From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Petazzoni Date: Fri, 27 Feb 2009 15:27:17 +0100 Subject: [Buildroot] Qtopia4 build issue In-Reply-To: <20090226162124.2d78cfa4@surf> References: <20090226122205.390e848a@surf> <20090226162124.2d78cfa4@surf> Message-ID: <20090227152717.5cefcd92@surf> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: buildroot@busybox.net Le Thu, 26 Feb 2009 16:21:24 +0100, Thomas Petazzoni a ?crit : > Ok, I think I found a fix for the issue. First of all, the problem > only occurs when cross-compiling on x86 to x86. I will cleanup my fix > later today or tomorrow and submit for discussion. Here is a discussion patch to fix the Qtopia build issue when the target architecture is x86. This patch is *not* meant for inclusion, only for discussions since it has known issues and isn't very clean. Please tell me if the approach seems correct. If so, I will provide a cleaned up patch, suitable for inclusion. Sincerly, Thomas =================================================================== Fix Qtopia4 build when target arch = host arch The Qtopia build process needs to build host tools (qmake, moc and others) before building the library for the target. Of course, the host tools must be built with the usual host compiler, while the libraries must be built with the cross-compiler (generated by Buildroot or external). As Qtopia doesn't use the traditionnal autotools, the build process is a bit unusual. In the Qtopia source tree, in the mkspecs/qws/ directory, there are several directories for various supported targets: linux-x86-g++, linux-arm-g++, linux-avr32-g++, etc. Each of these directories contains a qmake.conf which defines the path to the C and C++ cross-compilers and other configuration values. When passing the -embedded arm argument to the Qtopia configure script, Qtopia will : * Use the parameters defined in linux-x86-g++/qmake.conf to build host tools ; * Use the parameters defined in linux-arm-g++/qmake.conf to build the target libraries. Since linux-arm-g++/qmake.conf doesn't necessarly match Buildroot toolchain configuration, this file gets patched by Buildroot qtopia4.mk Makefile. This all works fine until the target arch is the same as the host arch (such as x86 on x86). In this case, Qtopia will use the parameters in linux-x86-g++/qmake.conf for both the host tools and the target libraries. As this file has been patched by Buildroot qtopia4.mk Makefile, it references the Buildroot toolchain. So, the host tools (qmake, moc and probably others) get compiled with the i686-linux-uclibc-gcc compiler. And these binaries obviously don't run on the host system since the host system is not uClibc-based. So, on x86, we must differentiate the configuration used during Qtopia build for the host tools and the target libraries. This is possible through the -platform and -xplatform configuration options, as explained in the Qt documentation (http://doc.trolltech.com/4.4/qt-embedded-crosscompiling.html#step-2-create-a-target-specific-qmake-specification) The approach of my patch is to differentiate these two configurations. The QTOPIA4_QMAKE_CONF variable is removed in favor of three variables : * QTOPIA4_PLATFORM_QMAKE_CONF_DIR, which points to the configuration used to build the host tools (this variable will be used for the -platform ./configure option). Currently, it is hardcoded to linux-x86-g++, which obviously isn't correct for people using Buildroot on x86_64 or PowerPC or something else. * QTOPIA4_XPLATFORM_ORIG_QMAKE_CONF_DIR, which points to an existing configuration for the target architecture (might be linux-x86-g++, linux-arm-g++ or whatever) * QTOPIA_XPLATFORM_QMAKE_CONF_DIR, which points to a non-existing configuration for the target architecture. This configuration will be created by Buildroot qtopia4.mk Makefile from the QTOPIA4_XPLATFORM_ORIG_QMAKE_CONF_DIR by modifying the appropriate configuration settings. QTOPIA_XPLATFORM_QMAKE_CONF_DIR will be used for the -xplatform ./configure option. Then, before running the configure script, we : * Copy QTOPIA4_XPLATFORM_ORIG_QMAKE_CONF_DIR (which exists) to QTOPIA_XPLATFORM_QMAKE_CONF_DIR (which didn't exist) ; * Patch qmake.conf in QTOPIA_XPLATFORM_QMAKE_CONF_DIR as was already done before in qtopia4.mk. The difference is that we don't patch something provided by Qtopia, but we make a copy of it before patching the new copy. Finally, we run the configure script with : -platform qws/linux-x86-g++ -xplatform qws/linux-buildroot-$(BR2_PACKAGE_QTOPIA4_EMB_PLATFORM)-g++ And it works :-) Signed-off-by: Thomas Petazzoni --- package/qtopia4/qtopia4.mk | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) Index: buildroot/package/qtopia4/qtopia4.mk =================================================================== --- buildroot.orig/package/qtopia4/qtopia4.mk +++ buildroot/package/qtopia4/qtopia4.mk @@ -322,7 +322,9 @@ BR2_PACKAGE_QTOPIA4_EMB_PLATFORM:=$(strip $(subst ",, $(BR2_PACKAGE_QTOPIA4_EMB_PLATFORM))) #")) -QTOPIA4_QMAKE_CONF:=$(QTOPIA4_TARGET_DIR)/mkspecs/qws/linux-$(BR2_PACKAGE_QTOPIA4_EMB_PLATFORM)-g++/qmake.conf +QTOPIA4_PLATFORM_QMAKE_CONF_DIR:=$(QTOPIA4_TARGET_DIR)/mkspecs/qws/linux-x86-g++/ +QTOPIA4_XPLATFORM_ORIG_QMAKE_CONF_DIR:=$(QTOPIA4_TARGET_DIR)/mkspecs/qws/linux-$(BR2_PACKAGE_QTOPIA4_EMB_PLATFORM)-g++/ +QTOPIA4_XPLATFORM_QMAKE_CONF_DIR:=$(QTOPIA4_TARGET_DIR)/mkspecs/qws/linux-buildroot-$(BR2_PACKAGE_QTOPIA4_EMB_PLATFORM)-g++/ # Variable for other Qt applications to use QTOPIA4_QMAKE:=$(STAGING_DIR)/usr/bin/qmake -spec qws/linux-$(BR2_PACKAGE_QTOPIA4_EMB_PLATFORM)-g++ @@ -346,15 +348,16 @@ $(SED) 's/^CFG_IPV6IFNAME=auto/CFG_IPV6IFNAME=no/' $(QTOPIA4_TARGET_DIR)/configure endif $(SED) 's/^CFG_XINERAMA=auto/CFG_XINERAMA=no/' $(QTOPIA4_TARGET_DIR)/configure + cp -a $(QTOPIA4_XPLATFORM_ORIG_QMAKE_CONF_DIR) $(QTOPIA4_XPLATFORM_QMAKE_CONF_DIR) #$(SED) 's,-O2,$(TARGET_CFLAGS),' $(QTOPIA4_QMAKE_CONF) # Fix compiler path - $(SED) '\,QMAKE_CC[ ]*=, c\QMAKE_CC = $(TARGET_CC)' $(QTOPIA4_QMAKE_CONF) - $(SED) '\,QMAKE_CXX[ ]*=, c\QMAKE_CXX = $(TARGET_CXX)' $(QTOPIA4_QMAKE_CONF) - $(SED) '\,QMAKE_LINK[ ]*=, c\QMAKE_LINK = $(TARGET_CXX)' $(QTOPIA4_QMAKE_CONF) - $(SED) '\,QMAKE_LINK_SHLIB[ ]*=, c\QMAKE_LINK_SHLIB = $(TARGET_CXX)' $(QTOPIA4_QMAKE_CONF) - $(SED) '\,QMAKE_AR[ ]*=, c\QMAKE_AR = $(TARGET_AR) cqs' $(QTOPIA4_QMAKE_CONF) - $(SED) '\,QMAKE_RANLIB[ ]*=, c\QMAKE_RANLIB = $(TARGET_RANLIB)' $(QTOPIA4_QMAKE_CONF) - $(SED) '\,QMAKE_STRIP[ ]*=, c\QMAKE_STRIP = $(TARGET_STRIP)' $(QTOPIA4_QMAKE_CONF) + $(SED) '\,QMAKE_CC[ ]*=, c\QMAKE_CC = $(TARGET_CC)' $(QTOPIA4_XPLATFORM_QMAKE_CONF_DIR)/qmake.conf + $(SED) '\,QMAKE_CXX[ ]*=, c\QMAKE_CXX = $(TARGET_CXX)' $(QTOPIA4_XPLATFORM_QMAKE_CONF_DIR)/qmake.conf + $(SED) '\,QMAKE_LINK[ ]*=, c\QMAKE_LINK = $(TARGET_CXX)' $(QTOPIA4_XPLATFORM_QMAKE_CONF_DIR)/qmake.conf + $(SED) '\,QMAKE_LINK_SHLIB[ ]*=, c\QMAKE_LINK_SHLIB = $(TARGET_CXX)' $(QTOPIA4_XPLATFORM_QMAKE_CONF_DIR)/qmake.conf + $(SED) '\,QMAKE_AR[ ]*=, c\QMAKE_AR = $(TARGET_AR) cqs' $(QTOPIA4_XPLATFORM_QMAKE_CONF_DIR)/qmake.conf + $(SED) '\,QMAKE_RANLIB[ ]*=, c\QMAKE_RANLIB = $(TARGET_RANLIB)' $(QTOPIA4_XPLATFORM_QMAKE_CONF_DIR)/qmake.conf + $(SED) '\,QMAKE_STRIP[ ]*=, c\QMAKE_STRIP = $(TARGET_STRIP)' $(QTOPIA4_XPLATFORM_QMAKE_CONF_DIR)/qmake.conf -[ -f $(QTOPIA4_QCONFIG_FILE) ] && cp $(QTOPIA4_QCONFIG_FILE) \ $(QTOPIA4_TARGET_DIR)/$(QTOPIA4_QCONFIG_FILE_LOCATION) @@ -385,11 +388,13 @@ -no-rpath \ -nomake examples \ -nomake demos \ + -platform qws/linux-x86-g++ \ + -xplatform qws/linux-buildroot-$(BR2_PACKAGE_QTOPIA4_EMB_PLATFORM)-g++ \ ) touch $@ $(QTOPIA4_TARGET_DIR)/.compiled: $(QTOPIA4_TARGET_DIR)/.configured - $(TARGET_CONFIGURE_OPTS) $(MAKE) -C $(QTOPIA4_TARGET_DIR) + $(MAKE) -C $(QTOPIA4_TARGET_DIR) touch $@ $(STAGING_DIR)/usr/lib/libQtCore.la: $(QTOPIA4_TARGET_DIR)/.compiled -- Thomas Petazzoni, Free Electrons Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com