diff options
| author | Joachim Gehweiler <44170764+jgehw@users.noreply.github.com> | 2020-10-27 03:30:27 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-26 19:30:27 -0700 |
| commit | 0ff75ac80b9a3770afb3d2971c572628d80a631e (patch) | |
| tree | 0d47d24d70e283449e8b16eef790c727d8a8deb5 /scripts | |
| parent | 839f53338202245c8756747011c40ed4926d20f4 (diff) | |
| download | vcpkg-0ff75ac80b9a3770afb3d2971c572628d80a631e.tar.gz vcpkg-0ff75ac80b9a3770afb3d2971c572628d80a631e.zip | |
[vcpkg] Fix more cases of semicolon mishandling in "scripts" - follow-up to PR #12926 (#13968)
Diffstat (limited to 'scripts')
33 files changed, 692 insertions, 630 deletions
diff --git a/scripts/cmake/vcpkg_acquire_msys.cmake b/scripts/cmake/vcpkg_acquire_msys.cmake index 6c56d205b..f0a8b7e0e 100644 --- a/scripts/cmake/vcpkg_acquire_msys.cmake +++ b/scripts/cmake/vcpkg_acquire_msys.cmake @@ -55,7 +55,8 @@ ## * [libvpx](https://github.com/Microsoft/vcpkg/blob/master/ports/libvpx/portfile.cmake) function(vcpkg_acquire_msys PATH_TO_ROOT_OUT) - cmake_parse_arguments(_am "NO_DEFAULT_PACKAGES" "" "PACKAGES;DIRECT_PACKAGES" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _am "NO_DEFAULT_PACKAGES" "" "PACKAGES;DIRECT_PACKAGES") set(TOTAL_HASH 0) set(ARCHIVES) diff --git a/scripts/cmake/vcpkg_apply_patches.cmake b/scripts/cmake/vcpkg_apply_patches.cmake index 8ad54697b..0ca33bc0d 100644 --- a/scripts/cmake/vcpkg_apply_patches.cmake +++ b/scripts/cmake/vcpkg_apply_patches.cmake @@ -33,7 +33,8 @@ include(vcpkg_execute_in_download_mode) function(vcpkg_apply_patches) - cmake_parse_arguments(_ap "QUIET" "SOURCE_PATH" "PATCHES" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _ap "QUIET" "SOURCE_PATH" "PATCHES") find_program(GIT NAMES git git.cmd) set(PATCHNUM 0) diff --git a/scripts/cmake/vcpkg_build_cmake.cmake b/scripts/cmake/vcpkg_build_cmake.cmake index f5867a1b5..a429ebf4b 100644 --- a/scripts/cmake/vcpkg_build_cmake.cmake +++ b/scripts/cmake/vcpkg_build_cmake.cmake @@ -30,7 +30,8 @@ ## * [poco](https://github.com/Microsoft/vcpkg/blob/master/ports/poco/portfile.cmake) ## * [opencv](https://github.com/Microsoft/vcpkg/blob/master/ports/opencv/portfile.cmake) function(vcpkg_build_cmake) - cmake_parse_arguments(_bc "DISABLE_PARALLEL;ADD_BIN_TO_PATH" "TARGET;LOGFILE_ROOT" "" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _bc "DISABLE_PARALLEL;ADD_BIN_TO_PATH" "TARGET;LOGFILE_ROOT" "") if(NOT _bc_LOGFILE_ROOT) set(_bc_LOGFILE_ROOT "build") diff --git a/scripts/cmake/vcpkg_build_make.cmake b/scripts/cmake/vcpkg_build_make.cmake index 7a3c21117..a77701ae7 100644 --- a/scripts/cmake/vcpkg_build_make.cmake +++ b/scripts/cmake/vcpkg_build_make.cmake @@ -39,7 +39,8 @@ ## * [freexl](https://github.com/Microsoft/vcpkg/blob/master/ports/freexl/portfile.cmake)
## * [libosip2](https://github.com/Microsoft/vcpkg/blob/master/ports/libosip2/portfile.cmake)
function(vcpkg_build_make)
- cmake_parse_arguments(_bc "ADD_BIN_TO_PATH;ENABLE_INSTALL;DISABLE_PARALLEL" "LOGFILE_ROOT;BUILD_TARGET" "" ${ARGN})
+ # parse parameters such that semicolons in options arguments to COMMAND don't get erased
+ cmake_parse_arguments(PARSE_ARGV 0 _bc "ADD_BIN_TO_PATH;ENABLE_INSTALL;DISABLE_PARALLEL" "LOGFILE_ROOT;BUILD_TARGET" "")
if(NOT _bc_LOGFILE_ROOT)
set(_bc_LOGFILE_ROOT "build")
diff --git a/scripts/cmake/vcpkg_build_msbuild.cmake b/scripts/cmake/vcpkg_build_msbuild.cmake index bc118b4c0..19b136cd2 100644 --- a/scripts/cmake/vcpkg_build_msbuild.cmake +++ b/scripts/cmake/vcpkg_build_msbuild.cmake @@ -62,12 +62,13 @@ ## * [cppunit](https://github.com/Microsoft/vcpkg/blob/master/ports/cppunit/portfile.cmake) function(vcpkg_build_msbuild) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased cmake_parse_arguments( + PARSE_ARGV 0 _csc "USE_VCPKG_INTEGRATION" "PROJECT_PATH;RELEASE_CONFIGURATION;DEBUG_CONFIGURATION;PLATFORM;PLATFORM_TOOLSET;TARGET_PLATFORM_VERSION;TARGET" "OPTIONS;OPTIONS_RELEASE;OPTIONS_DEBUG" - ${ARGN} ) if(NOT DEFINED _csc_RELEASE_CONFIGURATION) diff --git a/scripts/cmake/vcpkg_build_ninja.cmake b/scripts/cmake/vcpkg_build_ninja.cmake index 3eb05c98b..d49cc5c1f 100644 --- a/scripts/cmake/vcpkg_build_ninja.cmake +++ b/scripts/cmake/vcpkg_build_ninja.cmake @@ -14,7 +14,8 @@ ## Only build the specified targets. function(vcpkg_build_ninja) - cmake_parse_arguments(_vbn "" "" "TARGETS" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _vbn "" "" "TARGETS") vcpkg_find_acquire_program(NINJA) diff --git a/scripts/cmake/vcpkg_build_nmake.cmake b/scripts/cmake/vcpkg_build_nmake.cmake index 8cf074739..371dea0ee 100644 --- a/scripts/cmake/vcpkg_build_nmake.cmake +++ b/scripts/cmake/vcpkg_build_nmake.cmake @@ -71,11 +71,11 @@ ## * [tcl](https://github.com/Microsoft/vcpkg/blob/master/ports/tcl/portfile.cmake)
## * [freexl](https://github.com/Microsoft/vcpkg/blob/master/ports/freexl/portfile.cmake)
function(vcpkg_build_nmake)
- cmake_parse_arguments(_bn
+ # parse parameters such that semicolons in options arguments to COMMAND don't get erased
+ cmake_parse_arguments(PARSE_ARGV 0 _bn
"ADD_BIN_TO_PATH;ENABLE_INSTALL;NO_DEBUG"
"SOURCE_PATH;PROJECT_SUBPATH;PROJECT_NAME;LOGFILE_ROOT"
"OPTIONS;OPTIONS_RELEASE;OPTIONS_DEBUG;PRERUN_SHELL;PRERUN_SHELL_DEBUG;PRERUN_SHELL_RELEASE"
- ${ARGN}
)
if (NOT CMAKE_HOST_WIN32)
@@ -188,7 +188,7 @@ function(vcpkg_build_nmake) if (BUILDTYPE STREQUAL "debug" AND _bn_PRERUN_SHELL_DEBUG)
message(STATUS "Prerunning ${CURRENT_TRIPLET_NAME}")
vcpkg_execute_required_process(
- COMMAND "${_bn_PRERUN_SHELL_DEBUG}"
+ COMMAND ${_bn_PRERUN_SHELL_DEBUG}
WORKING_DIRECTORY ${OBJ_DIR}${_bn_PROJECT_SUBPATH}
LOGNAME "prerun-${CURRENT_TRIPLET_NAME}-dbg"
)
diff --git a/scripts/cmake/vcpkg_build_qmake.cmake b/scripts/cmake/vcpkg_build_qmake.cmake index deecf4f06..d4c435a0d 100644 --- a/scripts/cmake/vcpkg_build_qmake.cmake +++ b/scripts/cmake/vcpkg_build_qmake.cmake @@ -7,7 +7,8 @@ # vcpkg_build_qmake() # function(vcpkg_build_qmake) - cmake_parse_arguments(_csc "SKIP_MAKEFILES" "BUILD_LOGNAME" "TARGETS;RELEASE_TARGETS;DEBUG_TARGETS" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _csc "SKIP_MAKEFILES" "BUILD_LOGNAME" "TARGETS;RELEASE_TARGETS;DEBUG_TARGETS") if(CMAKE_HOST_WIN32) vcpkg_find_acquire_program(JOM) diff --git a/scripts/cmake/vcpkg_check_features.cmake b/scripts/cmake/vcpkg_check_features.cmake index 81ebc234d..404a1b61d 100644 --- a/scripts/cmake/vcpkg_check_features.cmake +++ b/scripts/cmake/vcpkg_check_features.cmake @@ -144,7 +144,8 @@ ## * [rocksdb](https://github.com/microsoft/vcpkg/blob/master/ports/rocksdb/portfile.cmake) ## function(vcpkg_check_features) - cmake_parse_arguments(_vcf "" "OUT_FEATURE_OPTIONS" "FEATURES;INVERTED_FEATURES" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _vcf "" "OUT_FEATURE_OPTIONS" "FEATURES;INVERTED_FEATURES") if (NOT DEFINED _vcf_OUT_FEATURE_OPTIONS) message(FATAL_ERROR "OUT_FEATURE_OPTIONS must be specified.") diff --git a/scripts/cmake/vcpkg_clean_executables_in_bin.cmake b/scripts/cmake/vcpkg_clean_executables_in_bin.cmake index 5321e05b6..da8594daf 100644 --- a/scripts/cmake/vcpkg_clean_executables_in_bin.cmake +++ b/scripts/cmake/vcpkg_clean_executables_in_bin.cmake @@ -19,7 +19,8 @@ ## ## Examples
## * [czmq](https://github.com/microsoft/vcpkg/blob/master/ports/czmq/portfile.cmake)
function(vcpkg_clean_executables_in_bin)
- cmake_parse_arguments(_vct "" "" "FILE_NAMES" ${ARGN})
+ # parse parameters such that semicolons in options arguments to COMMAND don't get erased
+ cmake_parse_arguments(PARSE_ARGV 0 _vct "" "" "FILE_NAMES")
if(NOT DEFINED _vct_FILE_NAMES)
message(FATAL_ERROR "FILE_NAMES must be specified.")
diff --git a/scripts/cmake/vcpkg_configure_cmake.cmake b/scripts/cmake/vcpkg_configure_cmake.cmake index 1a8915942..f41747f8a 100644 --- a/scripts/cmake/vcpkg_configure_cmake.cmake +++ b/scripts/cmake/vcpkg_configure_cmake.cmake @@ -266,12 +266,12 @@ function(vcpkg_configure_cmake) endforeach() set(rel_command - ${CMAKE_COMMAND} ${_csc_SOURCE_PATH} "${_csc_OPTIONS}" "${_csc_OPTIONS_RELEASE}" + ${CMAKE_COMMAND} ${_csc_SOURCE_PATH} ${_csc_OPTIONS} ${_csc_OPTIONS_RELEASE} -G ${GENERATOR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${CURRENT_PACKAGES_DIR}) set(dbg_command - ${CMAKE_COMMAND} ${_csc_SOURCE_PATH} "${_csc_OPTIONS}" "${_csc_OPTIONS_DEBUG}" + ${CMAKE_COMMAND} ${_csc_SOURCE_PATH} ${_csc_OPTIONS} ${_csc_OPTIONS_DEBUG} -G ${GENERATOR} -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=${CURRENT_PACKAGES_DIR}/debug) diff --git a/scripts/cmake/vcpkg_configure_gn.cmake b/scripts/cmake/vcpkg_configure_gn.cmake index 3ae14b8be..5d083aed8 100644 --- a/scripts/cmake/vcpkg_configure_gn.cmake +++ b/scripts/cmake/vcpkg_configure_gn.cmake @@ -27,7 +27,8 @@ ## Options to be passed to the release target. function(vcpkg_configure_gn) - cmake_parse_arguments(_vcg "" "SOURCE_PATH;OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE" "" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _vcg "" "SOURCE_PATH;OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE" "") if(NOT DEFINED _vcg_SOURCE_PATH) message(FATAL_ERROR "SOURCE_PATH must be specified.") @@ -42,7 +43,7 @@ function(vcpkg_configure_gn) function(generate CONFIG ARGS) message(STATUS "Generating build (${CONFIG})...") vcpkg_execute_required_process( - COMMAND "${GN}" gen "${CURRENT_BUILDTREES_DIR}/${CONFIG}" "${ARGS}" + COMMAND "${GN}" gen "${CURRENT_BUILDTREES_DIR}/${CONFIG}" ${ARGS} WORKING_DIRECTORY "${SOURCE_PATH}" LOGNAME generate-${CONFIG} ) diff --git a/scripts/cmake/vcpkg_configure_make.cmake b/scripts/cmake/vcpkg_configure_make.cmake index 4882a295d..bf1f93b9d 100644 --- a/scripts/cmake/vcpkg_configure_make.cmake +++ b/scripts/cmake/vcpkg_configure_make.cmake @@ -1,591 +1,591 @@ -## # vcpkg_configure_make
-##
-## Configure configure for Debug and Release builds of a project.
-##
-## ## Usage
-## ```cmake
-## vcpkg_configure_make(
-## SOURCE_PATH <${SOURCE_PATH}>
-## [AUTOCONFIG]
-## [USE_WRAPPERS]
-## [BUILD_TRIPLET "--host=x64 --build=i686-unknown-pc"]
-## [NO_ADDITIONAL_PATHS]
-## [CONFIG_DEPENDENT_ENVIRONMENT <SOME_VAR>...]
-## [CONFIGURE_ENVIRONMENT_VARIABLES <SOME_ENVVAR>...]
-## [ADD_BIN_TO_PATH]
-## [NO_DEBUG]
-## [SKIP_CONFIGURE]
-## [PROJECT_SUBPATH <${PROJ_SUBPATH}>]
-## [PRERUN_SHELL <${SHELL_PATH}>]
-## [OPTIONS <-DUSE_THIS_IN_ALL_BUILDS=1>...]
-## [OPTIONS_RELEASE <-DOPTIMIZE=1>...]
-## [OPTIONS_DEBUG <-DDEBUGGABLE=1>...]
-## )
-## ```
-##
-## ## Parameters
-## ### SOURCE_PATH
-## Specifies the directory containing the `configure`/`configure.ac`.
-## By convention, this is usually set in the portfile as the variable `SOURCE_PATH`.
-##
-## ### PROJECT_SUBPATH
-## Specifies the directory containing the ``configure`/`configure.ac`.
-## By convention, this is usually set in the portfile as the variable `SOURCE_PATH`.
-##
-## ### SKIP_CONFIGURE
-## Skip configure process
-##
-## ### USE_WRAPPERS
-## Use autotools ar-lib and compile wrappers (only applies to windows cl and lib)
-##
-## ### BUILD_TRIPLET
-## Used to pass custom --build/--target/--host to configure. Can be globally overwritten by VCPKG_MAKE_BUILD_TRIPLET
-##
-## ### DETERMINE_BUILD_TRIPLET
-## For ports having a configure script following the autotools rules for selecting the triplet
-##
-## ### NO_ADDITIONAL_PATHS
-## Don't pass any additional paths except for --prefix to the configure call
-##
-## ### AUTOCONFIG
-## Need to use autoconfig to generate configure file.
-##
-## ### PRERUN_SHELL
-## Script that needs to be called before configuration (do not use for batch files which simply call autoconf or configure)
-##
-## ### ADD_BIN_TO_PATH
-## Adds the appropriate Release and Debug `bin\` directories to the path during configure such that executables can run against the in-tree DLLs.
-##
-## ## DISABLE_VERBOSE_FLAGS
-## do not pass '--disable-silent-rules --verbose' to configure
-##
-## ### OPTIONS
-## Additional options passed to configure during the configuration.
-##
-## ### OPTIONS_RELEASE
-## Additional options passed to configure during the Release configuration. These are in addition to `OPTIONS`.
-##
-## ### OPTIONS_DEBUG
-## Additional options passed to configure during the Debug configuration. These are in addition to `OPTIONS`.
-##
-## ### CONFIG_DEPENDENT_ENVIRONMENT
-## List of additional configuration dependent environment variables to set.
-## Pass SOMEVAR to set the environment and have SOMEVAR_(DEBUG|RELEASE) set in the portfile to the appropriate values
-## General environment variables can be set from within the portfile itself.
-##
-## ### CONFIGURE_ENVIRONMENT_VARIABLES
-## List of additional environment variables to pass via the configure call.
-##
-## ## Notes
-## This command supplies many common arguments to configure. To see the full list, examine the source.
-##
-## ## Examples
-##
-## * [x264](https://github.com/Microsoft/vcpkg/blob/master/ports/x264/portfile.cmake)
-## * [tcl](https://github.com/Microsoft/vcpkg/blob/master/ports/tcl/portfile.cmake)
-## * [freexl](https://github.com/Microsoft/vcpkg/blob/master/ports/freexl/portfile.cmake)
-## * [libosip2](https://github.com/Microsoft/vcpkg/blob/master/ports/libosip2/portfile.cmake)
-macro(_vcpkg_determine_host_mingw out_var)
- if(DEFINED ENV{PROCESSOR_ARCHITEW6432})
- set(HOST_ARCH $ENV{PROCESSOR_ARCHITEW6432})
- else()
- set(HOST_ARCH $ENV{PROCESSOR_ARCHITECTURE})
- endif()
- if(HOST_ARCH MATCHES "(amd|AMD)64")
- set(${out_var} mingw64)
- elseif(HOST_ARCH MATCHES "(x|X)86")
- set(${out_var} mingw32)
- else()
- message(FATAL_ERROR "Unsupported mingw architecture ${HOST_ARCH} in _vcpkg_determine_autotools_host_cpu!" )
- endif()
- unset(HOST_ARCH)
-endmacro()
-
-macro(_vcpkg_determine_autotools_host_cpu out_var)
- if(DEFINED ENV{PROCESSOR_ARCHITEW6432})
- set(HOST_ARCH $ENV{PROCESSOR_ARCHITEW6432})
- else()
- set(HOST_ARCH $ENV{PROCESSOR_ARCHITECTURE})
- endif()
- if(HOST_ARCH MATCHES "(amd|AMD)64")
- set(${out_var} x86_64)
- elseif(HOST_ARCH MATCHES "(x|X)86")
- set(${out_var} i686)
- elseif(HOST_ARCH MATCHES "^(ARM|arm)64$")
- set(${out_var} aarch64)
- elseif(HOST_ARCH MATCHES "^(ARM|arm)$")
- set(${out_var} arm)
- else()
- message(FATAL_ERROR "Unsupported host architecture ${HOST_ARCH} in _vcpkg_determine_autotools_host_cpu!" )
- endif()
- unset(HOST_ARCH)
-endmacro()
-
-macro(_vcpkg_determine_autotools_target_cpu out_var)
- if(VCPKG_TARGET_ARCHITECTURE MATCHES "(x|X)64")
- set(${out_var} x86_64)
- elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "(x|X)86")
- set(${out_var} i686)
- elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "^(ARM|arm)64$")
- set(${out_var} aarch64)
- elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "^(ARM|arm)$")
- set(${out_var} arm)
- else()
- message(FATAL_ERROR "Unsupported VCPKG_TARGET_ARCHITECTURE architecture ${VCPKG_TARGET_ARCHITECTURE} in _vcpkg_determine_autotools_target_cpu!" )
- endif()
-endmacro()
-
-macro(_vcpkg_backup_env_variable envvar)
- if(DEFINED ENV{${envvar}})
- set(${envvar}_BACKUP "$ENV{${envvar}}")
- set(${envvar}_PATHLIKE_CONCAT "${VCPKG_HOST_PATH_SEPARATOR}$ENV{${envvar}}")
- else()
- set(${envvar}_BACKUP)
- set(${envvar}_PATHLIKE_CONCAT)
- endif()
-endmacro()
-
-macro(_vcpkg_backup_env_variables)
- foreach(_var ${ARGV})
- _vcpkg_backup_env_variable(${_var})
- endforeach()
-endmacro()
-
-macro(_vcpkg_restore_env_variable envvar)
- if(${envvar}_BACKUP)
- set(ENV{${envvar}} "${${envvar}_BACKUP}")
- else()
- unset(ENV{${envvar}})
- endif()
-endmacro()
-
-macro(_vcpkg_restore_env_variables)
- foreach(_var ${ARGV})
- _vcpkg_restore_env_variable(${_var})
- endforeach()
-endmacro()
-
-function(vcpkg_configure_make)
- cmake_parse_arguments(_csc
- "AUTOCONFIG;SKIP_CONFIGURE;COPY_SOURCE;DISABLE_VERBOSE_FLAGS;NO_ADDITIONAL_PATHS;ADD_BIN_TO_PATH;USE_WRAPPERS;DETERMINE_BUILD_TRIPLET"
- "SOURCE_PATH;PROJECT_SUBPATH;PRERUN_SHELL;BUILD_TRIPLET"
- "OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE;CONFIGURE_ENVIRONMENT_VARIABLES;CONFIG_DEPENDENT_ENVIRONMENT"
- ${ARGN}
- )
- if(DEFINED VCPKG_MAKE_BUILD_TRIPLET)
- set(_csc_BUILD_TRIPLET ${VCPKG_MAKE_BUILD_TRIPLET}) # Triplet overwrite for crosscompiling
- endif()
-
- set(SRC_DIR "${_csc_SOURCE_PATH}/${_csc_PROJECT_SUBPATH}")
-
- set(REQUIRES_AUTOGEN FALSE) # use autogen.sh
- set(REQUIRES_AUTOCONFIG FALSE) # use autotools and configure.ac
- if(EXISTS "${SRC_DIR}/configure" AND "${SRC_DIR}/configure.ac") # remove configure; rerun autoconf
- if(NOT VCPKG_MAINTAINER_SKIP_AUTOCONFIG) # If fixing bugs skipping autoconfig saves a lot of time
- set(REQUIRES_AUTOCONFIG TRUE)
- file(REMOVE "${SRC_DIR}/configure") # remove possible autodated configure scripts
- set(_csc_AUTOCONFIG ON)
- endif()
- elseif(EXISTS "${SRC_DIR}/configure" AND NOT _csc_SKIP_CONFIGURE) # run normally; no autoconf or autgen required
- elseif(EXISTS "${SRC_DIR}/configure.ac") # Run autoconfig
- set(REQUIRES_AUTOCONFIG TRUE)
- set(_csc_AUTOCONFIG ON)
- elseif(EXISTS "${SRC_DIR}/autogen.sh") # Run autogen
- set(REQUIRES_AUTOGEN TRUE)
- else()
- message(FATAL_ERROR "Could not determine method to configure make")
- endif()
-
- debug_message("REQUIRES_AUTOGEN:${REQUIRES_AUTOGEN}")
- debug_message("REQUIRES_AUTOCONFIG:${REQUIRES_AUTOCONFIG}")
- # Backup environment variables
- # CCAS CC C CPP CXX FC FF GC LD LF LIBTOOL OBJC OBJCXX R UPC Y
- set(FLAGPREFIXES CCAS CC C CPP CXX FC FF GC LD LF LIBTOOL OBJC OBJXX R UPC Y)
- foreach(_prefix IN LISTS FLAGPREFIXES)
- _vcpkg_backup_env_variable(${prefix}FLAGS)
- endforeach()
-
- # FC fotran compiler | FF Fortran 77 compiler
- # LDFLAGS -> pass -L flags
- # LIBS -> pass -l flags
-
- #Used by gcc/linux
- _vcpkg_backup_env_variables(C_INCLUDE_PATH CPLUS_INCLUDE_PATH LIBRARY_PATH LD_LIBRARY_PATH)
-
- #Used by cl
- _vcpkg_backup_env_variables(INCLUDE LIB LIBPATH)
-
- if(CURRENT_PACKAGES_DIR MATCHES " " OR CURRENT_INSTALLED_DIR MATCHES " ")
- # Don't bother with whitespace. The tools will probably fail and I tried very hard trying to make it work (no success so far)!
- message(WARNING "Detected whitespace in root directory. Please move the path to one without whitespaces! The required tools do not handle whitespaces correctly and the build will most likely fail")
- endif()
-
- # Pre-processing windows configure requirements
- if (CMAKE_HOST_WIN32)
- list(APPEND MSYS_REQUIRE_PACKAGES binutils libtool autoconf automake-wrapper automake1.16 m4)
- vcpkg_acquire_msys(MSYS_ROOT PACKAGES ${MSYS_REQUIRE_PACKAGES})
-
- if (_csc_AUTOCONFIG AND NOT _csc_BUILD_TRIPLET OR _csc_DETERMINE_BUILD_TRIPLET)
- _vcpkg_determine_autotools_host_cpu(BUILD_ARCH) # VCPKG_HOST => machine you are building on => --build=
- _vcpkg_determine_autotools_target_cpu(TARGET_ARCH)
- # --build: the machine you are building on
- # --host: the machine you are building for
- # --target: the machine that CC will produce binaries for
- # https://stackoverflow.com/questions/21990021/how-to-determine-host-value-for-configure-when-using-cross-compiler
- # 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.
- 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")
- # Needs to be different from --build to enable cross builds.
- string(APPEND _csc_BUILD_TRIPLET " --host=${TARGET_ARCH}-unknown-mingw32")
- endif()
- debug_message("Using make triplet: ${_csc_BUILD_TRIPLET}")
- endif()
- set(APPEND_ENV)
- if(_csc_AUTOCONFIG OR _csc_USE_WRAPPERS)
- set(APPEND_ENV ";${MSYS_ROOT}/usr/share/automake-1.16")
- endif()
- # This inserts msys before system32 (which masks sort.exe and find.exe) but after MSVC (which avoids masking link.exe)
- string(REPLACE ";$ENV{SystemRoot}\\System32;" "${APPEND_ENV};${MSYS_ROOT}/usr/bin;$ENV{SystemRoot}\\System32;" NEWPATH "$ENV{PATH}")
- string(REPLACE ";$ENV{SystemRoot}\\system32;" "${APPEND_ENV};${MSYS_ROOT}/usr/bin;$ENV{SystemRoot}\\system32;" NEWPATH "$ENV{PATH}")
- set(ENV{PATH} "${NEWPATH}")
- set(BASH "${MSYS_ROOT}/usr/bin/bash.exe")
-
- macro(_vcpkg_append_to_configure_environment inoutstring var defaultval)
- # Allows to overwrite settings in custom triplets via the environment
- if(DEFINED ENV{${var}})
- string(APPEND ${inoutstring} " ${var}='$ENV{${var}}'")
- else()
- string(APPEND ${inoutstring} " ${var}='${defaultval}'")
- endif()
- endmacro()
-
- set(CONFIGURE_ENV "V=1")
- if (_csc_AUTOCONFIG OR _csc_USE_WRAPPERS)
- _vcpkg_append_to_configure_environment(CONFIGURE_ENV CPP "compile cl.exe -nologo -E")
- _vcpkg_append_to_configure_environment(CONFIGURE_ENV CC "compile cl.exe -nologo")
- _vcpkg_append_to_configure_environment(CONFIGURE_ENV CXX "compile cl.exe -nologo")
- _vcpkg_append_to_configure_environment(CONFIGURE_ENV AR "ar-lib lib.exe -verbose")
- else()
- _vcpkg_append_to_configure_environment(CONFIGURE_ENV CPP "cl.exe -nologo -E")
- _vcpkg_append_to_configure_environment(CONFIGURE_ENV CC "cl.exe -nologo")
- _vcpkg_append_to_configure_environment(CONFIGURE_ENV CXX "cl.exe -nologo")
- _vcpkg_append_to_configure_environment(CONFIGURE_ENV AR "lib.exe -verbose")
- endif()
- _vcpkg_append_to_configure_environment(CONFIGURE_ENV LD "link.exe -verbose")
- _vcpkg_append_to_configure_environment(CONFIGURE_ENV RANLIB ":") # Trick to ignore the RANLIB call
- #_vcpkg_append_to_configure_environment(CONFIGURE_ENV OBJDUMP ":") ' Objdump is required to make shared libraries. Otherwise define lt_cv_deplibs_check_method=pass_all
- _vcpkg_append_to_configure_environment(CONFIGURE_ENV CCAS ":") # If required set the ENV variable CCAS in the portfile correctly
- _vcpkg_append_to_configure_environment(CONFIGURE_ENV STRIP ":") # If required set the ENV variable STRIP in the portfile correctly
- _vcpkg_append_to_configure_environment(CONFIGURE_ENV NM "dumpbin.exe -symbols -headers")
- # Would be better to have a true nm here! Some symbols (mainly exported variables) get not properly imported with dumpbin as nm
- # and require __declspec(dllimport) for some reason (same problem CMake has with WINDOWS_EXPORT_ALL_SYMBOLS)
- _vcpkg_append_to_configure_environment(CONFIGURE_ENV DLLTOOL "link.exe -verbose -dll")
-
- foreach(_env IN LISTS _csc_CONFIGURE_ENVIRONMENT_VARIABLES)
- _vcpkg_append_to_configure_environment(CONFIGURE_ENV ${_env} "${${_env}}")
- endforeach()
- # Other maybe interesting variables to control
- # COMPILE This is the command used to actually compile a C source file. The file name is appended to form the complete command line.
- # LINK This is the command used to actually link a C program.
- # CXXCOMPILE The command used to actually compile a C++ source file. The file name is appended to form the complete command line.
- # CXXLINK The command used to actually link a C++ program.
-
- #Some PATH handling for dealing with spaces....some tools will still fail with that!
- string(REPLACE " " "\\\ " _VCPKG_PREFIX ${CURRENT_INSTALLED_DIR})
- string(REGEX REPLACE "([a-zA-Z]):/" "/\\1/" _VCPKG_PREFIX "${_VCPKG_PREFIX}")
- set(_VCPKG_INSTALLED ${CURRENT_INSTALLED_DIR})
- string(REPLACE " " "\ " _VCPKG_INSTALLED_PKGCONF ${CURRENT_INSTALLED_DIR})
- string(REGEX REPLACE "([a-zA-Z]):/" "/\\1/" _VCPKG_INSTALLED_PKGCONF ${_VCPKG_INSTALLED_PKGCONF})
- string(REPLACE "\\" "/" _VCPKG_INSTALLED_PKGCONF ${_VCPKG_INSTALLED_PKGCONF})
- set(prefix_var "'\${prefix}'") # Windows needs extra quotes or else the variable gets expanded in the makefile!
- else()
- string(REPLACE " " "\ " _VCPKG_PREFIX ${CURRENT_INSTALLED_DIR})
- string(REPLACE " " "\ " _VCPKG_INSTALLED ${CURRENT_INSTALLED_DIR})
- set(_VCPKG_INSTALLED_PKGCONF ${CURRENT_INSTALLED_DIR})
- set(EXTRA_QUOTES)
- set(prefix_var "\${prefix}")
- endif()
-
- # Cleanup previous build dirs
- file(REMOVE_RECURSE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel"
- "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg"
- "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}")
-
- # Set configure paths
- set(_csc_OPTIONS_RELEASE ${_csc_OPTIONS_RELEASE} "--prefix=${EXTRA_QUOTES}${_VCPKG_PREFIX}${EXTRA_QUOTES}")
- set(_csc_OPTIONS_DEBUG ${_csc_OPTIONS_DEBUG} "--prefix=${EXTRA_QUOTES}${_VCPKG_PREFIX}/debug${EXTRA_QUOTES}")
- if(NOT _csc_NO_ADDITIONAL_PATHS)
- set(_csc_OPTIONS_RELEASE ${_csc_OPTIONS_RELEASE}
- # Important: These should all be relative to prefix!
- "--bindir=${prefix_var}/tools/${PORT}/bin"
- "--sbindir=${prefix_var}/tools/${PORT}/sbin"
- #"--libdir='\${prefix}'/lib" # already the default!
- #"--includedir='\${prefix}'/include" # already the default!
- "--mandir=${prefix_var}/share/${PORT}"
- "--docdir=${prefix_var}/share/${PORT}"
- "--datarootdir=${prefix_var}/share/${PORT}")
- set(_csc_OPTIONS_DEBUG ${_csc_OPTIONS_DEBUG}
- # Important: These should all be relative to prefix!
- "--bindir=${prefix_var}/../tools/${PORT}/debug/bin"
- "--sbindir=${prefix_var}/../tools/${PORT}/debug/sbin"
- #"--libdir='\${prefix}'/lib" # already the default!
- "--includedir=${prefix_var}/../include"
- "--datarootdir=${prefix_var}/share/${PORT}")
- endif()
- # Setup common options
- if(NOT DISABLE_VERBOSE_FLAGS)
- list(APPEND _csc_OPTIONS --disable-silent-rules --verbose)
- endif()
-
- if(VCPKG_LIBRARY_LINKAGE STREQUAL dynamic)
- list(APPEND _csc_OPTIONS --enable-shared --disable-static)
- else()
- list(APPEND _csc_OPTIONS --disable-shared --enable-static)
- endif()
-
- file(RELATIVE_PATH RELATIVE_BUILD_PATH "${CURRENT_BUILDTREES_DIR}" "${_csc_SOURCE_PATH}/${_csc_PROJECT_SUBPATH}")
-
- set(base_cmd)
- if(CMAKE_HOST_WIN32)
- set(base_cmd ${BASH} --noprofile --norc --debug)
- # Load toolchains
- if(NOT VCPKG_CHAINLOAD_TOOLCHAIN_FILE)
- set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/windows.cmake")
- endif()
- include("${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}")
- #Join the options list as a string with spaces between options
- list(JOIN _csc_OPTIONS " " _csc_OPTIONS)
- list(JOIN _csc_OPTIONS_RELEASE " " _csc_OPTIONS_RELEASE)
- list(JOIN _csc_OPTIONS_DEBUG " " _csc_OPTIONS_DEBUG)
- endif()
-
- # Setup include environment (since these are buildtype independent restoring them is unnecessary)
- # Used by CL
- set(ENV{INCLUDE} "${_VCPKG_INSTALLED}/include${VCPKG_HOST_PATH_SEPARATOR}${INCLUDE_BACKUP}")
- # Used by GCC
- set(ENV{C_INCLUDE_PATH} "${_VCPKG_INSTALLED}/include${VCPKG_HOST_PATH_SEPARATOR}${C_INCLUDE_PATH_BACKUP}")
- set(ENV{CPLUS_INCLUDE_PATH} "${_VCPKG_INSTALLED}/include${VCPKG_HOST_PATH_SEPARATOR}${CPLUS_INCLUDE_PATH_BACKUP}")
-
- # Setup global flags -> TODO: Further improve with toolchain file in mind!
- set(CPP_FLAGS_GLOBAL "$ENV{CPPFLAGS} -I${_VCPKG_INSTALLED}/include")
- set(C_FLAGS_GLOBAL "$ENV{CFLAGS} ${VCPKG_C_FLAGS}")
- set(CXX_FLAGS_GLOBAL "$ENV{CXXFLAGS} ${VCPKG_CXX_FLAGS}")
- set(LD_FLAGS_GLOBAL "$ENV{LDFLAGS} ${VCPKG_LINKER_FLAGS}")
- # Flags should be set in the toolchain instead (Setting this up correctly requires a function named vcpkg_determined_cmake_compiler_flags which can also be used to setup CC and CXX etc.)
- if(NOT VCPKG_TARGET_IS_WINDOWS)
- string(APPEND C_FLAGS_GLOBAL " -fPIC")
- string(APPEND CXX_FLAGS_GLOBAL " -fPIC")
- else()
- # TODO: Should be CPP flags instead -> rewrite when vcpkg_determined_cmake_compiler_flags defined
- string(APPEND CPP_FLAGS_GLOBAL " /D_WIN32_WINNT=0x0601 /DWIN32_LEAN_AND_MEAN /DWIN32 /D_WINDOWS")
- if(VCPKG_TARGET_IS_UWP)
- # Be aware that configure thinks it is crosscompiling due to:
- # error while loading shared libraries: VCRUNTIME140D_APP.dll:
- # cannot open shared object file: No such file or directory
- # IMPORTANT: The only way to pass linker flags through libtool AND the compile wrapper
- # is to use the CL and LINK environment variables !!!
- # (This is due to libtool and compiler wrapper using the same set of options to pass those variables around)
- string(REPLACE "\\" "/" VCToolsInstallDir "$ENV{VCToolsInstallDir}")
- set(ENV{_CL_} "$ENV{_CL_} /DWINAPI_FAMILY=WINAPI_FAMILY_APP /D__WRL_NO_DEFAULT_LIB_ -FU\"${VCToolsInstallDir}/lib/x86/store/references/platform.winmd\"")
- set(ENV{_LINK_} "$ENV{_LINK_} /MANIFEST /DYNAMICBASE WindowsApp.lib /WINMD:NO /APPCONTAINER")
- endif()
- if(VCPKG_TARGET_ARCHITECTURE STREQUAL x64)
- set(ENV{_LINK_} "$ENV{_LINK_} -MACHINE:x64")
- elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL x86)
- set(ENV{_LINK_} "$ENV{_LINK_} -MACHINE:x86")
- elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL arm)
- set(ENV{_LINK_} "$ENV{_LINK_} -MACHINE:ARM")
- elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL arm64)
- set(ENV{_LINK_} "$ENV{_LINK_} -MACHINE:ARM64")
- endif()
- endif()
-
- vcpkg_find_acquire_program(PKGCONFIG)
- if(VCPKG_LIBRARY_LINKAGE STREQUAL "static" AND NOT PKGCONFIG STREQUAL "--static")
- set(PKGCONFIG "${PKGCONFIG} --static")
- endif()
- # Run autoconf if necessary
- set(_GENERATED_CONFIGURE FALSE)
- if (_csc_AUTOCONFIG OR REQUIRES_AUTOCONFIG)
- find_program(AUTORECONF autoreconf)
- if(NOT AUTORECONF)
- message(FATAL_ERROR "${PORT} requires autoconf from the system package manager (example: \"sudo apt-get install autoconf\")")
- endif()
- message(STATUS "Generating configure for ${TARGET_TRIPLET}")
- if (CMAKE_HOST_WIN32)
- vcpkg_execute_required_process(
- COMMAND ${base_cmd} -c "autoreconf -vfi"
- WORKING_DIRECTORY "${SRC_DIR}"
- LOGNAME autoconf-${TARGET_TRIPLET}
- )
- else()
- vcpkg_execute_required_process(
- COMMAND ${AUTORECONF} -vfi
- WORKING_DIRECTORY "${SRC_DIR}"
- LOGNAME autoconf-${TARGET_TRIPLET}
- )
- endif()
- message(STATUS "Finished generating configure for ${TARGET_TRIPLET}")
- endif()
- if(REQUIRES_AUTOGEN)
- message(STATUS "Generating configure for ${TARGET_TRIPLET} via autogen.sh")
- if (CMAKE_HOST_WIN32)
- vcpkg_execute_required_process(
- COMMAND ${base_cmd} -c "./autogen.sh"
- WORKING_DIRECTORY "${SRC_DIR}"
- LOGNAME autoconf-${TARGET_TRIPLET}
- )
- else()
- vcpkg_execute_required_process(
- COMMAND "./autogen.sh"
- WORKING_DIRECTORY "${SRC_DIR}"
- LOGNAME autoconf-${TARGET_TRIPLET}
- )
- endif()
- message(STATUS "Finished generating configure for ${TARGET_TRIPLET}")
- endif()
-
- if (_csc_PRERUN_SHELL)
- message(STATUS "Prerun shell with ${TARGET_TRIPLET}")
- vcpkg_execute_required_process(
- COMMAND ${base_cmd} -c "${_csc_PRERUN_SHELL}"
- WORKING_DIRECTORY "${SRC_DIR}"
- LOGNAME prerun-${TARGET_TRIPLET}
- )
- endif()
-
- if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug" AND NOT _csc_NO_DEBUG)
- set(_VAR_SUFFIX DEBUG)
- set(PATH_SUFFIX_${_VAR_SUFFIX} "/debug")
- set(SHORT_NAME_${_VAR_SUFFIX} "dbg")
- list(APPEND _buildtypes ${_VAR_SUFFIX})
- if (CMAKE_HOST_WIN32) # Flags should be set in the toolchain instead
- string(REGEX REPLACE "[ \t]+/" " -" CPPFLAGS_${_VAR_SUFFIX} "${CPP_FLAGS_GLOBAL}")
- string(REGEX REPLACE "[ \t]+/" " -" CFLAGS_${_VAR_SUFFIX} "${C_FLAGS_GLOBAL} ${VCPKG_CRT_LINK_FLAG_PREFIX}d /D_DEBUG /Ob0 /Od ${VCPKG_C_FLAGS_${_VAR_SUFFIX}}")
- string(REGEX REPLACE "[ \t]+/" " -" CXXFLAGS_${_VAR_SUFFIX} "${CXX_FLAGS_GLOBAL} ${VCPKG_CRT_LINK_FLAG_PREFIX}d /D_DEBUG /Ob0 /Od ${VCPKG_CXX_FLAGS_${_VAR_SUFFIX}}")
- string(REGEX REPLACE "[ \t]+/" " -" LDFLAGS_${_VAR_SUFFIX} "-L${_VCPKG_INSTALLED}${PATH_SUFFIX_${_VAR_SUFFIX}}/lib ${LD_FLAGS_GLOBAL} ${VCPKG_LINKER_FLAGS_${_VAR_SUFFIX}}")
- else()
- set(CPPFLAGS_${_VAR_SUFFIX} "${CPP_FLAGS_GLOBAL}")
- set(CFLAGS_${_VAR_SUFFIX} "${C_FLAGS_GLOBAL} ${VCPKG_C_FLAGS_DEBUG}")
- set(CXXFLAGS_${_VAR_SUFFIX} "${CXX_FLAGS_GLOBAL} ${VCPKG_CXX_FLAGS_DEBUG}")
- set(LDFLAGS_${_VAR_SUFFIX} "-L${_VCPKG_INSTALLED}${PATH_SUFFIX_${_VAR_SUFFIX}}/lib/ -L${_VCPKG_INSTALLED}${PATH_SUFFIX_${_VAR_SUFFIX}}/lib/manual-link/ ${LD_FLAGS_GLOBAL} ${VCPKG_LINKER_FLAGS_${_VAR_SUFFIX}}")
- endif()
- unset(_VAR_SUFFIX)
- endif()
- if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
- set(_VAR_SUFFIX RELEASE)
- set(PATH_SUFFIX_${_VAR_SUFFIX} "")
- set(SHORT_NAME_${_VAR_SUFFIX} "rel")
- list(APPEND _buildtypes ${_VAR_SUFFIX})
- if (CMAKE_HOST_WIN32) # Flags should be set in the toolchain
- string(REGEX REPLACE "[ \t]+/" " -" CPPFLAGS_${_VAR_SUFFIX} "${CPP_FLAGS_GLOBAL}")
- string(REGEX REPLACE "[ \t]+/" " -" CFLAGS_${_VAR_SUFFIX} "${C_FLAGS_GLOBAL} ${VCPKG_CRT_LINK_FLAG_PREFIX} /O2 /Oi /Gy /DNDEBUG ${VCPKG_C_FLAGS_${_VAR_SUFFIX}}")
- string(REGEX REPLACE "[ \t]+/" " -" CXXFLAGS_${_VAR_SUFFIX} "${CXX_FLAGS_GLOBAL} ${VCPKG_CRT_LINK_FLAG_PREFIX} /O2 /Oi /Gy /DNDEBUG ${VCPKG_CXX_FLAGS_${_VAR_SUFFIX}}")
- string(REGEX REPLACE "[ \t]+/" " -" LDFLAGS_${_VAR_SUFFIX} "-L${_VCPKG_INSTALLED}${PATH_SUFFIX_${_VAR_SUFFIX}}/lib ${LD_FLAGS_GLOBAL} ${VCPKG_LINKER_FLAGS_${_VAR_SUFFIX}}")
- else()
- set(CPPFLAGS_${_VAR_SUFFIX} "${CPP_FLAGS_GLOBAL}")
- set(CFLAGS_${_VAR_SUFFIX} "${C_FLAGS_GLOBAL} ${VCPKG_C_FLAGS_DEBUG}")
- set(CXXFLAGS_${_VAR_SUFFIX} "${CXX_FLAGS_GLOBAL} ${VCPKG_CXX_FLAGS_DEBUG}")
- set(LDFLAGS_${_VAR_SUFFIX} "-L${_VCPKG_INSTALLED}${PATH_SUFFIX_${_VAR_SUFFIX}}/lib/ -L${_VCPKG_INSTALLED}${PATH_SUFFIX_${_VAR_SUFFIX}}/lib/manual-link/ ${LD_FLAGS_GLOBAL} ${VCPKG_LINKER_FLAGS_${_VAR_SUFFIX}}")
- endif()
- unset(_VAR_SUFFIX)
- endif()
-
- foreach(_buildtype IN LISTS _buildtypes)
- foreach(ENV_VAR ${_csc_CONFIG_DEPENDENT_ENVIRONMENT})
- if(DEFINED ENV{${ENV_VAR}})
- set(BACKUP_CONFIG_${ENV_VAR} "$ENV{${ENV_VAR}}")
- endif()
- set(ENV{${ENV_VAR}} "${${ENV_VAR}_${_buildtype}}")
- endforeach()
-
- set(TAR_DIR "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${SHORT_NAME_${_buildtype}}")
- file(MAKE_DIRECTORY "${TAR_DIR}")
- file(RELATIVE_PATH RELATIVE_BUILD_PATH "${TAR_DIR}" "${SRC_DIR}")
-
- if(_csc_COPY_SOURCE)
- file(COPY "${SRC_DIR}/" DESTINATION "${TAR_DIR}")
- set(RELATIVE_BUILD_PATH .)
- endif()
-
- set(PKGCONFIG_INSTALLED_DIR "${_VCPKG_INSTALLED_PKGCONF}${PATH_SUFFIX_${_buildtype}}/lib/pkgconfig")
- set(PKGCONFIG_INSTALLED_SHARE_DIR "${_VCPKG_INSTALLED_PKGCONF}/share/pkgconfig")
-
- if(ENV{PKG_CONFIG_PATH})
- set(BACKUP_ENV_PKG_CONFIG_PATH_${_buildtype} $ENV{PKG_CONFIG_PATH})
- set(ENV{PKG_CONFIG_PATH} "${PKGCONFIG_INSTALLED_DIR}:${PKGCONFIG_INSTALLED_SHARE_DIR}:$ENV{PKG_CONFIG_PATH}")
- else()
- set(ENV{PKG_CONFIG_PATH} "${PKGCONFIG_INSTALLED_DIR}:${PKGCONFIG_INSTALLED_SHARE_DIR}")
- endif()
-
- # Setup environment
- set(ENV{CPPFLAGS} ${CPPFLAGS_${_buildtype}})
- set(ENV{CFLAGS} ${CFLAGS_${_buildtype}})
- set(ENV{CXXFLAGS} ${CXXFLAGS_${_buildtype}})
- set(ENV{LDFLAGS} ${LDFLAGS_${_buildtype}})
- set(ENV{PKG_CONFIG} "${PKGCONFIG} --define-variable=prefix=${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}")
-
- set(ENV{LIB} "${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}/lib/${VCPKG_HOST_PATH_SEPARATOR}${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}/lib/manual-link/${LIB_PATHLIKE_CONCAT}")
- set(ENV{LIBPATH} "${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}/lib/${VCPKG_HOST_PATH_SEPARATOR}${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}/lib/manual-link/${LIBPATH_PATHLIKE_CONCAT}")
- set(ENV{LIBRARY_PATH} "${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}/lib/${VCPKG_HOST_PATH_SEPARATOR}${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}/lib/manual-link/${LIBRARY_PATH_PATHLIKE_CONCAT}")
- set(ENV{LD_LIBRARY_PATH} "${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}/lib/${VCPKG_HOST_PATH_SEPARATOR}${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}/lib/manual-link/${LD_LIBRARY_PATH_PATHLIKE_CONCAT}")
-
- if (CMAKE_HOST_WIN32)
- set(command ${base_cmd} -c "${CONFIGURE_ENV} ./${RELATIVE_BUILD_PATH}/configure ${_csc_BUILD_TRIPLET} ${_csc_OPTIONS} ${_csc_OPTIONS_${_buildtype}}")
- else()
- set(command /bin/bash "./${RELATIVE_BUILD_PATH}/configure" ${_csc_BUILD_TRIPLET} ${_csc_OPTIONS} ${_csc_OPTIONS_${_buildtype}})
- endif()
- if(_csc_ADD_BIN_TO_PATH)
- set(PATH_BACKUP $ENV{PATH})
- vcpkg_add_to_path("${CURRENT_INSTALLED_DIR}${PATH_SUFFIX_${_buildtype}}/bin")
- endif()
- debug_message("Configure command:'${command}'")
- if (NOT _csc_SKIP_CONFIGURE)
- message(STATUS "Configuring ${TARGET_TRIPLET}-${SHORT_NAME_${_buildtype}}")
- vcpkg_execute_required_process(
- COMMAND ${command}
- WORKING_DIRECTORY "${TAR_DIR}"
- LOGNAME config-${TARGET_TRIPLET}-${SHORT_NAME_${_buildtype}}
- )
- if(EXISTS "${TAR_DIR}/libtool" AND VCPKG_TARGET_IS_WINDOWS AND VCPKG_LIBRARY_LINKAGE STREQUAL dynamic)
- set(_file "${TAR_DIR}/libtool")
- file(READ "${_file}" _contents)
- string(REPLACE ".dll.lib" ".lib" _contents "${_contents}")
- file(WRITE "${_file}" "${_contents}")
- endif()
- endif()
-
- if(BACKUP_ENV_PKG_CONFIG_PATH_${_buildtype})
- set(ENV{PKG_CONFIG_PATH} "${BACKUP_ENV_PKG_CONFIG_PATH_${_buildtype}}")
- else()
- unset(ENV{PKG_CONFIG_PATH})
- endif()
- unset(BACKUP_ENV_PKG_CONFIG_PATH_${_buildtype})
-
- if(_csc_ADD_BIN_TO_PATH)
- set(ENV{PATH} "${PATH_BACKUP}")
- endif()
- # Restore environment (config dependent)
- foreach(ENV_VAR ${_csc_CONFIG_DEPENDENT_ENVIRONMENT})
- if(BACKUP_CONFIG_${ENV_VAR})
- set(ENV{${ENV_VAR}} "${BACKUP_CONFIG_${ENV_VAR}}")
- else()
- unset(ENV{${ENV_VAR}})
- endif()
- endforeach()
- endforeach()
-
- # Restore environment
- foreach(_prefix IN LISTS FLAGPREFIXES)
- _vcpkg_restore_env_variable(${prefix}FLAGS)
- endforeach()
-
- _vcpkg_restore_env_variables(LIB LIBPATH LIBRARY_PATH LD_LIBRARY_PATH)
-
- SET(_VCPKG_PROJECT_SOURCE_PATH ${_csc_SOURCE_PATH} PARENT_SCOPE)
- set(_VCPKG_PROJECT_SUBPATH ${_csc_PROJECT_SUBPATH} PARENT_SCOPE)
-endfunction()
+## # vcpkg_configure_make +## +## Configure configure for Debug and Release builds of a project. +## +## ## Usage +## ```cmake +## vcpkg_configure_make( +## SOURCE_PATH <${SOURCE_PATH}> +## [AUTOCONFIG] +## [USE_WRAPPERS] +## [BUILD_TRIPLET "--host=x64 --build=i686-unknown-pc"] +## [NO_ADDITIONAL_PATHS] +## [CONFIG_DEPENDENT_ENVIRONMENT <SOME_VAR>...] +## [CONFIGURE_ENVIRONMENT_VARIABLES <SOME_ENVVAR>...] +## [ADD_BIN_TO_PATH] +## [NO_DEBUG] +## [SKIP_CONFIGURE] +## [PROJECT_SUBPATH <${PROJ_SUBPATH}>] +## [PRERUN_SHELL <${SHELL_PATH}>] +## [OPTIONS <-DUSE_THIS_IN_ALL_BUILDS=1>...] +## [OPTIONS_RELEASE <-DOPTIMIZE=1>...] +## [OPTIONS_DEBUG <-DDEBUGGABLE=1>...] +## ) +## ``` +## +## ## Parameters +## ### SOURCE_PATH +## Specifies the directory containing the `configure`/`configure.ac`. +## By convention, this is usually set in the portfile as the variable `SOURCE_PATH`. +## +## ### PROJECT_SUBPATH +## Specifies the directory containing the ``configure`/`configure.ac`. +## By convention, this is usually set in the portfile as the variable `SOURCE_PATH`. +## +## ### SKIP_CONFIGURE +## Skip configure process +## +## ### USE_WRAPPERS +## Use autotools ar-lib and compile wrappers (only applies to windows cl and lib) +## +## ### BUILD_TRIPLET +## Used to pass custom --build/--target/--host to configure. Can be globally overwritten by VCPKG_MAKE_BUILD_TRIPLET +## +## ### DETERMINE_BUILD_TRIPLET +## For ports having a configure script following the autotools rules for selecting the triplet +## +## ### NO_ADDITIONAL_PATHS +## Don't pass any additional paths except for --prefix to the configure call +## +## ### AUTOCONFIG +## Need to use autoconfig to generate configure file. +## +## ### PRERUN_SHELL +## Script that needs to be called before configuration (do not use for batch files which simply call autoconf or configure) +## +## ### ADD_BIN_TO_PATH +## Adds the appropriate Release and Debug `bin\` directories to the path during configure such that executables can run against the in-tree DLLs. +## +## ## DISABLE_VERBOSE_FLAGS +## do not pass '--disable-silent-rules --verbose' to configure +## +## ### OPTIONS +## Additional options passed to configure during the configuration. +## +## ### OPTIONS_RELEASE +## Additional options passed to configure during the Release configuration. These are in addition to `OPTIONS`. +## +## ### OPTIONS_DEBUG +## Additional options passed to configure during the Debug configuration. These are in addition to `OPTIONS`. +## +## ### CONFIG_DEPENDENT_ENVIRONMENT +## List of additional configuration dependent environment variables to set. +## Pass SOMEVAR to set the environment and have SOMEVAR_(DEBUG|RELEASE) set in the portfile to the appropriate values +## General environment variables can be set from within the portfile itself. +## +## ### CONFIGURE_ENVIRONMENT_VARIABLES +## List of additional environment variables to pass via the configure call. +## +## ## Notes +## This command supplies many common arguments to configure. To see the full list, examine the source. +## +## ## Examples +## +## * [x264](https://github.com/Microsoft/vcpkg/blob/master/ports/x264/portfile.cmake) +## * [tcl](https://github.com/Microsoft/vcpkg/blob/master/ports/tcl/portfile.cmake) +## * [freexl](https://github.com/Microsoft/vcpkg/blob/master/ports/freexl/portfile.cmake) +## * [libosip2](https://github.com/Microsoft/vcpkg/blob/master/ports/libosip2/portfile.cmake) +macro(_vcpkg_determine_host_mingw out_var) + if(DEFINED ENV{PROCESSOR_ARCHITEW6432}) + set(HOST_ARCH $ENV{PROCESSOR_ARCHITEW6432}) + else() + set(HOST_ARCH $ENV{PROCESSOR_ARCHITECTURE}) + endif() + if(HOST_ARCH MATCHES "(amd|AMD)64") + set(${out_var} mingw64) + elseif(HOST_ARCH MATCHES "(x|X)86") + set(${out_var} mingw32) + else() + message(FATAL_ERROR "Unsupported mingw architecture ${HOST_ARCH} in _vcpkg_determine_autotools_host_cpu!" ) + endif() + unset(HOST_ARCH) +endmacro() + +macro(_vcpkg_determine_autotools_host_cpu out_var) + if(DEFINED ENV{PROCESSOR_ARCHITEW6432}) + set(HOST_ARCH $ENV{PROCESSOR_ARCHITEW6432}) + else() + set(HOST_ARCH $ENV{PROCESSOR_ARCHITECTURE}) + endif() + if(HOST_ARCH MATCHES "(amd|AMD)64") + set(${out_var} x86_64) + elseif(HOST_ARCH MATCHES "(x|X)86") + set(${out_var} i686) + elseif(HOST_ARCH MATCHES "^(ARM|arm)64$") + set(${out_var} aarch64) + elseif(HOST_ARCH MATCHES "^(ARM|arm)$") + set(${out_var} arm) + else() + message(FATAL_ERROR "Unsupported host architecture ${HOST_ARCH} in _vcpkg_determine_autotools_host_cpu!" ) + endif() + unset(HOST_ARCH) +endmacro() + +macro(_vcpkg_determine_autotools_target_cpu out_var) + if(VCPKG_TARGET_ARCHITECTURE MATCHES "(x|X)64") + set(${out_var} x86_64) + elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "(x|X)86") + set(${out_var} i686) + elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "^(ARM|arm)64$") + set(${out_var} aarch64) + elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "^(ARM|arm)$") + set(${out_var} arm) + else() + message(FATAL_ERROR "Unsupported VCPKG_TARGET_ARCHITECTURE architecture ${VCPKG_TARGET_ARCHITECTURE} in _vcpkg_determine_autotools_target_cpu!" ) + endif() +endmacro() + +macro(_vcpkg_backup_env_variable envvar) + if(DEFINED ENV{${envvar}}) + set(${envvar}_BACKUP "$ENV{${envvar}}") + set(${envvar}_PATHLIKE_CONCAT "${VCPKG_HOST_PATH_SEPARATOR}$ENV{${envvar}}") + else() + set(${envvar}_BACKUP) + set(${envvar}_PATHLIKE_CONCAT) + endif() +endmacro() + +macro(_vcpkg_backup_env_variables) + foreach(_var ${ARGV}) + _vcpkg_backup_env_variable(${_var}) + endforeach() +endmacro() + +macro(_vcpkg_restore_env_variable envvar) + if(${envvar}_BACKUP) + set(ENV{${envvar}} "${${envvar}_BACKUP}") + else() + unset(ENV{${envvar}}) + endif() +endmacro() + +macro(_vcpkg_restore_env_variables) + foreach(_var ${ARGV}) + _vcpkg_restore_env_variable(${_var}) + endforeach() +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 _csc + "AUTOCONFIG;SKIP_CONFIGURE;COPY_SOURCE;DISABLE_VERBOSE_FLAGS;NO_ADDITIONAL_PATHS;ADD_BIN_TO_PATH;USE_WRAPPERS;DETERMINE_BUILD_TRIPLET" + "SOURCE_PATH;PROJECT_SUBPATH;PRERUN_SHELL;BUILD_TRIPLET" + "OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE;CONFIGURE_ENVIRONMENT_VARIABLES;CONFIG_DEPENDENT_ENVIRONMENT" + ) + if(DEFINED VCPKG_MAKE_BUILD_TRIPLET) + set(_csc_BUILD_TRIPLET ${VCPKG_MAKE_BUILD_TRIPLET}) # Triplet overwrite for crosscompiling + endif() + + set(SRC_DIR "${_csc_SOURCE_PATH}/${_csc_PROJECT_SUBPATH}") + + set(REQUIRES_AUTOGEN FALSE) # use autogen.sh + set(REQUIRES_AUTOCONFIG FALSE) # use autotools and configure.ac + if(EXISTS "${SRC_DIR}/configure" AND "${SRC_DIR}/configure.ac") # remove configure; rerun autoconf + if(NOT VCPKG_MAINTAINER_SKIP_AUTOCONFIG) # If fixing bugs skipping autoconfig saves a lot of time + set(REQUIRES_AUTOCONFIG TRUE) + file(REMOVE "${SRC_DIR}/configure") # remove possible autodated configure scripts + set(_csc_AUTOCONFIG ON) + endif() + elseif(EXISTS "${SRC_DIR}/configure" AND NOT _csc_SKIP_CONFIGURE) # run normally; no autoconf or autgen required + elseif(EXISTS "${SRC_DIR}/configure.ac") # Run autoconfig + set(REQUIRES_AUTOCONFIG TRUE) + set(_csc_AUTOCONFIG ON) + elseif(EXISTS "${SRC_DIR}/autogen.sh") # Run autogen + set(REQUIRES_AUTOGEN TRUE) + else() + message(FATAL_ERROR "Could not determine method to configure make") + endif() + + debug_message("REQUIRES_AUTOGEN:${REQUIRES_AUTOGEN}") + debug_message("REQUIRES_AUTOCONFIG:${REQUIRES_AUTOCONFIG}") + # Backup environment variables + # CCAS CC C CPP CXX FC FF GC LD LF LIBTOOL OBJC OBJCXX R UPC Y + set(FLAGPREFIXES CCAS CC C CPP CXX FC FF GC LD LF LIBTOOL OBJC OBJXX R UPC Y) + foreach(_prefix IN LISTS FLAGPREFIXES) + _vcpkg_backup_env_variable(${prefix}FLAGS) + endforeach() + + # FC fotran compiler | FF Fortran 77 compiler + # LDFLAGS -> pass -L flags + # LIBS -> pass -l flags + + #Used by gcc/linux + _vcpkg_backup_env_variables(C_INCLUDE_PATH CPLUS_INCLUDE_PATH LIBRARY_PATH LD_LIBRARY_PATH) + + #Used by cl + _vcpkg_backup_env_variables(INCLUDE LIB LIBPATH) + + if(CURRENT_PACKAGES_DIR MATCHES " " OR CURRENT_INSTALLED_DIR MATCHES " ") + # Don't bother with whitespace. The tools will probably fail and I tried very hard trying to make it work (no success so far)! + message(WARNING "Detected whitespace in root directory. Please move the path to one without whitespaces! The required tools do not handle whitespaces correctly and the build will most likely fail") + endif() + + # Pre-processing windows configure requirements + if (CMAKE_HOST_WIN32) + list(APPEND MSYS_REQUIRE_PACKAGES binutils libtool autoconf automake-wrapper automake1.16 m4) + vcpkg_acquire_msys(MSYS_ROOT PACKAGES ${MSYS_REQUIRE_PACKAGES}) + + if (_csc_AUTOCONFIG AND NOT _csc_BUILD_TRIPLET OR _csc_DETERMINE_BUILD_TRIPLET) + _vcpkg_determine_autotools_host_cpu(BUILD_ARCH) # VCPKG_HOST => machine you are building on => --build= + _vcpkg_determine_autotools_target_cpu(TARGET_ARCH) + # --build: the machine you are building on + # --host: the machine you are building for + # --target: the machine that CC will produce binaries for + # https://stackoverflow.com/questions/21990021/how-to-determine-host-value-for-configure-when-using-cross-compiler + # 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. + 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") + # Needs to be different from --build to enable cross builds. + string(APPEND _csc_BUILD_TRIPLET " --host=${TARGET_ARCH}-unknown-mingw32") + endif() + debug_message("Using make triplet: ${_csc_BUILD_TRIPLET}") + endif() + set(APPEND_ENV) + if(_csc_AUTOCONFIG OR _csc_USE_WRAPPERS) + set(APPEND_ENV ";${MSYS_ROOT}/usr/share/automake-1.16") + endif() + # This inserts msys before system32 (which masks sort.exe and find.exe) but after MSVC (which avoids masking link.exe) + string(REPLACE ";$ENV{SystemRoot}\\System32;" "${APPEND_ENV};${MSYS_ROOT}/usr/bin;$ENV{SystemRoot}\\System32;" NEWPATH "$ENV{PATH}") + string(REPLACE ";$ENV{SystemRoot}\\system32;" "${APPEND_ENV};${MSYS_ROOT}/usr/bin;$ENV{SystemRoot}\\system32;" NEWPATH "$ENV{PATH}") + set(ENV{PATH} "${NEWPATH}") + set(BASH "${MSYS_ROOT}/usr/bin/bash.exe") + + macro(_vcpkg_append_to_configure_environment inoutstring var defaultval) + # Allows to overwrite settings in custom triplets via the environment + if(DEFINED ENV{${var}}) + string(APPEND ${inoutstring} " ${var}='$ENV{${var}}'") + else() + string(APPEND ${inoutstring} " ${var}='${defaultval}'") + endif() + endmacro() + + set(CONFIGURE_ENV "V=1") + if (_csc_AUTOCONFIG OR _csc_USE_WRAPPERS) + _vcpkg_append_to_configure_environment(CONFIGURE_ENV CPP "compile cl.exe -nologo -E") + _vcpkg_append_to_configure_environment(CONFIGURE_ENV CC "compile cl.exe -nologo") + _vcpkg_append_to_configure_environment(CONFIGURE_ENV CXX "compile cl.exe -nologo") + _vcpkg_append_to_configure_environment(CONFIGURE_ENV AR "ar-lib lib.exe -verbose") + else() + _vcpkg_append_to_configure_environment(CONFIGURE_ENV CPP "cl.exe -nologo -E") + _vcpkg_append_to_configure_environment(CONFIGURE_ENV CC "cl.exe -nologo") + _vcpkg_append_to_configure_environment(CONFIGURE_ENV CXX "cl.exe -nologo") + _vcpkg_append_to_configure_environment(CONFIGURE_ENV AR "lib.exe -verbose") + endif() + _vcpkg_append_to_configure_environment(CONFIGURE_ENV LD "link.exe -verbose") + _vcpkg_append_to_configure_environment(CONFIGURE_ENV RANLIB ":") # Trick to ignore the RANLIB call + #_vcpkg_append_to_configure_environment(CONFIGURE_ENV OBJDUMP ":") ' Objdump is required to make shared libraries. Otherwise define lt_cv_deplibs_check_method=pass_all + _vcpkg_append_to_configure_environment(CONFIGURE_ENV CCAS ":") # If required set the ENV variable CCAS in the portfile correctly + _vcpkg_append_to_configure_environment(CONFIGURE_ENV STRIP ":") # If required set the ENV variable STRIP in the portfile correctly + _vcpkg_append_to_configure_environment(CONFIGURE_ENV NM "dumpbin.exe -symbols -headers") + # Would be better to have a true nm here! Some symbols (mainly exported variables) get not properly imported with dumpbin as nm + # and require __declspec(dllimport) for some reason (same problem CMake has with WINDOWS_EXPORT_ALL_SYMBOLS) + _vcpkg_append_to_configure_environment(CONFIGURE_ENV DLLTOOL "link.exe -verbose -dll") + + foreach(_env IN LISTS _csc_CONFIGURE_ENVIRONMENT_VARIABLES) + _vcpkg_append_to_configure_environment(CONFIGURE_ENV ${_env} "${${_env}}") + endforeach() + # Other maybe interesting variables to control + # COMPILE This is the command used to actually compile a C source file. The file name is appended to form the complete command line. + # LINK This is the command used to actually link a C program. + # CXXCOMPILE The command used to actually compile a C++ source file. The file name is appended to form the complete command line. + # CXXLINK The command used to actually link a C++ program. + + #Some PATH handling for dealing with spaces....some tools will still fail with that! + string(REPLACE " " "\\\ " _VCPKG_PREFIX ${CURRENT_INSTALLED_DIR}) + string(REGEX REPLACE "([a-zA-Z]):/" "/\\1/" _VCPKG_PREFIX "${_VCPKG_PREFIX}") + set(_VCPKG_INSTALLED ${CURRENT_INSTALLED_DIR}) + string(REPLACE " " "\ " _VCPKG_INSTALLED_PKGCONF ${CURRENT_INSTALLED_DIR}) + string(REGEX REPLACE "([a-zA-Z]):/" "/\\1/" _VCPKG_INSTALLED_PKGCONF ${_VCPKG_INSTALLED_PKGCONF}) + string(REPLACE "\\" "/" _VCPKG_INSTALLED_PKGCONF ${_VCPKG_INSTALLED_PKGCONF}) + set(prefix_var "'\${prefix}'") # Windows needs extra quotes or else the variable gets expanded in the makefile! + else() + string(REPLACE " " "\ " _VCPKG_PREFIX ${CURRENT_INSTALLED_DIR}) + string(REPLACE " " "\ " _VCPKG_INSTALLED ${CURRENT_INSTALLED_DIR}) + set(_VCPKG_INSTALLED_PKGCONF ${CURRENT_INSTALLED_DIR}) + set(EXTRA_QUOTES) + set(prefix_var "\${prefix}") + endif() + + # Cleanup previous build dirs + file(REMOVE_RECURSE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel" + "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg" + "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}") + + # Set configure paths + set(_csc_OPTIONS_RELEASE ${_csc_OPTIONS_RELEASE} "--prefix=${EXTRA_QUOTES}${_VCPKG_PREFIX}${EXTRA_QUOTES}") + set(_csc_OPTIONS_DEBUG ${_csc_OPTIONS_DEBUG} "--prefix=${EXTRA_QUOTES}${_VCPKG_PREFIX}/debug${EXTRA_QUOTES}") + if(NOT _csc_NO_ADDITIONAL_PATHS) + set(_csc_OPTIONS_RELEASE ${_csc_OPTIONS_RELEASE} + # Important: These should all be relative to prefix! + "--bindir=${prefix_var}/tools/${PORT}/bin" + "--sbindir=${prefix_var}/tools/${PORT}/sbin" + #"--libdir='\${prefix}'/lib" # already the default! + #"--includedir='\${prefix}'/include" # already the default! + "--mandir=${prefix_var}/share/${PORT}" + "--docdir=${prefix_var}/share/${PORT}" + "--datarootdir=${prefix_var}/share/${PORT}") + set(_csc_OPTIONS_DEBUG ${_csc_OPTIONS_DEBUG} + # Important: These should all be relative to prefix! + "--bindir=${prefix_var}/../tools/${PORT}/debug/bin" + "--sbindir=${prefix_var}/../tools/${PORT}/debug/sbin" + #"--libdir='\${prefix}'/lib" # already the default! + "--includedir=${prefix_var}/../include" + "--datarootdir=${prefix_var}/share/${PORT}") + endif() + # Setup common options + if(NOT DISABLE_VERBOSE_FLAGS) + list(APPEND _csc_OPTIONS --disable-silent-rules --verbose) + endif() + + if(VCPKG_LIBRARY_LINKAGE STREQUAL dynamic) + list(APPEND _csc_OPTIONS --enable-shared --disable-static) + else() + list(APPEND _csc_OPTIONS --disable-shared --enable-static) + endif() + + file(RELATIVE_PATH RELATIVE_BUILD_PATH "${CURRENT_BUILDTREES_DIR}" "${_csc_SOURCE_PATH}/${_csc_PROJECT_SUBPATH}") + + set(base_cmd) + if(CMAKE_HOST_WIN32) + set(base_cmd ${BASH} --noprofile --norc --debug) + # Load toolchains + if(NOT VCPKG_CHAINLOAD_TOOLCHAIN_FILE) + set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/windows.cmake") + endif() + include("${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}") + #Join the options list as a string with spaces between options + list(JOIN _csc_OPTIONS " " _csc_OPTIONS) + list(JOIN _csc_OPTIONS_RELEASE " " _csc_OPTIONS_RELEASE) + list(JOIN _csc_OPTIONS_DEBUG " " _csc_OPTIONS_DEBUG) + endif() + + # Setup include environment (since these are buildtype independent restoring them is unnecessary) + # Used by CL + set(ENV{INCLUDE} "${_VCPKG_INSTALLED}/include${VCPKG_HOST_PATH_SEPARATOR}${INCLUDE_BACKUP}") + # Used by GCC + set(ENV{C_INCLUDE_PATH} "${_VCPKG_INSTALLED}/include${VCPKG_HOST_PATH_SEPARATOR}${C_INCLUDE_PATH_BACKUP}") + set(ENV{CPLUS_INCLUDE_PATH} "${_VCPKG_INSTALLED}/include${VCPKG_HOST_PATH_SEPARATOR}${CPLUS_INCLUDE_PATH_BACKUP}") + + # Setup global flags -> TODO: Further improve with toolchain file in mind! + set(CPP_FLAGS_GLOBAL "$ENV{CPPFLAGS} -I${_VCPKG_INSTALLED}/include") + set(C_FLAGS_GLOBAL "$ENV{CFLAGS} ${VCPKG_C_FLAGS}") + set(CXX_FLAGS_GLOBAL "$ENV{CXXFLAGS} ${VCPKG_CXX_FLAGS}") + set(LD_FLAGS_GLOBAL "$ENV{LDFLAGS} ${VCPKG_LINKER_FLAGS}") + # Flags should be set in the toolchain instead (Setting this up correctly requires a function named vcpkg_determined_cmake_compiler_flags which can also be used to setup CC and CXX etc.) + if(NOT VCPKG_TARGET_IS_WINDOWS) + string(APPEND C_FLAGS_GLOBAL " -fPIC") + string(APPEND CXX_FLAGS_GLOBAL " -fPIC") + else() + # TODO: Should be CPP flags instead -> rewrite when vcpkg_determined_cmake_compiler_flags defined + string(APPEND CPP_FLAGS_GLOBAL " /D_WIN32_WINNT=0x0601 /DWIN32_LEAN_AND_MEAN /DWIN32 /D_WINDOWS") + if(VCPKG_TARGET_IS_UWP) + # Be aware that configure thinks it is crosscompiling due to: + # error while loading shared libraries: VCRUNTIME140D_APP.dll: + # cannot open shared object file: No such file or directory + # IMPORTANT: The only way to pass linker flags through libtool AND the compile wrapper + # is to use the CL and LINK environment variables !!! + # (This is due to libtool and compiler wrapper using the same set of options to pass those variables around) + string(REPLACE "\\" "/" VCToolsInstallDir "$ENV{VCToolsInstallDir}") + set(ENV{_CL_} "$ENV{_CL_} /DWINAPI_FAMILY=WINAPI_FAMILY_APP /D__WRL_NO_DEFAULT_LIB_ -FU\"${VCToolsInstallDir}/lib/x86/store/references/platform.winmd\"") + set(ENV{_LINK_} "$ENV{_LINK_} /MANIFEST /DYNAMICBASE WindowsApp.lib /WINMD:NO /APPCONTAINER") + endif() + if(VCPKG_TARGET_ARCHITECTURE STREQUAL x64) + set(ENV{_LINK_} "$ENV{_LINK_} -MACHINE:x64") + elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL x86) + set(ENV{_LINK_} "$ENV{_LINK_} -MACHINE:x86") + elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL arm) + set(ENV{_LINK_} "$ENV{_LINK_} -MACHINE:ARM") + elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL arm64) + set(ENV{_LINK_} "$ENV{_LINK_} -MACHINE:ARM64") + endif() + endif() + + vcpkg_find_acquire_program(PKGCONFIG) + if(VCPKG_LIBRARY_LINKAGE STREQUAL "static" AND NOT PKGCONFIG STREQUAL "--static") + set(PKGCONFIG "${PKGCONFIG} --static") + endif() + # Run autoconf if necessary + set(_GENERATED_CONFIGURE FALSE) + if (_csc_AUTOCONFIG OR REQUIRES_AUTOCONFIG) + find_program(AUTORECONF autoreconf) + if(NOT AUTORECONF) + message(FATAL_ERROR "${PORT} requires autoconf from the system package manager (example: \"sudo apt-get install autoconf\")") + endif() + message(STATUS "Generating configure for ${TARGET_TRIPLET}") + if (CMAKE_HOST_WIN32) + vcpkg_execute_required_process( + COMMAND ${base_cmd} -c "autoreconf -vfi" + WORKING_DIRECTORY "${SRC_DIR}" + LOGNAME autoconf-${TARGET_TRIPLET} + ) + else() + vcpkg_execute_required_process( + COMMAND ${AUTORECONF} -vfi + WORKING_DIRECTORY "${SRC_DIR}" + LOGNAME autoconf-${TARGET_TRIPLET} + ) + endif() + message(STATUS "Finished generating configure for ${TARGET_TRIPLET}") + endif() + if(REQUIRES_AUTOGEN) + message(STATUS "Generating configure for ${TARGET_TRIPLET} via autogen.sh") + if (CMAKE_HOST_WIN32) + vcpkg_execute_required_process( + COMMAND ${base_cmd} -c "./autogen.sh" + WORKING_DIRECTORY "${SRC_DIR}" + LOGNAME autoconf-${TARGET_TRIPLET} + ) + else() + vcpkg_execute_required_process( + COMMAND "./autogen.sh" + WORKING_DIRECTORY "${SRC_DIR}" + LOGNAME autoconf-${TARGET_TRIPLET} + ) + endif() + message(STATUS "Finished generating configure for ${TARGET_TRIPLET}") + endif() + + if (_csc_PRERUN_SHELL) + message(STATUS "Prerun shell with ${TARGET_TRIPLET}") + vcpkg_execute_required_process( + COMMAND ${base_cmd} -c "${_csc_PRERUN_SHELL}" + WORKING_DIRECTORY "${SRC_DIR}" + LOGNAME prerun-${TARGET_TRIPLET} + ) + endif() + + if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug" AND NOT _csc_NO_DEBUG) + set(_VAR_SUFFIX DEBUG) + set(PATH_SUFFIX_${_VAR_SUFFIX} "/debug") + set(SHORT_NAME_${_VAR_SUFFIX} "dbg") + list(APPEND _buildtypes ${_VAR_SUFFIX}) + if (CMAKE_HOST_WIN32) # Flags should be set in the toolchain instead + string(REGEX REPLACE "[ \t]+/" " -" CPPFLAGS_${_VAR_SUFFIX} "${CPP_FLAGS_GLOBAL}") + string(REGEX REPLACE "[ \t]+/" " -" CFLAGS_${_VAR_SUFFIX} "${C_FLAGS_GLOBAL} ${VCPKG_CRT_LINK_FLAG_PREFIX}d /D_DEBUG /Ob0 /Od ${VCPKG_C_FLAGS_${_VAR_SUFFIX}}") + string(REGEX REPLACE "[ \t]+/" " -" CXXFLAGS_${_VAR_SUFFIX} "${CXX_FLAGS_GLOBAL} ${VCPKG_CRT_LINK_FLAG_PREFIX}d /D_DEBUG /Ob0 /Od ${VCPKG_CXX_FLAGS_${_VAR_SUFFIX}}") + string(REGEX REPLACE "[ \t]+/" " -" LDFLAGS_${_VAR_SUFFIX} "-L${_VCPKG_INSTALLED}${PATH_SUFFIX_${_VAR_SUFFIX}}/lib ${LD_FLAGS_GLOBAL} ${VCPKG_LINKER_FLAGS_${_VAR_SUFFIX}}") + else() + set(CPPFLAGS_${_VAR_SUFFIX} "${CPP_FLAGS_GLOBAL}") + set(CFLAGS_${_VAR_SUFFIX} "${C_FLAGS_GLOBAL} ${VCPKG_C_FLAGS_DEBUG}") + set(CXXFLAGS_${_VAR_SUFFIX} "${CXX_FLAGS_GLOBAL} ${VCPKG_CXX_FLAGS_DEBUG}") + set(LDFLAGS_${_VAR_SUFFIX} "-L${_VCPKG_INSTALLED}${PATH_SUFFIX_${_VAR_SUFFIX}}/lib/ -L${_VCPKG_INSTALLED}${PATH_SUFFIX_${_VAR_SUFFIX}}/lib/manual-link/ ${LD_FLAGS_GLOBAL} ${VCPKG_LINKER_FLAGS_${_VAR_SUFFIX}}") + endif() + unset(_VAR_SUFFIX) + endif() + if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release") + set(_VAR_SUFFIX RELEASE) + set(PATH_SUFFIX_${_VAR_SUFFIX} "") + set(SHORT_NAME_${_VAR_SUFFIX} "rel") + list(APPEND _buildtypes ${_VAR_SUFFIX}) + if (CMAKE_HOST_WIN32) # Flags should be set in the toolchain + string(REGEX REPLACE "[ \t]+/" " -" CPPFLAGS_${_VAR_SUFFIX} "${CPP_FLAGS_GLOBAL}") + string(REGEX REPLACE "[ \t]+/" " -" CFLAGS_${_VAR_SUFFIX} "${C_FLAGS_GLOBAL} ${VCPKG_CRT_LINK_FLAG_PREFIX} /O2 /Oi /Gy /DNDEBUG ${VCPKG_C_FLAGS_${_VAR_SUFFIX}}") + string(REGEX REPLACE "[ \t]+/" " -" CXXFLAGS_${_VAR_SUFFIX} "${CXX_FLAGS_GLOBAL} ${VCPKG_CRT_LINK_FLAG_PREFIX} /O2 /Oi /Gy /DNDEBUG ${VCPKG_CXX_FLAGS_${_VAR_SUFFIX}}") + string(REGEX REPLACE "[ \t]+/" " -" LDFLAGS_${_VAR_SUFFIX} "-L${_VCPKG_INSTALLED}${PATH_SUFFIX_${_VAR_SUFFIX}}/lib ${LD_FLAGS_GLOBAL} ${VCPKG_LINKER_FLAGS_${_VAR_SUFFIX}}") + else() + set(CPPFLAGS_${_VAR_SUFFIX} "${CPP_FLAGS_GLOBAL}") + set(CFLAGS_${_VAR_SUFFIX} "${C_FLAGS_GLOBAL} ${VCPKG_C_FLAGS_DEBUG}") + set(CXXFLAGS_${_VAR_SUFFIX} "${CXX_FLAGS_GLOBAL} ${VCPKG_CXX_FLAGS_DEBUG}") + set(LDFLAGS_${_VAR_SUFFIX} "-L${_VCPKG_INSTALLED}${PATH_SUFFIX_${_VAR_SUFFIX}}/lib/ -L${_VCPKG_INSTALLED}${PATH_SUFFIX_${_VAR_SUFFIX}}/lib/manual-link/ ${LD_FLAGS_GLOBAL} ${VCPKG_LINKER_FLAGS_${_VAR_SUFFIX}}") + endif() + unset(_VAR_SUFFIX) + endif() + + foreach(_buildtype IN LISTS _buildtypes) + foreach(ENV_VAR ${_csc_CONFIG_DEPENDENT_ENVIRONMENT}) + if(DEFINED ENV{${ENV_VAR}}) + set(BACKUP_CONFIG_${ENV_VAR} "$ENV{${ENV_VAR}}") + endif() + set(ENV{${ENV_VAR}} "${${ENV_VAR}_${_buildtype}}") + endforeach() + + set(TAR_DIR "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${SHORT_NAME_${_buildtype}}") + file(MAKE_DIRECTORY "${TAR_DIR}") + file(RELATIVE_PATH RELATIVE_BUILD_PATH "${TAR_DIR}" "${SRC_DIR}") + + if(_csc_COPY_SOURCE) + file(COPY "${SRC_DIR}/" DESTINATION "${TAR_DIR}") + set(RELATIVE_BUILD_PATH .) + endif() + + set(PKGCONFIG_INSTALLED_DIR "${_VCPKG_INSTALLED_PKGCONF}${PATH_SUFFIX_${_buildtype}}/lib/pkgconfig") + set(PKGCONFIG_INSTALLED_SHARE_DIR "${_VCPKG_INSTALLED_PKGCONF}/share/pkgconfig") + + if(ENV{PKG_CONFIG_PATH}) + set(BACKUP_ENV_PKG_CONFIG_PATH_${_buildtype} $ENV{PKG_CONFIG_PATH}) + set(ENV{PKG_CONFIG_PATH} "${PKGCONFIG_INSTALLED_DIR}:${PKGCONFIG_INSTALLED_SHARE_DIR}:$ENV{PKG_CONFIG_PATH}") + else() + set(ENV{PKG_CONFIG_PATH} "${PKGCONFIG_INSTALLED_DIR}:${PKGCONFIG_INSTALLED_SHARE_DIR}") + endif() + + # Setup environment + set(ENV{CPPFLAGS} ${CPPFLAGS_${_buildtype}}) + set(ENV{CFLAGS} ${CFLAGS_${_buildtype}}) + set(ENV{CXXFLAGS} ${CXXFLAGS_${_buildtype}}) + set(ENV{LDFLAGS} ${LDFLAGS_${_buildtype}}) + set(ENV{PKG_CONFIG} "${PKGCONFIG} --define-variable=prefix=${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}") + + set(ENV{LIB} "${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}/lib/${VCPKG_HOST_PATH_SEPARATOR}${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}/lib/manual-link/${LIB_PATHLIKE_CONCAT}") + set(ENV{LIBPATH} "${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}/lib/${VCPKG_HOST_PATH_SEPARATOR}${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}/lib/manual-link/${LIBPATH_PATHLIKE_CONCAT}") + set(ENV{LIBRARY_PATH} "${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}/lib/${VCPKG_HOST_PATH_SEPARATOR}${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}/lib/manual-link/${LIBRARY_PATH_PATHLIKE_CONCAT}") + set(ENV{LD_LIBRARY_PATH} "${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}/lib/${VCPKG_HOST_PATH_SEPARATOR}${_VCPKG_INSTALLED}${PATH_SUFFIX_${_buildtype}}/lib/manual-link/${LD_LIBRARY_PATH_PATHLIKE_CONCAT}") + + if (CMAKE_HOST_WIN32) + set(command ${base_cmd} -c "${CONFIGURE_ENV} ./${RELATIVE_BUILD_PATH}/configure ${_csc_BUILD_TRIPLET} ${_csc_OPTIONS} ${_csc_OPTIONS_${_buildtype}}") + else() + set(command /bin/bash "./${RELATIVE_BUILD_PATH}/configure" ${_csc_BUILD_TRIPLET} ${_csc_OPTIONS} ${_csc_OPTIONS_${_buildtype}}) + endif() + if(_csc_ADD_BIN_TO_PATH) + set(PATH_BACKUP $ENV{PATH}) + vcpkg_add_to_path("${CURRENT_INSTALLED_DIR}${PATH_SUFFIX_${_buildtype}}/bin") + endif() + debug_message("Configure command:'${command}'") + if (NOT _csc_SKIP_CONFIGURE) + message(STATUS "Configuring ${TARGET_TRIPLET}-${SHORT_NAME_${_buildtype}}") + vcpkg_execute_required_process( + COMMAND ${command} + WORKING_DIRECTORY "${TAR_DIR}" + LOGNAME config-${TARGET_TRIPLET}-${SHORT_NAME_${_buildtype}} + ) + if(EXISTS "${TAR_DIR}/libtool" AND VCPKG_TARGET_IS_WINDOWS AND VCPKG_LIBRARY_LINKAGE STREQUAL dynamic) + set(_file "${TAR_DIR}/libtool") + file(READ "${_file}" _contents) + string(REPLACE ".dll.lib" ".lib" _contents "${_contents}") + file(WRITE "${_file}" "${_contents}") + endif() + endif() + + if(BACKUP_ENV_PKG_CONFIG_PATH_${_buildtype}) + set(ENV{PKG_CONFIG_PATH} "${BACKUP_ENV_PKG_CONFIG_PATH_${_buildtype}}") + else() + unset(ENV{PKG_CONFIG_PATH}) + endif() + unset(BACKUP_ENV_PKG_CONFIG_PATH_${_buildtype}) + + if(_csc_ADD_BIN_TO_PATH) + set(ENV{PATH} "${PATH_BACKUP}") + endif() + # Restore environment (config dependent) + foreach(ENV_VAR ${_csc_CONFIG_DEPENDENT_ENVIRONMENT}) + if(BACKUP_CONFIG_${ENV_VAR}) + set(ENV{${ENV_VAR}} "${BACKUP_CONFIG_${ENV_VAR}}") + else() + unset(ENV{${ENV_VAR}}) + endif() + endforeach() + endforeach() + + # Restore environment + foreach(_prefix IN LISTS FLAGPREFIXES) + _vcpkg_restore_env_variable(${prefix}FLAGS) + endforeach() + + _vcpkg_restore_env_variables(LIB LIBPATH LIBRARY_PATH LD_LIBRARY_PATH) + + SET(_VCPKG_PROJECT_SOURCE_PATH ${_csc_SOURCE_PATH} PARENT_SCOPE) + set(_VCPKG_PROJECT_SUBPATH ${_csc_PROJECT_SUBPATH} PARENT_SCOPE) +endfunction() diff --git a/scripts/cmake/vcpkg_configure_meson.cmake b/scripts/cmake/vcpkg_configure_meson.cmake index 86a6e5586..71d9267db 100644 --- a/scripts/cmake/vcpkg_configure_meson.cmake +++ b/scripts/cmake/vcpkg_configure_meson.cmake @@ -34,7 +34,8 @@ ## * [fribidi](https://github.com/Microsoft/vcpkg/blob/master/ports/fribidi/portfile.cmake) ## * [libepoxy](https://github.com/Microsoft/vcpkg/blob/master/ports/libepoxy/portfile.cmake) function(vcpkg_configure_meson) - cmake_parse_arguments(_vcm "" "SOURCE_PATH" "OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _vcm "" "SOURCE_PATH" "OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE") file(REMOVE_RECURSE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel) file(REMOVE_RECURSE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg) diff --git a/scripts/cmake/vcpkg_configure_qmake.cmake b/scripts/cmake/vcpkg_configure_qmake.cmake index 7bb205742..f0baabb6a 100644 --- a/scripts/cmake/vcpkg_configure_qmake.cmake +++ b/scripts/cmake/vcpkg_configure_qmake.cmake @@ -16,7 +16,8 @@ # The options passed to qmake. function(vcpkg_configure_qmake) - cmake_parse_arguments(_csc "" "SOURCE_PATH" "OPTIONS;OPTIONS_RELEASE;OPTIONS_DEBUG;BUILD_OPTIONS;BUILD_OPTIONS_RELEASE;BUILD_OPTIONS_DEBUG" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _csc "" "SOURCE_PATH" "OPTIONS;OPTIONS_RELEASE;OPTIONS_DEBUG;BUILD_OPTIONS;BUILD_OPTIONS_RELEASE;BUILD_OPTIONS_DEBUG") # Find qmake executable set(_triplet_hostbindir ${CURRENT_INSTALLED_DIR}/tools/qt5/bin) diff --git a/scripts/cmake/vcpkg_copy_pdbs.cmake b/scripts/cmake/vcpkg_copy_pdbs.cmake index 12154d91c..d3cb7e6ec 100644 --- a/scripts/cmake/vcpkg_copy_pdbs.cmake +++ b/scripts/cmake/vcpkg_copy_pdbs.cmake @@ -21,7 +21,8 @@ ## * [zlib](https://github.com/Microsoft/vcpkg/blob/master/ports/zlib/portfile.cmake) ## * [cpprestsdk](https://github.com/Microsoft/vcpkg/blob/master/ports/cpprestsdk/portfile.cmake) function(vcpkg_copy_pdbs) - cmake_parse_arguments(_vcp "" "" "BUILD_PATHS" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _vcp "" "" "BUILD_PATHS") if(NOT _vcp_BUILD_PATHS) set( diff --git a/scripts/cmake/vcpkg_copy_tools.cmake b/scripts/cmake/vcpkg_copy_tools.cmake index 9651b5357..147a42696 100644 --- a/scripts/cmake/vcpkg_copy_tools.cmake +++ b/scripts/cmake/vcpkg_copy_tools.cmake @@ -26,7 +26,8 @@ ## * [nanomsg](https://github.com/microsoft/vcpkg/blob/master/ports/nanomsg/portfile.cmake)
## * [uriparser](https://github.com/microsoft/vcpkg/blob/master/ports/uriparser/portfile.cmake)
function(vcpkg_copy_tools)
- cmake_parse_arguments(_vct "AUTO_CLEAN" "SEARCH_DIR" "TOOL_NAMES" ${ARGN})
+ # parse parameters such that semicolons in options arguments to COMMAND don't get erased
+ cmake_parse_arguments(PARSE_ARGV 0 _vct "AUTO_CLEAN" "SEARCH_DIR" "TOOL_NAMES")
if(NOT DEFINED _vct_TOOL_NAMES)
message(FATAL_ERROR "TOOL_NAMES must be specified.")
diff --git a/scripts/cmake/vcpkg_download_distfile.cmake b/scripts/cmake/vcpkg_download_distfile.cmake index a767bff83..ff42fd64e 100644 --- a/scripts/cmake/vcpkg_download_distfile.cmake +++ b/scripts/cmake/vcpkg_download_distfile.cmake @@ -56,6 +56,7 @@ function(vcpkg_download_distfile VAR) set(options SKIP_SHA512 SILENT_EXIT QUIET) set(oneValueArgs FILENAME SHA512) set(multipleValuesArgs URLS HEADERS) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased cmake_parse_arguments(PARSE_ARGV 1 vcpkg_download_distfile "${options}" "${oneValueArgs}" "${multipleValuesArgs}") if(NOT DEFINED vcpkg_download_distfile_URLS) diff --git a/scripts/cmake/vcpkg_execute_build_process.cmake b/scripts/cmake/vcpkg_execute_build_process.cmake index 98e3648d5..9f9374184 100644 --- a/scripts/cmake/vcpkg_execute_build_process.cmake +++ b/scripts/cmake/vcpkg_execute_build_process.cmake @@ -33,7 +33,8 @@ ## * [icu](https://github.com/Microsoft/vcpkg/blob/master/ports/icu/portfile.cmake) include(vcpkg_prettify_command) function(vcpkg_execute_build_process) - cmake_parse_arguments(_ebp "" "WORKING_DIRECTORY;LOGNAME" "COMMAND;NO_PARALLEL_COMMAND" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _ebp "" "WORKING_DIRECTORY;LOGNAME" "COMMAND;NO_PARALLEL_COMMAND") set(LOG_OUT "${CURRENT_BUILDTREES_DIR}/${_ebp_LOGNAME}-out.log") set(LOG_ERR "${CURRENT_BUILDTREES_DIR}/${_ebp_LOGNAME}-err.log") diff --git a/scripts/cmake/vcpkg_execute_required_process.cmake b/scripts/cmake/vcpkg_execute_required_process.cmake index b59675c35..454d97b80 100644 --- a/scripts/cmake/vcpkg_execute_required_process.cmake +++ b/scripts/cmake/vcpkg_execute_required_process.cmake @@ -9,6 +9,8 @@ ## WORKING_DIRECTORY <${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg> ## LOGNAME <build-${TARGET_TRIPLET}-dbg> ## [TIMEOUT <seconds>] +## [OUTPUT_VARIABLE <var>] +## [ERROR_VARIABLE <var>] ## ) ## ``` ## ## Parameters @@ -28,6 +30,12 @@ ## ### TIMEOUT ## Optional timeout after which to terminate the command. ## +## ### OUTPUT_VARIABLE +## Optional variable to receive stdout of the command. +## +## ### ERROR_VARIABLE +## Optional variable to receive stderr of the command. +## ## This should be a unique name for different triplets so that the logs don't conflict when building multiple at once. ## ## ## Examples @@ -41,14 +49,25 @@ include(vcpkg_prettify_command) include(vcpkg_execute_in_download_mode) function(vcpkg_execute_required_process) - cmake_parse_arguments(vcpkg_execute_required_process "ALLOW_IN_DOWNLOAD_MODE" "WORKING_DIRECTORY;LOGNAME;TIMEOUT" "COMMAND" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 vcpkg_execute_required_process "ALLOW_IN_DOWNLOAD_MODE" "WORKING_DIRECTORY;LOGNAME;TIMEOUT;OUTPUT_VARIABLE;ERROR_VARIABLE" "COMMAND") set(LOG_OUT "${CURRENT_BUILDTREES_DIR}/${vcpkg_execute_required_process_LOGNAME}-out.log") set(LOG_ERR "${CURRENT_BUILDTREES_DIR}/${vcpkg_execute_required_process_LOGNAME}-err.log") if(vcpkg_execute_required_process_TIMEOUT) - set(TIMEOUT_PARAM "TIMEOUT;${vcpkg_execute_required_process_TIMEOUT}") + set(TIMEOUT_PARAM "TIMEOUT;${vcpkg_execute_required_process_TIMEOUT}") + else() + set(TIMEOUT_PARAM "") + endif() + if(vcpkg_execute_required_process_OUTPUT_VARIABLE) + set(OUTPUT_VARIABLE_PARAM "OUTPUT_VARIABLE;${vcpkg_execute_required_process_OUTPUT_VARIABLE}") else() - set(TIMEOUT_PARAM "") + set(OUTPUT_VARIABLE_PARAM "") + endif() + if(vcpkg_execute_required_process_ERROR_VARIABLE) + set(ERROR_VARIABLE_PARAM "ERROR_VARIABLE;${vcpkg_execute_required_process_ERROR_VARIABLE}") + else() + set(ERROR_VARIABLE_PARAM "") endif() if (DEFINED VCPKG_DOWNLOAD_MODE AND NOT vcpkg_execute_required_process_ALLOW_IN_DOWNLOAD_MODE) @@ -65,7 +84,9 @@ Halting portfile execution. ERROR_FILE ${LOG_ERR} RESULT_VARIABLE error_code WORKING_DIRECTORY ${vcpkg_execute_required_process_WORKING_DIRECTORY} - ${TIMEOUT_PARAM}) + ${TIMEOUT_PARAM} + ${OUTPUT_VARIABLE_PARAM} + ${ERROR_VARIABLE_PARAM}) if(error_code) set(LOGS) file(READ "${LOG_OUT}" out_contents) @@ -90,4 +111,10 @@ Halting portfile execution. ${STRINGIFIED_LOGS} ) endif() + # pass output parameters back to caller's scope + foreach(arg OUTPUT_VARIABLE ERROR_VARIABLE) + if(vcpkg_execute_required_process_${arg}) + set(${vcpkg_execute_required_process_${arg}} ${${vcpkg_execute_required_process_${arg}}} PARENT_SCOPE) + endif() + endforeach() endfunction() diff --git a/scripts/cmake/vcpkg_execute_required_process_repeat.cmake b/scripts/cmake/vcpkg_execute_required_process_repeat.cmake index ca11e8ea4..91b847dc5 100644 --- a/scripts/cmake/vcpkg_execute_required_process_repeat.cmake +++ b/scripts/cmake/vcpkg_execute_required_process_repeat.cmake @@ -1,11 +1,19 @@ # Usage: vcpkg_execute_required_process_repeat(COUNT <num> COMMAND <cmd> [<args>...] WORKING_DIRECTORY </path/to/dir> LOGNAME <my_log_name>) include(vcpkg_prettify_command) function(vcpkg_execute_required_process_repeat) - cmake_parse_arguments(vcpkg_execute_required_process_repeat "" "COUNT;WORKING_DIRECTORY;LOGNAME" "COMMAND" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 vcpkg_execute_required_process_repeat "ALLOW_IN_DOWNLOAD_MODE" "COUNT;WORKING_DIRECTORY;LOGNAME" "COMMAND") #debug_message("vcpkg_execute_required_process_repeat(${vcpkg_execute_required_process_repeat_COMMAND})") + if (DEFINED VCPKG_DOWNLOAD_MODE AND NOT vcpkg_execute_required_process_repeat_ALLOW_IN_DOWNLOAD_MODE) + message(FATAL_ERROR +[[ +This command cannot be executed in Download Mode. +Halting portfile execution. +]]) + endif() set(SUCCESSFUL_EXECUTION FALSE) foreach(loop_count RANGE ${vcpkg_execute_required_process_repeat_COUNT}) - execute_process( + vcpkg_execute_in_download_mode( COMMAND ${vcpkg_execute_required_process_repeat_COMMAND} OUTPUT_FILE ${CURRENT_BUILDTREES_DIR}/${vcpkg_execute_required_process_repeat_LOGNAME}-out-${loop_count}.log ERROR_FILE ${CURRENT_BUILDTREES_DIR}/${vcpkg_execute_required_process_repeat_LOGNAME}-err-${loop_count}.log diff --git a/scripts/cmake/vcpkg_extract_source_archive_ex.cmake b/scripts/cmake/vcpkg_extract_source_archive_ex.cmake index 9ce5047a2..d1a7febee 100644 --- a/scripts/cmake/vcpkg_extract_source_archive_ex.cmake +++ b/scripts/cmake/vcpkg_extract_source_archive_ex.cmake @@ -55,12 +55,13 @@ include(vcpkg_apply_patches) include(vcpkg_extract_source_archive)
function(vcpkg_extract_source_archive_ex)
+ # parse parameters such that semicolons in options arguments to COMMAND don't get erased
cmake_parse_arguments(
+ PARSE_ARGV 0
_vesae
"NO_REMOVE_ONE_LEVEL;SKIP_PATCH_CHECK"
"OUT_SOURCE_PATH;ARCHIVE;REF;WORKING_DIRECTORY"
"PATCHES"
- ${ARGN}
)
if(NOT _vesae_ARCHIVE)
diff --git a/scripts/cmake/vcpkg_fail_port_install.cmake b/scripts/cmake/vcpkg_fail_port_install.cmake index cf8777506..5288226eb 100644 --- a/scripts/cmake/vcpkg_fail_port_install.cmake +++ b/scripts/cmake/vcpkg_fail_port_install.cmake @@ -37,6 +37,7 @@ ##
## * [aws-lambda-cpp](https://github.com/Microsoft/vcpkg/blob/master/ports/aws-lambda-cpp/portfile.cmake)
function(vcpkg_fail_port_install)
+ # parse parameters such that semicolons in options arguments to COMMAND don't get erased
cmake_parse_arguments(PARSE_ARGV 0 _csc "ALWAYS" "MESSAGE" "ON_TARGET;ON_ARCH;ON_CRT_LINKAGE;ON_LIBRARY_LINKAGE")
if(DEFINED _csc_UNPARSED_ARGUMENTS)
message(FATAL_ERROR "Unknown arguments passed to vcpkg_fail_port_install. Please correct the portfile!")
diff --git a/scripts/cmake/vcpkg_fixup_cmake_targets.cmake b/scripts/cmake/vcpkg_fixup_cmake_targets.cmake index 0be2dfc54..7e4432e84 100644 --- a/scripts/cmake/vcpkg_fixup_cmake_targets.cmake +++ b/scripts/cmake/vcpkg_fixup_cmake_targets.cmake @@ -43,7 +43,8 @@ ## * [curl](https://github.com/Microsoft/vcpkg/blob/master/ports/curl/portfile.cmake) ## * [nlohmann-json](https://github.com/Microsoft/vcpkg/blob/master/ports/nlohmann-json/portfile.cmake) function(vcpkg_fixup_cmake_targets) - cmake_parse_arguments(_vfct "DO_NOT_DELETE_PARENT_CONFIG_PATH" "CONFIG_PATH;TARGET_PATH" "" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _vfct "DO_NOT_DELETE_PARENT_CONFIG_PATH" "CONFIG_PATH;TARGET_PATH" "") if(_vfct_UNPARSED_ARGUMENTS) message(FATAL_ERROR "vcpkg_fixup_cmake_targets was passed extra arguments: ${_vfct_UNPARSED_ARGUMENTS}") diff --git a/scripts/cmake/vcpkg_fixup_pkgconfig.cmake b/scripts/cmake/vcpkg_fixup_pkgconfig.cmake index c39b1fbe9..3b7a104ec 100644 --- a/scripts/cmake/vcpkg_fixup_pkgconfig.cmake +++ b/scripts/cmake/vcpkg_fixup_pkgconfig.cmake @@ -239,7 +239,8 @@ function(vcpkg_fixup_pkgconfig_check_files pkg_cfg_cmd _file _config _system_lib endfunction() function(vcpkg_fixup_pkgconfig) - cmake_parse_arguments(_vfpkg "SKIP_CHECK;NOT_STATIC_PKGCONFIG" "" "RELEASE_FILES;DEBUG_FILES;SYSTEM_LIBRARIES;SYSTEM_PACKAGES;IGNORE_FLAGS" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _vfpkg "SKIP_CHECK;NOT_STATIC_PKGCONFIG" "" "RELEASE_FILES;DEBUG_FILES;SYSTEM_LIBRARIES;SYSTEM_PACKAGES;IGNORE_FLAGS") # Note about SYSTEM_PACKAGES: pkg-config requires all packages mentioned in pc files to exists. Otherwise pkg-config will fail to find the pkg. # As such naming any SYSTEM_PACKAGES is damned to fail which is why it is not mentioned in the docs at the beginning. diff --git a/scripts/cmake/vcpkg_from_bitbucket.cmake b/scripts/cmake/vcpkg_from_bitbucket.cmake index 5f23714ea..bd4c67ed9 100644 --- a/scripts/cmake/vcpkg_from_bitbucket.cmake +++ b/scripts/cmake/vcpkg_from_bitbucket.cmake @@ -57,7 +57,8 @@ function(vcpkg_from_bitbucket) set(oneValueArgs OUT_SOURCE_PATH REPO REF SHA512 HEAD_REF) set(multipleValuesArgs PATCHES) - cmake_parse_arguments(_vdud "" "${oneValueArgs}" "${multipleValuesArgs}" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _vdud "" "${oneValueArgs}" "${multipleValuesArgs}") if(NOT _vdud_OUT_SOURCE_PATH) message(FATAL_ERROR "OUT_SOURCE_PATH must be specified.") diff --git a/scripts/cmake/vcpkg_from_git.cmake b/scripts/cmake/vcpkg_from_git.cmake index 860e314c4..39469064f 100644 --- a/scripts/cmake/vcpkg_from_git.cmake +++ b/scripts/cmake/vcpkg_from_git.cmake @@ -41,7 +41,8 @@ include(vcpkg_execute_in_download_mode) function(vcpkg_from_git) set(oneValueArgs OUT_SOURCE_PATH URL REF) set(multipleValuesArgs PATCHES) - cmake_parse_arguments(_vdud "" "${oneValueArgs}" "${multipleValuesArgs}" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _vdud "" "${oneValueArgs}" "${multipleValuesArgs}") if(NOT DEFINED _vdud_OUT_SOURCE_PATH) message(FATAL_ERROR "OUT_SOURCE_PATH must be specified.") diff --git a/scripts/cmake/vcpkg_from_github.cmake b/scripts/cmake/vcpkg_from_github.cmake index c8710998b..514151bbd 100644 --- a/scripts/cmake/vcpkg_from_github.cmake +++ b/scripts/cmake/vcpkg_from_github.cmake @@ -68,7 +68,8 @@ function(vcpkg_from_github) set(oneValueArgs OUT_SOURCE_PATH REPO REF SHA512 HEAD_REF GITHUB_HOST AUTHORIZATION_TOKEN) set(multipleValuesArgs PATCHES) - cmake_parse_arguments(_vdud "" "${oneValueArgs}" "${multipleValuesArgs}" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _vdud "" "${oneValueArgs}" "${multipleValuesArgs}") if(NOT DEFINED _vdud_OUT_SOURCE_PATH) message(FATAL_ERROR "OUT_SOURCE_PATH must be specified.") diff --git a/scripts/cmake/vcpkg_from_gitlab.cmake b/scripts/cmake/vcpkg_from_gitlab.cmake index bb908e48a..c42269661 100644 --- a/scripts/cmake/vcpkg_from_gitlab.cmake +++ b/scripts/cmake/vcpkg_from_gitlab.cmake @@ -67,7 +67,8 @@ include(vcpkg_execute_in_download_mode) function(vcpkg_from_gitlab) set(oneValueArgs OUT_SOURCE_PATH GITLAB_URL USER REPO REF SHA512 HEAD_REF) set(multipleValuesArgs PATCHES) - cmake_parse_arguments(_vdud "" "${oneValueArgs}" "${multipleValuesArgs}" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _vdud "" "${oneValueArgs}" "${multipleValuesArgs}") if(NOT DEFINED _vdud_GITLAB_URL) message(FATAL_ERROR "GITLAB_URL must be specified.") diff --git a/scripts/cmake/vcpkg_from_sourceforge.cmake b/scripts/cmake/vcpkg_from_sourceforge.cmake index 10dc8b623..280ad93f8 100644 --- a/scripts/cmake/vcpkg_from_sourceforge.cmake +++ b/scripts/cmake/vcpkg_from_sourceforge.cmake @@ -96,7 +96,8 @@ function(vcpkg_from_sourceforge) set(booleanValueArgs DISABLE_SSL NO_REMOVE_ONE_LEVEL) set(oneValueArgs OUT_SOURCE_PATH REPO REF SHA512 FILENAME WORKING_DIRECTORY) set(multipleValuesArgs PATCHES) - cmake_parse_arguments(_vdus "${booleanValueArgs}" "${oneValueArgs}" "${multipleValuesArgs}" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _vdus "${booleanValueArgs}" "${oneValueArgs}" "${multipleValuesArgs}") if(NOT DEFINED _vdus_OUT_SOURCE_PATH) message(FATAL_ERROR "OUT_SOURCE_PATH must be specified.") diff --git a/scripts/cmake/vcpkg_install_gn.cmake b/scripts/cmake/vcpkg_install_gn.cmake index 29a87a6cd..e71c8c173 100644 --- a/scripts/cmake/vcpkg_install_gn.cmake +++ b/scripts/cmake/vcpkg_install_gn.cmake @@ -20,7 +20,8 @@ ## Note: includes must be handled separately function(vcpkg_install_gn) - cmake_parse_arguments(_vig "" "SOURCE_PATH" "TARGETS" ${ARGN}) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased + cmake_parse_arguments(PARSE_ARGV 0 _vig "" "SOURCE_PATH" "TARGETS") if(NOT DEFINED _vig_SOURCE_PATH) message(FATAL_ERROR "SOURCE_PATH must be specified.") diff --git a/scripts/cmake/vcpkg_install_msbuild.cmake b/scripts/cmake/vcpkg_install_msbuild.cmake index 1a0d9513d..ee3247cfa 100644 --- a/scripts/cmake/vcpkg_install_msbuild.cmake +++ b/scripts/cmake/vcpkg_install_msbuild.cmake @@ -92,12 +92,13 @@ include(vcpkg_clean_msbuild) function(vcpkg_install_msbuild) + # parse parameters such that semicolons in options arguments to COMMAND don't get erased cmake_parse_arguments( + PARSE_ARGV 0 _csc "USE_VCPKG_INTEGRATION;ALLOW_ROOT_INCLUDES;REMOVE_ROOT_INCLUDES;SKIP_CLEAN" "SOURCE_PATH;PROJECT_SUBPATH;INCLUDES_SUBPATH;LICENSE_SUBPATH;RELEASE_CONFIGURATION;DEBUG_CONFIGURATION;PLATFORM;PLATFORM_TOOLSET;TARGET_PLATFORM_VERSION;TARGET" "OPTIONS;OPTIONS_RELEASE;OPTIONS_DEBUG" - ${ARGN} ) if(NOT DEFINED _csc_RELEASE_CONFIGURATION) diff --git a/scripts/cmake/vcpkg_install_nmake.cmake b/scripts/cmake/vcpkg_install_nmake.cmake index a8197751c..c4d600cc6 100644 --- a/scripts/cmake/vcpkg_install_nmake.cmake +++ b/scripts/cmake/vcpkg_install_nmake.cmake @@ -62,11 +62,11 @@ ## * [freexl](https://github.com/Microsoft/vcpkg/blob/master/ports/freexl/portfile.cmake)
function(vcpkg_install_nmake)
- cmake_parse_arguments(_in
+ # parse parameters such that semicolons in options arguments to COMMAND don't get erased
+ cmake_parse_arguments(PARSE_ARGV 0 _in
"NO_DEBUG"
"SOURCE_PATH;PROJECT_SUBPATH;PROJECT_NAME"
"OPTIONS;OPTIONS_RELEASE;OPTIONS_DEBUG;PRERUN_SHELL;PRERUN_SHELL_DEBUG;PRERUN_SHELL_RELEASE"
- ${ARGN}
)
if (NOT CMAKE_HOST_WIN32)
|
