204 lines
7.7 KiB
CMake
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()
|