From 5304f826b5736eea0aa4749ce49c84539badaf4a Mon Sep 17 00:00:00 2001 From: nicole mazzuca <83086508+strega-nil-ms@users.noreply.github.com> Date: Thu, 29 Jul 2021 11:47:35 -0500 Subject: [rollup] 2021-07-26 (#19157) * [rollup:2021-07-26 1/6] PR #18783 (@strega-nil) [scripts-audit] vcpkg_copy_tools and friends * [rollup:2021-07-26 2/6] PR #18898 (@dg0yt) [vcpkg] Fix toolchain compatibility with cmake < 3.15 * [rollup:2021-07-26 3/6] PR #18980 (@strega-nil) [cmake-guidelines] Minor update, for `if()` * [rollup:2021-07-26 4/6] PR #18981 (@strega-nil) [scripts-audit] vcpkg_check_linkage * [rollup:2021-07-26 5/6] PR #19158 (@Hoikas) [vcpkg.cmake] Fix variable case. * [rollup:2021-07-26 6/6] PR #18839 [scripts-audit] z_vcpkg_get_cmake_vars Co-authored-by: nicole mazzuca --- scripts/buildsystems/vcpkg.cmake | 51 ++++++---------- scripts/cmake/vcpkg_build_make.cmake | 7 +-- scripts/cmake/vcpkg_check_linkage.cmake | 32 +++++++--- scripts/cmake/vcpkg_clean_executables_in_bin.cmake | 53 +++++++++-------- scripts/cmake/vcpkg_configure_cmake.cmake | 27 +++++---- scripts/cmake/vcpkg_configure_make.cmake | 7 +-- scripts/cmake/vcpkg_configure_meson.cmake | 7 +-- scripts/cmake/vcpkg_copy_pdbs.cmake | 24 ++++---- scripts/cmake/vcpkg_copy_tool_dependencies.cmake | 46 ++++++++------- scripts/cmake/vcpkg_copy_tools.cmake | 40 +++++++------ scripts/cmake/vcpkg_internal_get_cmake_vars.cmake | 68 ---------------------- scripts/cmake/z_vcpkg_get_cmake_vars.cmake | 65 +++++++++++++++++++++ scripts/ports.cmake | 2 +- 13 files changed, 217 insertions(+), 212 deletions(-) delete mode 100644 scripts/cmake/vcpkg_internal_get_cmake_vars.cmake create mode 100644 scripts/cmake/z_vcpkg_get_cmake_vars.cmake (limited to 'scripts') diff --git a/scripts/buildsystems/vcpkg.cmake b/scripts/buildsystems/vcpkg.cmake index ff0873457..e59779e4e 100644 --- a/scripts/buildsystems/vcpkg.cmake +++ b/scripts/buildsystems/vcpkg.cmake @@ -385,39 +385,24 @@ set(_VCPKG_INSTALLED_DIR "${VCPKG_INSTALLED_DIR}" CACHE PATH "The directory which contains the installed libraries for each triplet" FORCE) -if(VCPKG_PREFER_SYSTEM_LIBS) - set(Z_VCPKG_PATH_LIST_OP APPEND) -else() - set(Z_VCPKG_PATH_LIST_OP PREPEND) -endif() - -if(CMAKE_BUILD_TYPE MATCHES "^[Dd][Ee][Bb][Uu][Gg]$" OR NOT DEFINED CMAKE_BUILD_TYPE) #Debug build: Put Debug paths before Release paths. - list(${Z_VCPKG_PATH_LIST_OP} CMAKE_PREFIX_PATH - "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug" - "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}" - ) - list(${Z_VCPKG_PATH_LIST_OP} CMAKE_LIBRARY_PATH - "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib/manual-link" - "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/manual-link" - ) - list(${Z_VCPKG_PATH_LIST_OP} CMAKE_FIND_ROOT_PATH - "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug" - "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}" - ) -else() #Release build: Put Release paths before Debug paths. Debug Paths are required so that CMake generates correct info in autogenerated target files. - list(${Z_VCPKG_PATH_LIST_OP} CMAKE_PREFIX_PATH - "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}" - "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug" - ) - list(${Z_VCPKG_PATH_LIST_OP} CMAKE_LIBRARY_PATH - "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/manual-link" - "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib/manual-link" +function(z_vcpkg_add_vcpkg_to_cmake_path list suffix) + set(vcpkg_paths + "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}${suffix}" + "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug${suffix}" ) - list(${Z_VCPKG_PATH_LIST_OP} CMAKE_FIND_ROOT_PATH - "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}" - "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug" - ) -endif() + if(NOT DEFINED CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE MATCHES "^[Dd][Ee][Bb][Uu][Gg]$") + list(REVERSE vcpkg_paths) # Debug build: Put Debug paths before Release paths. + endif() + if(VCPKG_PREFER_SYSTEM_LIBS) + list(APPEND "${list}" "${vcpkg_paths}") + else() + list(INSERT "${list}" 0 "${vcpkg_paths}") # CMake 3.15 is required for list(PREPEND ...). + endif() + set("${list}" "${${list}}" PARENT_SCOPE) +endfunction() +z_vcpkg_add_vcpkg_to_cmake_path(CMAKE_PREFIX_PATH "") +z_vcpkg_add_vcpkg_to_cmake_path(CMAKE_LIBRARY_PATH "/lib/manual-link") +z_vcpkg_add_vcpkg_to_cmake_path(CMAKE_FIND_ROOT_PATH "") # If one CMAKE_FIND_ROOT_PATH_MODE_* variables is set to ONLY, to make sure that ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET} # and ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug are searched, it is not sufficient to just add them to CMAKE_FIND_ROOT_PATH, @@ -692,7 +677,7 @@ if(X_VCPKG_APPLOCAL_DEPS_INSTALL) list(APPEND parsed_targets "${arg}") endif() - if(last_command STREQUAL "DESTINATION" AND (MODIFIER STREQUAL "" OR MODIFIER STREQUAL "RUNTIME")) + if(last_command STREQUAL "DESTINATION" AND (modifier STREQUAL "" OR modifier STREQUAL "RUNTIME")) set(destination "${arg}") endif() if(last_command STREQUAL "COMPONENT") diff --git a/scripts/cmake/vcpkg_build_make.cmake b/scripts/cmake/vcpkg_build_make.cmake index dd845bde4..6bd84c5ad 100755 --- a/scripts/cmake/vcpkg_build_make.cmake +++ b/scripts/cmake/vcpkg_build_make.cmake @@ -51,11 +51,8 @@ You can use the alias [`vcpkg_install_make()`](vcpkg_install_make.md) function i #]===] function(vcpkg_build_make) - if(NOT _VCPKG_CMAKE_VARS_FILE) - # vcpkg_build_make called without using vcpkg_configure_make before - vcpkg_internal_get_cmake_vars(OUTPUT_FILE _VCPKG_CMAKE_VARS_FILE) - endif() - include("${_VCPKG_CMAKE_VARS_FILE}") + z_vcpkg_get_cmake_vars(cmake_vars_file) + include("${cmake_vars_file}") # 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;SUBPATH;MAKEFILE;INSTALL_TARGET" "") diff --git a/scripts/cmake/vcpkg_check_linkage.cmake b/scripts/cmake/vcpkg_check_linkage.cmake index 97e29bad7..f2e9fe10a 100644 --- a/scripts/cmake/vcpkg_check_linkage.cmake +++ b/scripts/cmake/vcpkg_check_linkage.cmake @@ -35,24 +35,38 @@ This command will either alter the settings for `VCPKG_LIBRARY_LINKAGE` or fail, #]===] function(vcpkg_check_linkage) - cmake_parse_arguments(_csc "ONLY_STATIC_LIBRARY;ONLY_DYNAMIC_LIBRARY;ONLY_DYNAMIC_CRT;ONLY_STATIC_CRT" "" "" ${ARGN}) + cmake_parse_arguments(PARSE_ARGV 0 arg + "ONLY_STATIC_LIBRARY;ONLY_DYNAMIC_LIBRARY;ONLY_DYNAMIC_CRT;ONLY_STATIC_CRT" + "" + "" + ) - if(_csc_ONLY_STATIC_LIBRARY AND VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic") + if(DEFINED arg_UNPARSED_ARGUMENTS) + message(WARNING "${CMAKE_CURRENT_FUNCTION} was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}") + endif() + + if(arg_ONLY_STATIC_LIBRARY AND arg_ONLY_DYNAMIC_LIBRARY) + message(FATAL_ERROR "Requesting both ONLY_STATIC_LIBRARY and ONLY_DYNAMIC_LIBRARY; this is an error.") + endif() + if(arg_ONLY_STATIC_CRT AND arg_ONLY_DYNAMIC_CRT) + message(FATAL_ERROR "Requesting both ONLY_STATIC_CRT and ONLY_DYNAMIC_CRT; this is an error.") + endif() + + if(arg_ONLY_STATIC_LIBRARY AND "${VCPKG_LIBRARY_LINKAGE}" STREQUAL "dynamic") message(STATUS "Note: ${PORT} only supports static library linkage. Building static library.") set(VCPKG_LIBRARY_LINKAGE static PARENT_SCOPE) - endif() - if(_csc_ONLY_DYNAMIC_LIBRARY AND VCPKG_LIBRARY_LINKAGE STREQUAL "static") + elseif(arg_ONLY_DYNAMIC_LIBRARY AND "${VCPKG_LIBRARY_LINKAGE}" STREQUAL "static") message(STATUS "Note: ${PORT} only supports dynamic library linkage. Building dynamic library.") - if(VCPKG_CRT_LINKAGE STREQUAL "static") - message(FATAL_ERROR "Refusing to build unexpected dynamic library against the static CRT. If this is desired, please configure your triplet to directly request this configuration.") + if("${VCPKG_CRT_LINKAGE}" STREQUAL "static") + message(FATAL_ERROR "Refusing to build unexpected dynamic library against the static CRT. + If this is desired, please configure your triplet to directly request this configuration.") endif() set(VCPKG_LIBRARY_LINKAGE dynamic PARENT_SCOPE) endif() - if(_csc_ONLY_DYNAMIC_CRT AND VCPKG_CRT_LINKAGE STREQUAL "static") + if(arg_ONLY_DYNAMIC_CRT AND "${VCPKG_CRT_LINKAGE}" STREQUAL "static") message(FATAL_ERROR "${PORT} only supports dynamic crt linkage") - endif() - if(_csc_ONLY_STATIC_CRT AND VCPKG_CRT_LINKAGE STREQUAL "dynamic") + elseif(arg_ONLY_STATIC_CRT AND "${VCPKG_CRT_LINKAGE}" STREQUAL "dynamic") message(FATAL_ERROR "${PORT} only supports static crt linkage") endif() endfunction() diff --git a/scripts/cmake/vcpkg_clean_executables_in_bin.cmake b/scripts/cmake/vcpkg_clean_executables_in_bin.cmake index 077e23cc3..e1cea3a95 100644 --- a/scripts/cmake/vcpkg_clean_executables_in_bin.cmake +++ b/scripts/cmake/vcpkg_clean_executables_in_bin.cmake @@ -21,15 +21,35 @@ Generally, there is no need to call this function manually. Instead, pass an ext * [czmq](https://github.com/microsoft/vcpkg/blob/master/ports/czmq/portfile.cmake) #]===] +function(z_vcpkg_clean_executables_in_bin_remove_directory_if_empty directory) + if(NOT EXISTS "${directory}") + return() + endif() + + if(NOT IS_DIRECTORY "${directory}") + message(FATAL_ERROR "${directory} must be a directory") + endif() + + file(GLOB items "${directory}/*") + if("${items}" STREQUAL "") + file(REMOVE_RECURSE "${directory}") + endif() +endfunction() + + function(vcpkg_clean_executables_in_bin) - # parse parameters such that semicolons in options arguments to COMMAND don't get erased - cmake_parse_arguments(PARSE_ARGV 0 _vct "" "" "FILE_NAMES") + cmake_parse_arguments(PARSE_ARGV 0 arg "" "" "FILE_NAMES") - if(NOT DEFINED _vct_FILE_NAMES) + if(NOT DEFINED arg_FILE_NAMES) message(FATAL_ERROR "FILE_NAMES must be specified.") endif() - foreach(file_name IN LISTS _vct_FILE_NAMES) + if(DEFINED arg_UNPARSED_ARGUMENTS) + message(WARNING "${CMAKE_CURRENT_FUNCTION} was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}") + endif() + + + foreach(file_name IN LISTS arg_FILE_NAMES) file(REMOVE "${CURRENT_PACKAGES_DIR}/bin/${file_name}${VCPKG_TARGET_EXECUTABLE_SUFFIX}" "${CURRENT_PACKAGES_DIR}/debug/bin/${file_name}${VCPKG_TARGET_EXECUTABLE_SUFFIX}" @@ -38,27 +58,6 @@ function(vcpkg_clean_executables_in_bin) ) endforeach() - function(try_remove_empty_directory directory) - if(NOT EXISTS "${directory}") - return() - endif() - - if(NOT IS_DIRECTORY "${directory}") - message(FATAL_ERROR "${directory} is supposed to be an existing directory.") - endif() - - # TODO: - # For an empty directory, - # file(GLOB items "${directory}" "${directory}/*") - # will return a list with one item. - file(GLOB items "${directory}/" "${directory}/*") - list(LENGTH items items_count) - - if(${items_count} EQUAL 0) - file(REMOVE_RECURSE "${directory}") - endif() - endfunction() - - try_remove_empty_directory("${CURRENT_PACKAGES_DIR}/bin") - try_remove_empty_directory("${CURRENT_PACKAGES_DIR}/debug/bin") + z_vcpkg_clean_executables_in_bin_remove_directory_if_empty("${CURRENT_PACKAGES_DIR}/bin") + z_vcpkg_clean_executables_in_bin_remove_directory_if_empty("${CURRENT_PACKAGES_DIR}/debug/bin") endfunction() diff --git a/scripts/cmake/vcpkg_configure_cmake.cmake b/scripts/cmake/vcpkg_configure_cmake.cmake index bce3f6af5..56bf9bd57 100644 --- a/scripts/cmake/vcpkg_configure_cmake.cmake +++ b/scripts/cmake/vcpkg_configure_cmake.cmake @@ -72,16 +72,16 @@ This command supplies many common arguments to CMake. To see the full list, exam #]===] function(vcpkg_configure_cmake) - if(Z_VCPKG_CMAKE_CONFIGURE_GUARD) - message(FATAL_ERROR "The ${PORT} port already depends on vcpkg-cmake; using both vcpkg-cmake and vcpkg_configure_cmake in the same port is unsupported.") - endif() - cmake_parse_arguments(PARSE_ARGV 0 arg - "PREFER_NINJA;DISABLE_PARALLEL_CONFIGURE;NO_CHARSET_FLAG;Z_VCPKG_IGNORE_UNUSED_VARIABLES" + "PREFER_NINJA;DISABLE_PARALLEL_CONFIGURE;NO_CHARSET_FLAG;Z_GET_CMAKE_VARS_USAGE" "SOURCE_PATH;GENERATOR;LOGNAME" "OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE;MAYBE_UNUSED_VARIABLES" ) + if(NOT arg_Z_GET_CMAKE_VARS_USAGE AND Z_VCPKG_CMAKE_CONFIGURE_GUARD) + message(FATAL_ERROR "The ${PORT} port already depends on vcpkg-cmake; using both vcpkg-cmake and vcpkg_configure_cmake in the same port is unsupported.") + endif() + if(NOT VCPKG_PLATFORM_TOOLSET) message(FATAL_ERROR "Vcpkg has been updated with VS2017 support; " "however, vcpkg.exe must be rebuilt by re-running bootstrap-vcpkg.bat\n") @@ -92,7 +92,12 @@ function(vcpkg_configure_cmake) endif() set(manually_specified_variables "") - if(NOT arg_Z_VCPKG_IGNORE_UNUSED_VARIABLES) + + if(arg_Z_GET_CMAKE_VARS_USAGE) + set(configuring_message "Getting CMake variables for ${TARGET_TRIPLET}") + else() + set(configuring_message "Configuring ${TARGET_TRIPLET}") + foreach(option IN LISTS arg_OPTIONS arg_OPTIONS_RELEASE arg_OPTIONS_DEBUG) if(option MATCHES "^-D([^:=]*)[:=]") list(APPEND manually_specified_variables "${CMAKE_MATCH_1}") @@ -336,7 +341,7 @@ function(vcpkg_configure_cmake) file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/vcpkg-parallel-configure) file(WRITE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/vcpkg-parallel-configure/build.ninja "${_contents}") - message(STATUS "Configuring ${TARGET_TRIPLET}") + message(STATUS "${configuring_message}") vcpkg_execute_required_process( COMMAND ninja -v WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/vcpkg-parallel-configure @@ -348,7 +353,7 @@ function(vcpkg_configure_cmake) "${CURRENT_BUILDTREES_DIR}/${arg_LOGNAME}-err.log") else() if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug") - message(STATUS "Configuring ${TARGET_TRIPLET}-dbg") + message(STATUS "${configuring_message}-dbg") file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg) vcpkg_execute_required_process( COMMAND ${dbg_command} @@ -361,7 +366,7 @@ function(vcpkg_configure_cmake) endif() if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release") - message(STATUS "Configuring ${TARGET_TRIPLET}-rel") + message(STATUS "${configuring_message}-rel") file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel) vcpkg_execute_required_process( COMMAND ${rel_command} @@ -408,5 +413,7 @@ Please recheck them and remove the unnecessary options from the `vcpkg_configure If these options should still be passed for whatever reason, please use the `MAYBE_UNUSED_VARIABLES` argument.") endif() - set(Z_VCPKG_CMAKE_GENERATOR "${GENERATOR}" PARENT_SCOPE) + if(NOT arg_Z_GET_CMAKE_VARS_USAGE) + set(Z_VCPKG_CMAKE_GENERATOR "${GENERATOR}" PARENT_SCOPE) + endif() endfunction() diff --git a/scripts/cmake/vcpkg_configure_make.cmake b/scripts/cmake/vcpkg_configure_make.cmake index 65d66daac..f9a042660 100644 --- a/scripts/cmake/vcpkg_configure_make.cmake +++ b/scripts/cmake/vcpkg_configure_make.cmake @@ -236,10 +236,9 @@ function(vcpkg_configure_make) "SOURCE_PATH;PROJECT_SUBPATH;PRERUN_SHELL;BUILD_TRIPLET" "OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE;CONFIGURE_ENVIRONMENT_VARIABLES;CONFIG_DEPENDENT_ENVIRONMENT;ADDITIONAL_MSYS_PACKAGES" ) - vcpkg_internal_get_cmake_vars(OUTPUT_FILE _VCPKG_CMAKE_VARS_FILE) - set(_VCPKG_CMAKE_VARS_FILE "${_VCPKG_CMAKE_VARS_FILE}" PARENT_SCOPE) - debug_message("Including cmake vars from: ${_VCPKG_CMAKE_VARS_FILE}") - include("${_VCPKG_CMAKE_VARS_FILE}") + z_vcpkg_get_cmake_vars(cmake_vars_file) + debug_message("Including cmake vars from: ${cmake_vars_file}") + include("${cmake_vars_file}") if(DEFINED VCPKG_MAKE_BUILD_TRIPLET) set(_csc_BUILD_TRIPLET ${VCPKG_MAKE_BUILD_TRIPLET}) # Triplet overwrite for crosscompiling endif() diff --git a/scripts/cmake/vcpkg_configure_meson.cmake b/scripts/cmake/vcpkg_configure_meson.cmake index 2ee8266b9..5bb34089c 100644 --- a/scripts/cmake/vcpkg_configure_meson.cmake +++ b/scripts/cmake/vcpkg_configure_meson.cmake @@ -356,10 +356,9 @@ function(vcpkg_configure_meson) file(REMOVE_RECURSE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel") file(REMOVE_RECURSE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg") - vcpkg_internal_get_cmake_vars(OUTPUT_FILE _VCPKG_CMAKE_VARS_FILE) - set(_VCPKG_CMAKE_VARS_FILE "${_VCPKG_CMAKE_VARS_FILE}" PARENT_SCOPE) - debug_message("Including cmake vars from: ${_VCPKG_CMAKE_VARS_FILE}") - include("${_VCPKG_CMAKE_VARS_FILE}") + z_vcpkg_get_cmake_vars(cmake_vars_file) + debug_message("Including cmake vars from: ${cmake_vars_file}") + include("${cmake_vars_file}") vcpkg_find_acquire_program(PYTHON3) get_filename_component(PYTHON3_DIR "${PYTHON3}" DIRECTORY) diff --git a/scripts/cmake/vcpkg_copy_pdbs.cmake b/scripts/cmake/vcpkg_copy_pdbs.cmake index dd489db02..60335255a 100644 --- a/scripts/cmake/vcpkg_copy_pdbs.cmake +++ b/scripts/cmake/vcpkg_copy_pdbs.cmake @@ -27,15 +27,18 @@ This command should always be called by portfiles after they have finished rearr function(vcpkg_copy_pdbs) cmake_parse_arguments(PARSE_ARGV 0 "arg" "" "" "BUILD_PATHS") + if(DEFINED arg_UNPARSED_ARGUMENTS) + message(WARNING "${CMAKE_CURRENT_FUNCTION} was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}") + endif() + if(NOT DEFINED arg_BUILD_PATHS) - set( - arg_BUILD_PATHS + set(arg_BUILD_PATHS "${CURRENT_PACKAGES_DIR}/bin/*.dll" "${CURRENT_PACKAGES_DIR}/debug/bin/*.dll" ) endif() - set(dlls_without_matching_pdbs) + set(dlls_without_matching_pdbs "") if(VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic" AND VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_IS_MINGW) file(GLOB_RECURSE dlls ${arg_BUILD_PATHS}) @@ -44,17 +47,16 @@ function(vcpkg_copy_pdbs) set(ENV{VSLANG} 1033) foreach(dll IN LISTS dlls) - execute_process(COMMAND dumpbin /PDBPATH ${dll} + execute_process(COMMAND dumpbin /PDBPATH "${dll}" COMMAND findstr PDB OUTPUT_VARIABLE pdb_line ERROR_QUIET RESULT_VARIABLE error_code ) - if(NOT error_code AND pdb_line MATCHES "PDB file found at") - string(REGEX MATCH [['.*']] pdb_path "${pdb_line}") # Extract the path which is in single quotes - string(REPLACE "'" "" pdb_path "${pdb_path}") # Remove single quotes - get_filename_component(dll_dir "${dll}" DIRECTORY) + if(error_code EQUAL "0" AND pdb_line MATCHES "PDB file found at.*'(.*)'") + set(pdb_path "${CMAKE_MATCH_1}") + cmake_path(GET dll PARENT_PATH dll_dir) file(COPY "${pdb_path}" DESTINATION "${dll_dir}") else() list(APPEND dlls_without_matching_pdbs "${dll}") @@ -63,10 +65,10 @@ function(vcpkg_copy_pdbs) set(ENV{VSLANG} "${vslang_backup}") - list(LENGTH dlls_without_matching_pdbs unmatched_dlls_length) - if(unmatched_dlls_length GREATER 0) + if(NOT unmatched_dlls_length STREQUAL "") list(JOIN dlls_without_matching_pdbs "\n " message) - message(WARNING "Could not find a matching pdb file for:${message}\n") + message(WARNING "Could not find a matching pdb file for: + ${message}\n") endif() endif() diff --git a/scripts/cmake/vcpkg_copy_tool_dependencies.cmake b/scripts/cmake/vcpkg_copy_tool_dependencies.cmake index 0cb0bbcef..856a2d7fe 100644 --- a/scripts/cmake/vcpkg_copy_tool_dependencies.cmake +++ b/scripts/cmake/vcpkg_copy_tool_dependencies.cmake @@ -19,29 +19,31 @@ This command should always be called by portfiles after they have finished rearr * [fltk](https://github.com/Microsoft/vcpkg/blob/master/ports/fltk/portfile.cmake) #]===] -function(vcpkg_copy_tool_dependencies TOOL_DIR) - if (VCPKG_TARGET_IS_WINDOWS) - find_program(PWSH_EXE pwsh) - if (NOT PWSH_EXE) - if(UNIX AND NOT CYGWIN) - message(FATAL_ERROR "Could not find PowerShell Core; install PowerShell Core as described here: https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-linux") - endif() +function(z_vcpkg_copy_tool_dependencies_search tool_dir path_to_search) + file(GLOB tools "${tool_dir}/*.exe" "${tool_dir}/*.dll" "${tool_dir}/*.pyd") + foreach(tool IN LISTS tools) + vcpkg_execute_required_process( + COMMAND "${Z_VCPKG_POWERSHELL_CORE}" -noprofile -executionpolicy Bypass -nologo + -file "${SCRIPTS}/buildsystems/msbuild/applocal.ps1" + -targetBinary "${tool}" + -installedDir "${path_to_search}" + WORKING_DIRECTORY "${VCPKG_ROOT_DIR}" + LOGNAME copy-tool-dependencies + ) + endforeach() +endfunction() + +function(vcpkg_copy_tool_dependencies tool_dir) + if(ARGC GREATER 1) + message(WARNING "${CMAKE_CURRENT_FUNCTION} was passed extra arguments: ${ARGN}") + endif() + + if(VCPKG_TARGET_IS_WINDOWS) + find_program(Z_VCPKG_POWERSHELL_CORE pwsh) + if (NOT Z_VCPKG_POWERSHELL_CORE) message(FATAL_ERROR "Could not find PowerShell Core; please open an issue to report this.") endif() - macro(search_for_dependencies PATH_TO_SEARCH) - file(GLOB TOOLS "${TOOL_DIR}/*.exe" "${TOOL_DIR}/*.dll" "${TOOL_DIR}/*.pyd") - foreach(TOOL IN LISTS TOOLS) - vcpkg_execute_required_process( - COMMAND "${PWSH_EXE}" -noprofile -executionpolicy Bypass -nologo - -file "${SCRIPTS}/buildsystems/msbuild/applocal.ps1" - -targetBinary "${TOOL}" - -installedDir "${PATH_TO_SEARCH}" - WORKING_DIRECTORY "${VCPKG_ROOT_DIR}" - LOGNAME copy-tool-dependencies - ) - endforeach() - endmacro() - search_for_dependencies("${CURRENT_PACKAGES_DIR}/bin") - search_for_dependencies("${CURRENT_INSTALLED_DIR}/bin") + z_vcpkg_copy_tool_dependencies_search("${tool_dir}" "${CURRENT_PACKAGES_DIR}/bin") + z_vcpkg_copy_tool_dependencies_search("${tool_dir}" "${CURRENT_INSTALLED_DIR}/bin") endif() endfunction() diff --git a/scripts/cmake/vcpkg_copy_tools.cmake b/scripts/cmake/vcpkg_copy_tools.cmake index 18ddc3715..ef3259840 100644 --- a/scripts/cmake/vcpkg_copy_tools.cmake +++ b/scripts/cmake/vcpkg_copy_tools.cmake @@ -33,39 +33,43 @@ Auto clean executables in `${CURRENT_PACKAGES_DIR}/bin` and `${CURRENT_PACKAGES_ #]===] function(vcpkg_copy_tools) - # 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;DESTINATION" "TOOL_NAMES") + cmake_parse_arguments(PARSE_ARGV 0 arg "AUTO_CLEAN" "SEARCH_DIR;DESTINATION" "TOOL_NAMES") - if(NOT DEFINED _vct_TOOL_NAMES) + if(DEFINED arg_UNPARSED_ARGUMENTS) + message(WARNING "${CMAKE_CURRENT_FUNCTION} was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}") + endif() + + if(NOT DEFINED arg_TOOL_NAMES) message(FATAL_ERROR "TOOL_NAMES must be specified.") endif() - if(NOT DEFINED _vct_DESTINATION) - set(_vct_DESTINATION "${CURRENT_PACKAGES_DIR}/tools/${PORT}") + if(NOT DEFINED arg_DESTINATION) + set(arg_DESTINATION "${CURRENT_PACKAGES_DIR}/tools/${PORT}") endif() - if(NOT DEFINED _vct_SEARCH_DIR) - set(_vct_SEARCH_DIR "${CURRENT_PACKAGES_DIR}/bin") - elseif(NOT IS_DIRECTORY ${_vct_SEARCH_DIR}) - message(FATAL_ERROR "SEARCH_DIR ${_vct_SEARCH_DIR} is supposed to be a directory.") + if(NOT DEFINED arg_SEARCH_DIR) + set(arg_SEARCH_DIR "${CURRENT_PACKAGES_DIR}/bin") + elseif(NOT IS_DIRECTORY "${arg_SEARCH_DIR}") + message(FATAL_ERROR "SEARCH_DIR (${arg_SEARCH_DIR}) must be a directory") endif() - foreach(tool_name IN LISTS _vct_TOOL_NAMES) - set(tool_path "${_vct_SEARCH_DIR}/${tool_name}${VCPKG_TARGET_EXECUTABLE_SUFFIX}") - set(tool_pdb "${_vct_SEARCH_DIR}/${tool_name}.pdb") + foreach(tool_name IN LISTS arg_TOOL_NAMES) + set(tool_path "${arg_SEARCH_DIR}/${tool_name}${VCPKG_TARGET_EXECUTABLE_SUFFIX}") + set(tool_pdb "${arg_SEARCH_DIR}/${tool_name}.pdb") if(EXISTS "${tool_path}") - file(COPY "${tool_path}" DESTINATION "${_vct_DESTINATION}") + file(COPY "${tool_path}" DESTINATION "${arg_DESTINATION}") else() - message(FATAL_ERROR "Couldn't find this tool: ${tool_path}.") + message(FATAL_ERROR "Couldn't find tool \"${tool_name}\": + \"${tool_path}\" does not exist") endif() if(EXISTS "${tool_pdb}") - file(COPY "${tool_pdb}" DESTINATION "${_vct_DESTINATION}") + file(COPY "${tool_pdb}" DESTINATION "${arg_DESTINATION}") endif() endforeach() - if(_vct_AUTO_CLEAN) - vcpkg_clean_executables_in_bin(FILE_NAMES ${_vct_TOOL_NAMES}) + if(arg_AUTO_CLEAN) + vcpkg_clean_executables_in_bin(FILE_NAMES ${arg_TOOL_NAMES}) endif() - vcpkg_copy_tool_dependencies("${_vct_DESTINATION}") + vcpkg_copy_tool_dependencies("${arg_DESTINATION}") endfunction() diff --git a/scripts/cmake/vcpkg_internal_get_cmake_vars.cmake b/scripts/cmake/vcpkg_internal_get_cmake_vars.cmake deleted file mode 100644 index 030d74120..000000000 --- a/scripts/cmake/vcpkg_internal_get_cmake_vars.cmake +++ /dev/null @@ -1,68 +0,0 @@ -#[===[.md: -# vcpkg_internal_get_cmake_vars - -**Only for internal use in vcpkg helpers. Behavior and arguments will change without notice.** -Runs a cmake configure with a dummy project to extract certain cmake variables - -## Usage -```cmake -vcpkg_internal_get_cmake_vars( - [OUTPUT_FILE ] - [OPTIONS <-DUSE_THIS_IN_ALL_BUILDS=1>...] -) -``` - -## Parameters -### OPTIONS -Additional options to pass to the test configure call - -### OUTPUT_FILE -Variable to return the path to the generated cmake file with the detected `CMAKE_` variables set as `VCKPG_DETECTED_` - -## Notes -If possible avoid usage in portfiles. - -## Examples - -* [vcpkg_configure_make](https://github.com/Microsoft/vcpkg/blob/master/scripts/cmake/vcpkg_configure_make.cmake) -#]===] - -function(vcpkg_internal_get_cmake_vars) - cmake_parse_arguments(PARSE_ARGV 0 _gcv "" "OUTPUT_FILE" "OPTIONS") - - if(_gcv_UNPARSED_ARGUMENTS) - message(FATAL_ERROR "${CMAKE_CURRENT_FUNCTION} was passed unparsed arguments: '${_gcv_UNPARSED_ARGUMENTS}'") - endif() - - if(NOT _gcv_OUTPUT_FILE) - message(FATAL_ERROR "${CMAKE_CURRENT_FUNCTION} requires parameter OUTPUT_FILE!") - endif() - - if(${_gcv_OUTPUT_FILE}) - debug_message("OUTPUT_FILE ${${_gcv_OUTPUT_FILE}}") - else() - set(DEFAULT_OUT "${CURRENT_BUILDTREES_DIR}/cmake-vars-${TARGET_TRIPLET}.cmake.log") # So that the file gets included in CI artifacts. - set(${_gcv_OUTPUT_FILE} "${DEFAULT_OUT}" PARENT_SCOPE) - set(${_gcv_OUTPUT_FILE} "${DEFAULT_OUT}") - endif() - - vcpkg_configure_cmake( - SOURCE_PATH "${SCRIPTS}/get_cmake_vars" - OPTIONS ${_gcv_OPTIONS} "-DVCPKG_BUILD_TYPE=${VCPKG_BUILD_TYPE}" - OPTIONS_DEBUG "-DVCPKG_OUTPUT_FILE:PATH=${CURRENT_BUILDTREES_DIR}/cmake-vars-${TARGET_TRIPLET}-dbg.cmake.log" - OPTIONS_RELEASE "-DVCPKG_OUTPUT_FILE:PATH=${CURRENT_BUILDTREES_DIR}/cmake-vars-${TARGET_TRIPLET}-rel.cmake.log" - PREFER_NINJA - LOGNAME get-cmake-vars-${TARGET_TRIPLET} - Z_VCPKG_IGNORE_UNUSED_VARIABLES - ) - - set(_include_string) - if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release") - string(APPEND _include_string "include(\"${CURRENT_BUILDTREES_DIR}/cmake-vars-${TARGET_TRIPLET}-rel.cmake.log\")\n") - endif() - if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug") - string(APPEND _include_string "include(\"${CURRENT_BUILDTREES_DIR}/cmake-vars-${TARGET_TRIPLET}-dbg.cmake.log\")\n") - endif() - file(WRITE "${${_gcv_OUTPUT_FILE}}" "${_include_string}") - -endfunction() diff --git a/scripts/cmake/z_vcpkg_get_cmake_vars.cmake b/scripts/cmake/z_vcpkg_get_cmake_vars.cmake new file mode 100644 index 000000000..f50b1db26 --- /dev/null +++ b/scripts/cmake/z_vcpkg_get_cmake_vars.cmake @@ -0,0 +1,65 @@ +#[===[.md: +# z_vcpkg_get_cmake_vars + +**Only for internal use in vcpkg helpers. Behavior and arguments will change without notice.** +Runs a cmake configure with a dummy project to extract certain cmake variables + +## Usage +```cmake +z_vcpkg_get_cmake_vars() +``` + +`z_vcpkg_get_cmake_vars(cmake_vars_file)` sets `` to +a path to a generated CMake file, with the detected `CMAKE_*` variables +re-exported as `VCPKG_DETECTED_*`. + +## Notes +Avoid usage in portfiles. + +All calls to `z_vcpkg_get_cmake_vars` will result in the same output file; +the output file is not generated multiple times. + +## Examples + +* [vcpkg_configure_make](https://github.com/Microsoft/vcpkg/blob/master/scripts/cmake/vcpkg_configure_make.cmake) + +### Basic Usage + +```cmake +z_vcpkg_get_cmake_vars(cmake_vars_file) +include("${cmake_vars_file}") +message(STATUS "detected CXX flags: ${VCPKG_DETECTED_CXX_FLAGS}") +``` +#]===] + +function(z_vcpkg_get_cmake_vars out_file) + cmake_parse_arguments(PARSE_ARGV 1 arg "" "" "") + + if(DEFINED arg_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "${CMAKE_CURRENT_FUNCTION} was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}") + endif() + + if(NOT DEFINED CACHE{Z_VCPKG_GET_CMAKE_VARS_FILE}) + set(Z_VCPKG_GET_CMAKE_VARS_FILE "${CURRENT_BUILDTREES_DIR}/cmake-vars-${TARGET_TRIPLET}.cmake.log" + CACHE PATH "The file to include to access the CMake variables from a generated project.") + vcpkg_configure_cmake( + SOURCE_PATH "${SCRIPTS}/get_cmake_vars" + OPTIONS_DEBUG "-DVCPKG_OUTPUT_FILE:PATH=${CURRENT_BUILDTREES_DIR}/cmake-vars-${TARGET_TRIPLET}-dbg.cmake.log" + OPTIONS_RELEASE "-DVCPKG_OUTPUT_FILE:PATH=${CURRENT_BUILDTREES_DIR}/cmake-vars-${TARGET_TRIPLET}-rel.cmake.log" + PREFER_NINJA + LOGNAME get-cmake-vars-${TARGET_TRIPLET} + Z_GET_CMAKE_VARS_USAGE # ignore vcpkg_cmake_configure, be quiet, don't set variables... + ) + + set(include_string "") + if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release") + string(APPEND include_string "include(\"\${CMAKE_CURRENT_LIST_DIR}/cmake-vars-${TARGET_TRIPLET}-rel.cmake.log\")\n") + endif() + if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug") + string(APPEND include_string "include(\"\${CMAKE_CURRENT_LIST_DIR}/cmake-vars-${TARGET_TRIPLET}-dbg.cmake.log\")\n") + endif() + file(WRITE "${Z_VCPKG_GET_CMAKE_VARS_FILE}" "${include_string}") + endif() + + set("${out_file}" "${Z_VCPKG_GET_CMAKE_VARS_FILE}" PARENT_SCOPE) +endfunction() diff --git a/scripts/ports.cmake b/scripts/ports.cmake index 98a6e2352..c44463411 100644 --- a/scripts/ports.cmake +++ b/scripts/ports.cmake @@ -129,13 +129,13 @@ if(CMD MATCHES "^BUILD$") include("${SCRIPTS}/cmake/vcpkg_install_msbuild.cmake") include("${SCRIPTS}/cmake/vcpkg_install_nmake.cmake") include("${SCRIPTS}/cmake/vcpkg_install_qmake.cmake") - include("${SCRIPTS}/cmake/vcpkg_internal_get_cmake_vars.cmake") include("${SCRIPTS}/cmake/vcpkg_list.cmake") include("${SCRIPTS}/cmake/vcpkg_replace_string.cmake") include("${SCRIPTS}/cmake/vcpkg_test_cmake.cmake") include("${SCRIPTS}/cmake/z_vcpkg_apply_patches.cmake") include("${SCRIPTS}/cmake/z_vcpkg_forward_output_variable.cmake") + include("${SCRIPTS}/cmake/z_vcpkg_get_cmake_vars.cmake") include("${SCRIPTS}/cmake/z_vcpkg_prettify_command_line.cmake") include("${CURRENT_PORT_DIR}/portfile.cmake") -- cgit v1.2.3