Skip to contentSkip to conversation

qt: fix build for arm with BR2_STATIC_LIBS

PATCH Superseded Alexander Lukichev 4 participants 7 messages Oct 6, 2015 – Oct 13, 2015

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 qt: fix build for arm with BR2_STATIC_LIBS

Some Buildroot-generated static toolchains for ARM do not have dlfcn.h header, which breaks builds of qt-4.8.7 because its QtCore's plugin loader expects this header to be present (and dynamic libraries to be supported). For certain platforms without dynamic libraries, there is a QT_NO_DYNAMIC_LIBRARY constant defined in plugin loader's source. This patch puts that constant into Qt's build environment if Buildroot is configured without shared library support, and prevents plugin loader from defining it if it has already been defined.

Fixes:
- http://autobuild.buildroot.net/results/11a4c19638ca211bd2a424fd92602166235c9433
- http://autobuild.buildroot.net/results/c056e8781558267f6971a5f017f47e90dcf24e07
- http://autobuild.buildroot.net/results/b8f34afa8686e890a1a3882a52081bb6a3b9c13b
and several others.

---
 package/qt/0009-no-dynamic-library-plugins.patch | 27 ++++++++++++++++++++++++
 package/qt/qt.mk                                 |  4 ++++
 2 files changed, 31 insertions(+)
 create mode 100644 package/qt/0009-no-dynamic-library-plugins.patch
package/qt/0009-no-dynamic-library-plugins.patch new file +27 -0
new file mode 100644
index 0000000..3836677
@@ -0,0 +1,27 @@
+Do not define QT_NO_DYNAMIC_LIBRARY if it is already defined
+
+QtCore plugin loader behaves correctly on platforms that do not support
+dynamic libraries. This is implemented by QT_NO_DYNAMIC_LIBRARY constant
+defined at compile time in the loader's source for specific platforms.
+Since Buildroot does not have a separate platform defined for it in
+mkspecs, if shared libraries are not supported by its configuration, the
+constant is specified in Qt's build environment. This patch prevents
+compilation error in such cases.
+
+Signed-off-by: Alexander Lukichev <[email protected]>
+
+diff -uNrp qt-4.8.7.orig/src/corelib/plugin/qlibrary_unix.cpp qt-4.8.7/src/corelib/plugin/qlibrary_unix.cpp
+--- qt-4.8.7.orig/src/corelib/plugin/qlibrary_unix.cpp	2015-05-07 17:14:48.000000000 +0300
++++ qt-4.8.7/src/corelib/plugin/qlibrary_unix.cpp	2015-10-06 08:53:27.189232642 +0300
+@@ -56,9 +56,11 @@
+ #include <string.h>
+ #endif
+ 
++#ifndef QT_NO_DYNAMIC_LIBRARY
+ #if (defined(Q_OS_VXWORKS) && !defined(VXWORKS_RTP)) || defined (Q_OS_NACL)
+ #define QT_NO_DYNAMIC_LIBRARY
+ #endif
++#endif
+ 
+ QT_BEGIN_NAMESPACE
+ 
package/qt/qt.mk +4 -0
index e0e5d22..a64d32f 100644
@@ -203,6 +203,10 @@ else
 QT_CONFIGURE_OPTS += -static
 endif
 
+ifeq ($(BR2_STATIC_LIBS),y)
+QT_CONFIGURE_OPTS += -D QT_NO_DYNAMIC_LIBRARY
+endif
+
 ifeq ($(BR2_ENDIAN),"LITTLE")
 QT_CONFIGURE_OPTS += -little-endian
 else
Signature · 1 line
1.8.0.1
#1 lore raw

PATCH 1/1 qt: fix build for arm with BR2_STATIC_LIBS

Quoted 29 lines · Alexander Lukichev

Some Buildroot-generated static toolchains for ARM do not have dlfcn.h header, which breaks builds of qt-4.8.7 because its QtCore's plugin loader expects this header to be present (and dynamic libraries to be supported). For certain platforms without dynamic libraries, there is a QT_NO_DYNAMIC_LIBRARY constant defined in plugin loader's source. This patch puts that constant into Qt's build environment if Buildroot is configured without shared library support, and prevents plugin loader from defining it if it has already been defined.

Fixes:
- http://autobuild.buildroot.net/results/11a4c19638ca211bd2a424fd92602166235c9433
- http://autobuild.buildroot.net/results/c056e8781558267f6971a5f017f47e90dcf24e07
- http://autobuild.buildroot.net/results/b8f34afa8686e890a1a3882a52081bb6a3b9c13b
and several others.

---
 package/qt/0009-no-dynamic-library-plugins.patch | 27 ++++++++++++++++++++++++
 package/qt/qt.mk                                 |  4 ++++
 2 files changed, 31 insertions(+)
 create mode 100644 package/qt/0009-no-dynamic-library-plugins.patch
package/qt/0009-no-dynamic-library-plugins.patch new file +0 -0
new file mode 100644
index 0000000..3836677

