a162a3cbbc
On Android, there's a limitation set on the names of the libraries you deploy that they must start with "lib" and end with ".so", so Android apps will link against and deploy with the unversioned libQt5FooBar.so libraries. When cross-compiling on Windows however, due to the lack of symbolic links, the only installed library used to be the main library target "libQt5FooBar.so.X.Y.Z" (for version X.Y.Z.) This has been worked around in packaging, but breaks building add-on modules on top of Qt, and is clearly wrong. This patch introduces a new "unversioned_libname" configuration in qmake which is currently only supported for the Unix makefile generator and only enabled for Android builds. When it is enabled, only the unversioned library "libQt5FooBar.so" will be created. Task-number: QTBUG-38347 Change-Id: Ia8897ca7a23a62e2a526d0e02854899b02eb19dc Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
194 lines
8.9 KiB
Plaintext
194 lines
8.9 KiB
Plaintext
# qmake configuration for building with android-g++
|
|
MAKEFILE_GENERATOR = UNIX
|
|
QMAKE_PLATFORM = android
|
|
QMAKE_COMPILER = gcc
|
|
|
|
CONFIG += android_install unversioned_soname unversioned_libname android_deployment_settings
|
|
|
|
include(../common/linux.conf)
|
|
include(../common/gcc-base-unix.conf)
|
|
|
|
load(device_config)
|
|
|
|
# Passing in -win32 to qmake (from NQTC) causes this condition to pass, however
|
|
# qmake complains that -win32 is deprecated; should find another way, Q_OS_WIN
|
|
# should really be all QMAKE_HOST.os needs to depend on?
|
|
contains(QMAKE_HOST.os,Windows) {
|
|
# Not having sh.exe in your path causes this condition to pass
|
|
# To build Android Qt on Windows, this block must not be evaluated.
|
|
isEmpty(QMAKE_SH) {
|
|
# Override values from previously loaded shell-unix.conf
|
|
# (via unix.conf, via linux.conf).
|
|
include(../common/shell-win32.conf)
|
|
QMAKE_DEL_TREE = rmdir /s /q
|
|
QMAKE_INSTALL_FILE = copy /y
|
|
QMAKE_INSTALL_PROGRAM = copy /y
|
|
} else {
|
|
MINGW_IN_SHELL = 1
|
|
QMAKE_DIR_SEP = /
|
|
# Because install's ability to set permissions is not relevant on Windows,
|
|
# and git's msys does not provide it to start with.
|
|
QMAKE_INSTALL_FILE = cp -f
|
|
QMAKE_INSTALL_PROGRAM = cp -f
|
|
}
|
|
}
|
|
|
|
NDK_ROOT = $$(ANDROID_NDK_ROOT)
|
|
!exists($$NDK_ROOT) {
|
|
NDK_ROOT = $$DEFAULT_ANDROID_NDK_ROOT
|
|
}
|
|
|
|
NDK_HOST = $$(ANDROID_NDK_HOST)
|
|
isEmpty(NDK_HOST): NDK_HOST = $$DEFAULT_ANDROID_NDK_HOST
|
|
|
|
ANDROID_PLATFORM = $$(ANDROID_NDK_PLATFORM)
|
|
isEmpty(ANDROID_PLATFORM): ANDROID_PLATFORM = $$DEFAULT_ANDROID_PLATFORM
|
|
|
|
ANDROID_TARGET_ARCH = $$(ANDROID_TARGET_ARCH)
|
|
isEmpty(ANDROID_TARGET_ARCH): ANDROID_TARGET_ARCH = $$DEFAULT_ANDROID_TARGET_ARCH
|
|
|
|
NDK_TOOLCHAIN_PREFIX = $$(ANDROID_NDK_TOOLCHAIN_PREFIX)
|
|
isEmpty(NDK_TOOLCHAIN_PREFIX) {
|
|
equals(ANDROID_TARGET_ARCH, x86): NDK_TOOLCHAIN_PREFIX = x86
|
|
else: equals(ANDROID_TARGET_ARCH, mips): NDK_TOOLCHAIN_PREFIX = mipsel-linux-android
|
|
else: NDK_TOOLCHAIN_PREFIX = arm-linux-androideabi
|
|
}
|
|
|
|
NDK_TOOLS_PREFIX = $$(ANDROID_NDK_TOOLS_PREFIX)
|
|
isEmpty(NDK_TOOLS_PREFIX) {
|
|
equals(ANDROID_TARGET_ARCH, x86): NDK_TOOLS_PREFIX = i686-linux-android
|
|
else: equals(ANDROID_TARGET_ARCH, mips): NDK_TOOLS_PREFIX = mipsel-linux-android
|
|
else: NDK_TOOLS_PREFIX = arm-linux-androideabi
|
|
}
|
|
|
|
NDK_TOOLCHAIN_VERSION = $$(ANDROID_NDK_TOOLCHAIN_VERSION)
|
|
isEmpty(NDK_TOOLCHAIN_VERSION): NDK_TOOLCHAIN_VERSION = $$DEFAULT_ANDROID_NDK_TOOLCHAIN_VERSION
|
|
|
|
equals(ANDROID_TARGET_ARCH, x86): ANDROID_ARCHITECTURE = x86
|
|
else: equals(ANDROID_TARGET_ARCH, mips): ANDROID_ARCHITECTURE = mips
|
|
else: ANDROID_ARCHITECTURE = arm
|
|
|
|
!equals(NDK_TOOLCHAIN_VERSION, 4.4.3): ANDROID_CXXSTL_SUFFIX = -$$NDK_TOOLCHAIN_VERSION
|
|
|
|
NDK_TOOLCHAIN = $$NDK_TOOLCHAIN_PREFIX-$$NDK_TOOLCHAIN_VERSION
|
|
NDK_TOOLCHAIN_PATH = $$NDK_ROOT/toolchains/$$NDK_TOOLCHAIN/prebuilt/$$NDK_HOST
|
|
|
|
CONFIG += $$ANDROID_PLATFORM
|
|
ANDROID_PLATFORM_ROOT_PATH = $$NDK_ROOT/platforms/$$ANDROID_PLATFORM/arch-$$ANDROID_ARCHITECTURE/
|
|
ANDROID_PLATFORM_PATH = $$ANDROID_PLATFORM_ROOT_PATH/usr
|
|
|
|
# used to compile platform plugins for android-4 and android-5
|
|
QMAKE_ANDROID_PLATFORM_INCDIR = $$NDK_ROOT/platforms/$$ANDROID_PLATFORM/arch-$$ANDROID_ARCHITECTURE/usr/include
|
|
QMAKE_ANDROID_PLATFORM_LIBDIR = $$NDK_ROOT/platforms/$$ANDROID_PLATFORM/arch-$$ANDROID_ARCHITECTURE/usr/lib
|
|
|
|
ANDROID_SOURCES_CXX_STL_LIBDIR = $$NDK_ROOT/sources/cxx-stl/gnu-libstdc++/$$NDK_TOOLCHAIN_VERSION/libs/$$ANDROID_TARGET_ARCH
|
|
ANDROID_SOURCES_CXX_STL_INCDIR = $$NDK_ROOT/sources/cxx-stl/gnu-libstdc++/$$NDK_TOOLCHAIN_VERSION/include $$ANDROID_SOURCES_CXX_STL_LIBDIR/include
|
|
|
|
# modifications to g++.conf
|
|
QMAKE_CC = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-gcc
|
|
|
|
equals(ANDROID_TARGET_ARCH, armeabi-v7a): \
|
|
QMAKE_CFLAGS = -Wno-psabi -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -DANDROID -Wa,--noexecstack
|
|
else: equals(ANDROID_TARGET_ARCH, armeabi): \
|
|
QMAKE_CFLAGS = -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -DANDROID -Wa,--noexecstack
|
|
else: equals(ANDROID_TARGET_ARCH, x86): \
|
|
QMAKE_CFLAGS = -ffunction-sections -funwind-tables -O2 -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 -DANDROID -Wa,--noexecstack
|
|
else: equals(ANDROID_TARGET_ARCH, mips): \
|
|
QMAKE_CFLAGS = -fno-strict-aliasing -finline-functions -ffunction-sections -funwind-tables -fmessage-length=0 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers -O2 -fomit-frame-pointer -funswitch-loops -finline-limit=300 -DANDROID -Wa,--noexecstack
|
|
|
|
QMAKE_CFLAGS_WARN_ON = -Wall -Wno-psabi -W
|
|
QMAKE_CFLAGS_WARN_OFF = -Wno-psabi
|
|
equals(ANDROID_TARGET_ARCH, x86) {
|
|
QMAKE_CFLAGS_RELEASE = -O2
|
|
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -g -gdwarf-2 -O2
|
|
QMAKE_CFLAGS_DEBUG = -g -gdwarf-2
|
|
} else: equals(ANDROID_TARGET_ARCH, mips) {
|
|
QMAKE_CFLAGS_RELEASE = -O2
|
|
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -g -gdwarf-2 -O2
|
|
QMAKE_CFLAGS_DEBUG = -g -gdwarf-2 -fno-omit-frame-pointer
|
|
} else { # arm
|
|
QMAKE_CFLAGS_RELEASE = -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64
|
|
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -g -gdwarf-2 -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64
|
|
QMAKE_CFLAGS_DEBUG = -g -gdwarf-2 -marm -O0 -fno-omit-frame-pointer
|
|
equals(ANDROID_TARGET_ARCH, armeabi): equals(NDK_TOOLCHAIN_VERSION, 4.8) {
|
|
DEFINES += QT_OS_ANDROID_GCC_48_WORKAROUND
|
|
} else {
|
|
QMAKE_CFLAGS_RELEASE += -mthumb
|
|
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -mthumb
|
|
}
|
|
}
|
|
|
|
QMAKE_CFLAGS_SHLIB = -fPIC
|
|
QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
|
|
QMAKE_CFLAGS_THREAD = -D_REENTRANT
|
|
QMAKE_CFLAGS_HIDESYMS = -fvisibility=hidden
|
|
|
|
QMAKE_CXX = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-g++
|
|
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS -std=gnu++0x
|
|
QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
|
|
QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
|
|
QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE
|
|
QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
|
|
QMAKE_CXXFLAGS_DEBUG += $$QMAKE_CFLAGS_DEBUG
|
|
QMAKE_CXXFLAGS_SHLIB = $$QMAKE_CFLAGS_SHLIB
|
|
QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
|
|
QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
|
|
QMAKE_CXXFLAGS_HIDESYMS = $$QMAKE_CFLAGS_HIDESYMS -fvisibility-inlines-hidden
|
|
|
|
QMAKE_LINK = $$QMAKE_CXX
|
|
QMAKE_LINK_SHLIB = $$QMAKE_LINK
|
|
|
|
# modifications to linux.conf
|
|
QMAKE_AR = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-ar cqs
|
|
QMAKE_OBJCOPY = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-objcopy
|
|
QMAKE_NM = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-nm -P
|
|
|
|
QMAKE_STRIP =
|
|
#$$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-strip
|
|
|
|
QMAKE_RANLIB = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-ranlib
|
|
|
|
QMAKE_INCDIR = $$ANDROID_SOURCES_CXX_STL_INCDIR $$ANDROID_PLATFORM_PATH/include
|
|
QMAKE_LIBDIR = $$ANDROID_SOURCES_CXX_STL_LIBDIR $$ANDROID_PLATFORM_PATH/lib $$LIBGCC_PATH
|
|
QMAKE_INCDIR_X11 =
|
|
QMAKE_LIBDIR_X11 =
|
|
QMAKE_INCDIR_OPENGL = $$ANDROID_PLATFORM_PATH/include
|
|
QMAKE_LIBDIR_OPENGL = $$ANDROID_PLATFORM_PATH/lib
|
|
|
|
equals(ANDROID_TARGET_ARCH, x86)|equals(ANDROID_TARGET_ARCH, mips): \
|
|
LIBGCC_PATH_FULL = $$system("$$QMAKE_CC -print-libgcc-file-name")
|
|
else: \
|
|
LIBGCC_PATH_FULL = $$system("$$QMAKE_CC -mthumb-interwork -print-libgcc-file-name")
|
|
|
|
LIBGCC_PATH = $$dirname(LIBGCC_PATH_FULL)
|
|
|
|
QMAKE_LINK = $$QMAKE_CXX
|
|
QMAKE_LINK_SHLIB = $$QMAKE_CXX
|
|
QMAKE_LFLAGS = --sysroot=$$ANDROID_PLATFORM_ROOT_PATH
|
|
QMAKE_RPATHLINK = $$ANDROID_PLATFORM_PATH/lib
|
|
QMAKE_LFLAGS_APP = -Wl,--no-undefined -Wl,-z,noexecstack -shared
|
|
QMAKE_LFLAGS_SHLIB = -Wl,--no-undefined -Wl,-z,noexecstack -shared
|
|
|
|
contains(NDK_ROOT, ".*r6")|contains(NDK_ROOT, ".*r5.*") {
|
|
!equals(ANDROID_PLATFORM, android-4):!equals(ANDROID_PLATFORM, android-5):!equals(ANDROID_PLATFORM, android-8) {
|
|
warning("Your NDK version is outdated. A workaround is enabled. Consider updating your NDK (workarounds are required until r6(a))")
|
|
QMAKE_LFLAGS_SHLIB += $$ANDROID_PLATFORM_PATH/lib/crtbegin_so.o $$ANDROID_PLATFORM_PATH/lib/crtend_so.o
|
|
}
|
|
}
|
|
|
|
QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB
|
|
QMAKE_LFLAGS_NOUNDEF = -Wl,--no-undefined
|
|
QMAKE_LFLAGS_RPATH = -Wl,-rpath=
|
|
QMAKE_LFLAGS_RPATHLINK = -Wl,-rpath-link=
|
|
|
|
QMAKE_LIBS_PRIVATE = -lgnustl_shared -llog -lz -lm -ldl -lc -lgcc
|
|
QMAKE_LIBS_X11 =
|
|
QMAKE_LIBS_THREAD =
|
|
QMAKE_LIBS_EGL = -lEGL
|
|
QMAKE_LIBS_OPENGL =
|
|
QMAKE_LIBS_OPENGL_ES2 = -lGLESv2
|
|
|
|
!exists($$NDK_ROOT): error("You need to set the ANDROID_NDK_ROOT environment variable to point to your Android NDK.")
|
|
|
|
load(qt_config)
|