summaryrefslogtreecommitdiffstats
path: root/cmake
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2021-05-23 17:39:28 +0200
committerMichal Klocek <michal.klocek@qt.io>2021-07-02 12:51:15 +0200
commit3a962d8a2d3b70639a195fe5fd442f6c653bbe8f (patch)
treefc29d1aa945b0ad90c9a558e6e3155f4c35f1f9a /cmake
parent9e8f10247a5c5d433f5f983345f636fbedb26e2d (diff)
Add cross compilation support to cmake builds
Add arm cross-compile basic support. CMake does not support host builds. However we do host build with gn and changing that would require an extra effort to keep all necessary changes with Chromium upstream. Therefore let gn to perform the host build for required tools and just feed gn with all the build data. Add new build steps: * install gn into QT_HOST_PATH/libexec. * run hostBuild project to get native architecture and compiler * call PkgConfigHost to pass pkg-config paths to gn * create wrapper script for host pkg-config to escape yocto shell pkg config exports This change also splits gn toolchain into 3 toolchains host,target,v8 Now hostBuild provides host and v8 toolchain in case of cross compile. The build optimizations will follow in another patch. Fix not existing 'boot2qt' condition and enables more test on QEMU. Note this is tested only with yocto based images. Pick-to: dev Task-number: QTBUG-91760 Change-Id: Ic2bea12229acc71fbd36a848e9ed4fed7e14b485 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'cmake')
-rw-r--r--cmake/FindGn.cmake9
-rw-r--r--cmake/FindNinja.cmake4
-rw-r--r--cmake/FindPkgConfigHost.cmake40
-rw-r--r--cmake/Functions.cmake45
4 files changed, 92 insertions, 6 deletions
diff --git a/cmake/FindGn.cmake b/cmake/FindGn.cmake
index 12a90778c..abfa0fe26 100644
--- a/cmake/FindGn.cmake
+++ b/cmake/FindGn.cmake
@@ -1,9 +1,10 @@
if (NOT DEFINED WEBENGINE_ROOT_BUILD_DIR)
- set(WEBENGINE_ROOT_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/../..)
+ set(WEBENGINE_ROOT_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR})
+endif()
+find_program(Gn_EXECUTABLE NAMES gn PATHS "${WEBENGINE_ROOT_BUILD_DIR}/install/bin" NO_DEFAULT_PATH)
+if(NOT QT_HOST_PATH STREQUAL "")
+ find_program(Gn_EXECUTABLE NAMES gn PATHS ${QT_HOST_PATH}/${INSTALL_LIBEXECDIR} NO_DEFAULT_PATH)
endif()
-
-set(CMAKE_PROGRAM_PATH ${WEBENGINE_ROOT_BUILD_DIR}/install/bin)
-
find_program(Gn_EXECUTABLE NAMES gn)
if(Gn_EXECUTABLE)
diff --git a/cmake/FindNinja.cmake b/cmake/FindNinja.cmake
index 3615d58b9..720e73266 100644
--- a/cmake/FindNinja.cmake
+++ b/cmake/FindNinja.cmake
@@ -1,8 +1,8 @@
if (NOT DEFINED WEBENGINE_ROOT_BUILD_DIR)
- set(WEBENGINE_ROOT_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/..)
+ set(WEBENGINE_ROOT_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR})
endif()
-set(CMAKE_PROGRAM_PATH ${WEBENGINE_ROOT_BUILD_DIR}/install/bin)
+find_program(Ninja_EXECUTABLE NAMES ninja ninja-build PATHS "${WEBENGINE_ROOT_BUILD_DIR}/install/bin" NO_DEFAULT_PATH)
find_program(Ninja_EXECUTABLE NAMES ninja ninja-build)
if(Ninja_EXECUTABLE)
diff --git a/cmake/FindPkgConfigHost.cmake b/cmake/FindPkgConfigHost.cmake
new file mode 100644
index 000000000..de0216384
--- /dev/null
+++ b/cmake/FindPkgConfigHost.cmake
@@ -0,0 +1,40 @@
+# this is just simply pkg config wrapper to pass executable path to gn
+
+if(CMAKE_CROSSCOMPILING)
+ # find pkg-config, use PKG_CONFIG_HOST if set
+ if((NOT PKG_CONFIG_HOST_EXECUTABLE) AND (NOT "$ENV{PKG_CONFIG_HOST}" STREQUAL ""))
+ set(PKG_CONFIG_HOST_EXECUTABLE "$ENV{PKG_CONFIG_HOST}" CACHE FILEPATH "pkg-config host executable")
+ endif()
+
+ find_program(PKG_CONFIG_HOST_EXECUTABLE NAMES "pkg-config" DOC "pkg-config executable"
+ NO_SYSTEM_ENVIRONMENT_PATH
+ NO_CMAKE_FIND_ROOT_PATH
+ )
+
+ if(PKG_CONFIG_HOST_EXECUTABLE)
+ mark_as_advanced(PKG_CONFIG_HOST_EXECUTABLE)
+ execute_process(COMMAND ${PKG_CONFIG_HOST_EXECUTABLE} --version
+ OUTPUT_VARIABLE PKG_CONFIG_HOST_VERSION_STRING
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ ERROR_QUIET)
+ endif ()
+
+ include(FindPackageHandleStandardArgs)
+ find_package_handle_standard_args(PkgConfigHost
+ FOUND_VAR PkgConfigHost_FOUND
+ VERSION_VAR PKG_CONFIG_HOST_VERSION_STRING
+ REQUIRED_VARS PKG_CONFIG_HOST_EXECUTABLE
+ )
+else() # if not corss build simply wrap FindPkgConfig
+ find_package(PkgConfig)
+ if(PKG_CONFIG_FOUND)
+ include(FindPackageHandleStandardArgs)
+ set(PKG_CONFIG_HOST_VERSION ${PKG_CONFIG_VERSION})
+ set(PKG_CONFIG_HOST_EXECUTABLE ${PKG_CONFIG_EXECUTABLE})
+ find_package_handle_standard_args(PkgConfigHost
+ FOUND_VAR PkgConfigHost_FOUND
+ VERSION_VAR PKG_CONFIG_HOST_VERSION_STRING
+ REQUIRED_VARS PKG_CONFIG_HOST_EXECUTABLE
+ )
+ endif()
+endif()
diff --git a/cmake/Functions.cmake b/cmake/Functions.cmake
index 837ae272a..8bdeaa2ad 100644
--- a/cmake/Functions.cmake
+++ b/cmake/Functions.cmake
@@ -360,3 +360,48 @@ function(qt_internal_add_external_project_dependency_to_root_project name)
cmake_policy(POP)
endfunction()
+
+function(get_gn_arch result arch)
+ if("${arch}" STREQUAL "i386")
+ set(${result} "x86" PARENT_SCOPE)
+ elseif("${arch}" STREQUAL "x86_64")
+ set(${result} "x64" PARENT_SCOPE)
+ elseif("${arch}" STREQUAL "arm")
+ set(${result} "arm" PARENT_SCOPE)
+ elseif("${arch}" STREQUAL "arm64")
+ set(${result} "arm64" PARENT_SCOPE)
+ elseif("${arch}" STREQUAL "mipsel")
+ set(${result} "mipsel" PARENT_SCOPE)
+ elseif("${arch}" STREQUAL "mipsel64")
+ set(${result} "mips64el" PARENT_SCOPE)
+ else()
+ message(DEBUG "Unsupported achitecture: ${arch}")
+ endif()
+endfunction()
+
+function(get_v8_arch result targetArch)
+ set(list32 i386 arm mipsel)
+ if("${targetArch}" IN_LIST list32)
+ set(${result} "i386" PARENT_SCOPE)
+ else()
+ set(${result} "x86_64" PARENT_SCOPE)
+ endif()
+endfunction()
+
+function(configure_gn_toolchain name cpuType v8CpuType toolchainIn toolchainOut)
+ set(GN_TOOLCHAIN ${name})
+ get_gn_arch(GN_CPU ${cpuType})
+ get_gn_arch(GN_V8_CPU ${v8CpuType})
+ configure_file(${toolchainIn} ${toolchainOut}/BUILD.gn @ONLY)
+endfunction()
+
+function(create_pkg_config_host_wrapper wrapperName wrapperCmd)
+ file(WRITE ${wrapperName}
+ "#!/bin/sh\n"
+ "unset PKG_CONFIG_LIBDIR\n"
+ "unset PKG_CONFIG_PATH\n"
+ "unset PKG_CONFIG_SYSROOT_DIR\n"
+ "exec ${wrapperCmd} \"$@\""
+ )
+ file(CHMOD ${wrapperName} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE)
+endfunction()