Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
182 changes: 116 additions & 66 deletions ports/vcpkg-cmake/vcpkg_cmake_configure.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -128,12 +128,26 @@ function(vcpkg_cmake_configure)

set(build_dir_release "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel")
set(build_dir_debug "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg")
file(REMOVE_RECURSE
"${build_dir_release}"
"${build_dir_debug}")
file(MAKE_DIRECTORY "${build_dir_release}")
if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
file(MAKE_DIRECTORY "${build_dir_debug}")
# Preserve build directories for incremental builds
if(_VCPKG_EDITABLE_SUBTREE)
# Editable mode: preserve build directories for incremental builds
if(NOT EXISTS "${build_dir_release}")
file(MAKE_DIRECTORY "${build_dir_release}")
endif()
if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
if(NOT EXISTS "${build_dir_debug}")
file(MAKE_DIRECTORY "${build_dir_debug}")
endif()
endif()
else()
# Normal mode: clean slate for reproducible builds
file(REMOVE_RECURSE
"${build_dir_release}"
"${build_dir_debug}")
file(MAKE_DIRECTORY "${build_dir_release}")
if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
file(MAKE_DIRECTORY "${build_dir_debug}")
endif()
endif()

if(DEFINED VCPKG_CMAKE_SYSTEM_NAME)
Expand Down Expand Up @@ -243,75 +257,111 @@ function(vcpkg_cmake_configure)
"-DCMAKE_INSTALL_PREFIX=${CURRENT_PACKAGES_DIR}/debug"
${arg_OPTIONS} ${arg_OPTIONS_DEBUG})

if(NOT arg_DISABLE_PARALLEL_CONFIGURE)
vcpkg_list(APPEND arg_OPTIONS "-DCMAKE_DISABLE_SOURCE_CHANGES=ON")

vcpkg_find_acquire_program(NINJA)

#parallelize the configure step
set(ninja_configure_contents
"rule CreateProcess\n command = \$process\n\n"
)

if(NOT DEFINED VCPKG_BUILD_TYPE OR "${VCPKG_BUILD_TYPE}" STREQUAL "release")
z_vcpkg_configure_cmake_build_cmakecache(ninja_configure_contents ".." "rel")
# In editable mode, skip configure if CMakeCache.txt already exists
# This enables truly incremental builds by letting ninja handle reconfiguration
set(_vcpkg_skip_configure OFF)
if(_VCPKG_EDITABLE_SUBTREE)
set(_vcpkg_has_release_cache OFF)
set(_vcpkg_has_debug_cache OFF)
if(EXISTS "${build_dir_release}/CMakeCache.txt")
set(_vcpkg_has_release_cache ON)
endif()
if(NOT DEFINED VCPKG_BUILD_TYPE OR "${VCPKG_BUILD_TYPE}" STREQUAL "debug")
z_vcpkg_configure_cmake_build_cmakecache(ninja_configure_contents "../../${TARGET_TRIPLET}-dbg" "dbg")
if(EXISTS "${build_dir_debug}/CMakeCache.txt")
set(_vcpkg_has_debug_cache ON)
endif()

file(MAKE_DIRECTORY "${build_dir_release}/vcpkg-parallel-configure")
file(WRITE
"${build_dir_release}/vcpkg-parallel-configure/build.ninja"
"${ninja_configure_contents}")

message(STATUS "${configuring_message}")
vcpkg_execute_required_process(
COMMAND "${NINJA}" -v
WORKING_DIRECTORY "${build_dir_release}/vcpkg-parallel-configure"
LOGNAME "${arg_LOGFILE_BASE}"
SAVE_LOG_FILES
"../../${TARGET_TRIPLET}-dbg/CMakeCache.txt" ALIAS "dbg-CMakeCache.txt.log"
"../CMakeCache.txt" ALIAS "rel-CMakeCache.txt.log"
"../../${TARGET_TRIPLET}-dbg/CMakeFiles/CMakeConfigureLog.yaml" ALIAS "dbg-CMakeConfigureLog.yaml.log"
"../CMakeFiles/CMakeConfigureLog.yaml" ALIAS "rel-CMakeConfigureLog.yaml.log"
${parallel_log_args}
)

