Changeset View
Changeset View
Standalone View
Standalone View
toolchain/Android.cmake
Show First 20 Lines • Show All 127 Lines • ▼ Show 20 Line(s) | |||||
128 | # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | 128 | # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
129 | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | 129 | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
130 | # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 130 | # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
131 | # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 131 | # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
132 | # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 132 | # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
133 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 133 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
134 | # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 134 | # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
135 | 135 | | |||
136 | cmake_minimum_required(VERSION "3.1") | 136 | cmake_minimum_required(VERSION "3.7") | ||
137 | 137 | | |||
138 | #input | 138 | #input | ||
139 | set(ANDROID_NDK "$ENV{ANDROID_NDK}" CACHE path "Android NDK path") | 139 | set(ANDROID_NDK "$ENV{ANDROID_NDK}" CACHE path "Android NDK path") | ||
140 | set(ANDROID_SDK_ROOT "$ENV{ANDROID_SDK_ROOT}" CACHE path "Android SDK path") | 140 | set(ANDROID_SDK_ROOT "$ENV{ANDROID_SDK_ROOT}" CACHE path "Android SDK path") | ||
141 | set(ANDROID_ARCHITECTURE "arm" CACHE string "Used Architecture, related to the ABI and TOOLCHAIN") | 141 | set(ANDROID_ARCHITECTURE "arm" CACHE string "Used Architecture, related to the ABI and TOOLCHAIN") | ||
142 | set(ANDROID_TOOLCHAIN "arm-linux-androideabi" CACHE string "Used SDK") | 142 | set(ANDROID_TOOLCHAIN "arm-linux-androideabi" CACHE string "Used SDK") | ||
143 | set(ANDROID_COMPILER_PREFIX "arm-linux-androideabi" CACHE string "Prefix for gcc/g++/etc") | 143 | set(ANDROID_COMPILER_PREFIX "arm-linux-androideabi" CACHE string "Prefix for gcc/g++/etc") | ||
144 | set(ANDROID_ABI "armeabi-v7a" CACHE string "Used ABI") | 144 | set(ANDROID_ABI "armeabi-v7a" CACHE string "Used ABI") | ||
145 | set(ANDROID_GCC_VERSION "4.9" CACHE string "Used GCC version" ) | 145 | set(ANDROID_GCC_VERSION "4.9" CACHE string "Used GCC version" ) | ||
146 | set(ANDROID_API_LEVEL "14" CACHE string "Android API Level") | 146 | set(ANDROID_API_LEVEL "14" CACHE string "Android API Level") | ||
147 | set(ANDROID_SDK_BUILD_TOOLS_REVISION "21.1.1" CACHE string "Android API Level") | 147 | set(ANDROID_SDK_BUILD_TOOLS_REVISION "21.1.1" CACHE string "Android API Level") | ||
148 | 148 | | |||
149 | set(_HOST "${CMAKE_HOST_SYSTEM_NAME}-${CMAKE_HOST_SYSTEM_PROCESSOR}") | | |||
150 | string(TOLOWER "${_HOST}" _HOST) | | |||
151 | 149 | | |||
152 | get_filename_component(_CMAKE_ANDROID_DIR "${CMAKE_TOOLCHAIN_FILE}" PATH) | 150 | set(CMAKE_ANDROID_NDK ${ANDROID_NDK}) | ||
153 | 151 | set(CMAKE_SYSTEM_VERSION ${ANDROID_API_LEVEL}) | |||
154 | set(CMAKE_SYSROOT | 152 | set(CMAKE_ANDROID_ARCH ${ANDROID_ARCHITECTURE}) | ||
155 | "${ANDROID_NDK}/platforms/android-${ANDROID_API_LEVEL}/arch-${ANDROID_ARCHITECTURE}") | 153 | set(CMAKE_ANDROID_ARCH_ABI ${ANDROID_ABI}) | ||
156 | if(NOT EXISTS ${CMAKE_SYSROOT}) | 154 | set(CMAKE_SYSTEM_NAME Android) | ||
157 | message(FATAL_ERROR "Couldn't find the Android NDK Root in ${CMAKE_SYSROOT}") | 155 | if (NOT CMAKE_ANDROID_STL_TYPE) | ||
156 | set(CMAKE_ANDROID_STL_TYPE gnustl_shared) | ||||
158 | endif() | 157 | endif() | ||
159 | 158 | | |||
160 | #actual code | 159 | include(${CMAKE_ROOT}/Modules/Platform/Android-GNU.cmake REQUIRED) | ||
161 | SET(CMAKE_SYSTEM_NAME Android) | 160 | include(${CMAKE_ROOT}/Modules/Platform/Android-Initialize.cmake REQUIRED) | ||
162 | SET(CMAKE_SYSTEM_VERSION 1) | | |||
163 | SET(ANDROID TRUE) | | |||
164 | 161 | | |||
165 | if (NOT DEFINED ECM_ADDITIONAL_FIND_ROOT_PATH) | 162 | if (NOT DEFINED ECM_ADDITIONAL_FIND_ROOT_PATH) | ||
166 | SET(ECM_ADDITIONAL_FIND_ROOT_PATH ${CMAKE_PREFIX_PATH}) | 163 | SET(ECM_ADDITIONAL_FIND_ROOT_PATH ${CMAKE_PREFIX_PATH}) | ||
167 | endif() | 164 | endif() | ||
168 | SET(CMAKE_FIND_ROOT_PATH ${ANDROID_NDK} ${ANDROID_NDK}/sysroot ${CMAKE_SYSROOT} ${ECM_ADDITIONAL_FIND_ROOT_PATH}) | 165 | SET(CMAKE_FIND_ROOT_PATH ${ANDROID_NDK} ${ANDROID_NDK}/sysroot ${CMAKE_SYSROOT} ${ECM_ADDITIONAL_FIND_ROOT_PATH}) | ||
169 | SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) | 166 | SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) | ||
170 | set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) | 167 | set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) | ||
171 | set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) | 168 | set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) | ||
172 | set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) | 169 | set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) | ||
173 | 170 | | |||
174 | set(ANDROID_TOOLCHAIN_ROOT "${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN}-${ANDROID_GCC_VERSION}/prebuilt/${_HOST}/bin") | | |||
175 | set(ANDROID_LIBS_ROOT "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_GCC_VERSION}") | | |||
176 | | ||||
177 | # includes | | |||
178 | include_directories(SYSTEM | | |||
179 | "${CMAKE_SYSROOT}/usr/include" | | |||
180 | "${ANDROID_LIBS_ROOT}/include/" | | |||
181 | "${ANDROID_LIBS_ROOT}/libs/${ANDROID_ABI}/include" | | |||
182 | "${ANDROID_NDK}/sysroot/usr/include" | | |||
183 | "${ANDROID_NDK}/sysroot/usr/include/${ANDROID_COMPILER_PREFIX}" | | |||
184 | ) | | |||
185 | | ||||
186 | # libraries | | |||
187 | set(ANDROID_LIBRARIES_PATH | | |||
188 | "${CMAKE_SYSROOT}/usr/lib") | | |||
189 | set(CMAKE_SYSTEM_LIBRARY_PATH | | |||
190 | ${ANDROID_LIBRARIES_PATH} | | |||
191 | "${ANDROID_LIBS_ROOT}/libs/${ANDROID_ABI}/" | | |||
192 | ) | | |||
193 | set(CMAKE_FIND_LIBRARY_SUFFIXES ".so") | | |||
194 | set(CMAKE_FIND_LIBRARY_PREFIXES "lib") | | |||
195 | | ||||
196 | # Settling hard on gnustl_shared as C++ helper runtime for now, | | |||
197 | # given this is most similar to what is on GNU/Linux, which is what | | |||
198 | # the average software targetted by this toolchain is built against otherwise. | | |||
199 | # If requested by devs, the used helper runtime could be made an option later. | | |||
200 | # Related info: https://developer.android.com/ndk/guides/cpp-support.html | | |||
201 | find_library(GNUSTL_SHARED gnustl_shared) | | |||
202 | if(NOT GNUSTL_SHARED) | | |||
203 | message(FATAL_ERROR "Selected Android platform does not provide gnustl_shared: ${CMAKE_SYSTEM_LIBRARY_PATH}") | | |||
204 | endif() | | |||
205 | | ||||
206 | link_directories(${CMAKE_SYSTEM_LIBRARY_PATH}) | | |||
207 | | ||||
208 | set(CMAKE_C_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_COMPILER_PREFIX}-gcc") | | |||
209 | set(CMAKE_CXX_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_COMPILER_PREFIX}-g++") | | |||
210 | | ||||
211 | set(CMAKE_EXE_LINKER_FLAGS "${GNUSTL_SHARED} -Wl,-rpath-link,${ANDROID_LIBRARIES_PATH} -llog -lz -lm -ldl -lc -lgcc" CACHE STRING "") | | |||
212 | set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}" CACHE STRING "") | | |||
213 | set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}" CACHE STRING "") | | |||
214 | | ||||
215 | #we want executables to be shared libraries, hooks will invoke the exported cmake function | 171 | #we want executables to be shared libraries, hooks will invoke the exported cmake function | ||
216 | set(CMAKE_CXX_LINK_EXECUTABLE | 172 | set(CMAKE_CXX_LINK_EXECUTABLE | ||
217 | "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" | 173 | "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" | ||
218 | ) | 174 | ) | ||
219 | 175 | | |||
220 | # ANDROID is needed for Qt to define Q_OS_ANDROID, __ANDROID_API__ is expected by the Android NDK | | |||
221 | add_definitions(-DANDROID -D__ANDROID_API__=${ANDROID_API_LEVEL}) | | |||
222 | | ||||
223 | set(ECM_DIR "${CMAKE_CURRENT_LIST_DIR}/../cmake" CACHE STRING "") | 176 | set(ECM_DIR "${CMAKE_CURRENT_LIST_DIR}/../cmake" CACHE STRING "") | ||
224 | 177 | | |||
225 | ######### generation | 178 | ######### generation | ||
226 | 179 | | |||
227 | set(CREATEAPK_TARGET_NAME "create-apk-${QTANDROID_EXPORTED_TARGET}") | 180 | set(CREATEAPK_TARGET_NAME "create-apk-${QTANDROID_EXPORTED_TARGET}") | ||
228 | # Need to ensure we only get in here once, as this file is included twice: | 181 | # Need to ensure we only get in here once, as this file is included twice: | ||
229 | # from CMakeDetermineSystem.cmake and from CMakeSystem.cmake generated within the | 182 | # from CMakeDetermineSystem.cmake and from CMakeSystem.cmake generated within the | ||
230 | # build directory. | 183 | # build directory. | ||
231 | if(DEFINED QTANDROID_EXPORTED_TARGET AND NOT TARGET ${CREATEAPK_TARGET_NAME}) | 184 | if(DEFINED QTANDROID_EXPORTED_TARGET AND NOT TARGET ${CREATEAPK_TARGET_NAME}) | ||
185 | get_filename_component(_CMAKE_ANDROID_DIR "${CMAKE_TOOLCHAIN_FILE}" PATH) | ||||
232 | if(NOT DEFINED ANDROID_APK_DIR) | 186 | if(NOT DEFINED ANDROID_APK_DIR) | ||
233 | message(FATAL_ERROR "Define an apk dir to initialize from using -DANDROID_APK_DIR=<path>. The specified directory must contain the AndroidManifest.xml file.") | 187 | message(FATAL_ERROR "Define an apk dir to initialize from using -DANDROID_APK_DIR=<path>. The specified directory must contain the AndroidManifest.xml file.") | ||
234 | elseif(NOT EXISTS "${ANDROID_APK_DIR}/AndroidManifest.xml") | 188 | elseif(NOT EXISTS "${ANDROID_APK_DIR}/AndroidManifest.xml") | ||
235 | message(FATAL_ERROR "Cannot find ${ANDROID_APK_DIR}/AndroidManifest.xml according to ANDROID_APK_DIR") | 189 | message(FATAL_ERROR "Cannot find ${ANDROID_APK_DIR}/AndroidManifest.xml according to ANDROID_APK_DIR") | ||
236 | endif() | 190 | endif() | ||
237 | 191 | | |||
238 | find_package(Qt5Core REQUIRED) | 192 | find_package(Qt5Core REQUIRED) | ||
239 | 193 | | |||
Show All 14 Lines | |||||
254 | set(EXTRA_PREFIX_DIRS "") | 208 | set(EXTRA_PREFIX_DIRS "") | ||
255 | foreach(prefix ${ECM_ADDITIONAL_FIND_ROOT_PATH}) | 209 | foreach(prefix ${ECM_ADDITIONAL_FIND_ROOT_PATH}) | ||
256 | if (EXTRA_PREFIX_DIRS) | 210 | if (EXTRA_PREFIX_DIRS) | ||
257 | set(EXTRA_PREFIX_DIRS "${EXTRA_PREFIX_DIRS}, \"${prefix}\"") | 211 | set(EXTRA_PREFIX_DIRS "${EXTRA_PREFIX_DIRS}, \"${prefix}\"") | ||
258 | else() | 212 | else() | ||
259 | set(EXTRA_PREFIX_DIRS "\"${prefix}\"") | 213 | set(EXTRA_PREFIX_DIRS "\"${prefix}\"") | ||
260 | endif() | 214 | endif() | ||
261 | endforeach() | 215 | endforeach() | ||
216 | string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" _LOWER_CMAKE_HOST_SYSTEM_NAME) | ||||
262 | configure_file("${_CMAKE_ANDROID_DIR}/deployment-file.json.in" "${QTANDROID_EXPORTED_TARGET}-deployment.json.in") | 217 | configure_file("${_CMAKE_ANDROID_DIR}/deployment-file.json.in" "${QTANDROID_EXPORTED_TARGET}-deployment.json.in") | ||
263 | 218 | | |||
264 | if (CMAKE_GENERATOR STREQUAL "Unix Makefiles") | 219 | if (CMAKE_GENERATOR STREQUAL "Unix Makefiles") | ||
265 | set(arguments "\\$(ARGS)") | 220 | set(arguments "\\$(ARGS)") | ||
266 | endif() | 221 | endif() | ||
267 | 222 | | |||
223 | function(havestl var access VALUE) | ||||
224 | if (NOT VALUE STREQUAL "") | ||||
225 | file(WRITE ${CMAKE_BINARY_DIR}/stl "${VALUE}") | ||||
226 | endif() | ||||
227 | endfunction() | ||||
228 | variable_watch(CMAKE_CXX_STANDARD_LIBRARIES havestl) | ||||
229 | | ||||
268 | add_custom_target(${CREATEAPK_TARGET_NAME} | 230 | add_custom_target(${CREATEAPK_TARGET_NAME} | ||
269 | COMMAND cmake -E echo "Generating $<TARGET_NAME:${QTANDROID_EXPORTED_TARGET}> with $<TARGET_FILE_DIR:Qt5::qmake>/androiddeployqt" | 231 | COMMAND cmake -E echo "Generating $<TARGET_NAME:${QTANDROID_EXPORTED_TARGET}> with $<TARGET_FILE_DIR:Qt5::qmake>/androiddeployqt" | ||
270 | COMMAND cmake -E remove_directory "${EXPORT_DIR}" | 232 | COMMAND cmake -E remove_directory "${EXPORT_DIR}" | ||
271 | COMMAND cmake -E copy_directory "${ANDROID_APK_DIR}" "${EXPORT_DIR}" | 233 | COMMAND cmake -E copy_directory "${ANDROID_APK_DIR}" "${EXPORT_DIR}" | ||
272 | COMMAND cmake -E copy "$<TARGET_FILE:${QTANDROID_EXPORTED_TARGET}>" "${EXECUTABLE_DESTINATION_PATH}" | 234 | COMMAND cmake -E copy "$<TARGET_FILE:${QTANDROID_EXPORTED_TARGET}>" "${EXECUTABLE_DESTINATION_PATH}" | ||
273 | COMMAND LANG=C cmake -DINPUT_FILE="${QTANDROID_EXPORTED_TARGET}-deployment.json.in" -DOUTPUT_FILE="${QTANDROID_EXPORTED_TARGET}-deployment.json" "-DTARGET=$<TARGET_FILE:${QTANDROID_EXPORTED_TARGET}>" "-DOUTPUT_DIR=$<TARGET_FILE_DIR:${QTANDROID_EXPORTED_TARGET}>" "-DEXPORT_DIR=${CMAKE_INSTALL_PREFIX}" "-DECM_ADDITIONAL_FIND_ROOT_PATH=\"${ECM_ADDITIONAL_FIND_ROOT_PATH}\"" -P ${_CMAKE_ANDROID_DIR}/specifydependencies.cmake | 235 | COMMAND LANG=C cmake -DINPUT_FILE="${QTANDROID_EXPORTED_TARGET}-deployment.json.in" -DOUTPUT_FILE="${QTANDROID_EXPORTED_TARGET}-deployment.json" "-DTARGET=$<TARGET_FILE:${QTANDROID_EXPORTED_TARGET}>" "-DOUTPUT_DIR=$<TARGET_FILE_DIR:${QTANDROID_EXPORTED_TARGET}>" "-DEXPORT_DIR=${CMAKE_INSTALL_PREFIX}" "-DECM_ADDITIONAL_FIND_ROOT_PATH=\"${ECM_ADDITIONAL_FIND_ROOT_PATH}\"" -P ${_CMAKE_ANDROID_DIR}/specifydependencies.cmake | ||
274 | COMMAND $<TARGET_FILE_DIR:Qt5::qmake>/androiddeployqt --gradle --input "${QTANDROID_EXPORTED_TARGET}-deployment.json" --output "${EXPORT_DIR}" --deployment bundled ${arguments} | 236 | COMMAND $<TARGET_FILE_DIR:Qt5::qmake>/androiddeployqt --gradle --input "${QTANDROID_EXPORTED_TARGET}-deployment.json" --output "${EXPORT_DIR}" --deployment bundled ${arguments} | ||
275 | ) | 237 | ) | ||
276 | 238 | | |||
277 | add_custom_target(install-apk-${QTANDROID_EXPORTED_TARGET} | 239 | add_custom_target(install-apk-${QTANDROID_EXPORTED_TARGET} | ||
278 | COMMAND adb install -r "${EXPORT_DIR}/build/outputs/apk/${QTANDROID_EXPORTED_TARGET}_build_apk-debug.apk" | 240 | COMMAND adb install -r "${EXPORT_DIR}/build/outputs/apk/${QTANDROID_EXPORTED_TARGET}_build_apk-debug.apk" | ||
279 | ) | 241 | ) | ||
280 | else() | 242 | else() | ||
281 | message(STATUS "You can export a target by specifying -DQTANDROID_EXPORTED_TARGET=<targetname>") | 243 | message(STATUS "You can export a target by specifying -DQTANDROID_EXPORTED_TARGET=<targetname>") | ||
282 | endif() | 244 | endif() |