[script audit] Meson buildsystem (#21026)

* [script audit] Meson buildsystem

* Apply suggestions, fix build

* Fix non-Windows build

* Fix debug path in meson config

* Fix env pkgconfig path

* Apply suggestions

* Nicole's CRs

* oops

* Apply suggestions

* final changes

* fix typoes

Co-authored-by: nicole mazzuca <83086508+strega-nil-ms@users.noreply.github.com>
Co-authored-by: nicole mazzuca <mazzucan@outlook.com>
This commit is contained in:
Jack·Boos·Yu 2021-11-09 04:27:18 +08:00 committed by GitHub
parent 7801974c2f
commit cf308f37ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 281 additions and 311 deletions

View File

@ -40,8 +40,8 @@ This command supplies many common arguments to Meson. To see the full list, exam
* [libepoxy](https://github.com/Microsoft/vcpkg/blob/master/ports/libepoxy/portfile.cmake) * [libepoxy](https://github.com/Microsoft/vcpkg/blob/master/ports/libepoxy/portfile.cmake)
#]===] #]===]
function(vcpkg_internal_meson_generate_native_file _additional_binaries) #https://mesonbuild.com/Native-environments.html function(z_vcpkg_meson_generate_native_file additional_binaries) #https://mesonbuild.com/Native-environments.html
set(NATIVE "[binaries]\n") set(native_config "[binaries]\n")
#set(proglist AR RANLIB STRIP NM OBJDUMP DLLTOOL MT) #set(proglist AR RANLIB STRIP NM OBJDUMP DLLTOOL MT)
if(VCPKG_TARGET_IS_WINDOWS) if(VCPKG_TARGET_IS_WINDOWS)
set(proglist MT) set(proglist MT)
@ -51,116 +51,121 @@ function(vcpkg_internal_meson_generate_native_file _additional_binaries) #https:
foreach(prog IN LISTS proglist) foreach(prog IN LISTS proglist)
if(VCPKG_DETECTED_CMAKE_${prog}) if(VCPKG_DETECTED_CMAKE_${prog})
string(TOLOWER "${prog}" proglower) string(TOLOWER "${prog}" proglower)
string(APPEND NATIVE "${proglower} = '${VCPKG_DETECTED_CMAKE_${prog}}'\n") string(APPEND native_config "${proglower} = '${VCPKG_DETECTED_CMAKE_${prog}}'\n")
endif() endif()
endforeach() endforeach()
set(compiler C CXX RC) set(programs C CXX RC)
foreach(prog IN LISTS compiler) foreach(prog IN LISTS programs)
if(VCPKG_DETECTED_CMAKE_${prog}_COMPILER) if(VCPKG_DETECTED_CMAKE_${prog}_COMPILER)
string(REPLACE "CXX" "CPP" mesonprog "${prog}") string(REPLACE "CXX" "CPP" mesonprog "${prog}")
string(REPLACE "RC" "windres" mesonprog "${mesonprog}") # https://mesonbuild.com/Windows-module.html string(REPLACE "RC" "windres" mesonprog "${mesonprog}") # https://mesonbuild.com/Windows-module.html
string(TOLOWER "${mesonprog}" proglower) string(TOLOWER "${mesonprog}" proglower)
string(APPEND NATIVE "${proglower} = '${VCPKG_DETECTED_CMAKE_${prog}_COMPILER}'\n") string(APPEND native_config "${proglower} = '${VCPKG_DETECTED_CMAKE_${prog}_COMPILER}'\n")
endif() endif()
endforeach() endforeach()
if(VCPKG_DETECTED_CMAKE_LINKER AND VCPKG_TARGET_IS_WINDOWS) if(VCPKG_DETECTED_CMAKE_LINKER AND VCPKG_TARGET_IS_WINDOWS)
if (NOT VCPKG_DETECTED_CMAKE_C_COMPILER_ID MATCHES "^(GNU|Intel)$") # for gcc and icc the linker flag -fuse-ld is used. See https://github.com/mesonbuild/meson/issues/8647#issuecomment-878673456 # for gcc and icc the linker flag -fuse-ld is used. See https://github.com/mesonbuild/meson/issues/8647#issuecomment-878673456
string(APPEND NATIVE "c_ld = '${VCPKG_DETECTED_CMAKE_LINKER}'\n") if (NOT VCPKG_DETECTED_CMAKE_C_COMPILER_ID MATCHES "^(GNU|Intel)$")
string(APPEND native_config "c_ld = '${VCPKG_DETECTED_CMAKE_LINKER}'\n")
endif() endif()
endif() endif()
if(VCPKG_DETECTED_CMAKE_LINKER AND VCPKG_TARGET_IS_WINDOWS) if(VCPKG_DETECTED_CMAKE_LINKER AND VCPKG_TARGET_IS_WINDOWS)
if (NOT VCPKG_DETECTED_CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Intel)$") # for gcc and icc the linker flag -fuse-ld is used. See https://github.com/mesonbuild/meson/issues/8647#issuecomment-878673456 # for gcc and icc the linker flag -fuse-ld is used. See https://github.com/mesonbuild/meson/issues/8647#issuecomment-878673456
string(APPEND NATIVE "cpp_ld = '${VCPKG_DETECTED_CMAKE_LINKER}'\n") if (NOT VCPKG_DETECTED_CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Intel)$")
string(APPEND native_config "cpp_ld = '${VCPKG_DETECTED_CMAKE_LINKER}'\n")
endif() endif()
endif() endif()
string(APPEND NATIVE "cmake = '${CMAKE_COMMAND}'\n") string(APPEND native_config "cmake = '${CMAKE_COMMAND}'\n")
foreach(_binary IN LISTS ${_additional_binaries}) foreach(additional_binary IN LISTS additional_binaries)
string(APPEND NATIVE "${_binary}\n") string(APPEND native_config "${additional_binary}\n")
endforeach() endforeach()
string(APPEND NATIVE "[built-in options]\n") #https://mesonbuild.com/Builtin-options.html string(APPEND native_config "[built-in options]\n") #https://mesonbuild.com/Builtin-options.html
if(VCPKG_DETECTED_CMAKE_C_COMPILER MATCHES "cl.exe") if(VCPKG_DETECTED_CMAKE_C_COMPILER MATCHES "cl.exe")
# This is currently wrongly documented in the meson docs or buggy. The docs say: 'none' = no flags # This is currently wrongly documented in the meson docs or buggy. The docs say: 'none' = no flags
# In reality however 'none' tries to deactivate eh and meson passes the flags for it resulting in a lot of warnings # In reality however 'none' tries to deactivate eh and meson passes the flags for it resulting in a lot of warnings
# about overriden flags. Until this is fixed in meson vcpkg should not pass this here. # about overriden flags. Until this is fixed in meson vcpkg should not pass this here.
# string(APPEND NATIVE "cpp_eh='none'\n") # To make sure meson is not adding eh flags by itself using msvc # string(APPEND native_config "cpp_eh='none'\n") # To make sure meson is not adding eh flags by itself using msvc
endif() endif()
if(VCPKG_TARGET_IS_WINDOWS) if(VCPKG_TARGET_IS_WINDOWS)
string(REGEX REPLACE "( |^)(-|/)" ";\\2" WIN_C_STANDARD_LIBRARIES "${VCPKG_DETECTED_CMAKE_C_STANDARD_LIBRARIES}") set(c_winlibs "${VCPKG_DETECTED_CMAKE_C_STANDARD_LIBRARIES}")
string(REGEX REPLACE "\\.lib " ".lib;" WIN_C_STANDARD_LIBRARIES "${WIN_C_STANDARD_LIBRARIES}") set(cpp_winlibs "${VCPKG_DETECTED_CMAKE_CXX_STANDARD_LIBRARIES}")
list(TRANSFORM WIN_C_STANDARD_LIBRARIES APPEND "'") foreach(libvar IN ITEMS c_winlibs cpp_winlibs)
list(TRANSFORM WIN_C_STANDARD_LIBRARIES PREPEND "'") string(REGEX REPLACE "( |^)(-|/)" [[;\2]] "${libvar}" "${${libvar}}")
list(REMOVE_ITEM WIN_C_STANDARD_LIBRARIES "''") string(REPLACE ".lib " ".lib;" "${libvar}" "${${libvar}}")
list(JOIN WIN_C_STANDARD_LIBRARIES ", " WIN_C_STANDARD_LIBRARIES) vcpkg_list(REMOVE_ITEM "${libvar}" "")
string(APPEND NATIVE "c_winlibs = [${WIN_C_STANDARD_LIBRARIES}]\n") vcpkg_list(JOIN "${libvar}" "', '" "${libvar}")
string(REGEX REPLACE "( |^)(-|/)" ";\\2" WIN_CXX_STANDARD_LIBRARIES "${VCPKG_DETECTED_CMAKE_CXX_STANDARD_LIBRARIES}") string(APPEND native_config "${libvar} = ['${${libvar}}']\n")
string(REGEX REPLACE "\\.lib " ".lib;" WIN_CXX_STANDARD_LIBRARIES "${WIN_CXX_STANDARD_LIBRARIES}") endforeach()
list(TRANSFORM WIN_CXX_STANDARD_LIBRARIES APPEND "'")
list(TRANSFORM WIN_CXX_STANDARD_LIBRARIES PREPEND "'")
list(REMOVE_ITEM WIN_CXX_STANDARD_LIBRARIES "''")
list(JOIN WIN_CXX_STANDARD_LIBRARIES ", " WIN_CXX_STANDARD_LIBRARIES)
string(APPEND NATIVE "cpp_winlibs = [${WIN_CXX_STANDARD_LIBRARIES}]\n")
endif() endif()
set(_file "${CURRENT_BUILDTREES_DIR}/meson-nativ-${TARGET_TRIPLET}.log") set(native_config_name "${CURRENT_BUILDTREES_DIR}/meson-native-${TARGET_TRIPLET}.log")
set(VCPKG_MESON_NATIVE_FILE "${_file}" PARENT_SCOPE) set(vcpkg_meson_native_file "${native_config_name}" PARENT_SCOPE)
file(WRITE "${_file}" "${NATIVE}") file(WRITE "${native_config_name}" "${native_config}")
endfunction() endfunction()
function(vcpkg_internal_meson_convert_compiler_flags_to_list _out_var _compiler_flags) function(z_vcpkg_meson_convert_compiler_flags_to_list out_var compiler_flags)
string(REPLACE ";" "\\\;" tmp_var "${_compiler_flags}") string(REPLACE ";" [[\;]] tmp_var "${compiler_flags}")
string(REGEX REPLACE [=[( +|^)((\"(\\\"|[^"])+\"|\\\"|\\ |[^ ])+)]=] ";\\2" ${_out_var} "${tmp_var}") string(REGEX REPLACE [=[( +|^)((\"(\\"|[^"])+"|\\"|\\ |[^ ])+)]=] ";\\2" tmp_var "${tmp_var}")
list(POP_FRONT ${_out_var}) # The first element is always empty due to the above replacement vcpkg_list(POP_FRONT tmp_var) # The first element is always empty due to the above replacement
list(TRANSFORM ${_out_var} STRIP) # Strip leading trailing whitespaces from each element in the list. list(TRANSFORM tmp_var STRIP) # Strip leading trailing whitespaces from each element in the list.
set(${_out_var} "${${_out_var}}" PARENT_SCOPE) set("${out_var}" "${tmp_var}" PARENT_SCOPE)
endfunction() endfunction()
function(vcpkg_internal_meson_convert_list_to_python_array _out_var) function(z_vcpkg_meson_convert_list_to_python_array out_var)
set(FLAG_LIST ${ARGN}) z_vcpkg_function_arguments(flag_list 1)
list(TRANSFORM FLAG_LIST APPEND "'") vcpkg_list(REMOVE_ITEM flag_list "") # remove empty elements if any
list(TRANSFORM FLAG_LIST PREPEND "'") vcpkg_list(JOIN flag_list "', '" flag_list)
list(JOIN FLAG_LIST ", " ${_out_var}) set("${out_var}" "['${flag_list}']" PARENT_SCOPE)
string(REPLACE "'', " "" ${_out_var} "${${_out_var}}") # remove empty elements if any
set(${_out_var} "[${${_out_var}}]" PARENT_SCOPE)
endfunction() endfunction()
# Generates the required compiler properties for meson # Generates the required compiler properties for meson
function(vcpkg_internal_meson_generate_flags_properties_string _out_var _config) function(z_vcpkg_meson_generate_flags_properties_string out_var config_type)
set(result "")
if(VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_IS_MINGW) if(VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_IS_MINGW)
set(L_FLAG /LIBPATH:) set(libpath_flag /LIBPATH:)
else() else()
set(L_FLAG -L) set(libpath_flag -L)
endif() endif()
set(PATH_SUFFIX_DEBUG /debug) if(config_type STREQUAL "DEBUG")
set(LIBPATH_${_config} "${L_FLAG}${CURRENT_INSTALLED_DIR}${PATH_SUFFIX_${_config}}/lib") set(path_suffix "/debug")
vcpkg_internal_meson_convert_compiler_flags_to_list(MESON_CFLAGS_${_config} "${VCPKG_DETECTED_CMAKE_C_FLAGS_${_config}}") else()
list(APPEND MESON_CFLAGS_${_config} "-I${CURRENT_INSTALLED_DIR}/include") set(path_suffix "")
vcpkg_internal_meson_convert_list_to_python_array(MESON_CFLAGS_${_config} ${MESON_CFLAGS_${_config}}) endif()
string(APPEND ${_out_var} "c_args = ${MESON_CFLAGS_${_config}}\n")
vcpkg_internal_meson_convert_compiler_flags_to_list(MESON_CXXFLAGS_${_config} "${VCPKG_DETECTED_CMAKE_CXX_FLAGS_${_config}}") set(libpath "${libpath_flag}${CURRENT_INSTALLED_DIR}${path_suffix}/lib")
list(APPEND MESON_CXXFLAGS_${_config} "-I${CURRENT_INSTALLED_DIR}/include")
vcpkg_internal_meson_convert_list_to_python_array(MESON_CXXFLAGS_${_config} ${MESON_CXXFLAGS_${_config}}) z_vcpkg_meson_convert_compiler_flags_to_list(cflags "${VCPKG_DETECTED_CMAKE_C_FLAGS_${config_type}}")
string(APPEND ${_out_var} "cpp_args = ${MESON_CXXFLAGS_${_config}}\n") vcpkg_list(APPEND cflags "-I${CURRENT_INSTALLED_DIR}/include")
z_vcpkg_meson_convert_list_to_python_array(cflags ${cflags})
string(APPEND result "c_args = ${cflags}\n")
z_vcpkg_meson_convert_compiler_flags_to_list(cxxflags "${VCPKG_DETECTED_CMAKE_CXX_FLAGS_${config_type}}")
vcpkg_list(APPEND cxxflags "-I${CURRENT_INSTALLED_DIR}/include")
z_vcpkg_meson_convert_list_to_python_array(cxxflags ${cxxflags})
string(APPEND result "cpp_args = ${cxxflags}\n")
if(VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic") if(VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic")
set(LINKER_FLAGS_${_config} "${VCPKG_DETECTED_CMAKE_SHARED_LINKER_FLAGS_${_config}}") set(linker_flags "${VCPKG_DETECTED_CMAKE_SHARED_LINKER_FLAGS_${config_type}}")
else() else()
set(LINKER_FLAGS_${_config} "${VCPKG_DETECTED_CMAKE_STATIC_LINKER_FLAGS_${_config}}") set(linker_flags "${VCPKG_DETECTED_CMAKE_STATIC_LINKER_FLAGS_${config_type}}")
endif() endif()
vcpkg_internal_meson_convert_compiler_flags_to_list(LINKER_FLAGS_${_config} "${LINKER_FLAGS_${_config}}") z_vcpkg_meson_convert_compiler_flags_to_list(linker_flags "${linker_flags}")
list(APPEND LINKER_FLAGS_${_config} "${LIBPATH_${_config}}") vcpkg_list(APPEND linker_flags "${libpath}")
vcpkg_internal_meson_convert_list_to_python_array(LINKER_FLAGS_${_config} ${LINKER_FLAGS_${_config}}) z_vcpkg_meson_convert_list_to_python_array(linker_flags ${linker_flags})
string(APPEND ${_out_var} "c_link_args = ${LINKER_FLAGS_${_config}}\n") string(APPEND result "c_link_args = ${linker_flags}\n")
string(APPEND ${_out_var} "cpp_link_args = ${LINKER_FLAGS_${_config}}\n") string(APPEND result "cpp_link_args = ${linker_flags}\n")
set(${_out_var} "${${_out_var}}" PARENT_SCOPE) set("${out_var}" "${result}" PARENT_SCOPE)
endfunction() endfunction()
function(vcpkg_internal_meson_generate_native_file_config _config) #https://mesonbuild.com/Native-environments.html function(z_vcpkg_meson_generate_native_file_config config_type) #https://mesonbuild.com/Native-environments.html
set(NATIVE_${_config} "[properties]\n") #https://mesonbuild.com/Builtin-options.html set(native_file "[properties]\n") #https://mesonbuild.com/Builtin-options.html
vcpkg_internal_meson_generate_flags_properties_string(NATIVE_PROPERTIES ${_config}) z_vcpkg_meson_generate_flags_properties_string(native_properties "${config_type}")
string(APPEND NATIVE_${_config} "${NATIVE_PROPERTIES}") string(APPEND native_file "${native_properties}")
#Setup CMake properties #Setup CMake properties
string(APPEND NATIVE_${_config} "cmake_toolchain_file = '${SCRIPTS}/buildsystems/vcpkg.cmake'\n") string(APPEND native_file "cmake_toolchain_file = '${SCRIPTS}/buildsystems/vcpkg.cmake'\n")
string(APPEND NATIVE_${_config} "[cmake]\n") string(APPEND native_file "[cmake]\n")
if(NOT VCPKG_CHAINLOAD_TOOLCHAIN_FILE) if(NOT VCPKG_CHAINLOAD_TOOLCHAIN_FILE)
if(VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_IS_MINGW) if(VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_IS_MINGW)
@ -182,49 +187,49 @@ function(vcpkg_internal_meson_generate_native_file_config _config) #https://meso
endif() endif()
endif() endif()
string(APPEND NATIVE_${_config} "VCPKG_TARGET_TRIPLET = '${TARGET_TRIPLET}'\n") string(APPEND native_file "VCPKG_TARGET_TRIPLET = '${TARGET_TRIPLET}'\n")
string(APPEND NATIVE_${_config} "VCPKG_CHAINLOAD_TOOLCHAIN_FILE = '${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}'\n") string(APPEND native_file "VCPKG_CHAINLOAD_TOOLCHAIN_FILE = '${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}'\n")
string(APPEND NATIVE_${_config} "VCPKG_CRT_LINKAGE = '${VCPKG_CRT_LINKAGE}'\n") string(APPEND native_file "VCPKG_CRT_LINKAGE = '${VCPKG_CRT_LINKAGE}'\n")
string(APPEND NATIVE_${_config} "[built-in options]\n") string(APPEND native_file "[built-in options]\n")
if(VCPKG_TARGET_IS_WINDOWS) if(VCPKG_TARGET_IS_WINDOWS)
if(VCPKG_CRT_LINKAGE STREQUAL "static") if(VCPKG_CRT_LINKAGE STREQUAL "static")
set(CRT mt) set(crt_type mt)
else() else()
set(CRT md) set(crt_type md)
endif() endif()
if(${_config} STREQUAL DEBUG) if("${config_type}" STREQUAL "DEBUG")
set(CRT ${CRT}d) string(APPEND crt_type "d")
endif() endif()
string(APPEND NATIVE_${_config} "b_vscrt = '${CRT}'\n") string(APPEND native_file "b_vscrt = '${crt_type}'\n")
endif() endif()
string(TOLOWER "${_config}" lowerconfig) string(TOLOWER "${config_type}" lowerconfig)
set(_file "${CURRENT_BUILDTREES_DIR}/meson-nativ-${TARGET_TRIPLET}-${lowerconfig}.log") set(native_config_name "${CURRENT_BUILDTREES_DIR}/meson-native-${TARGET_TRIPLET}-${lowerconfig}.log")
set(VCPKG_MESON_NATIVE_FILE_${_config} "${_file}" PARENT_SCOPE) file(WRITE "${native_config_name}" "${native_file}")
file(WRITE "${_file}" "${NATIVE_${_config}}") set("vcpkg_meson_native_file_${config_type}" "${native_config_name}" PARENT_SCOPE)
endfunction() endfunction()
function(vcpkg_internal_meson_generate_cross_file _additional_binaries) #https://mesonbuild.com/Cross-compilation.html function(z_vcpkg_meson_generate_cross_file additional_binaries) #https://mesonbuild.com/Cross-compilation.html
if(CMAKE_HOST_WIN32) if(CMAKE_HOST_WIN32)
if(DEFINED ENV{PROCESSOR_ARCHITEW6432}) if(DEFINED ENV{PROCESSOR_ARCHITEW6432})
set(BUILD_ARCH $ENV{PROCESSOR_ARCHITEW6432}) set(build_arch $ENV{PROCESSOR_ARCHITEW6432})
else() else()
set(BUILD_ARCH $ENV{PROCESSOR_ARCHITECTURE}) set(build_arch $ENV{PROCESSOR_ARCHITECTURE})
endif() endif()
if(BUILD_ARCH MATCHES "(amd|AMD)64") if(build_arch MATCHES "(amd|AMD)64")
set(BUILD_CPU_FAM x86_64) set(build_cpu_fam x86_64)
set(BUILD_CPU x86_64) set(build_cpu x86_64)
elseif(BUILD_ARCH MATCHES "(x|X)86") elseif(build_arch MATCHES "(x|X)86")
set(BUILD_CPU_FAM x86) set(build_cpu_fam x86)
set(BUILD_CPU i686) set(build_cpu i686)
elseif(BUILD_ARCH MATCHES "^(ARM|arm)64$") elseif(build_arch MATCHES "^(ARM|arm)64$")
set(BUILD_CPU_FAM aarch64) set(build_cpu_fam aarch64)
set(BUILD_CPU armv8) set(build_cpu armv8)
elseif(BUILD_ARCH MATCHES "^(ARM|arm)$") elseif(build_arch MATCHES "^(ARM|arm)$")
set(BUILD_CPU_FAM arm) set(build_cpu_fam arm)
set(BUILD_CPU armv7hl) set(build_cpu armv7hl)
else() else()
message(FATAL_ERROR "Unsupported host architecture ${BUILD_ARCH}!") message(FATAL_ERROR "Unsupported host architecture ${build_arch}!")
endif() endif()
elseif(CMAKE_HOST_UNIX) elseif(CMAKE_HOST_UNIX)
# at this stage, CMAKE_HOST_SYSTEM_PROCESSOR is not defined # at this stage, CMAKE_HOST_SYSTEM_PROCESSOR is not defined
@ -237,21 +242,18 @@ function(vcpkg_internal_meson_generate_cross_file _additional_binaries) #https:/
debug_message("Machine: ${MACHINE}") debug_message("Machine: ${MACHINE}")
if(MACHINE MATCHES "arm64") if(MACHINE MATCHES "arm64")
set(BUILD_CPU_FAM aarch64) set(build_cpu_fam aarch64)
set(BUILD_CPU armv8) set(build_cpu armv8)
elseif(MACHINE MATCHES "x86_64|amd64") elseif(MACHINE MATCHES "x86_64|amd64")
set(BUILD_CPU_FAM x86_64) set(build_cpu_fam x86_64)
set(BUILD_CPU x86_64) set(build_cpu x86_64)
elseif(MACHINE MATCHES "x86|i686") elseif(MACHINE MATCHES "x86|i686")
set(BUILD_CPU_FAM x86) set(build_cpu_fam x86)
set(BUILD_CPU i686) set(build_cpu i686)
elseif(MACHINE MATCHES "i386") elseif(MACHINE MATCHES "i386")
set(BUILD_CPU_FAM x86) set(build_cpu_fam x86)
set(BUILD_CPU i386) set(build_cpu i386)
else() else()
unset(BUILD_CPU_FAM)
unset(BUILD_CPU)
# https://github.com/mesonbuild/meson/blob/master/docs/markdown/Reference-tables.md#cpu-families # https://github.com/mesonbuild/meson/blob/master/docs/markdown/Reference-tables.md#cpu-families
message(FATAL_ERROR "Unhandled machine: ${MACHINE}") message(FATAL_ERROR "Unhandled machine: ${MACHINE}")
endif() endif()
@ -260,21 +262,21 @@ function(vcpkg_internal_meson_generate_cross_file _additional_binaries) #https:/
endif() endif()
if(VCPKG_TARGET_ARCHITECTURE MATCHES "(amd|AMD|x|X)64") if(VCPKG_TARGET_ARCHITECTURE MATCHES "(amd|AMD|x|X)64")
set(HOST_CPU_FAM x86_64) set(host_cpu_fam x86_64)
set(HOST_CPU x86_64) set(host_cpu x86_64)
elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "(x|X)86") elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "(x|X)86")
set(HOST_CPU_FAM x86) set(host_cpu_fam x86)
set(HOST_CPU i686) set(host_cpu i686)
elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "^(ARM|arm)64$") elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "^(ARM|arm)64$")
set(HOST_CPU_FAM aarch64) set(host_cpu_fam aarch64)
set(HOST_CPU armv8) set(host_cpu armv8)
elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "^(ARM|arm)$") elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "^(ARM|arm)$")
set(HOST_CPU_FAM arm) set(host_cpu_fam arm)
set(HOST_CPU armv7hl) set(host_cpu armv7hl)
else() else()
message(FATAL_ERROR "Unsupported target architecture ${VCPKG_TARGET_ARCHITECTURE}!" ) message(FATAL_ERROR "Unsupported target architecture ${VCPKG_TARGET_ARCHITECTURE}!" )
endif() endif()
set(CROSS "[binaries]\n") set(cross_file "[binaries]\n")
if(VCPKG_TARGET_IS_WINDOWS) if(VCPKG_TARGET_IS_WINDOWS)
set(proglist MT) set(proglist MT)
else() else()
@ -283,96 +285,104 @@ function(vcpkg_internal_meson_generate_cross_file _additional_binaries) #https:/
foreach(prog IN LISTS proglist) foreach(prog IN LISTS proglist)
if(VCPKG_DETECTED_CMAKE_${prog}) if(VCPKG_DETECTED_CMAKE_${prog})
string(TOLOWER "${prog}" proglower) string(TOLOWER "${prog}" proglower)
string(APPEND CROSS "${proglower} = '${VCPKG_DETECTED_CMAKE_${prog}}'\n") string(APPEND cross_file "${proglower} = '${VCPKG_DETECTED_CMAKE_${prog}}'\n")
endif() endif()
endforeach() endforeach()
set(compiler C CXX RC) set(programs C CXX RC)
foreach(prog IN LISTS compiler) foreach(prog IN LISTS programs)
if(VCPKG_DETECTED_CMAKE_${prog}_COMPILER) if(VCPKG_DETECTED_CMAKE_${prog}_COMPILER)
string(REPLACE "CXX" "CPP" mesonprog "${prog}") string(REPLACE "CXX" "CPP" mesonprog "${prog}")
string(REPLACE "RC" "windres" mesonprog "${mesonprog}") # https://mesonbuild.com/Windows-module.html string(REPLACE "RC" "windres" mesonprog "${mesonprog}") # https://mesonbuild.com/Windows-module.html
string(TOLOWER "${mesonprog}" proglower) string(TOLOWER "${mesonprog}" proglower)
string(APPEND CROSS "${proglower} = '${VCPKG_DETECTED_CMAKE_${prog}_COMPILER}'\n") string(APPEND cross_file "${proglower} = '${VCPKG_DETECTED_CMAKE_${prog}_COMPILER}'\n")
endif() endif()
endforeach() endforeach()
if(VCPKG_DETECTED_CMAKE_LINKER AND VCPKG_TARGET_IS_WINDOWS) if(VCPKG_DETECTED_CMAKE_LINKER AND VCPKG_TARGET_IS_WINDOWS)
if (NOT VCPKG_DETECTED_CMAKE_C_COMPILER_ID MATCHES "^(GNU|Intel)$") # for gcc and icc the linker flag -fuse-ld is used. See https://github.com/mesonbuild/meson/issues/8647#issuecomment-878673456 # for gcc and icc the linker flag -fuse-ld is used. See https://github.com/mesonbuild/meson/issues/8647#issuecomment-878673456
string(APPEND CROSS "c_ld = '${VCPKG_DETECTED_CMAKE_LINKER}'\n") if (NOT VCPKG_DETECTED_CMAKE_C_COMPILER_ID MATCHES "^(GNU|Intel)$")
string(APPEND cross_file "c_ld = '${VCPKG_DETECTED_CMAKE_LINKER}'\n")
endif() endif()
endif() endif()
if(VCPKG_DETECTED_CMAKE_LINKER AND VCPKG_TARGET_IS_WINDOWS) if(VCPKG_DETECTED_CMAKE_LINKER AND VCPKG_TARGET_IS_WINDOWS)
if (NOT VCPKG_DETECTED_CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Intel)$") # for gcc and icc the linker flag -fuse-ld is used. See https://github.com/mesonbuild/meson/issues/8647#issuecomment-878673456 # for gcc and icc the linker flag -fuse-ld is used. See https://github.com/mesonbuild/meson/issues/8647#issuecomment-878673456
string(APPEND CROSS "cpp_ld = '${VCPKG_DETECTED_CMAKE_LINKER}'\n") if (NOT VCPKG_DETECTED_CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Intel)$")
string(APPEND cross_file "cpp_ld = '${VCPKG_DETECTED_CMAKE_LINKER}'\n")
endif() endif()
endif() endif()
string(APPEND CROSS "cmake = '${CMAKE_COMMAND}'\n") string(APPEND cross_file "cmake = '${CMAKE_COMMAND}'\n")
foreach(_binary IN LISTS ${_additional_binaries}) foreach(additional_binary IN LISTS additional_binaries)
string(APPEND CROSS "${_binary}\n") string(APPEND cross_file "${additional_binary}\n")
endforeach() endforeach()
string(APPEND CROSS "[properties]\n") string(APPEND cross_file "[properties]\n")
string(APPEND CROSS "[host_machine]\n") string(APPEND cross_file "[host_machine]\n")
string(APPEND CROSS "endian = 'little'\n") string(APPEND cross_file "endian = 'little'\n")
if(NOT VCPKG_CMAKE_SYSTEM_NAME OR VCPKG_TARGET_IS_MINGW) if(NOT VCPKG_CMAKE_SYSTEM_NAME OR VCPKG_TARGET_IS_MINGW)
set(MESON_SYSTEM_NAME "windows") set(meson_system_name "windows")
else() else()
string(TOLOWER "${VCPKG_CMAKE_SYSTEM_NAME}" MESON_SYSTEM_NAME) string(TOLOWER "${VCPKG_CMAKE_SYSTEM_NAME}" meson_system_name)
endif() endif()
string(APPEND CROSS "system = '${MESON_SYSTEM_NAME}'\n") string(APPEND cross_file "system = '${meson_system_name}'\n")
string(APPEND CROSS "cpu_family = '${HOST_CPU_FAM}'\n") string(APPEND cross_file "cpu_family = '${host_cpu_fam}'\n")
string(APPEND CROSS "cpu = '${HOST_CPU}'\n") string(APPEND cross_file "cpu = '${host_cpu}'\n")
string(APPEND CROSS "[build_machine]\n") string(APPEND cross_file "[build_machine]\n")
string(APPEND CROSS "endian = 'little'\n") string(APPEND cross_file "endian = 'little'\n")
if(WIN32) if(WIN32)
string(APPEND CROSS "system = 'windows'\n") string(APPEND cross_file "system = 'windows'\n")
elseif(DARWIN) elseif(DARWIN)
string(APPEND CROSS "system = 'darwin'\n") string(APPEND cross_file "system = 'darwin'\n")
else() else()
string(APPEND CROSS "system = 'linux'\n") string(APPEND cross_file "system = 'linux'\n")
endif() endif()
if(DEFINED BUILD_CPU_FAM) if(DEFINED build_cpu_fam)
string(APPEND CROSS "cpu_family = '${BUILD_CPU_FAM}'\n") string(APPEND cross_file "cpu_family = '${build_cpu_fam}'\n")
endif() endif()
if(DEFINED BUILD_CPU) if(DEFINED build_cpu)
string(APPEND CROSS "cpu = '${BUILD_CPU}'\n") string(APPEND cross_file "cpu = '${build_cpu}'\n")
endif() endif()
if(NOT BUILD_CPU_FAM MATCHES "${HOST_CPU_FAM}" OR VCPKG_TARGET_IS_ANDROID OR VCPKG_TARGET_IS_IOS OR VCPKG_TARGET_IS_UWP OR (VCPKG_TARGET_IS_MINGW AND NOT WIN32)) if(NOT build_cpu_fam MATCHES "${host_cpu_fam}"
set(_file "${CURRENT_BUILDTREES_DIR}/meson-cross-${TARGET_TRIPLET}.log") OR VCPKG_TARGET_IS_ANDROID OR VCPKG_TARGET_IS_IOS OR VCPKG_TARGET_IS_UWP
set(VCPKG_MESON_CROSS_FILE "${_file}" PARENT_SCOPE) OR (VCPKG_TARGET_IS_MINGW AND NOT WIN32))
file(WRITE "${_file}" "${CROSS}") set(native_config_name "${CURRENT_BUILDTREES_DIR}/meson-cross-${TARGET_TRIPLET}.log")
set(vcpkg_meson_cross_file "${native_config_name}" PARENT_SCOPE)
file(WRITE "${native_config_name}" "${cross_file}")
endif() endif()
endfunction() endfunction()
function(vcpkg_internal_meson_generate_cross_file_config _config) #https://mesonbuild.com/Native-environments.html function(z_vcpkg_meson_generate_cross_file_config config_type) #https://mesonbuild.com/Native-environments.html
set(CROSS_${_config} "[properties]\n") #https://mesonbuild.com/Builtin-options.html set(cross_${config_type}_log "[properties]\n") #https://mesonbuild.com/Builtin-options.html
vcpkg_internal_meson_generate_flags_properties_string(CROSS_PROPERTIES ${_config}) z_vcpkg_meson_generate_flags_properties_string(cross_properties ${config_type})
string(APPEND CROSS_${_config} "${CROSS_PROPERTIES}") string(APPEND cross_${config_type}_log "${cross_properties}")
string(APPEND CROSS_${_config} "[built-in options]\n") string(APPEND cross_${config_type}_log "[built-in options]\n")
if(VCPKG_TARGET_IS_WINDOWS) if(VCPKG_TARGET_IS_WINDOWS)
if(VCPKG_CRT_LINKAGE STREQUAL "static") if(VCPKG_CRT_LINKAGE STREQUAL "static")
set(CRT mt) set(crt_type mt)
else() else()
set(CRT md) set(crt_type md)
endif() endif()
if(${_config} STREQUAL DEBUG) if(${config_type} STREQUAL "DEBUG")
set(CRT ${CRT}d) set(crt_type ${crt_type}d)
endif() endif()
string(APPEND CROSS_${_config} "b_vscrt = '${CRT}'\n") string(APPEND cross_${config_type}_log "b_vscrt = '${crt_type}'\n")
endif() endif()
string(TOLOWER "${_config}" lowerconfig) string(TOLOWER "${config_type}" lowerconfig)
set(_file "${CURRENT_BUILDTREES_DIR}/meson-cross-${TARGET_TRIPLET}-${lowerconfig}.log") set(native_config_name "${CURRENT_BUILDTREES_DIR}/meson-cross-${TARGET_TRIPLET}-${lowerconfig}.log")
set(VCPKG_MESON_CROSS_FILE_${_config} "${_file}" PARENT_SCOPE) set(VCPKG_MESON_CROSS_FILE_${config_type} "${native_config_name}" PARENT_SCOPE)
file(WRITE "${_file}" "${CROSS_${_config}}") file(WRITE "${native_config_name}" "${cross_${config_type}_log}")
endfunction() endfunction()
function(vcpkg_configure_meson) function(vcpkg_configure_meson)
# parse parameters such that semicolons in options arguments to COMMAND don't get erased # parse parameters such that semicolons in options arguments to COMMAND don't get erased
cmake_parse_arguments(PARSE_ARGV 0 _vcm "NO_PKG_CONFIG" "SOURCE_PATH" "OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE;ADDITIONAL_NATIVE_BINARIES;ADDITIONAL_CROSS_BINARIES") cmake_parse_arguments(PARSE_ARGV 0 arg
"NO_PKG_CONFIG"
"SOURCE_PATH"
"OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE;ADDITIONAL_NATIVE_BINARIES;ADDITIONAL_CROSS_BINARIES"
)
file(REMOVE_RECURSE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel") file(REMOVE_RECURSE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel")
file(REMOVE_RECURSE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg") file(REMOVE_RECURSE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg")
@ -384,8 +394,8 @@ function(vcpkg_configure_meson)
vcpkg_find_acquire_program(PYTHON3) vcpkg_find_acquire_program(PYTHON3)
get_filename_component(PYTHON3_DIR "${PYTHON3}" DIRECTORY) get_filename_component(PYTHON3_DIR "${PYTHON3}" DIRECTORY)
vcpkg_add_to_path("${PYTHON3_DIR}") vcpkg_add_to_path("${PYTHON3_DIR}")
list(APPEND _vcm_ADDITIONAL_NATIVE_BINARIES "python = '${PYTHON3}'") vcpkg_list(APPEND arg_ADDITIONAL_NATIVE_BINARIES "python = '${PYTHON3}'")
list(APPEND _vcm_ADDITIONAL_CROSS_BINARIES "python = '${PYTHON3}'") vcpkg_list(APPEND arg_ADDITIONAL_CROSS_BINARIES "python = '${PYTHON3}'")
vcpkg_find_acquire_program(MESON) vcpkg_find_acquire_program(MESON)
@ -395,158 +405,132 @@ function(vcpkg_configure_meson)
vcpkg_find_acquire_program(NINJA) vcpkg_find_acquire_program(NINJA)
get_filename_component(NINJA_PATH ${NINJA} DIRECTORY) get_filename_component(NINJA_PATH ${NINJA} DIRECTORY)
vcpkg_add_to_path(PREPEND "${NINJA_PATH}") # Need to prepend so that meson picks up the correct ninja from vcpkg .... vcpkg_add_to_path(PREPEND "${NINJA_PATH}") # Need to prepend so that meson picks up the correct ninja from vcpkg ....
# list(APPEND _vcm_ADDITIONAL_NATIVE_BINARIES "ninja = '${NINJA}'") # This does not work due to meson issues ...... # vcpkg_list(APPEND arg_ADDITIONAL_NATIVE_BINARIES "ninja = '${NINJA}'") # This does not work due to meson issues ......
list(APPEND _vcm_OPTIONS --buildtype plain --backend ninja --wrap-mode nodownload) vcpkg_list(APPEND arg_OPTIONS --buildtype plain --backend ninja --wrap-mode nodownload)
if(NOT VCPKG_MESON_CROSS_FILE) if(NOT vcpkg_meson_cross_file)
vcpkg_internal_meson_generate_cross_file("_vcm_ADDITIONAL_CROSS_BINARIES") z_vcpkg_meson_generate_cross_file("${arg_ADDITIONAL_CROSS_BINARIES}")
endif() endif()
if(NOT VCPKG_MESON_CROSS_FILE_DEBUG AND VCPKG_MESON_CROSS_FILE) # We must use uppercase `DEBUG` and `RELEASE` here because they matches the configuration data
vcpkg_internal_meson_generate_cross_file_config(DEBUG) if(NOT VCPKG_MESON_CROSS_FILE_DEBUG AND vcpkg_meson_cross_file)
z_vcpkg_meson_generate_cross_file_config(DEBUG)
endif() endif()
if(NOT VCPKG_MESON_CROSS_FILE_RELEASE AND VCPKG_MESON_CROSS_FILE) if(NOT VCPKG_MESON_CROSS_FILE_RELEASE AND vcpkg_meson_cross_file)
vcpkg_internal_meson_generate_cross_file_config(RELEASE) z_vcpkg_meson_generate_cross_file_config(RELEASE)
endif() endif()
if(VCPKG_MESON_CROSS_FILE) if(vcpkg_meson_cross_file)
list(APPEND _vcm_OPTIONS --cross "${VCPKG_MESON_CROSS_FILE}") vcpkg_list(APPEND arg_OPTIONS --cross "${vcpkg_meson_cross_file}")
endif() endif()
if(VCPKG_MESON_CROSS_FILE_DEBUG) if(VCPKG_MESON_CROSS_FILE_DEBUG)
list(APPEND _vcm_OPTIONS_DEBUG --cross "${VCPKG_MESON_CROSS_FILE_DEBUG}") vcpkg_list(APPEND arg_OPTIONS_DEBUG --cross "${VCPKG_MESON_CROSS_FILE_DEBUG}")
endif() endif()
if(VCPKG_MESON_CROSS_FILE_RELEASE) if(VCPKG_MESON_CROSS_FILE_RELEASE)
list(APPEND _vcm_OPTIONS_RELEASE --cross "${VCPKG_MESON_CROSS_FILE_RELEASE}") vcpkg_list(APPEND arg_OPTIONS_RELEASE --cross "${VCPKG_MESON_CROSS_FILE_RELEASE}")
endif() endif()
if(NOT VCPKG_MESON_NATIVE_FILE AND NOT VCPKG_MESON_CROSS_FILE) if(NOT vcpkg_meson_native_file AND NOT vcpkg_meson_cross_file)
vcpkg_internal_meson_generate_native_file("_vcm_ADDITIONAL_NATIVE_BINARIES") z_vcpkg_meson_generate_native_file("${arg_ADDITIONAL_NATIVE_BINARIES}")
endif() endif()
if(NOT VCPKG_MESON_NATIVE_FILE_DEBUG AND NOT VCPKG_MESON_CROSS_FILE) if(NOT vcpkg_meson_native_file_DEBUG AND NOT vcpkg_meson_cross_file)
vcpkg_internal_meson_generate_native_file_config(DEBUG) z_vcpkg_meson_generate_native_file_config(DEBUG)
endif() endif()
if(NOT VCPKG_MESON_NATIVE_FILE_RELEASE AND NOT VCPKG_MESON_CROSS_FILE) if(NOT vcpkg_meson_native_file_RELEASE AND NOT vcpkg_meson_cross_file)
vcpkg_internal_meson_generate_native_file_config(RELEASE) z_vcpkg_meson_generate_native_file_config(RELEASE)
endif() endif()
if(VCPKG_MESON_NATIVE_FILE AND NOT VCPKG_MESON_CROSS_FILE) if(vcpkg_meson_native_file AND NOT vcpkg_meson_cross_file)
list(APPEND _vcm_OPTIONS --native "${VCPKG_MESON_NATIVE_FILE}") vcpkg_list(APPEND arg_OPTIONS --native "${vcpkg_meson_native_file}")
list(APPEND _vcm_OPTIONS_DEBUG --native "${VCPKG_MESON_NATIVE_FILE_DEBUG}") vcpkg_list(APPEND arg_OPTIONS_DEBUG --native "${vcpkg_meson_native_file_DEBUG}")
list(APPEND _vcm_OPTIONS_RELEASE --native "${VCPKG_MESON_NATIVE_FILE_RELEASE}") vcpkg_list(APPEND arg_OPTIONS_RELEASE --native "${vcpkg_meson_native_file_RELEASE}")
else() else()
list(APPEND _vcm_OPTIONS --native "${SCRIPTS}/buildsystems/meson/none.txt") vcpkg_list(APPEND arg_OPTIONS --native "${SCRIPTS}/buildsystems/meson/none.txt")
endif() endif()
if(VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic") if(VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic")
list(APPEND _vcm_OPTIONS --default-library shared) vcpkg_list(APPEND arg_OPTIONS --default-library shared)
else() else()
list(APPEND _vcm_OPTIONS --default-library static) vcpkg_list(APPEND arg_OPTIONS --default-library static)
endif() endif()
list(APPEND _vcm_OPTIONS --libdir lib) # else meson install into an architecture describing folder vcpkg_list(APPEND arg_OPTIONS --libdir lib) # else meson install into an architecture describing folder
list(APPEND _vcm_OPTIONS_DEBUG -Ddebug=true --prefix ${CURRENT_PACKAGES_DIR}/debug --includedir ../include) vcpkg_list(APPEND arg_OPTIONS_DEBUG -Ddebug=true --prefix "${CURRENT_PACKAGES_DIR}/debug" --includedir ../include)
list(APPEND _vcm_OPTIONS_RELEASE -Ddebug=false --prefix ${CURRENT_PACKAGES_DIR}) vcpkg_list(APPEND arg_OPTIONS_RELEASE -Ddebug=false --prefix "${CURRENT_PACKAGES_DIR}")
# select meson cmd-line options # select meson cmd-line options
if(VCPKG_TARGET_IS_WINDOWS) if(VCPKG_TARGET_IS_WINDOWS)
list(APPEND _vcm_OPTIONS_DEBUG "-Dcmake_prefix_path=['${CURRENT_INSTALLED_DIR}/debug','${CURRENT_INSTALLED_DIR}','${CURRENT_INSTALLED_DIR}/share']") vcpkg_list(APPEND arg_OPTIONS_DEBUG "-Dcmake_prefix_path=['${CURRENT_INSTALLED_DIR}/debug','${CURRENT_INSTALLED_DIR}','${CURRENT_INSTALLED_DIR}/share']")
list(APPEND _vcm_OPTIONS_RELEASE "-Dcmake_prefix_path=['${CURRENT_INSTALLED_DIR}','${CURRENT_INSTALLED_DIR}/debug','${CURRENT_INSTALLED_DIR}/share']") vcpkg_list(APPEND arg_OPTIONS_RELEASE "-Dcmake_prefix_path=['${CURRENT_INSTALLED_DIR}','${CURRENT_INSTALLED_DIR}/debug','${CURRENT_INSTALLED_DIR}/share']")
else() else()
list(APPEND _vcm_OPTIONS_DEBUG "-Dcmake_prefix_path=['${CURRENT_INSTALLED_DIR}/debug','${CURRENT_INSTALLED_DIR}']") vcpkg_list(APPEND arg_OPTIONS_DEBUG "-Dcmake_prefix_path=['${CURRENT_INSTALLED_DIR}/debug','${CURRENT_INSTALLED_DIR}']")
list(APPEND _vcm_OPTIONS_RELEASE "-Dcmake_prefix_path=['${CURRENT_INSTALLED_DIR}','${CURRENT_INSTALLED_DIR}/debug']") vcpkg_list(APPEND arg_OPTIONS_RELEASE "-Dcmake_prefix_path=['${CURRENT_INSTALLED_DIR}','${CURRENT_INSTALLED_DIR}/debug']")
endif() endif()
if(NOT _vcm_NO_PKG_CONFIG) if(NOT arg_NO_PKG_CONFIG)
vcpkg_find_acquire_program(PKGCONFIG) vcpkg_find_acquire_program(PKGCONFIG)
get_filename_component(PKGCONFIG_PATH ${PKGCONFIG} DIRECTORY) get_filename_component(PKGCONFIG_PATH ${PKGCONFIG} DIRECTORY)
vcpkg_add_to_path("${PKGCONFIG_PATH}") vcpkg_add_to_path("${PKGCONFIG_PATH}")
set(PKGCONFIG_SHARE_DIR "${CURRENT_INSTALLED_DIR}/share/pkgconfig/") set(pkgconfig_share_dir "${CURRENT_INSTALLED_DIR}/share/pkgconfig/")
endif() endif()
set(buildtypes) set(buildtypes)
if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug") if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
set(BUILDNAME DEBUG) set(buildname "DEBUG")
list(APPEND buildtypes ${BUILDNAME}) vcpkg_list(APPEND buildtypes ${buildname})
set(PATH_SUFFIX_${BUILDNAME} "debug/") set(path_suffix_${buildname} "debug/")
set(SUFFIX_${BUILDNAME} "dbg") set(suffix_${buildname} "dbg")
endif() endif()
if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release") if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
set(BUILDNAME RELEASE) set(buildname "RELEASE")
list(APPEND buildtypes ${BUILDNAME}) vcpkg_list(APPEND buildtypes ${buildname})
set(PATH_SUFFIX_${BUILDNAME} "") set(path_suffix_${buildname} "")
set(SUFFIX_${BUILDNAME} "rel") set(suffix_${buildname} "rel")
endif() endif()
if(VCPKG_TARGET_IS_OSX) if(VCPKG_TARGET_IS_OSX)
if(DEFINED ENV{SDKROOT}) vcpkg_backup_env_variables(VARS SDKROOT MACOSX_DEPLOYMENT_TARGET)
set(_VCPKG_ENV_SDKROOT_BACKUP $ENV{SDKROOT})
endif()
set(ENV{SDKROOT} "${VCPKG_DETECTED_CMAKE_OSX_SYSROOT}") set(ENV{SDKROOT} "${VCPKG_DETECTED_CMAKE_OSX_SYSROOT}")
set(VCPKG_DETECTED_CMAKE_OSX_SYSROOT "${VCPKG_DETECTED_CMAKE_OSX_SYSROOT}" PARENT_SCOPE) set(VCPKG_DETECTED_CMAKE_OSX_SYSROOT "${VCPKG_DETECTED_CMAKE_OSX_SYSROOT}" PARENT_SCOPE)
if(DEFINED ENV{MACOSX_DEPLOYMENT_TARGET})
set(_VCPKG_ENV_MACOSX_DEPLOYMENT_TARGET_BACKUP $ENV{MACOSX_DEPLOYMENT_TARGET})
endif()
set(ENV{MACOSX_DEPLOYMENT_TARGET} "${VCPKG_DETECTED_CMAKE_OSX_DEPLOYMENT_TARGET}") set(ENV{MACOSX_DEPLOYMENT_TARGET} "${VCPKG_DETECTED_CMAKE_OSX_DEPLOYMENT_TARGET}")
set(VCPKG_DETECTED_CMAKE_OSX_DEPLOYMENT_TARGET "${VCPKG_DETECTED_CMAKE_OSX_DEPLOYMENT_TARGET}" PARENT_SCOPE) set(VCPKG_DETECTED_CMAKE_OSX_DEPLOYMENT_TARGET "${VCPKG_DETECTED_CMAKE_OSX_DEPLOYMENT_TARGET}" PARENT_SCOPE)
endif() endif()
if(DEFINED ENV{INCLUDE}) vcpkg_backup_env_variables(VARS INCLUDE)
set(ENV{INCLUDE} "$ENV{INCLUDE}${VCPKG_HOST_PATH_SEPARATOR}${CURRENT_INSTALLED_DIR}/include") vcpkg_host_path_list(APPEND ENV{INCLUDE} "${CURRENT_INSTALLED_DIR}/include")
else()
set(ENV{INCLUDE} "${CURRENT_INSTALLED_DIR}/include")
endif()
# configure build # configure build
foreach(buildtype IN LISTS buildtypes) foreach(buildtype IN LISTS buildtypes)
message(STATUS "Configuring ${TARGET_TRIPLET}-${SUFFIX_${buildtype}}") message(STATUS "Configuring ${TARGET_TRIPLET}-${suffix_${buildtype}}")
file(MAKE_DIRECTORY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${SUFFIX_${buildtype}}") file(MAKE_DIRECTORY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${suffix_${buildtype}}")
#setting up PKGCONFIG #setting up PKGCONFIG
if(NOT _vcm_NO_PKG_CONFIG) vcpkg_backup_env_variables(VARS PKG_CONFIG PKG_CONFIG_PATH)
if(NOT arg_NO_PKG_CONFIG)
set(ENV{PKG_CONFIG} "${PKGCONFIG}") # Set via native file? set(ENV{PKG_CONFIG} "${PKGCONFIG}") # Set via native file?
set(PKGCONFIG_INSTALLED_DIR "${CURRENT_INSTALLED_DIR}/${PATH_SUFFIX_${buildtype}}lib/pkgconfig/") set(pkgconfig_installed_dir "${CURRENT_INSTALLED_DIR}/${path_suffix_${buildtype}}lib/pkgconfig/")
if(DEFINED ENV{PKG_CONFIG_PATH}) vcpkg_host_path_list(APPEND ENV{PKG_CONFIG_PATH} "${pkgconfig_installed_dir}" "${pkgconfig_share_dir}" "$ENV{PKG_CONFIG_PATH}")
set(BACKUP_ENV_PKG_CONFIG_PATH_RELEASE $ENV{PKG_CONFIG_PATH})
set(ENV{PKG_CONFIG_PATH} "${PKGCONFIG_INSTALLED_DIR}${VCPKG_HOST_PATH_SEPARATOR}${PKGCONFIG_SHARE_DIR}${VCPKG_HOST_PATH_SEPARATOR}$ENV{PKG_CONFIG_PATH}")
else()
set(ENV{PKG_CONFIG_PATH} "${PKGCONFIG_INSTALLED_DIR}${VCPKG_HOST_PATH_SEPARATOR}${PKGCONFIG_SHARE_DIR}")
endif()
endif() endif()
vcpkg_execute_required_process( vcpkg_execute_required_process(
COMMAND ${MESON} ${_vcm_OPTIONS} ${_vcm_OPTIONS_${buildtype}} ${_vcm_SOURCE_PATH} COMMAND ${MESON} ${arg_OPTIONS} ${arg_OPTIONS_${buildtype}} ${arg_SOURCE_PATH}
WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${SUFFIX_${buildtype}} WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${suffix_${buildtype}}"
LOGNAME config-${TARGET_TRIPLET}-${SUFFIX_${buildtype}} LOGNAME config-${TARGET_TRIPLET}-${suffix_${buildtype}}
) )
#Copy meson log files into buildtree for CI #Copy meson log files into buildtree for CI
if(EXISTS "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${SUFFIX_${buildtype}}/meson-logs/meson-log.txt") if(EXISTS "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${suffix_${buildtype}}/meson-logs/meson-log.txt")
file(COPY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${SUFFIX_${buildtype}}/meson-logs/meson-log.txt" DESTINATION "${CURRENT_BUILDTREES_DIR}") file(COPY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${suffix_${buildtype}}/meson-logs/meson-log.txt" DESTINATION "${CURRENT_BUILDTREES_DIR}")
file(RENAME "${CURRENT_BUILDTREES_DIR}/meson-log.txt" "${CURRENT_BUILDTREES_DIR}/meson-log-${SUFFIX_${buildtype}}.txt") file(RENAME "${CURRENT_BUILDTREES_DIR}/meson-log.txt" "${CURRENT_BUILDTREES_DIR}/meson-log-${suffix_${buildtype}}.txt")
endif() endif()
if(EXISTS "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${SUFFIX_${buildtype}}/meson-logs/install-log.txt") if(EXISTS "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${suffix_${buildtype}}/meson-logs/install-log.txt")
file(COPY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${SUFFIX_${buildtype}}/meson-logs/install-log.txt" DESTINATION "${CURRENT_BUILDTREES_DIR}") file(COPY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${suffix_${buildtype}}/meson-logs/install-log.txt" DESTINATION "${CURRENT_BUILDTREES_DIR}")
file(RENAME "${CURRENT_BUILDTREES_DIR}/install-log.txt" "${CURRENT_BUILDTREES_DIR}/install-log-${SUFFIX_${buildtype}}.txt") file(RENAME "${CURRENT_BUILDTREES_DIR}/install-log.txt" "${CURRENT_BUILDTREES_DIR}/install-log-${suffix_${buildtype}}.txt")
endif() endif()
message(STATUS "Configuring ${TARGET_TRIPLET}-${SUFFIX_${buildtype}} done") message(STATUS "Configuring ${TARGET_TRIPLET}-${suffix_${buildtype}} done")
if(NOT _vcm_NO_PKG_CONFIG) vcpkg_restore_env_variables(VARS PKG_CONFIG PKG_CONFIG_PATH)
#Restore PKG_CONFIG_PATH
if(BACKUP_ENV_PKG_CONFIG_PATH_${buildtype})
set(ENV{PKG_CONFIG_PATH} "${BACKUP_ENV_PKG_CONFIG_PATH_${buildtype}}")
unset(BACKUP_ENV_PKG_CONFIG_PATH_${buildtype})
else()
unset(ENV{PKG_CONFIG_PATH})
endif()
endif()
endforeach() endforeach()
if(VCPKG_TARGET_IS_OSX) if(VCPKG_TARGET_IS_OSX)
if(DEFINED _VCPKG_ENV_SDKROOT_BACKUP) vcpkg_restore_env_variables(VARS SDKROOT MACOSX_DEPLOYMENT_TARGET)
set(ENV{SDKROOT} "${_VCPKG_ENV_SDKROOT_BACKUP}")
else()
unset(ENV{SDKROOT})
endif()
if(DEFINED _VCPKG_ENV_MACOSX_DEPLOYMENT_TARGET_BACKUP)
set(ENV{MACOSX_DEPLOYMENT_TARGET} "${_VCPKG_ENV_MACOSX_DEPLOYMENT_TARGET_BACKUP}")
else()
unset(ENV{MACOSX_DEPLOYMENT_TARGET})
endif()
endif() endif()
vcpkg_restore_env_variables(VARS INCLUDE)
endfunction() endfunction()