package/qt/0009-no-dynamic-library-plugins.patch line 9

Quoted 9 lines
package/qt/0009-no-dynamic-library-plugins.patch new file +9 -0
@@ -0,0 +1,27 @@
+Do not define QT_NO_DYNAMIC_LIBRARY if it is already defined
+
+QtCore plugin loader behaves correctly on platforms that do not support
+dynamic libraries. This is implemented by QT_NO_DYNAMIC_LIBRARY constant
+defined at compile time in the loader's source for specific platforms.
+Since Buildroot does not have a separate platform defined for it in
+mkspecs, if shared libraries are not supported by its configuration, the
+constant is specified in Qt's build environment. This patch prevents
+compilation error in such cases.

I'm sorry, but I fail to understand how there can be a compilation error...
We're not building for VxWorks or NaCl, so why should there be a problem?

Otherwise the patch looks good to me BTW.

Regards,
Arnout

Quoted 34 lines
package/qt/0009-no-dynamic-library-plugins.patch new file +18 -0
+
+Signed-off-by: Alexander Lukichev <[email protected]>
+
+diff -uNrp qt-4.8.7.orig/src/corelib/plugin/qlibrary_unix.cpp qt-4.8.7/src/corelib/plugin/qlibrary_unix.cpp
+--- qt-4.8.7.orig/src/corelib/plugin/qlibrary_unix.cpp	2015-05-07 17:14:48.000000000 +0300
++++ qt-4.8.7/src/corelib/plugin/qlibrary_unix.cpp	2015-10-06 08:53:27.189232642 +0300
+@@ -56,9 +56,11 @@
+ #include <string.h>
+ #endif
+ 
++#ifndef QT_NO_DYNAMIC_LIBRARY
+ #if (defined(Q_OS_VXWORKS) && !defined(VXWORKS_RTP)) || defined (Q_OS_NACL)
+ #define QT_NO_DYNAMIC_LIBRARY
+ #endif
++#endif
+ 
+ QT_BEGIN_NAMESPACE
+ 
package/qt/qt.mk +4 -0
index e0e5d22..a64d32f 100644
@@ -203,6 +203,10 @@ else
 QT_CONFIGURE_OPTS += -static
 endif
 
+ifeq ($(BR2_STATIC_LIBS),y)
+QT_CONFIGURE_OPTS += -D QT_NO_DYNAMIC_LIBRARY
+endif
+
 ifeq ($(BR2_ENDIAN),"LITTLE")
 QT_CONFIGURE_OPTS += -little-endian
 else
Signature · 6 lines
Arnout Vandecappelle                          arnout at mind be
Senior Embedded Software Architect            +32-16-286500
Essensium/Mind                                http://www.mind.be
G.Geenslaan 9, 3001 Leuven, Belgium           BE 872 984 063 RPR Leuven
LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle
GPG fingerprint:  7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF
#2 lore raw

PATCH 1/1 qt: fix build for arm with BR2_STATIC_LIBS

Hi, Arnout!

Thanks for taking a look!

Quoted 4 lines · Arnout Vandecappelle
Quoted 4 lines
package/qt/0009-no-dynamic-library-plugins.patch new file +1 -0
@@ -0,0 +1,27 @@
+Do not define QT_NO_DYNAMIC_LIBRARY if it is already defined

[...]

Quoted 8 lines
Quoted 5 lines

++#ifndef QT_NO_DYNAMIC_LIBRARY
+ #if (defined(Q_OS_VXWORKS) && !defined(VXWORKS_RTP)) || defined (Q_OS_NACL)
+ #define QT_NO_DYNAMIC_LIBRARY
+ #endif
++#endif

I'm sorry, but I fail to understand how there can be a compilation error...
We're not building for VxWorks or NaCl, so why should there be a problem?

Indeed. I will remove unnecessary Qt patch and send a new version. Thanks again!

--
Best regards,
Alexander Lukichev

#3 lore raw

PATCH v2 1/1 qt: fix build for arm with BR2_STATIC_LIBS

In reply to Alexander Lukichev

Some Buildroot-generated static toolchains for ARM do not have dlfcn.h header, which breaks builds of qt-4.8.7 because its QtCore's plugin loader expects this header to be present (and dynamic libraries to be supported). For certain platforms without dynamic libraries, there is a QT_NO_DYNAMIC_LIBRARY constant defined in plugin loader's source. This patch puts that constant into Qt's build environment if Buildroot is configured without shared library support.

Fixes:
- http://autobuild.buildroot.net/results/11a4c19638ca211bd2a424fd92602166235c9433
- http://autobuild.buildroot.net/results/c056e8781558267f6971a5f017f47e90dcf24e07
- http://autobuild.buildroot.net/results/b8f34afa8686e890a1a3882a52081bb6a3b9c13b
and several others.

---
Changes
v2: unnecessary Qt patch removed (Arnout).

---
 package/qt/qt.mk | 4 ++++
 1 file changed, 4 insertions(+)
