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
19 changes: 6 additions & 13 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,12 @@
- Run tests: `ctest --preset windows-ci --output-on-failure`

### Windows local development
- Use `Win-arm64-Debug-WithArtifacts` on Windows Arm64 hosts.
- Use `Win-x64-Debug-WithArtifacts` on Windows x64 hosts.
- Prefer these host-matching `WithArtifacts` presets for normal local configure, build, and test workflows instead of `windows-ci`.
- Use `Win-arm64-Debug` on Windows Arm64 hosts.
- Use `Win-x64-Debug` on Windows x64 hosts.

### Run a single test
- Run one CTest target: `ctest --preset Win-arm64-Debug-WithArtifacts -R "^vcpkg-test$" --output-on-failure` or `ctest --preset Win-x64-Debug-WithArtifacts -R "^vcpkg-test$" --output-on-failure`
- Run specific Catch2 tests directly: `.\out\build\Win-arm64-Debug-WithArtifacts\vcpkg-test.exe [tag-or-filter]` or `.\out\build\Win-x64-Debug-WithArtifacts\vcpkg-test.exe [tag-or-filter]`
- Run one CTest target: `ctest --preset Win-arm64-Debug -R "^vcpkg-test$" --output-on-failure` or `ctest --preset Win-x64-Debug -R "^vcpkg-test$" --output-on-failure`
- Run specific Catch2 tests directly: `.\out\build\Win-arm64-Debug\vcpkg-test.exe [tag-or-filter]` or `.\out\build\Win-x64-Debug\vcpkg-test.exe [tag-or-filter]`
- Tags follow the source filename convention (for example `[arguments]`).
- Run one e2e suite: `pwsh azure-pipelines/end-to-end-tests.ps1 -Filter "<suite-file-name-without-.ps1>"`

Expand All @@ -26,21 +25,15 @@

### Formatting / checks
- C++ format check path used in PR workflow: `pwsh .\azure-pipelines\Format-CxxCode.ps1`
- Regenerate message map: `cmake --build --preset Win-arm64-Debug-WithArtifacts --target generate-message-map -- -k0` or `cmake --build --preset Win-x64-Debug-WithArtifacts --target generate-message-map -- -k0`
- Verify message usage: `cmake --build --preset Win-arm64-Debug-WithArtifacts --target verify-messages -- -k0` or `cmake --build --preset Win-x64-Debug-WithArtifacts --target verify-messages -- -k0`

### vcpkg-artifacts (TypeScript) checks
- Install deps: `npm --prefix .\vcpkg-artifacts ci`
- Lint: `npm --prefix .\vcpkg-artifacts run eslint`
- Unit tests: `npm --prefix .\vcpkg-artifacts test`
- Regenerate message map: `cmake --build --preset Win-arm64-Debug --target generate-message-map -- -k0` or `cmake --build --preset Win-x64-Debug --target generate-message-map -- -k0`
- Verify message usage: `cmake --build --preset Win-arm64-Debug --target verify-messages -- -k0` or `cmake --build --preset Win-x64-Debug --target verify-messages -- -k0`

## High-level architecture

- `vcpkg` is the CLI executable (`src/vcpkg.cpp`) and dispatches subcommands registered in `src/vcpkg/commands.cpp`.
- Command dispatch is tiered: `basic_commands` run without `VcpkgPaths`, `paths_commands` require initialized paths, and `triplet_commands` additionally resolve default/host triplets before executing.
- Core implementation lives in the `vcpkglib` object library built from `src/vcpkg/*.cpp` and `src/vcpkg/base/*.cpp`, with public headers in `include/vcpkg/**`.
- Tests are built into `vcpkg-test` from `src/vcpkg-test/*.cpp` (Catch2), plus small helper executables (`reads-stdin`, `test-editor`, etc.) used by tests.
- The `vcpkg-artifacts` TypeScript code is bundled into `vcpkg-artifacts.mjs` during CMake builds only when `VCPKG_ARTIFACTS_DEVELOPMENT=ON` (enabled by CI presets).
- Localization is a first-class pipeline: message declarations in `include/vcpkg/base/message-data.inc.h`, generated maps in `locales/messages.json`, and enforcement via `generate-message-map` + `verify-messages`.