View File

@ -19,87 +19,73 @@ Adds the appropriate Release and Debug `bin\` directories to the path during the
#]===] #]===]
function(vcpkg_install_meson) function(vcpkg_install_meson)
cmake_parse_arguments(PARSE_ARGV 0 arg "ADD_BIN_TO_PATH" "" "")
vcpkg_find_acquire_program(NINJA) vcpkg_find_acquire_program(NINJA)
unset(ENV{DESTDIR}) # installation directory was already specified with '--prefix' option unset(ENV{DESTDIR}) # installation directory was already specified with '--prefix' option
cmake_parse_arguments(PARSE_ARGV 0 _im "ADD_BIN_TO_PATH" "" "")
if(VCPKG_TARGET_IS_OSX) if(VCPKG_TARGET_IS_OSX)
if(DEFINED ENV{SDKROOT}) vcpkg_backup_env_variables(VARS SDKROOT MACOSX_DEPLOYMENT_TARGET)
set(_VCPKG_ENV_SDKROOT_BACKUP $ENV{SDKROOT})
endif()
set(ENV{SDKROOT} "${VCPKG_DETECTED_CMAKE_OSX_SYSROOT}") set(ENV{SDKROOT} "${VCPKG_DETECTED_CMAKE_OSX_SYSROOT}")
if(DEFINED ENV{MACOSX_DEPLOYMENT_TARGET})
set(_VCPKG_ENV_MACOSX_DEPLOYMENT_TARGET_BACKUP $ENV{MACOSX_DEPLOYMENT_TARGET})
endif()
set(ENV{MACOSX_DEPLOYMENT_TARGET} "${VCPKG_DETECTED_CMAKE_OSX_DEPLOYMENT_TARGET}") set(ENV{MACOSX_DEPLOYMENT_TARGET} "${VCPKG_DETECTED_CMAKE_OSX_DEPLOYMENT_TARGET}")
endif() endif()
foreach(BUILDTYPE "debug" "release") foreach(buildtype IN ITEMS "debug" "release")
if(DEFINED VCPKG_BUILD_TYPE AND NOT VCPKG_BUILD_TYPE STREQUAL BUILDTYPE) if(DEFINED VCPKG_BUILD_TYPE AND NOT VCPKG_BUILD_TYPE STREQUAL buildtype)
continue() continue()
endif() endif()
if(BUILDTYPE STREQUAL "debug") if(buildtype STREQUAL "debug")
set(SHORT_BUILDTYPE "dbg") set(short_buildtype "dbg")
else() else()
set(SHORT_BUILDTYPE "rel") set(short_buildtype "rel")
endif() endif()
message(STATUS "Package ${TARGET_TRIPLET}-${SHORT_BUILDTYPE}") message(STATUS "Package ${TARGET_TRIPLET}-${short_buildtype}")
if(_im_ADD_BIN_TO_PATH) if(arg_ADD_BIN_TO_PATH)
set(_BACKUP_ENV_PATH "$ENV{PATH}") vcpkg_backup_env_variables(VARS PATH)
if(BUILDTYPE STREQUAL "debug") if(buildtype STREQUAL "debug")
vcpkg_add_to_path(PREPEND "${CURRENT_INSTALLED_DIR}/debug/bin") vcpkg_add_to_path(PREPEND "${CURRENT_INSTALLED_DIR}/debug/bin")
else() else()
vcpkg_add_to_path(PREPEND "${CURRENT_INSTALLED_DIR}/bin") vcpkg_add_to_path(PREPEND "${CURRENT_INSTALLED_DIR}/bin")
endif() endif()
endif() endif()
vcpkg_execute_required_process( vcpkg_execute_required_process(
COMMAND ${NINJA} install -v COMMAND "${NINJA}" install -v
WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${SHORT_BUILDTYPE} WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-${short_buildtype}"
LOGNAME package-${TARGET_TRIPLET}-${SHORT_BUILDTYPE} LOGNAME package-${TARGET_TRIPLET}-${short_buildtype}
) )
if(_im_ADD_BIN_TO_PATH) if(arg_ADD_BIN_TO_PATH)
set(ENV{PATH} "${_BACKUP_ENV_PATH}") vcpkg_restore_env_variables(VARS PATH)
endif() endif()
endforeach() endforeach()
set(RENAMED_LIBS "") vcpkg_list(SET renamed_libs)
if(VCPKG_TARGET_IS_WINDOWS AND VCPKG_LIBRARY_LINKAGE STREQUAL static AND NOT VCPKG_TARGET_IS_MINGW) if(VCPKG_TARGET_IS_WINDOWS AND VCPKG_LIBRARY_LINKAGE STREQUAL static AND NOT VCPKG_TARGET_IS_MINGW)
# Meson names all static libraries lib<name>.a which basically breaks the world # Meson names all static libraries lib<name>.a which basically breaks the world
file(GLOB_RECURSE LIBRARIES "${CURRENT_PACKAGES_DIR}*/**/lib*.a") file(GLOB_RECURSE gen_libraries "${CURRENT_PACKAGES_DIR}*/**/lib*.a")
foreach(_library IN LISTS LIBRARIES) foreach(gen_library IN LISTS gen_libraries)
get_filename_component(LIBDIR "${_library}" DIRECTORY ) get_filename_component(libdir "${gen_library}" DIRECTORY)
get_filename_component(LIBNAME "${_library}" NAME) get_filename_component(libname "${gen_library}" NAME)
string(REGEX REPLACE ".a$" ".lib" LIBNAMENEW "${LIBNAME}") string(REGEX REPLACE ".a$" ".lib" fixed_librawname "${libname}")
string(REGEX REPLACE "^lib" "" LIBNAMENEW "${LIBNAMENEW}") string(REGEX REPLACE "^lib" "" fixed_librawname "${fixed_librawname}")
file(RENAME "${_library}" "${LIBDIR}/${LIBNAMENEW}") file(RENAME "${gen_library}" "${libdir}/${fixed_librawname}")
# For cmake fixes. # For cmake fixes.
string(REGEX REPLACE ".a$" "" LIBRAWNAMEOLD "${LIBNAME}") string(REGEX REPLACE ".a$" "" origin_librawname "${libname}")
string(REGEX REPLACE ".lib$" "" LIBRAWNAMENEW "${LIBNAMENEW}") string(REGEX REPLACE ".lib$" "" fixed_librawname "${fixed_librawname}")
list(APPEND RENAMED_LIBS ${LIBRAWNAMENEW}) vcpkg_list(APPEND renamed_libs ${fixed_librawname})
set(${LIBRAWNAME}_OLD ${LIBRAWNAMEOLD}) set(${librawname}_old ${origin_librawname})
set(${LIBRAWNAME}_NEW ${LIBRAWNAMENEW}) set(${librawname}_new ${fixed_librawname})
endforeach() endforeach()
file(GLOB_RECURSE CMAKE_FILES "${CURRENT_PACKAGES_DIR}*/*.cmake") file(GLOB_RECURSE cmake_files "${CURRENT_PACKAGES_DIR}*/*.cmake")
foreach(_cmake IN LISTS CMAKE_FILES) foreach(cmake_file IN LISTS cmake_files)
foreach(_lib IN LISTS RENAMED_LIBS) foreach(current_lib IN LISTS renamed_libs)
vcpkg_replace_string("${_cmake}" "${${_lib}_OLD}" "${${_lib}_NEW}") vcpkg_replace_string("${cmake_file}" "${${current_lib}_old}" "${${current_lib}_new}")
endforeach() endforeach()
endforeach() endforeach()
endif() endif()
if(VCPKG_TARGET_IS_OSX) if(VCPKG_TARGET_IS_OSX)
if(DEFINED _VCPKG_ENV_SDKROOT_BACKUP) vcpkg_restore_env_variables(VARS SDKROOT MACOSX_DEPLOYMENT_TARGET)
set(ENV{SDKROOT} "${_VCPKG_ENV_SDKROOT_BACKUP}")
else()
unset(ENV{SDKROOT})
endif()
if(DEFINED _VCPKG_ENV_MACOSX_DEPLOYMENT_TARGET_BACKUP)
set(ENV{MACOSX_DEPLOYMENT_TARGET} "${_VCPKG_ENV_MACOSX_DEPLOYMENT_TARGET_BACKUP}")
else()
unset(ENV{MACOSX_DEPLOYMENT_TARGET})
endif()
endif() endif()
endfunction() endfunction()