diff --git a/scripts/cmake/vcpkg_configure_make.cmake b/scripts/cmake/vcpkg_configure_make.cmake index 3e9c4378767926..72b9da43a34b06 100644 --- a/scripts/cmake/vcpkg_configure_make.cmake +++ b/scripts/cmake/vcpkg_configure_make.cmake @@ -116,6 +116,8 @@ macro(z_vcpkg_determine_autotools_host_cpu out_var) endif() if(host_arch MATCHES "(amd|AMD)64") set(${out_var} x86_64) + elseif(host_arch MATCHES "(x|X)86_64") + set(${out_var} x86_64) elseif(host_arch MATCHES "(x|X)86") set(${out_var} i686) elseif(host_arch MATCHES "^(ARM|arm)64$") @@ -225,6 +227,14 @@ macro(z_convert_to_list input output) string(REGEX MATCHALL "(( +|^ *)[^ ]+)" ${output} "${${input}}") endmacro() +macro(z_vcpkg_setup_detected_env env_name cmake_var) + if(VCPKG_DETECTED_${cmake_var}) + if(NOT VCPKG_TARGET_IS_OSX) + set(ENV{${env_name}} "${VCPKG_DETECTED_${cmake_var}}") + endif() + endif() +endmacro() + function(vcpkg_configure_make) # parse parameters such that semicolons in options arguments to COMMAND don't get erased cmake_parse_arguments(PARSE_ARGV 0 arg @@ -282,8 +292,9 @@ function(vcpkg_configure_make) # Backup environment variables # CCAS CC C CPP CXX FC FF GC LD LF LIBTOOL OBJC OBJCXX R UPC Y set(cm_FLAGS AS CCAS CC C CPP CXX FC FF GC LD LF LIBTOOL OBJC OBJXX R UPC Y RC) + set(cm_TOOLS CC CXX AR AS LD RANLIB READELF STRIP) list(TRANSFORM cm_FLAGS APPEND "FLAGS") - vcpkg_backup_env_variables(VARS ${cm_FLAGS}) + vcpkg_backup_env_variables(VARS ${cm_FLAGS} ${cm_TOOLS}) # FC fotran compiler | FF Fortran 77 compiler @@ -469,6 +480,36 @@ function(vcpkg_configure_make) endif() endif() + # Android - cross-compiling support + if(VCPKG_TARGET_IS_ANDROID) + # This is temporarily disabled since it just avoid some warnings. + # if(VCPKG_DETECTED_CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + # string(REPLACE "-static-libstdc++" "-lc++_static" VCPKG_DETECTED_CMAKE_CXX_STANDARD_LIBRARIES ${VCPKG_DETECTED_CMAKE_CXX_STANDARD_LIBRARIES}) + # endif() + + if(arg_DETERMINE_BUILD_TRIPLET OR NOT arg_BUILD_TRIPLET) + if(VCPKG_HOST_IS_WINDOWS) + z_vcpkg_determine_autotools_host_cpu(BUILD_ARCH) + z_vcpkg_determine_host_mingw(BUILD_MINGW) + set(arg_BUILD_TRIPLET "--build=${BUILD_ARCH}-pc-${BUILD_MINGW}") + elseif(VCPKG_HOST_IS_OSX) + z_vcpkg_determine_autotools_host_arch_mac(BUILD_ARCH) + set(arg_BUILD_TRIPLET "--build=${BUILD_ARCH}-apple-darwin") + else() + z_vcpkg_determine_autotools_host_cpu(BUILD_ARCH) + set(arg_BUILD_TRIPLET "--build=${BUILD_ARCH}-pc-linux-gnu") + endif() + + z_vcpkg_determine_autotools_target_cpu(TARGET_ARCH) + if(TARGET_ARCH MATCHES "armv7-a") + string(APPEND arg_BUILD_TRIPLET " --host=arm-linux-androideabi") + else() + string(APPEND arg_BUILD_TRIPLET " --host=${TARGET_ARCH}-linux-android") + endif() + endif() + debug_message("Using make triplet: ${arg_BUILD_TRIPLET}") + endif() + # Linux - cross-compiling support if(VCPKG_TARGET_IS_LINUX) if (requires_autoconfig AND NOT arg_BUILD_TRIPLET OR arg_DETERMINE_BUILD_TRIPLET) @@ -745,6 +786,13 @@ function(vcpkg_configure_make) vcpkg_list(JOIN tmp " " "${var}") endforeach() + foreach(tool IN ITEMS AR AS MT NM RANLIB READELF STRIP OBJDUMP DLLTOOL) + z_vcpkg_setup_detected_env(${tool} "CMAKE_${tool}") + endforeach() + z_vcpkg_setup_detected_env(CC CMAKE_C_COMPILER) + z_vcpkg_setup_detected_env(CXX CMAKE_CXX_COMPILER) + z_vcpkg_setup_detected_env(LD CMAKE_LINKER) + foreach(current_buildtype IN LISTS all_buildtypes) foreach(ENV_VAR ${arg_CONFIG_DEPENDENT_ENVIRONMENT}) if(DEFINED ENV{${ENV_VAR}}) @@ -772,7 +820,6 @@ function(vcpkg_configure_make) set(ENV{PKG_CONFIG_PATH} "${pkgconfig_installed_dir}${VCPKG_HOST_PATH_SEPARATOR}${pkgconfig_installed_share_dir}") endif() - # Setup environment set(ENV{CPPFLAGS} "${CPPFLAGS_${current_buildtype}}") set(ENV{CFLAGS} "${CFLAGS_${current_buildtype}}") set(ENV{CXXFLAGS} "${CXXFLAGS_${current_buildtype}}") @@ -866,7 +913,7 @@ function(vcpkg_configure_make) endif() # Restore environment - vcpkg_restore_env_variables(VARS ${cm_FLAGS} LIB LIBPATH LIBRARY_PATH LD_LIBRARY_PATH) + vcpkg_restore_env_variables(VARS ${cm_FLAGS} ${cm_TOOLS} LIB LIBPATH LIBRARY_PATH LD_LIBRARY_PATH) set(_VCPKG_PROJECT_SOURCE_PATH ${arg_SOURCE_PATH} PARENT_SCOPE) set(_VCPKG_PROJECT_SUBPATH ${arg_PROJECT_SUBPATH} PARENT_SCOPE) diff --git a/scripts/get_cmake_vars/CMakeLists.txt b/scripts/get_cmake_vars/CMakeLists.txt index 23b7d64e7fada0..102e6362afccb6 100644 --- a/scripts/get_cmake_vars/CMakeLists.txt +++ b/scripts/get_cmake_vars/CMakeLists.txt @@ -6,15 +6,16 @@ set(OUTPUT_STRING) # Build default checklists list(APPEND VCPKG_DEFAULT_VARS_TO_CHECK CMAKE_CROSSCOMPILING CMAKE_SYSTEM_NAME - CMAKE_HOST_SYSTEM_NAME + CMAKE_SYSTEM_VERSION CMAKE_SYSTEM_PROCESSOR + CMAKE_HOST_SYSTEM_NAME CMAKE_HOST_SYSTEM_PROCESSOR) if(CMAKE_SYSTEM_NAME MATCHES "Darwin") list(APPEND VCPKG_DEFAULT_VARS_TO_CHECK CMAKE_OSX_DEPLOYMENT_TARGET CMAKE_OSX_SYSROOT) endif() # Programs to check -set(PROGLIST AR RANLIB STRIP NM OBJDUMP DLLTOOL MT LINKER) +set(PROGLIST AR RANLIB READELF STRIP NM OBJDUMP DLLTOOL MT LINKER) foreach(prog IN LISTS PROGLIST) list(APPEND VCPKG_DEFAULT_VARS_TO_CHECK CMAKE_${prog}) endforeach() @@ -77,7 +78,7 @@ endif() project(get_cmake_vars LANGUAGES ${VCPKG_LANGUAGES}) foreach(VAR IN LISTS VCPKG_VARS_TO_CHECK) - string(APPEND OUTPUT_STRING "set(${VCPKG_VAR_PREFIX}_${VAR} \"${${VAR}}\")\n") + string(APPEND OUTPUT_STRING "set(${VCPKG_VAR_PREFIX}_${VAR} \"${${VAR}}\")\n") endforeach() foreach(_env IN LISTS VCPKG_ENV_VARS_TO_CHECK) @@ -97,7 +98,6 @@ macro(_vcpkg_adjust_flags flag_var) if("${flag_var}" IN_LIST VCPKG_LANG_FLAGS) # macOS - append arch and isysroot if cross-compiling if(NOT "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "${CMAKE_HOST_SYSTEM_PROCESSOR}") - foreach(arch IN LISTS CMAKE_OSX_ARCHITECTURES) string(APPEND ${flag_var} " -arch ${arch}") endforeach() @@ -108,6 +108,21 @@ macro(_vcpkg_adjust_flags flag_var) endif() endif() endif() + if(CMAKE_SYSTEM_NAME MATCHES "Android") + if("${flag_var}" MATCHES "CMAKE_(C|CXX)_FLAGS$") + if(ANDROID_NDK_MAJOR GREATER_EQUAL 23) + if (ANDROID_LLVM_TRIPLE MATCHES "[0-9]+") + string(APPEND ${flag_var} " ${CMAKE_CXX_COMPILE_OPTIONS_TARGET}${ANDROID_LLVM_TRIPLE} ") + else() + string(APPEND ${flag_var} " ${CMAKE_CXX_COMPILE_OPTIONS_TARGET}${ANDROID_LLVM_TRIPLE}${ANDROID_NATIVE_API_LEVEL} ") + endif() + elseif(ANDROID_NDK_MAJOR GREATER_EQUAL 19) + string(REGEX REPLACE "-march=[^ ]+" "" ${flag_var} "${${flag_var}}") + string(REGEX REPLACE "-mtune=[^ ]+" "" ${flag_var} "${${flag_var}}") + string(APPEND ${flag_var} " ${CMAKE_CXX_COMPILE_OPTIONS_TARGET}${ANDROID_LLVM_TRIPLE} ") + endif() + endif() + endif() endmacro() foreach(flag IN LISTS VCPKG_FLAGS_TO_CHECK) @@ -124,7 +139,6 @@ foreach(flag IN LISTS VCPKG_FLAGS_TO_CHECK) endforeach() endforeach() - file(WRITE "${VCPKG_OUTPUT_FILE}" "${OUTPUT_STRING}") # Programs: diff --git a/scripts/toolchains/android.cmake b/scripts/toolchains/android.cmake index fb4e66cd6b04ac..9f2e95407102da 100644 --- a/scripts/toolchains/android.cmake +++ b/scripts/toolchains/android.cmake @@ -1,13 +1,15 @@ set(ANDROID_CPP_FEATURES "rtti exceptions" CACHE STRING "") set(CMAKE_SYSTEM_NAME Android CACHE STRING "") set(ANDROID_TOOLCHAIN clang CACHE STRING "") -set(ANDROID_NATIVE_API_LEVEL ${CMAKE_SYSTEM_VERSION} CACHE STRING "") -if(CMAKE_SYSTEM_VERSION MATCHES "^[0-9]+$") - set(ANDROID_PLATFORM android-${CMAKE_SYSTEM_VERSION} CACHE STRING "") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION clang CACHE STRING "") + +if ($ENV{VCPKG_ANDROID_NATIVE_API_LEVEL} STREQUAL "detect") + set(ANDROID_NATIVE_API_LEVEL ${CMAKE_SYSTEM_VERSION} CACHE STRING "") +elseif ($ENV{VCPKG_ANDROID_NATIVE_API_LEVEL} MATCHES "^[1-3][0-9]$") + set(ANDROID_NATIVE_API_LEVEL $ENV{VCPKG_ANDROID_NATIVE_API_LEVEL} CACHE STRING "") else() - set(ANDROID_PLATFORM ${CMAKE_SYSTEM_VERSION} CACHE STRING "") + message(FATAL_ERROR "$VCPKG_ANDROID_NATIVE_API_LEVEL should be two digits or \"detect\"") endif() -set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION clang CACHE STRING "") if (VCPKG_TARGET_TRIPLET MATCHES "arm64-android") set(ANDROID_ABI arm64-v8a CACHE STRING "") @@ -48,6 +50,27 @@ if(NOT EXISTS "${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake") message(FATAL_ERROR "Could not find android ndk. Searched at ${ANDROID_NDK_HOME}") endif() +# Android NDK revision +file(READ "${ANDROID_NDK_HOME}/source.properties" ANDROID_NDK_SOURCE_PROPERTIES) + +set(ANDROID_NDK_REVISION_REGEX + "^Pkg\\.Desc = Android NDK\nPkg\\.Revision = ([0-9]+)\\.([0-9]+)\\.([0-9]+)(-beta([0-9]+))?") +if(NOT ANDROID_NDK_SOURCE_PROPERTIES MATCHES "${ANDROID_NDK_REVISION_REGEX}") + message(SEND_ERROR "Failed to parse Android NDK revision: ${CMAKE_ANDROID_NDK}/source.properties.\n${ANDROID_NDK_SOURCE_PROPERTIES}") +endif() + +set(ANDROID_NDK_MAJOR "${CMAKE_MATCH_1}") +#set(ANDROID_NDK_MINOR "${CMAKE_MATCH_2}") +#set(ANDROID_NDK_BUILD "${CMAKE_MATCH_3}") + +if(ANDROID_NDK_MAJOR GREATER 20) + set(ANDROID_PLATFORM "${ANDROID_NATIVE_API_LEVEL}") +elseif(ANDROID_NDK_MAJOR GREATER 18) + set(ANDROID_PLATFORM "android-${ANDROID_NDK_MAJOR}") +else() + message(FATAL_ERROR "Android NDK r18 and older is not supported yet") +endif() + include("${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake") if(NOT _VCPKG_ANDROID_TOOLCHAIN) diff --git a/triplets/community/arm-android.cmake b/triplets/community/arm-android.cmake index 29ba5655ae3154..f84e371a2825b4 100644 --- a/triplets/community/arm-android.cmake +++ b/triplets/community/arm-android.cmake @@ -2,3 +2,6 @@ set(VCPKG_TARGET_ARCHITECTURE arm) set(VCPKG_CRT_LINKAGE static) set(VCPKG_LIBRARY_LINKAGE static) set(VCPKG_CMAKE_SYSTEM_NAME Android) +# If you need to specify the ANDROID_NATIVE_API_LEVEL, +# please use the overlay triplet and set the value below +set(ENV{VCPKG_ANDROID_NATIVE_API_LEVEL} "detect") diff --git a/triplets/community/arm-neon-android.cmake b/triplets/community/arm-neon-android.cmake index 29ba5655ae3154..f84e371a2825b4 100644 --- a/triplets/community/arm-neon-android.cmake +++ b/triplets/community/arm-neon-android.cmake @@ -2,3 +2,6 @@ set(VCPKG_TARGET_ARCHITECTURE arm) set(VCPKG_CRT_LINKAGE static) set(VCPKG_LIBRARY_LINKAGE static) set(VCPKG_CMAKE_SYSTEM_NAME Android) +# If you need to specify the ANDROID_NATIVE_API_LEVEL, +# please use the overlay triplet and set the value below +set(ENV{VCPKG_ANDROID_NATIVE_API_LEVEL} "detect") diff --git a/triplets/community/arm64-android.cmake b/triplets/community/arm64-android.cmake index 20b255d39267ad..a2096a5e62e15c 100644 --- a/triplets/community/arm64-android.cmake +++ b/triplets/community/arm64-android.cmake @@ -2,3 +2,6 @@ set(VCPKG_TARGET_ARCHITECTURE arm64) set(VCPKG_CRT_LINKAGE static) set(VCPKG_LIBRARY_LINKAGE static) set(VCPKG_CMAKE_SYSTEM_NAME Android) +# If you need to specify the ANDROID_NATIVE_API_LEVEL, +# please use the overlay triplet and set the value below +set(ENV{VCPKG_ANDROID_NATIVE_API_LEVEL} "detect") diff --git a/triplets/community/armv6-android.cmake b/triplets/community/armv6-android.cmake index 29ba5655ae3154..f84e371a2825b4 100644 --- a/triplets/community/armv6-android.cmake +++ b/triplets/community/armv6-android.cmake @@ -2,3 +2,6 @@ set(VCPKG_TARGET_ARCHITECTURE arm) set(VCPKG_CRT_LINKAGE static) set(VCPKG_LIBRARY_LINKAGE static) set(VCPKG_CMAKE_SYSTEM_NAME Android) +# If you need to specify the ANDROID_NATIVE_API_LEVEL, +# please use the overlay triplet and set the value below +set(ENV{VCPKG_ANDROID_NATIVE_API_LEVEL} "detect") diff --git a/triplets/community/x64-android.cmake b/triplets/community/x64-android.cmake index 6342ce5361a1af..1b7214327424d4 100644 --- a/triplets/community/x64-android.cmake +++ b/triplets/community/x64-android.cmake @@ -2,3 +2,6 @@ set(VCPKG_TARGET_ARCHITECTURE x64) set(VCPKG_CRT_LINKAGE static) set(VCPKG_LIBRARY_LINKAGE static) set(VCPKG_CMAKE_SYSTEM_NAME Android) +# If you need to specify the ANDROID_NATIVE_API_LEVEL, +# please use the overlay triplet and set the value below +set(ENV{VCPKG_ANDROID_NATIVE_API_LEVEL} "detect") diff --git a/triplets/community/x86-android.cmake b/triplets/community/x86-android.cmake index ca0fbaeffb0e07..f3e0d3bea21f38 100644 --- a/triplets/community/x86-android.cmake +++ b/triplets/community/x86-android.cmake @@ -2,3 +2,6 @@ set(VCPKG_TARGET_ARCHITECTURE x86) set(VCPKG_CRT_LINKAGE static) set(VCPKG_LIBRARY_LINKAGE static) set(VCPKG_CMAKE_SYSTEM_NAME Android) +# If you need to specify the ANDROID_NATIVE_API_LEVEL, +# please use the overlay triplet and set the value below +set(ENV{VCPKG_ANDROID_NATIVE_API_LEVEL} "detect")