## Key conventions
Expand Down
11 changes: 3 additions & 8 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,13 @@ jobs:
timeout-minutes: 120
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "24.x"
cache: 'npm'
cache-dependency-path: vcpkg-artifacts/package-lock.json
- name: Enable Problem Matchers
run: echo "::add-matcher::.github/workflows/matchers.json"
- name: '[CI Only] Initialize CodeQL'
if: inputs.codeql && matrix.preset != 'linux-arm64-ci' && matrix.preset != 'macos-ci'
uses: github/codeql-action/init@v4
with:
languages: javascript-typescript, c-cpp
languages: c-cpp
- name: Configure and Build
if: matrix.preset != 'windows-ci'
run: |
Expand All @@ -56,7 +51,7 @@ jobs:
- name: '[CI Only] Perform CodeQL Analysis'
if: inputs.codeql && matrix.preset != 'linux-arm64-ci' && matrix.preset != 'macos-ci'
uses: github/codeql-action/analyze@v4
- name: Run vcpkg and vcpkg-artifacts unit tests
- name: Run vcpkg unit tests
run: ctest --preset ${{ matrix.preset }} --output-on-failure 2>&1
- name: Get microsoft/vcpkg pinned sha into VCPKG_SHA
id: vcpkg_sha
Expand All @@ -83,6 +78,6 @@ jobs:
shell: pwsh
run: |
cd out/build/${{ matrix.preset }}
${{ github.workspace }}/azure-pipelines/end-to-end-tests.ps1 -RunArtifactsTests
${{ github.workspace }}/azure-pipelines/end-to-end-tests.ps1
env:
VCPKG_ROOT: ${{ github.workspace }}/vcpkg-root
6 changes: 0 additions & 6 deletions .github/workflows/pr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,6 @@ jobs:
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "24.x"
cache: 'npm'
cache-dependency-path: vcpkg-artifacts/package-lock.json
- uses: lukka/get-cmake@v3.31.0
with:
cmakeVersion: 3.22.1 # ubuntu 22.04
Expand Down Expand Up @@ -51,7 +46,6 @@ jobs:
shell: pwsh
run: |
git add -u
git restore --staged vcpkg-artifacts/.npmrc
git diff --cached --stat --exit-code
if ($LASTEXITCODE -ne 0) {
git config user.name $(git log -1 --pretty=format:'%an')
Expand Down
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,5 @@ CMakeLists.txt.user
/build*
/cmake-build-*
/out
/vcpkg-artifacts/node_modules/
/vcpkg-root
/work
141 changes: 6 additions & 135 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,13 @@ option(VCPKG_BUILD_FUZZING "Build vcpkg fuzz tests" OFF)
option(VCPKG_FUZZER_INSTRUMENTATION "Build vcpkg with fuzzing instrumentation. Not generally useful without VCPKG_BUILD_FUZZING turned on" OFF)
option(VCPKG_EMBED_GIT_SHA "Option for to fill in the Git SHA version; off by default to avoid privacy concerns out of official builds" OFF)
option(VCPKG_ADD_SOURCELINK "Option for enabling SourceLink in debug information on Windows/MSVC builds" "${VCPKG_EMBED_GIT_SHA}")
option(VCPKG_ARTIFACTS_DEVELOPMENT "Hard code path to artifacts TypeScript. Requires node.js and npm." OFF)
option(VCPKG_OFFICIAL_BUILD "Option to cause immediate failure if variables required for official builds are unset." OFF)
set(VCPKG_PDB_SUFFIX "" CACHE STRING "Append this string to the name of the PDB for shipping vcpkg binaries.")

if(VCPKG_ARTIFACTS_DEVELOPMENT)
message(FATAL_ERROR "vcpkg-artifacts has been removed.")
endif()

CMAKE_DEPENDENT_OPTION(VCPKG_BUILD_BENCHMARKING "Option for enabling benchmarking" OFF
"BUILD_TESTING" OFF)

Expand Down Expand Up @@ -285,118 +288,6 @@ elseif(VCPKG_OFFICIAL_BUILD)
message(FATAL_ERROR "VCPKG_STANDALONE_BUNDLE_SHA is required for official builds.")
endif()

if(VCPKG_ARTIFACTS_SHA)
target_compile_definitions(vcpkglib PUBLIC
"VCPKG_ARTIFACTS_SHA=${VCPKG_ARTIFACTS_SHA}"
)
elseif(VCPKG_OFFICIAL_BUILD)
message(FATAL_ERROR "VCPKG_ARTIFACTS_SHA is required for official builds.")
endif()

file(TO_CMAKE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg-artifacts" VCPKG_ARTIFACTS_SOURCE_DIR)
if (VCPKG_ARTIFACTS_DEVELOPMENT)
# The directory constructed by this portion of the build script needs to be kept in sync with
# that created by azure-pipelines/signing.yml

if (WIN32)
set(NPM_SUFFIX ".cmd")
else()
set(NPM_SUFFIX "")
endif()

find_program(NODEJS "node")
find_program(NPM "npm${NPM_SUFFIX}")
if (NOT NODEJS OR NOT NPM)
message(FATAL_ERROR "node.js and npm must be installed when VCPKG_ARTIFACTS_DEVELOPMENT is set")
endif()

add_custom_command(
OUTPUT
"${VCPKG_ARTIFACTS_SOURCE_DIR}/node_modules"
COMMAND "${NPM}" ARGS "ci" "--include=dev"
WORKING_DIRECTORY
"${VCPKG_ARTIFACTS_SOURCE_DIR}"
COMMENT
"Running npm install..."
MAIN_DEPENDENCY
"${VCPKG_ARTIFACTS_SOURCE_DIR}/package-lock.json"
VERBATIM
)

add_custom_target(npm-restore
ALL
DEPENDS
"${VCPKG_ARTIFACTS_SOURCE_DIR}/node_modules"
)
set_target_properties(npm-restore
PROPERTIES
ADDITIONAL_CLEAN_FILES "${VCPKG_ARTIFACTS_SOURCE_DIR}/node_modules"
)

# === Target: vcpkg-artifacts-target ===
# The suffix "-target" is added to avoid a conflict in CMake with the directory named vcpkg-artifacts and the target named vcpkg-artifacts.
file(GLOB VCPKG_ARTIFACTS_ROOT_SOURCES LIST_DIRECTORIES false RELATIVE "${VCPKG_ARTIFACTS_SOURCE_DIR}" CONFIGURE_DEPENDS "${VCPKG_ARTIFACTS_SOURCE_DIR}/*.ts")
file(GLOB_RECURSE VCPKG_ARTIFACTS_NESTED_SOURCES LIST_DIRECTORIES false RELATIVE "${VCPKG_ARTIFACTS_SOURCE_DIR}" CONFIGURE_DEPENDS
"${VCPKG_ARTIFACTS_SOURCE_DIR}/amf/*.ts"
"${VCPKG_ARTIFACTS_SOURCE_DIR}/archivers/*.ts"
"${VCPKG_ARTIFACTS_SOURCE_DIR}/artifacts/*.ts"
"${VCPKG_ARTIFACTS_SOURCE_DIR}/cli/*.ts"
"${VCPKG_ARTIFACTS_SOURCE_DIR}/fs/*.ts"
"${VCPKG_ARTIFACTS_SOURCE_DIR}/installers/*.ts"
"${VCPKG_ARTIFACTS_SOURCE_DIR}/interfaces/*.ts"
# "${VCPKG_ARTIFACTS_SOURCE_DIR}/locales/*.ts"
"${VCPKG_ARTIFACTS_SOURCE_DIR}/mediaquery/*.ts"
# "${VCPKG_ARTIFACTS_SOURCE_DIR}/node_modules/*.ts"
"${VCPKG_ARTIFACTS_SOURCE_DIR}/registries/*.ts"
"${VCPKG_ARTIFACTS_SOURCE_DIR}/test/*.ts"
"${VCPKG_ARTIFACTS_SOURCE_DIR}/test-resources/*" # Note no *.ts
"${VCPKG_ARTIFACTS_SOURCE_DIR}/util/*.ts"
"${VCPKG_ARTIFACTS_SOURCE_DIR}/yaml/*.ts"
)
set(VCPKG_ARTIFACTS_SOURCES ${VCPKG_ARTIFACTS_ROOT_SOURCES} ${VCPKG_ARTIFACTS_NESTED_SOURCES})
list(TRANSFORM VCPKG_ARTIFACTS_SOURCES PREPEND "${VCPKG_ARTIFACTS_SOURCE_DIR}/")

set(VCPKG_ARTIFACTS_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/vcpkg-artifacts-build")
set(VCPKG_ARTIFACTS_BINARY "${CMAKE_CURRENT_BINARY_DIR}/vcpkg-artifacts.mjs")
add_custom_command(
OUTPUT "${VCPKG_ARTIFACTS_SOURCE_DIR}/locales/messages.json"
COMMAND "${NODEJS}" ARGS "${VCPKG_ARTIFACTS_SOURCE_DIR}/node_modules/translate-strings/dist/main.js" "." "--json"
DEPENDS
${VCPKG_ARTIFACTS_SOURCES}
"${VCPKG_ARTIFACTS_SOURCE_DIR}/node_modules"
WORKING_DIRECTORY "${VCPKG_ARTIFACTS_SOURCE_DIR}"
COMMENT "Running artifacts translate-strings..."
VERBATIM
)

add_custom_command(
OUTPUT
${VCPKG_ARTIFACTS_BINARY}
COMMAND
"${NODEJS}" ARGS "${VCPKG_ARTIFACTS_SOURCE_DIR}/node_modules/@vercel/ncc/dist/ncc/cli.js"
build "main.ts"
--out "${VCPKG_ARTIFACTS_BUILD_DIR}"
COMMAND
"${CMAKE_COMMAND}" ARGS -E copy "${VCPKG_ARTIFACTS_BUILD_DIR}/index.js" "${VCPKG_ARTIFACTS_BINARY}"
WORKING_DIRECTORY
"${VCPKG_ARTIFACTS_SOURCE_DIR}"
DEPENDS
npm-restore
${VCPKG_ARTIFACTS_SOURCES}
"${VCPKG_ARTIFACTS_SOURCE_DIR}/tsconfig.json"
"${VCPKG_ARTIFACTS_SOURCE_DIR}/package.json"
"${VCPKG_ARTIFACTS_SOURCE_DIR}/package-lock.json"
"${VCPKG_ARTIFACTS_SOURCE_DIR}/.npmrc"
"${VCPKG_ARTIFACTS_SOURCE_DIR}/.mocharc.json"
"${VCPKG_ARTIFACTS_SOURCE_DIR}/locales/messages.json"
COMMENT
"Building vcpkg-artifacts..."
VERBATIM
)

add_custom_target(vcpkg-artifacts-target ALL DEPENDS "${VCPKG_ARTIFACTS_BINARY}")
endif()

set(CPP_ATOMIC_LIBRARY "")
include(CheckCXXSourceCompiles)
if(NOT MSVC)
Expand Down Expand Up @@ -464,18 +355,6 @@ if(MINGW)
target_link_libraries(vcpkglib PUBLIC winhttp bcrypt version ole32 uuid)
endif()

# === Target: vcpkg-ps1 ===
add_custom_command(
OUTPUT
"${CMAKE_CURRENT_BINARY_DIR}/vcpkg-shell.ps1"
COMMAND
"${CMAKE_COMMAND}" ARGS -E copy "${CMAKE_CURRENT_SOURCE_DIR}/src/vcpkg-in-development.ps1" "${CMAKE_CURRENT_BINARY_DIR}/vcpkg-shell.ps1"
DEPENDS
"${CMAKE_CURRENT_SOURCE_DIR}/src/vcpkg-in-development.ps1"
VERBATIM
)
add_custom_target(vcpkg-ps1 ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/vcpkg-shell.ps1")

# === Target: vcpkg ===

add_executable(vcpkg ${VCPKG_SOURCES} "${CMAKE_CURRENT_SOURCE_DIR}/src/vcpkg.manifest")
Expand All @@ -494,14 +373,9 @@ endif()
set_property(TARGET vcpkg PROPERTY PDB_NAME "vcpkg${VCPKG_PDB_SUFFIX}")

# === Target: generate-message-map ===
set(GENERATE_MESSAGE_MAP_DEPENDENCIES vcpkg)
if (VCPKG_ARTIFACTS_DEVELOPMENT)
list(APPEND GENERATE_MESSAGE_MAP_DEPENDENCIES "${VCPKG_ARTIFACTS_SOURCE_DIR}/locales/messages.json")
endif()

add_custom_target(generate-message-map
COMMAND "$<TARGET_FILE:vcpkg>" z-generate-default-message-map locales/messages.json "${VCPKG_ARTIFACTS_SOURCE_DIR}/locales/messages.json"
DEPENDS ${GENERATE_MESSAGE_MAP_DEPENDENCIES}
COMMAND "$<TARGET_FILE:vcpkg>" z-generate-default-message-map locales/messages.json
DEPENDS vcpkg
WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}"
COMMENT "Update locales/messages.json"
VERBATIM
Expand Down Expand Up @@ -535,9 +409,6 @@ if (BUILD_TESTING)
if(VCPKG_BUILD_BENCHMARKING)
target_compile_options(vcpkg-test PRIVATE -DCATCH_CONFIG_ENABLE_BENCHMARKING)
endif()
if(VCPKG_ARTIFACTS_DEVELOPMENT)
add_test(NAME artifacts COMMAND "${NODEJS}" "${VCPKG_ARTIFACTS_SOURCE_DIR}/node_modules/mocha/bin/mocha.js" "--import=tsx" WORKING_DIRECTORY "${VCPKG_ARTIFACTS_SOURCE_DIR}")
endif()
endif()

# === Target: vcpkg-fuzz-utf8-decoder ===
Expand Down
Loading
Loading