vcpkg_list(APPEND config_logs
"${CURRENT_BUILDTREES_DIR}/${arg_LOGFILE_BASE}-out.log"
"${CURRENT_BUILDTREES_DIR}/${arg_LOGFILE_BASE}-err.log")
else()
if(NOT DEFINED VCPKG_BUILD_TYPE OR "${VCPKG_BUILD_TYPE}" STREQUAL "debug")
message(STATUS "${configuring_message}-dbg")
vcpkg_execute_required_process(
COMMAND ${dbg_command}
WORKING_DIRECTORY "${build_dir_debug}"
LOGNAME "${arg_LOGFILE_BASE}-dbg"
SAVE_LOG_FILES
"CMakeCache.txt"
"CMakeFiles/CMakeConfigureLog.yaml"
${log_args}
)
vcpkg_list(APPEND config_logs
"${CURRENT_BUILDTREES_DIR}/${arg_LOGFILE_BASE}-dbg-out.log"
"${CURRENT_BUILDTREES_DIR}/${arg_LOGFILE_BASE}-dbg-err.log")
# Skip configure if all required caches exist
if(NOT DEFINED VCPKG_BUILD_TYPE)
# Both debug and release needed
if(_vcpkg_has_release_cache AND _vcpkg_has_debug_cache)
set(_vcpkg_skip_configure ON)
endif()
elseif(VCPKG_BUILD_TYPE STREQUAL "release")
if(_vcpkg_has_release_cache)
set(_vcpkg_skip_configure ON)
endif()
elseif(VCPKG_BUILD_TYPE STREQUAL "debug")
if(_vcpkg_has_debug_cache)
set(_vcpkg_skip_configure ON)
endif()
endif()

if(_vcpkg_skip_configure)
message(STATUS "${configuring_message} - skipping (CMakeCache.txt exists, ninja will reconfigure if needed)")
endif()
endif()

if(NOT _vcpkg_skip_configure)
if(NOT arg_DISABLE_PARALLEL_CONFIGURE)
vcpkg_list(APPEND arg_OPTIONS "-DCMAKE_DISABLE_SOURCE_CHANGES=ON")

vcpkg_find_acquire_program(NINJA)

#parallelize the configure step
set(ninja_configure_contents
"rule CreateProcess\n command = \$process\n\n"
)

if(NOT DEFINED VCPKG_BUILD_TYPE OR "${VCPKG_BUILD_TYPE}" STREQUAL "release")
message(STATUS "${configuring_message}-rel")
if(NOT DEFINED VCPKG_BUILD_TYPE OR "${VCPKG_BUILD_TYPE}" STREQUAL "release")
z_vcpkg_configure_cmake_build_cmakecache(ninja_configure_contents ".." "rel")
endif()
if(NOT DEFINED VCPKG_BUILD_TYPE OR "${VCPKG_BUILD_TYPE}" STREQUAL "debug")
z_vcpkg_configure_cmake_build_cmakecache(ninja_configure_contents "../../${TARGET_TRIPLET}-dbg" "dbg")
endif()

file(MAKE_DIRECTORY "${build_dir_release}/vcpkg-parallel-configure")
file(WRITE
"${build_dir_release}/vcpkg-parallel-configure/build.ninja"
"${ninja_configure_contents}")

message(STATUS "${configuring_message}")
vcpkg_execute_required_process(
COMMAND ${rel_command}
WORKING_DIRECTORY "${build_dir_release}"
LOGNAME "${arg_LOGFILE_BASE}-rel"
COMMAND "${NINJA}" -v
WORKING_DIRECTORY "${build_dir_release}/vcpkg-parallel-configure"
LOGNAME "${arg_LOGFILE_BASE}"
SAVE_LOG_FILES
"CMakeCache.txt"
"CMakeFiles/CMakeConfigureLog.yaml"
${log_args}
"../../${TARGET_TRIPLET}-dbg/CMakeCache.txt" ALIAS "dbg-CMakeCache.txt.log"
"../CMakeCache.txt" ALIAS "rel-CMakeCache.txt.log"
"../../${TARGET_TRIPLET}-dbg/CMakeFiles/CMakeConfigureLog.yaml" ALIAS "dbg-CMakeConfigureLog.yaml.log"
"../CMakeFiles/CMakeConfigureLog.yaml" ALIAS "rel-CMakeConfigureLog.yaml.log"
${parallel_log_args}
)

