zeek/auxil/vcpkg/ports/vcpkg-make/vcpkg_scripts.cmake
Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

204 lines
7.7 KiB
CMake

include_guard(GLOBAL)
function(vcpkg_insert_into_path)
cmake_parse_arguments(PARSE_ARGV 0 arg
""
"PATH_OUT;APPENDED_OUT"
"BEFORE;INSERT"
)
z_vcpkg_unparsed_args(FATAL_ERROR)
cmake_path(CONVERT "$ENV{PATH}" TO_CMAKE_PATH_LIST path_list NORMALIZE)
string(TOUPPER "${arg_BEFORE}" before_upper)
set(index 0)
set(appending TRUE)
foreach(item IN LISTS path_list)
string(TOUPPER "${item}" item_upper)
if(item IN_LIST arg_BEFORE OR item_upper IN_LIST before_upper)
set(appending FALSE)
break()
endif()
math(EXPR index "${index} + 1")
endforeach()
vcpkg_list(INSERT path_list "${index}" ${arg_INSERT})
cmake_path(CONVERT "${path_list}" TO_NATIVE_PATH_LIST native_path_list)
set(ENV{PATH} "${native_path_list}")
if(DEFINED arg_PATH_OUT)
set("${arg_PATH_OUT}" "${path_list}" PARENT_SCOPE)
endif()
if(appending)
set("${arg_APPENDED_OUT}" "TRUE" PARENT_SCOPE)
else()
set("${arg_APPENDED_OUT}" "FALSE" PARENT_SCOPE)
endif()
endfunction()
function(vcpkg_insert_program_into_path prog)
set(filepath "${prog}")
cmake_path(GET filepath FILENAME ${prog})
find_program(z_vcm_prog_found NAMES "${${prog}}" PATHS ENV PATH NO_DEFAULT_PATH NO_CACHE)
if(NOT z_vcm_prog_found STREQUAL filepath)
cmake_path(GET z_vcm_prog_found PARENT_PATH before_dir)
cmake_path(GET filepath PARENT_PATH dir)
vcpkg_insert_into_path(
INSERT "${dir}"
BEFORE "${before_dir}"
)
endif()
endfunction()
function(vcpkg_insert_msys_into_path msys_out)
cmake_parse_arguments(PARSE_ARGV 1 arg
""
"PATH_OUT"
"PACKAGES"
)
z_vcpkg_unparsed_args(FATAL_ERROR)
vcpkg_acquire_msys(MSYS_ROOT PACKAGES ${arg_PACKAGES})
cmake_path(CONVERT "$ENV{SystemRoot}" TO_CMAKE_PATH_LIST system_root NORMALIZE)
cmake_path(CONVERT "$ENV{LOCALAPPDATA}" TO_CMAKE_PATH_LIST local_app_data NORMALIZE)
file(REAL_PATH "${system_root}" system_root)
vcpkg_list(SET find_system_dirs
"${system_root}/system32"
"${system_root}/System32"
"${system_root}/system32/"
"${system_root}/System32/"
"${local_app_data}/Microsoft/WindowsApps"
"${local_app_data}/Microsoft/WindowsApps/"
)
vcpkg_insert_into_path(
INSERT "${MSYS_ROOT}/usr/bin"
BEFORE ${find_system_dirs}
PATH_OUT path_out
APPENDED_OUT appending
)
if(appending)
message(WARNING "Unable to find system dir in the PATH variable! Appending required msys paths!")
endif()
if(DEFINED arg_PATH_OUT)
set("${arg_PATH_OUT}" "${path_out}" PARENT_SCOPE)
endif()
set("${msys_out}" "${MSYS_ROOT}" PARENT_SCOPE)
endfunction()
### Helper macros for argument checking
macro(z_vcpkg_unparsed_args warning_level)
if(DEFINED arg_UNPARSED_ARGUMENTS)
message("${warning_level}" "${CMAKE_CURRENT_FUNCTION} was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}")
endif()
endmacro()
macro(z_vcpkg_conflicting_args)
set(conflicting_args_set "")
foreach(z_vcpkg_conflicting_args_index RANGE 0 "${ARGC}")
if(${ARGV${z_vcpkg_conflicting_args_index}})
list(APPEND conflicting_args_set "${ARGV${z_vcpkg_conflicting_args_index}}")
endif()
endforeach()
list(LENGTH conflicting_args_set conflicting_args_set_length)
if(conflicting_args_set_length GREATER 1)
message(FATAL_ERROR "${CMAKE_CURRENT_FUNCTION} was passed conflicting arguments:'${conflicting_args_set}'. Only one of those arguments can be passed")
endif()
unset(conflicting_args_set_length)
unset(conflicting_args_set)
unset(z_vcpkg_conflicting_args_index)
endmacro()
macro(z_vcpkg_required_args arg)
foreach(arg IN ITEMS ${ARGN})
if(NOT DEFINED arg_${arg})
message("FATAL_ERROR" "${CMAKE_CURRENT_FUNCTION} requires argument: ${arg}")
endif()
endforeach()
endmacro()
function(z_vcpkg_set_global_property property value)
if(NOT ARGN STREQUAL "" AND NOT ARGN MATCHES "^APPEND(_STRING)?$")
message(FATAL_ERROR "'${CMAKE_CURRENT_FUNCTION}' called with invalid arguments '${ARGN}'")
endif()
set_property(GLOBAL ${ARGN} PROPERTY "z_vcpkg_global_property_${property}" "${value}")
endfunction()
function(z_vcpkg_get_global_property outvar property)
if(NOT ARGN STREQUAL "" AND NOT ARGN STREQUAL "SET")
message(FATAL_ERROR "'${CMAKE_CURRENT_FUNCTION}' called with invalid arguments '${ARGN}'")
endif()
get_property(outprop GLOBAL PROPERTY "z_vcpkg_global_property_${property}" ${ARGN})
set(${outvar} "${outprop}" PARENT_SCOPE)
endfunction()
function(vcpkg_prepare_pkgconfig config)
set(subdir "")
if(config MATCHES "(DEBUG|debug)")
set(subdir "/debug")
endif()
z_vcpkg_get_global_property(has_backup "make-pkg-config-backup-${envvar}" SET)
if(has_backup)
message(FATAL_ERROR "'${CMAKE_CURRENT_FUNCTION}' does not (yet) support recursive backups. Need to restore previous state first!")
endif()
foreach(envvar IN ITEMS PKG_CONFIG PKG_CONFIG_PATH)
if(DEFINED ENV{${envvar}})
z_vcpkg_set_global_property("make-pkg-config-backup-${envvar}" "$ENV{${envvar}}")
else()
z_vcpkg_set_global_property("make-pkg-config-backup-${envvar}" "")
endif()
endforeach()
vcpkg_find_acquire_program(PKGCONFIG)
set(ENV{PKG_CONFIG} "${PKGCONFIG}")
vcpkg_host_path_list(PREPEND ENV{PKG_CONFIG_PATH}
# After installation, (merged) 'lib' is always searched before 'share'.
"${CURRENT_PACKAGES_DIR}${subdir}/lib/pkgconfig"
"${CURRENT_INSTALLED_DIR}${subdir}/lib/pkgconfig"
"${CURRENT_PACKAGES_DIR}/share/pkgconfig"
"${CURRENT_INSTALLED_DIR}/share/pkgconfig"
)
endfunction()
function(vcpkg_restore_pkgconfig)
foreach(envvar IN ITEMS PKG_CONFIG PKG_CONFIG_PATH)
z_vcpkg_get_global_property(has_backup "make-pkg-config-backup-${envvar}" SET)
if(has_backup)
z_vcpkg_get_global_property(backup "make-pkg-config-backup-${envvar}")
set("ENV{${envvar}}" "${backup}")
z_vcpkg_set_global_property("make-pkg-config-backup-${envvar}" "")
else()
unset("ENV{${envvar}}")
endif()
endforeach()
endfunction()
function(z_vcpkg_escape_spaces_in_path outvar invar)
string(REPLACE " " "\\ " current_installed_dir_escaped "${invar}")
set("${outvar}" "${current_installed_dir_escaped}" PARENT_SCOPE)
endfunction()
function(z_vcpkg_warn_path_with_spaces)
vcpkg_list(SET z_vcm_paths_with_spaces)
if(CURRENT_BUILDTREES_DIR MATCHES " ")
vcpkg_list(APPEND z_vcm_paths_with_spaces "${CURRENT_BUILDTREES_DIR}")
endif()
if(CURRENT_PACKAGES_DIR MATCHES " ")
vcpkg_list(APPEND z_vcm_paths_with_spaces "${CURRENT_PACKAGES_DIR}")
endif()
if(CURRENT_INSTALLED_DIR MATCHES " ")
vcpkg_list(APPEND z_vcm_paths_with_spaces "${CURRENT_INSTALLED_DIR}")
endif()
if(z_vcm_paths_with_spaces)
# Don't bother with whitespace. The tools will probably fail and I tried very hard trying to make it work (no success so far)!
vcpkg_list(APPEND z_vcm_paths_with_spaces "Please move the path to one without whitespaces!")
list(JOIN z_vcm_paths_with_spaces "\n " z_vcm_paths_with_spaces)
message(STATUS "Warning: Paths with embedded space may be handled incorrectly by configure:\n ${z_vcm_paths_with_spaces}")
endif()
endfunction()