diff --git a/scripts/cmake/vcpkg_configure_make.cmake b/scripts/cmake/vcpkg_configure_make.cmake index 95c1fb322751b5..755c0a8949b8dc 100644 --- a/scripts/cmake/vcpkg_configure_make.cmake +++ b/scripts/cmake/vcpkg_configure_make.cmake @@ -299,7 +299,9 @@ function(vcpkg_configure_make) # Only for ports using autotools so we can assume that they follow the common conventions for build/target/host set(_csc_BUILD_TRIPLET "--build=${BUILD_ARCH}-pc-mingw32") # This is required since we are running in a msys # shell which will be otherwise identified as ${BUILD_ARCH}-pc-msys - if(NOT TARGET_ARCH MATCHES "${BUILD_ARCH}") # we don't need to specify the additional flags if we build nativly. + if(VCPKG_DETECTED_CMAKE_C_COMPILER_TARGET) + string(APPEND _csc_BUILD_TRIPLET " --host=${VCPKG_DETECTED_CMAKE_C_COMPILER_TARGET}") + elseif(NOT TARGET_ARCH MATCHES "${BUILD_ARCH}") # we don't need to specify the additional flags if we build nativly. string(APPEND _csc_BUILD_TRIPLET " --host=${TARGET_ARCH}-pc-mingw32") # (Host activates crosscompilation; The name given here is just the prefix of the host tools for the target) endif() if(VCPKG_TARGET_IS_UWP AND NOT _csc_BUILD_TRIPLET MATCHES "--host") @@ -339,11 +341,10 @@ function(vcpkg_configure_make) endif() endforeach() if (_csc_AUTOCONFIG OR _csc_USE_WRAPPERS) # without autotools we assume a custom configure script which correctly handles cl and lib. Otherwise the port needs to set CC|CXX|AR and probably CPP - _vcpkg_append_to_configure_environment(CONFIGURE_ENV CPP "compile ${VCPKG_DETECTED_CMAKE_C_COMPILER} -E") - - _vcpkg_append_to_configure_environment(CONFIGURE_ENV CC "compile ${VCPKG_DETECTED_CMAKE_C_COMPILER}") - _vcpkg_append_to_configure_environment(CONFIGURE_ENV CC_FOR_BUILD "compile ${VCPKG_DETECTED_CMAKE_C_COMPILER}") - _vcpkg_append_to_configure_environment(CONFIGURE_ENV CXX "compile ${VCPKG_DETECTED_CMAKE_CXX_COMPILER}") + _vcpkg_append_to_configure_environment(CONFIGURE_ENV CPP "compile ${VCPKG_DETECTED_CMAKE_C_COMPILER} ${VCPKG_DETECTED_CMAKE_C_COMPILER_ARG1} -E") + _vcpkg_append_to_configure_environment(CONFIGURE_ENV CC "compile ${VCPKG_DETECTED_CMAKE_C_COMPILER} ${VCPKG_DETECTED_CMAKE_C_COMPILER_ARG1}") + _vcpkg_append_to_configure_environment(CONFIGURE_ENV CC_FOR_BUILD "compile ${VCPKG_DETECTED_CMAKE_C_COMPILER} ${VCPKG_DETECTED_CMAKE_C_COMPILER_ARG1}") + _vcpkg_append_to_configure_environment(CONFIGURE_ENV CXX "compile ${VCPKG_DETECTED_CMAKE_CXX_COMPILER} ${VCPKG_DETECTED_CMAKE_CXX_COMPILER_ARG1}") _vcpkg_append_to_configure_environment(CONFIGURE_ENV RC "windres-rc ${VCPKG_DETECTED_CMAKE_RC_COMPILER}") _vcpkg_append_to_configure_environment(CONFIGURE_ENV WINDRES "windres-rc ${VCPKG_DETECTED_CMAKE_RC_COMPILER}") if(VCPKG_DETECTED_CMAKE_AR) @@ -352,10 +353,10 @@ function(vcpkg_configure_make) _vcpkg_append_to_configure_environment(CONFIGURE_ENV AR "ar-lib lib.exe -verbose") endif() else() - _vcpkg_append_to_configure_environment(CONFIGURE_ENV CPP "${VCPKG_DETECTED_CMAKE_C_COMPILER} -E") - _vcpkg_append_to_configure_environment(CONFIGURE_ENV CC "${VCPKG_DETECTED_CMAKE_C_COMPILER}") - _vcpkg_append_to_configure_environment(CONFIGURE_ENV CC_FOR_BUILD "${VCPKG_DETECTED_CMAKE_C_COMPILER}") - _vcpkg_append_to_configure_environment(CONFIGURE_ENV CXX "${VCPKG_DETECTED_CMAKE_CXX_COMPILER}") + _vcpkg_append_to_configure_environment(CONFIGURE_ENV CPP "${VCPKG_DETECTED_CMAKE_C_COMPILER} ${VCPKG_DETECTED_CMAKE_C_COMPILER_ARG1} -E") + _vcpkg_append_to_configure_environment(CONFIGURE_ENV CC "${VCPKG_DETECTED_CMAKE_C_COMPILER} ${VCPKG_DETECTED_CMAKE_C_COMPILER_ARG1}") + _vcpkg_append_to_configure_environment(CONFIGURE_ENV CC_FOR_BUILD "${VCPKG_DETECTED_CMAKE_C_COMPILER} ${VCPKG_DETECTED_CMAKE_C_COMPILER_ARG1}") + _vcpkg_append_to_configure_environment(CONFIGURE_ENV CXX "${VCPKG_DETECTED_CMAKE_CXX_COMPILER} ${VCPKG_DETECTED_CMAKE_CXX_COMPILER_ARG1}") if(VCPKG_DETECTED_CMAKE_AR) _vcpkg_append_to_configure_environment(CONFIGURE_ENV AR "${VCPKG_DETECTED_CMAKE_AR}") else() diff --git a/scripts/get_cmake_vars/CMakeLists.txt b/scripts/get_cmake_vars/CMakeLists.txt index 6be594787392e4..aa992017504c40 100644 --- a/scripts/get_cmake_vars/CMakeLists.txt +++ b/scripts/get_cmake_vars/CMakeLists.txt @@ -29,6 +29,8 @@ foreach(_lang IN LISTS VCPKG_LANGUAGES) list(APPEND VCPKG_DEFAULT_VARS_TO_CHECK CMAKE_${_lang}_STANDARD) list(APPEND VCPKG_DEFAULT_VARS_TO_CHECK CMAKE_${_lang}_COMPILE_FEATURES) list(APPEND VCPKG_DEFAULT_VARS_TO_CHECK CMAKE_${_lang}_EXTENSION) + list(APPEND VCPKG_DEFAULT_VARS_TO_CHECK CMAKE_${_lang}_COMPILER_ARG1) + list(APPEND VCPKG_DEFAULT_VARS_TO_CHECK CMAKE_${_lang}_COMPILER_TARGET) # Probably never required since implicit. #list(APPEND VCPKG_DEFAULT_VARS_TO_CHECK CMAKE_${_lang}_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES) #list(APPEND VCPKG_DEFAULT_VARS_TO_CHECK CMAKE_${_lang}_IMPLICIT_INCLUDE_DIRECTORIES) @@ -74,6 +76,38 @@ endif() project(get_cmake_vars LANGUAGES ${VCPKG_LANGUAGES}) +macro(_vcpkg_add_option_to_var var option_var value_var) + if(${option_var} AND ${value_var}) + if(${option_var} MATCHES "=$") + set(_sep "") + else() + set(_sep " ") + endif() + string(APPEND ${var} " ${${option_var}}${_sep}${${value_var}}") + endif() +endmacro() + +# Configure a Makefile project by CC='${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}'. +# Why export CMAKE_${lang}_COMPILER_ARG1? +# Someone may use this variable to achieve multi-part compile commands like what the environment variable CC does. +# See https://gitlab.kitware.com/cmake/cmake/-/issues/17346. +# Another important reason is for GNU Build System Autoconf/Automake/Libtool. +# Some flags are common to CFLAGS and LDFLAGS, there are two approaches as documented at +# https://www.gnu.org/software/autoconf/manual/html_node/Preset-Output-Variables.html, +# i.e. add the flags to CC or to both CFLAGS and LDFLAGS. +# But Libtool will strip link flags when creating shared libraries, +# https://www.gnu.org/software/libtool/manual/html_node/Stripped-link-flags.html. +# For cross-compiling, the most important flag --target also gets stripped. +# https://git.savannah.gnu.org/cgit/libtool.git/tree/build-aux/ltmain.in or +# ltmain.sh which is copied into source code root directory after autoreconf -i +# has a list of "Flags to be passed through". +foreach(lang IN LISTS VCPKG_LANGUAGES) + if("CMAKE_${lang}_COMPILER_ARG1" IN_LIST VCPKG_VARS_TO_CHECK) + _vcpkg_add_option_to_var(CMAKE_${lang}_COMPILER_ARG1 CMAKE_${lang}_COMPILE_OPTIONS_TARGET CMAKE_${lang}_COMPILER_TARGET) + endif() +endforeach() + + foreach(VAR IN LISTS VCPKG_VARS_TO_CHECK) string(APPEND OUTPUT_STRING "set(${VCPKG_VAR_PREFIX}_${VAR} \"${${VAR}}\")\n") endforeach() @@ -102,6 +136,11 @@ macro(_vcpkg_adjust_flags flag_var) string(APPEND ${flag_var} " -isysroot ${CMAKE_OSX_SYSROOT}") endif() endif() + elseif("${flag_var}" IN_LIST VCPKG_LANG_FLAGS) + string(REPLACE "FLAGS" "" _prefix ${flag_var}) # CMAKE__ + _vcpkg_add_option_to_var(${flag_var} ${_prefix}COMPILE_OPTIONS_SYSROOT CMAKE_SYSROOT) + _vcpkg_add_option_to_var(${flag_var} ${_prefix}COMPILE_OPTIONS_TARGET ${_prefix}COMPILER_TARGET) + _vcpkg_add_option_to_var(${flag_var} ${_prefix}COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN ${_prefix}COMPILER_EXTERNAL_TOOLCHAIN) endif() endmacro()