vcpkg_list(APPEND config_logs
"${CURRENT_BUILDTREES_DIR}/${arg_LOGFILE_BASE}-rel-out.log"
"${CURRENT_BUILDTREES_DIR}/${arg_LOGFILE_BASE}-rel-err.log")
"${CURRENT_BUILDTREES_DIR}/${arg_LOGFILE_BASE}-out.log"
"${CURRENT_BUILDTREES_DIR}/${arg_LOGFILE_BASE}-err.log")
else()
if(NOT DEFINED VCPKG_BUILD_TYPE OR "${VCPKG_BUILD_TYPE}" STREQUAL "debug")
message(STATUS "${configuring_message}-dbg")
vcpkg_execute_required_process(
COMMAND ${dbg_command}
WORKING_DIRECTORY "${build_dir_debug}"
LOGNAME "${arg_LOGFILE_BASE}-dbg"
SAVE_LOG_FILES
"CMakeCache.txt"
"CMakeFiles/CMakeConfigureLog.yaml"
${log_args}
)
vcpkg_list(APPEND config_logs
"${CURRENT_BUILDTREES_DIR}/${arg_LOGFILE_BASE}-dbg-out.log"
"${CURRENT_BUILDTREES_DIR}/${arg_LOGFILE_BASE}-dbg-err.log")
endif()

if(NOT DEFINED VCPKG_BUILD_TYPE OR "${VCPKG_BUILD_TYPE}" STREQUAL "release")
message(STATUS "${configuring_message}-rel")
vcpkg_execute_required_process(
COMMAND ${rel_command}
WORKING_DIRECTORY "${build_dir_release}"
LOGNAME "${arg_LOGFILE_BASE}-rel"
SAVE_LOG_FILES
"CMakeCache.txt"
"CMakeFiles/CMakeConfigureLog.yaml"
${log_args}
)
vcpkg_list(APPEND config_logs
"${CURRENT_BUILDTREES_DIR}/${arg_LOGFILE_BASE}-rel-out.log"
"${CURRENT_BUILDTREES_DIR}/${arg_LOGFILE_BASE}-rel-err.log")
endif()
endif()
endif()

Expand Down
7 changes: 5 additions & 2 deletions scripts/cmake/vcpkg_extract_source_archive.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,14 @@ function(vcpkg_extract_source_archive)
OUTPUT_VARIABLE source_path
)

if(_VCPKG_EDITABLE AND EXISTS "${source_path}")
# Preserve source for:
# - _VCPKG_EDITABLE: this specific port is editable
# - _VCPKG_EDITABLE_SUBTREE: this port is in the dependency tree of an editable port
if((_VCPKG_EDITABLE OR _VCPKG_EDITABLE_SUBTREE) AND EXISTS "${source_path}")
set("${out_source_path}" "${source_path}" PARENT_SCOPE)
message(STATUS "Using source at ${source_path}")
return()
elseif(NOT _VCPKG_EDITABLE)
elseif(NOT _VCPKG_EDITABLE AND NOT _VCPKG_EDITABLE_SUBTREE)
cmake_path(APPEND_STRING source_path ".clean")
if(EXISTS "${source_path}")
message(STATUS "Cleaning sources at ${source_path}. Use --editable to skip cleaning for the packages you specify.")
Expand Down
21 changes: 21 additions & 0 deletions scripts/cmake/vcpkg_from_git.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,27 @@ function(vcpkg_from_git)
message(WARNING "The TAG argument to vcpkg_from_git has been deprecated and has no effect.")
endif()

