summaryrefslogtreecommitdiffstats
path: root/cmake
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2021-07-20 12:34:39 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2021-07-23 16:32:42 +0200
commitd39f8065a23aade87a83357adf8b02cdde79f4b1 (patch)
treec0536712ea119b75a526cebed5316a72b35591db /cmake
parent132681d3a3081c1fbf2ce1b39dca4a0ee6516f25 (diff)
Add support for macOS universal builds
Change-Id: I416036a925167204cf5121108922911bce854352 Reviewed-by: Michal Klocek <michal.klocek@qt.io> (cherry picked from commit 35144cbc3a285029574ea3ef45e4a6790f9607e4)
Diffstat (limited to 'cmake')
-rw-r--r--cmake/Functions.cmake127
1 files changed, 117 insertions, 10 deletions
diff --git a/cmake/Functions.cmake b/cmake/Functions.cmake
index 3f01646ed..94d2949cf 100644
--- a/cmake/Functions.cmake
+++ b/cmake/Functions.cmake
@@ -341,6 +341,119 @@ function(extend_target_with_gn_objects target config cmakeFile stampFile)
endif()
endfunction()
+function(extend_target_with_gn_libs target config cmakeFile stampFile)
+ string(TOUPPER ${config} cfg)
+
+ # Do a partial link of all the archives into a single archive:
+ include(${buildDir}/arm64/${config}/${cmakeFile})
+ set_source_files_properties(${${cfg}_NINJA_OBJECTS} PROPERTIES GENERATED TRUE)
+
+ list(JOIN ${cfg}_NINJA_OBJECTS " " arm64_objects)
+ list(JOIN ${cfg}_NINJA_ARCHIVES " " arm64_archives)
+ file(WRITE ${buildDir}/arm64/${config}/${target}_gnobjects.rsp ${arm64_objects})
+ file(WRITE ${buildDir}/arm64/${config}/${target}_gnarchives.rsp ${arm64_archives})
+ add_custom_command(OUTPUT ${buildDir}/arm64/${config}/${target}_gnobjects.rsp
+ ${buildDir}/arm64/${config}/${target}_gnarchives.rsp
+ DEPENDS ${buildDir}/arm64/${config}/${stampFile})
+ add_custom_target(generate_arm64_rsp_${target}_${config}
+ DEPENDS
+ ${buildDir}/arm64/${config}/${target}_gnobjects.rsp
+ ${buildDir}/arm64/${config}/${target}_gnarchives.rsp)
+
+ add_custom_command(
+ OUTPUT ${buildDir}/${config}/arm64_${target}_${config}.a
+ BYPRODUCTS ${buildDir}/${config}/arm64_${target}_${config}.o
+ COMMAND clang++ -r -nostdlib -arch arm64
+ -o ${buildDir}/${config}/arm64_${target}_${config}.o
+ -Wl,-keep_private_externs
+ @${buildDir}/arm64/${config}/${target}_gnobjects.rsp
+ -Wl,-all_load
+ @${buildDir}/arm64/${config}/${target}_gnarchives.rsp
+ COMMAND ar -cr
+ ${buildDir}/${config}/arm64_${target}_${config}.a
+ ${buildDir}/${config}/arm64_${target}_${config}.o
+ DEPENDS
+ ${buildDir}/arm64/${config}/${stampFile}
+ ${buildDir}/arm64/${config}/${target}_gnobjects.rsp
+ ${buildDir}/arm64/${config}/${target}_gnarchives.rsp
+ USES_TERMINAL
+ VERBATIM
+ COMMAND_EXPAND_LISTS
+ )
+ add_custom_command(OUTPUT ${${cfg}_NINJA_OBJECTS} ${${cfg}_NINJA_ARCHIVES}
+ DEPENDS ${buildDir}/arm64/${config}/${stampFile})
+ add_custom_target(generate_arm64_${target}_${config}
+ DEPENDS ${${cfg}_NINJA_OBJECTS} ${${cfg}_NINJA_ARCHIVES})
+
+ include(${buildDir}/x86_64/${config}/${cmakeFile})
+ set_source_files_properties(${${cfg}_NINJA_OBJECTS} PROPERTIES GENERATED TRUE)
+
+ list(JOIN ${cfg}_NINJA_OBJECTS " " x64_objects)
+ list(JOIN ${cfg}_NINJA_ARCHIVES " " x64_archives)
+ file(WRITE ${buildDir}/x86_64/${config}/${target}_gnobjects.rsp ${x64_objects})
+ file(WRITE ${buildDir}/x86_64/${config}/${target}_gnarchives.rsp ${x64_archives})
+ add_custom_command(OUTPUT ${buildDir}/x86_64/${config}/${target}_gnobjects.rsp
+ ${buildDir}/x86_64/${config}/${target}_gnarchives.rsp
+ DEPENDS ${buildDir}/x86_64/${config}/${stampFile})
+ add_custom_target(generate_x64_rsp_${target}_${config}
+ DEPENDS
+ ${buildDir}/x86_64/${config}/${target}_gnobjects.rsp
+ ${buildDir}/x86_64/${config}/${target}_gnarchives.rsp)
+
+ add_custom_command(
+ OUTPUT ${buildDir}/${config}/x64_${target}_${config}.a
+ BYPRODUCTS ${buildDir}/${config}/x64_${target}_${config}.o
+ COMMAND clang++ -r -nostdlib -arch x86_64
+ -o ${buildDir}/${config}/x64_${target}_${config}.o
+ -Wl,-keep_private_externs
+ @${buildDir}/x86_64/${config}/${target}_gnobjects.rsp
+ -Wl,-all_load
+ @${buildDir}/x86_64/${config}/${target}_gnarchives.rsp
+ COMMAND ar -cr
+ ${buildDir}/${config}/x64_${target}_${config}.a
+ ${buildDir}/${config}/x64_${target}_${config}.o
+ DEPENDS
+ ${buildDir}/x86_64/${config}/${stampFile}
+ ${buildDir}/x86_64/${config}/${target}_gnobjects.rsp
+ ${buildDir}/x86_64/${config}/${target}_gnarchives.rsp
+ USES_TERMINAL
+ VERBATIM
+ COMMAND_EXPAND_LISTS
+ )
+ add_custom_command(OUTPUT ${${cfg}_NINJA_OBJECTS} ${${cfg}_NINJA_ARCHIVES}
+ DEPENDS ${buildDir}/x86_64/${config}/${stampFile})
+ add_custom_target(generate_x86_64_${target}_${config}
+ DEPENDS ${${cfg}_NINJA_OBJECTS} ${${cfg}_NINJA_ARCHIVES})
+
+ add_custom_target(generate1_${target}_${config}
+ DEPENDS ${buildDir}/${config}/arm64_${target}_${config}.a
+ ${buildDir}/${config}/x64_${target}_${config}.a)
+
+ # Lipo the object files together to a single fat archive
+ add_library(${target}_${config} STATIC IMPORTED GLOBAL)
+ add_custom_command(
+ OUTPUT ${buildDir}/${config}/lib${target}_${config}.a
+ COMMAND lipo -create
+ -output ${buildDir}/${config}/lib${target}_${config}.a
+ ARGS
+ ${buildDir}/${config}/arm64_${target}_${config}.a
+ ${buildDir}/${config}/x64_${target}_${config}.a
+ DEPENDS
+ ${buildDir}/${config}/arm64_${target}_${config}.a
+ ${buildDir}/${config}/x64_${target}_${config}.a
+ USES_TERMINAL
+ VERBATIM
+ )
+ set_property(TARGET ${target}_${config}
+ PROPERTY IMPORTED_LOCATION_${cfg} ${buildDir}/${config}/lib${target}_${config}.a)
+ add_custom_target(generate2_${target}_${config}
+ DEPENDS ${buildDir}/${config}/lib${target}_${config}.a)
+ target_link_libraries(${target} PRIVATE ${target}_${config})
+
+ # Just link with dynamic libs once
+ target_link_libraries(${target} PUBLIC "$<$<CONFIG:${config}>:${${cfg}_NINJA_LIBS}>")
+endfunction()
+
function(qt_internal_add_external_project_dependency_to_root_project name)
set(independent_args)
cmake_policy(PUSH)
@@ -702,15 +815,9 @@ macro(append_toolchain_setup)
if(CMAKE_SYSROOT)
list(APPEND gnArgArg target_sysroot="${CMAKE_SYSROOT}")
endif()
- endif()
- if(WIN32)
- list(APPEND gnArgArg target_cpu="x64")
- endif()
- if(MAC AND (CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64" OR
- CMAKE_OSX_ARCHITECTURES STREQUAL "arm64"))
- list(APPEND gnArgArg
- target_cpu="arm64"
- )
+ else()
+ get_gn_arch(cpu ${arch})
+ list(APPEND gnArgArg target_cpu="${cpu}")
endif()
endmacro()
@@ -762,7 +869,7 @@ macro(execute_ninja ninjaTargets)
${sandboxOutput}
${buildDir}/${config}/runAlways # use generator expression in CMAKE 3.20
WORKING_DIRECTORY ${buildDir}/${config}
- COMMAND ${CMAKE_COMMAND} -E echo "Ninja ${config} build"
+ COMMENT "Ninja ${arch} ${config} build"
COMMAND Ninja::ninja
${NINJAFLAGS}
-C ${buildDir}/${config}