From bad2c589d590ac7a545782394098286deb422a9b Mon Sep 17 00:00:00 2001 From: nicole mazzuca <83086508+strega-nil-ms@users.noreply.github.com> Date: Wed, 3 Nov 2021 21:42:05 -0700 Subject: [PATCH] [vcpkg_host_path_list] add SET subcommand (#20879) * [vcpkg_host_path_list] add SET subcommand * update docs * try to do something that Billy might like more? * wheee Co-authored-by: nicole mazzuca Co-authored-by: PhoebeHui <20694052+PhoebeHui@users.noreply.github.com> --- docs/maintainers/vcpkg_host_path_list.md | 9 ++-- scripts/cmake/vcpkg_host_path_list.cmake | 62 +++++++++++++++--------- 2 files changed, 44 insertions(+), 27 deletions(-) diff --git a/docs/maintainers/vcpkg_host_path_list.md b/docs/maintainers/vcpkg_host_path_list.md index 8517e7f56e1..d3f19988988 100644 --- a/docs/maintainers/vcpkg_host_path_list.md +++ b/docs/maintainers/vcpkg_host_path_list.md @@ -7,6 +7,7 @@ Modify a host path list variable (PATH, INCLUDE, LIBPATH, etc.) ```cmake vcpkg_host_path_list(PREPEND [...]) vcpkg_host_path_list(APPEND [...]) +vcpkg_host_path_list(SET [...]) ``` `` may be either a regular variable name, or `ENV{variable-name}`, @@ -15,12 +16,14 @@ in which case `vcpkg_host_path_list` will modify the environment. `vcpkg_host_path_list` adds all of the paths passed to it to ``; `PREPEND` puts them before the existing list, so that they are searched first; `APPEND` places them after the existing list, -so they would be searched after the paths which are already in the variable. +so they would be searched after the paths which are already in the variable, +and `SET` replaces the value of the existing list. -For both `APPEND` and `PREPEND`, +For all of `APPEND`, `PREPEND`, and `SET`, the paths are added (and thus searched) in the order received. -If no paths are passed, then nothing will be done. +If no paths are passed to `APPEND` or `PREPEND`, nothing will be done; +for `SET`, the variable will be set to the empty string. ## Source [scripts/cmake/vcpkg\_host\_path\_list.cmake](https://github.com/Microsoft/vcpkg/blob/master/scripts/cmake/vcpkg_host_path_list.cmake) diff --git a/scripts/cmake/vcpkg_host_path_list.cmake b/scripts/cmake/vcpkg_host_path_list.cmake index d849cd42d35..3495e803f87 100644 --- a/scripts/cmake/vcpkg_host_path_list.cmake +++ b/scripts/cmake/vcpkg_host_path_list.cmake @@ -6,6 +6,7 @@ Modify a host path list variable (PATH, INCLUDE, LIBPATH, etc.) ```cmake vcpkg_host_path_list(PREPEND [...]) vcpkg_host_path_list(APPEND [...]) +vcpkg_host_path_list(SET [...]) ``` `` may be either a regular variable name, or `ENV{variable-name}`, @@ -14,13 +15,36 @@ in which case `vcpkg_host_path_list` will modify the environment. `vcpkg_host_path_list` adds all of the paths passed to it to ``; `PREPEND` puts them before the existing list, so that they are searched first; `APPEND` places them after the existing list, -so they would be searched after the paths which are already in the variable. +so they would be searched after the paths which are already in the variable, +and `SET` replaces the value of the existing list. -For both `APPEND` and `PREPEND`, +For all of `APPEND`, `PREPEND`, and `SET`, the paths are added (and thus searched) in the order received. -If no paths are passed, then nothing will be done. +If no paths are passed to `APPEND` or `PREPEND`, nothing will be done; +for `SET`, the variable will be set to the empty string. #]===] + +function(z_vcpkg_translate_to_host_path_list out_var lst) + if(NOT DEFINED arg_UNPARSED_ARGUMENTS) + set("${out_var}" "" PARENT_SCOPE) + else() + if("${VCPKG_HOST_PATH_SEPARATOR}" STREQUAL ";") + set("${out_var}" "${lst}" PARENT_SCOPE) + + string(FIND "${lst}" [[\;]] index_of_host_path_separator) + else() + vcpkg_list(JOIN lst "${VCPKG_HOST_PATH_SEPARATOR}" arguments) + set("${out_var}" "${arguments}" PARENT_SCOPE) + + string(FIND "${lst}" "${VCPKG_HOST_PATH_SEPARATOR}" index_of_host_path_separator) + endif() + if(NOT "${index_of_host_path_separator}" EQUAL "-1") + message(FATAL_ERROR "Host path separator (${VCPKG_HOST_PATH_SEPARATOR}) in path; this is unsupported.") + endif() + endif() +endfunction() + function(vcpkg_host_path_list) if("${ARGC}" LESS "2") message(FATAL_ERROR "vcpkg_host_path_list requires at least two arguments.") @@ -44,30 +68,20 @@ function(vcpkg_host_path_list) set(operation "${ARGV0}") set(list_var "${ARGV1}") - if("${operation}" MATCHES "^(APPEND|PREPEND)$") - cmake_parse_arguments(PARSE_ARGV 2 arg "" "" "") - if(NOT DEFINED arg_UNPARSED_ARGUMENTS) - return() - endif() + cmake_parse_arguments(PARSE_ARGV 2 arg "" "" "") + z_vcpkg_translate_to_host_path_list(arguments "${arg_UNPARSED_ARGUMENTS}") - if("${VCPKG_HOST_PATH_SEPARATOR}" STREQUAL ";") - set(to_add "${arg_UNPARSED_ARGUMENTS}") - string(FIND "${arg_UNPARSED_ARGUMENTS}" [[\;]] index_of_host_path_separator) - else() - vcpkg_list(JOIN arg_UNPARSED_ARGUMENTS "${VCPKG_HOST_PATH_SEPARATOR}" to_add) - string(FIND "${arg_UNPARSED_ARGUMENTS}" "${VCPKG_HOST_PATH_SEPARATOR}" index_of_host_path_separator) - endif() - - if(NOT "${index_of_host_path_separator}" EQUAL "-1") - message(FATAL_ERROR "Host path separator (${VCPKG_HOST_PATH_SEPARATOR}) in path; this is unsupported.") - endif() - - if("${list}" STREQUAL "") - set(list "${to_add}") + if("${operation}" STREQUAL "SET") + set(list "${arguments}") + elseif("${operation}" MATCHES "^(APPEND|PREPEND)$") + if("${arguments}" STREQUAL "") + # do nothing + elseif("${list}" STREQUAL "") + set(list "${arguments}") elseif(arg_PREPEND) - set(list "${to_add}${VCPKG_HOST_PATH_SEPARATOR}${list}") + set(list "${arguments}${VCPKG_HOST_PATH_SEPARATOR}${list}") else() - set(list "${list}${VCPKG_HOST_PATH_SEPARATOR}${to_add}") + set(list "${list}${VCPKG_HOST_PATH_SEPARATOR}${arguments}") endif() else() message(FATAL_ERROR "Operation ${operation} not recognized.")