package/qt/qt.mk +4 -0
index e0e5d22..a64d32f 100644
@@ -203,6 +203,10 @@ else
 QT_CONFIGURE_OPTS += -static
 endif
 
+ifeq ($(BR2_STATIC_LIBS),y)
+QT_CONFIGURE_OPTS += -D QT_NO_DYNAMIC_LIBRARY
+endif
+
 ifeq ($(BR2_ENDIAN),"LITTLE")
 QT_CONFIGURE_OPTS += -little-endian
 else
Signature · 1 line
2.6.1
#4 lore raw

PATCH v2 1/1 qt: fix build for arm with BR2_STATIC_LIBS

Dear Alexander Lukichev,

Quoted 15 lines · Alexander Lukichev

Some Buildroot-generated static toolchains for ARM do not have dlfcn.h header, which breaks builds of qt-4.8.7 because its QtCore's plugin loader expects this header to be present (and dynamic libraries to be supported). For certain platforms without dynamic libraries, there is a QT_NO_DYNAMIC_LIBRARY constant defined in plugin loader's source. This patch puts that constant into Qt's build environment if Buildroot is configured without shared library support.

Fixes:
- http://autobuild.buildroot.net/results/11a4c19638ca211bd2a424fd92602166235c9433
- http://autobuild.buildroot.net/results/c056e8781558267f6971a5f017f47e90dcf24e07
- http://autobuild.buildroot.net/results/b8f34afa8686e890a1a3882a52081bb6a3b9c13b
and several others.

Quoted 7 lines

---
Changes
v2: unnecessary Qt patch removed (Arnout).

---
 package/qt/qt.mk | 4 ++++
 1 file changed, 4 insertions(+)

Applied, thanks.

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com
#5 lore raw

PATCH v2 1/1 qt: fix build for arm with BR2_STATIC_LIBS

In reply to Alexander Lukichev
Quoted 30 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Alexander" == Alexander Lukichev <[email protected]> writes:

Some Buildroot-generated static toolchains for ARM do not have dlfcn.h header, which breaks builds of qt-4.8.7 because its QtCore's plugin loader expects this header to be present (and dynamic libraries to be supported). For certain platforms without dynamic libraries, there is a QT_NO_DYNAMIC_LIBRARY constant defined in plugin loader's source. This patch puts that constant into Qt's build environment if Buildroot is configured without shared library support.

Fixes:
- http://autobuild.buildroot.net/results/11a4c19638ca211bd2a424fd92602166235c9433
- http://autobuild.buildroot.net/results/c056e8781558267f6971a5f017f47e90dcf24e07
- http://autobuild.buildroot.net/results/b8f34afa8686e890a1a3882a52081bb6a3b9c13b
and several others.

---
Changes
v2: unnecessary Qt patch removed (Arnout).

---
 package/qt/qt.mk | 4 ++++
 1 file changed, 4 insertions(+)
package/qt/qt.mk +0 -0
index e0e5d22..a64d32f 100644

package/qt/qt.mk else · line 207

Quoted 5 lines
package/qt/qt.mk +2 -0
@@ -203,6 +203,10 @@ else
 QT_CONFIGURE_OPTS += -static
 endif
 
+ifeq ($(BR2_STATIC_LIBS),y)
+QT_CONFIGURE_OPTS += -D QT_NO_DYNAMIC_LIBRARY

Hmm, shouldn't this be checking BR2_PACKAGE_QT_STATIC instead?

Signature · 1 line
Bye, Peter Korsgaard
#6 lore raw

PATCH v2 1/1 qt: fix build for arm with BR2_STATIC_LIBS

Hi Peter,

Quoted 10 lines · Peter Korsgaard
Quoted 10 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Alexander" == Alexander Lukichev <[email protected]> writes:

Some Buildroot-generated static toolchains for ARM do not have dlfcn.h header, which breaks builds of qt-4.8.7 because its QtCore's plugin loader expects this header to be present (and dynamic libraries to be supported). For certain platforms without dynamic libraries, there is a QT_NO_DYNAMIC_LIBRARY constant defined in plugin loader's source. This patch puts that constant into Qt's build environment if Buildroot is configured without shared library support.

[...]

Quoted 4 lines

package/qt/qt.mk else · line 207

Quoted 2 lines
package/qt/qt.mk +2 -0
+ifeq ($(BR2_STATIC_LIBS),y)
+QT_CONFIGURE_OPTS += -D QT_NO_DYNAMIC_LIBRARY

Hmm, shouldn't this be checking BR2_PACKAGE_QT_STATIC instead?

I think, no. If BR2_PACKAGE_QT_STATIC means to compile only Qt statically. The problem is when the whole platform is built with static libraries (BR2_STATIC_LIBS). Then loading plugins dynamically is not possible in principle. When the Buildroot build is not static, some dynamic libraries (e.g., compiled later) may be put onto the target system and be loaded by Qt, even if it itself is statically built. Correct me if I'm wrong but I have not been able to confirm that static Qt cannot load / work with dynamic libraries.

--
Best regards,
Alexander Lukichev