# Editable mode: delegate to consolidated helper
if(_VCPKG_EDITABLE AND DEFINED _VCPKG_EDITABLE_SOURCES_PATH)
if(DEFINED arg_REF)
set(_git_ref "${arg_REF}")
elseif(DEFINED arg_HEAD_REF)
set(_git_ref "${arg_HEAD_REF}")
else()
message(FATAL_ERROR "Editable mode: REF or HEAD_REF must be specified")
endif()

include("${SCRIPTS}/cmake/z_vcpkg_from_git_editable.cmake")
z_vcpkg_from_git_editable(
URL "${arg_URL}"
REF "${_git_ref}"
OUT_SOURCE_PATH "${arg_OUT_SOURCE_PATH}"
PATCHES ${arg_PATCHES}
)
set("${arg_OUT_SOURCE_PATH}" "${${arg_OUT_SOURCE_PATH}}" PARENT_SCOPE)
return()
endif()

if(NOT DEFINED arg_OUT_SOURCE_PATH)
message(FATAL_ERROR "OUT_SOURCE_PATH must be specified")
endif()
Expand Down
28 changes: 28 additions & 0 deletions scripts/cmake/vcpkg_from_github.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,34 @@ function(vcpkg_from_github)
message(WARNING "vcpkg_from_github was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}")
endif()

# Editable mode: delegate to consolidated helper
if(_VCPKG_EDITABLE AND DEFINED _VCPKG_EDITABLE_SOURCES_PATH)
if(NOT DEFINED arg_GITHUB_HOST)
set(_github_host "https://github.com")
else()
set(_github_host "${arg_GITHUB_HOST}")
endif()

set(_git_url "${_github_host}/${arg_REPO}.git")
if(DEFINED arg_REF)
set(_git_ref "${arg_REF}")
elseif(DEFINED arg_HEAD_REF)
set(_git_ref "${arg_HEAD_REF}")
else()
message(FATAL_ERROR "Editable mode: REF or HEAD_REF must be specified")
endif()

include("${SCRIPTS}/cmake/z_vcpkg_from_git_editable.cmake")
z_vcpkg_from_git_editable(
URL "${_git_url}"
REF "${_git_ref}"
OUT_SOURCE_PATH "${arg_OUT_SOURCE_PATH}"
PATCHES ${arg_PATCHES}
)
set("${arg_OUT_SOURCE_PATH}" "${${arg_OUT_SOURCE_PATH}}" PARENT_SCOPE)
return()
endif()

if(DEFINED arg_REF AND NOT DEFINED arg_SHA512)
message(FATAL_ERROR "SHA512 must be specified if REF is specified.")
endif()
Expand Down
22 changes: 22 additions & 0 deletions scripts/cmake/vcpkg_from_gitlab.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,28 @@ function(vcpkg_from_gitlab)
message(WARNING "vcpkg_from_gitlab was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}")
endif()

# Editable mode: delegate to consolidated helper
if(_VCPKG_EDITABLE AND DEFINED _VCPKG_EDITABLE_SOURCES_PATH)
set(_git_url "${arg_GITLAB_URL}/${arg_REPO}.git")
if(DEFINED arg_REF)
set(_git_ref "${arg_REF}")
elseif(DEFINED arg_HEAD_REF)
set(_git_ref "${arg_HEAD_REF}")
else()
message(FATAL_ERROR "Editable mode: REF or HEAD_REF must be specified")
endif()

include("${SCRIPTS}/cmake/z_vcpkg_from_git_editable.cmake")
z_vcpkg_from_git_editable(
URL "${_git_url}"
REF "${_git_ref}"
OUT_SOURCE_PATH "${arg_OUT_SOURCE_PATH}"
PATCHES ${arg_PATCHES}
)
set("${arg_OUT_SOURCE_PATH}" "${${arg_OUT_SOURCE_PATH}}" PARENT_SCOPE)
return()
endif()

if(NOT DEFINED arg_GITLAB_URL)
message(FATAL_ERROR "GITLAB_URL must be specified.")
endif()
Expand Down
Loading
Loading