Skip to content

Commit 3fd94c2

Browse files
committed
feat(Vcvars): Add support for selecting vcvarsall.bat via Vcvars_FIND_VCVARSALL
When Vcvars_FIND_VCVARSALL is enabled, the module uses vcvarsall.bat instead of architecture-specific scripts. The appropriate arch argument (x86 or x64), derived from Vcvars_MSVC_ARCH, is automatically appended when invoking the generated wrapper script.
1 parent a5df860 commit 3fd94c2

File tree

2 files changed

+80
-7
lines changed

2 files changed

+80
-7
lines changed

FindVcvars.cmake

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,18 @@ These variables can be used to choose which "vcvars" batch script is looked up.
2929
the variable :variable:`Vcvars_MSVC_VERSION` is initialized based on the most
3030
recent version of Visual Studio installed on the system.
3131
32+
.. variable:: Vcvars_FIND_VCVARSALL
33+
34+
If set to TRUE, forces the module to look up ``vcvarsall.bat`` instead of
35+
an architecture-specific script such as ``vcvars64.bat``.
36+
37+
When enabled, the appropriate architecture argument (e.g., ``x64`` or ``x86``),
38+
determined from the value of :variable:`Vcvars_MSVC_ARCH`, is automatically passed
39+
to ``vcvarsall.bat`` via the generated wrapper script.
40+
41+
Default is FALSE.
42+
43+
3244
This will define the following variables:
3345
3446
.. variable:: Vcvars_BATCH_FILE
@@ -341,10 +353,14 @@ endfunction()
341353
function(Vcvars_FindFirstValidMsvcVersion msvc_arch candidate_msvc_versions msvc_version_output_varname batch_file_output_varname)
342354
_vcvars_message(STATUS "Setting ${msvc_version_output_varname}")
343355
# which vcvars script ?
344-
if(msvc_arch STREQUAL "64")
345-
set(_candidate_scripts vcvarsamd64.bat vcvars64.bat)
356+
if(Vcvars_FIND_VCVARSALL)
357+
set(_candidate_scripts vcvarsall.bat)
346358
else()
347-
set(_candidate_scripts vcvars32.bat)
359+
if(msvc_arch STREQUAL "64")
360+
set(_candidate_scripts vcvarsamd64.bat vcvars64.bat)
361+
else()
362+
set(_candidate_scripts vcvars32.bat)
363+
endif()
348364
endif()
349365
foreach(_candidate_msvc_version IN LISTS candidate_msvc_versions)
350366
Vcvars_GetVisualStudioPaths(${_candidate_msvc_version} "${msvc_arch}" _paths)
@@ -403,9 +419,15 @@ if(NOT DEFINED Vcvars_MSVC_VERSION)
403419
endif()
404420
endif()
405421
endif()
422+
423+
if(NOT DEFINED Vcvars_FIND_VCVARSALL)
424+
set(Vcvars_FIND_VCVARSALL FALSE)
425+
endif()
426+
406427
if(NOT DEFINED Vcvars_BATCH_FILE)
407428
set(Vcvars_BATCH_FILE "Vcvars_BATCH_FILE-NOTFOUND")
408429
endif()
430+
409431
if(NOT DEFINED Vcvars_LAUNCHER)
410432
set(Vcvars_LAUNCHER "Vcvars_LAUNCHER-NOTFOUND")
411433
endif()
@@ -416,10 +438,14 @@ if(NOT Vcvars_MSVC_ARCH MATCHES ${_Vcvars_MSVC_ARCH_REGEX})
416438
endif()
417439

418440
# which vcvars script ?
419-
if(Vcvars_MSVC_ARCH STREQUAL "64")
420-
set(_Vcvars_SCRIPTS vcvarsamd64.bat vcvars64.bat)
441+
if(Vcvars_FIND_VCVARSALL)
442+
set(_Vcvars_SCRIPTS vcvarsall.bat)
421443
else()
422-
set(_Vcvars_SCRIPTS vcvars32.bat)
444+
if(Vcvars_MSVC_ARCH STREQUAL "64")
445+
set(_Vcvars_SCRIPTS vcvarsamd64.bat vcvars64.bat)
446+
else()
447+
set(_Vcvars_SCRIPTS vcvars32.bat)
448+
endif()
423449
endif()
424450

425451
# set Vcvars_BATCH_FILE
@@ -457,17 +483,26 @@ endif()
457483
set(Vcvars_LAUNCHER)
458484
if(Vcvars_BATCH_FILE)
459485

486+
set(_vcvarsall_arch )
487+
if(Vcvars_FIND_VCVARSALL)
488+
if(Vcvars_MSVC_ARCH STREQUAL "64")
489+
set(_vcvarsall_arch "x64")
490+
elseif(Vcvars_MSVC_ARCH STREQUAL "32")
491+
set(_vcvarsall_arch "x86")
492+
endif()
493+
endif()
460494
set(_in "${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/Vcvars_wrapper.bat.in")
461495
get_filename_component(_basename ${Vcvars_BATCH_FILE} NAME_WE)
462496
set(_out "${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/${_basename}_wrapper.bat")
463-
file(WRITE ${_in} "call \"@Vcvars_BATCH_FILE@\"
497+
file(WRITE ${_in} "call \"@Vcvars_BATCH_FILE@\" @_vcvarsall_arch@
464498
%*
465499
")
466500
configure_file(${_in} ${_out} @ONLY)
467501

468502
set(Vcvars_LAUNCHER ${_out})
469503
unset(_in)
470504
unset(_out)
505+
unset(_vcvarsall_arch)
471506
endif()
472507

473508
# cleanup

tests/CMakeLists.txt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,13 @@ if(DEFINED REQUESTED_MSVC_VERSION AND NOT FUNCTIONS_ONLY_COMPONENT_REQUESTED)
6666
list(APPEND requested_vars REQUESTED_MSVC_VERSION)
6767
endif()
6868

69+
if(DEFINED REQUESTED_FIND_VCVARSALL AND NOT FUNCTIONS_ONLY_COMPONENT_REQUESTED)
70+
set(Vcvars_FIND_VCVARSALL ${REQUESTED_FIND_VCVARSALL})
71+
list(APPEND requested_vars REQUESTED_FIND_VCVARSALL)
72+
endif()
73+
6974
foreach(var_suffix IN LISTS
75+
FIND_VCVARSALL
7076
MSVC_ARCH
7177
MSVC_VERSION
7278
)
@@ -214,11 +220,13 @@ check_msvc_version_to_vs_version_convert(Vcvars_VS7_MSVC_VERSIONS "7.0")
214220
check_msvc_version_to_vs_version_convert(Vcvars_VS6_MSVC_VERSIONS "6.0")
215221

216222
if(FUNCTIONS_ONLY_COMPONENT_REQUESTED)
223+
check_var_not_defined("Vcvars_FIND_VCVARSALL")
217224
check_var_not_defined("Vcvars_MSVC_ARCH")
218225
check_var_not_defined("Vcvars_MSVC_VERSION")
219226
check_var_not_defined("Vcvars_LAUNCHER")
220227
check_var_not_defined("Vcvars_LAUNCHER")
221228
else()
229+
check_var_equals("Vcvars_FIND_VCVARSALL" "${EXPECTED_FIND_VCVARSALL}")
222230
check_var_equals("Vcvars_MSVC_ARCH" "${EXPECTED_MSVC_ARCH}")
223231
check_var_equals("Vcvars_MSVC_VERSION" "${EXPECTED_MSVC_VERSION}")
224232

@@ -304,6 +312,7 @@ add_find_vcvars_test(
304312
-DEXPECTED_MSVC_VERSION:STRING=${EXPECTED_MSVC_VERSION}
305313
-DEXPECTED_BATCH_FILENAME:STRING=${EXPECTED_BATCH_FILENAME}
306314
-DEXPECTED_WRAPPER_FILENAME:STRING=${EXPECTED_WRAPPER_FILENAME}
315+
-DEXPECTED_FIND_VCVARSALL:BOOL=FALSE
307316
)
308317

309318
add_find_vcvars_test(
@@ -316,6 +325,7 @@ add_find_vcvars_test(
316325
-DEXPECTED_MSVC_VERSION:STRING=${EXPECTED_MSVC_VERSION}
317326
-DEXPECTED_BATCH_FILENAME:STRING=vcvars64.bat
318327
-DEXPECTED_WRAPPER_FILENAME:STRING=vcvars64_wrapper.bat
328+
-DEXPECTED_FIND_VCVARSALL:BOOL=FALSE
319329
)
320330

321331
add_find_vcvars_test(
@@ -328,6 +338,7 @@ add_find_vcvars_test(
328338
-DEXPECTED_MSVC_VERSION:STRING=${EXPECTED_MSVC_VERSION}
329339
-DEXPECTED_BATCH_FILENAME:STRING=vcvars32.bat
330340
-DEXPECTED_WRAPPER_FILENAME:STRING=vcvars32_wrapper.bat
341+
-DEXPECTED_FIND_VCVARSALL:BOOL=FALSE
331342
)
332343

333344
add_find_vcvars_test(
@@ -340,5 +351,32 @@ add_find_vcvars_test(
340351
-DEXPECTED_MSVC_VERSION:STRING=${EXPECTED_MSVC_VERSION}
341352
-DEXPECTED_BATCH_FILENAME:STRING=${EXPECTED_BATCH_FILENAME}
342353
-DEXPECTED_WRAPPER_FILENAME:STRING=${EXPECTED_WRAPPER_FILENAME}
354+
-DEXPECTED_FIND_VCVARSALL:BOOL=FALSE
355+
)
356+
357+
add_find_vcvars_test(
358+
NAME "find-vcvarsall-ON"
359+
OPTIONS
360+
# Requested
361+
-DREQUESTED_FIND_VCVARSALL:BOOL=ON
362+
# Expected
363+
-DEXPECTED_MSVC_ARCH:STRING=${EXPECTED_MSVC_ARCH}
364+
-DEXPECTED_MSVC_VERSION:STRING=${EXPECTED_MSVC_VERSION}
365+
-DEXPECTED_BATCH_FILENAME:STRING=vcvarsall.bat
366+
-DEXPECTED_WRAPPER_FILENAME:STRING=vcvarsall_wrapper.bat
367+
-DEXPECTED_FIND_VCVARSALL:BOOL=ON
368+
)
369+
370+
add_find_vcvars_test(
371+
NAME "find-vcvarsall-OFF"
372+
OPTIONS
373+
# Requested
374+
-DREQUESTED_FIND_VCVARSALL:BOOL=OFF
375+
# Expected
376+
-DEXPECTED_MSVC_ARCH:STRING=${EXPECTED_MSVC_ARCH}
377+
-DEXPECTED_MSVC_VERSION:STRING=${EXPECTED_MSVC_VERSION}
378+
-DEXPECTED_BATCH_FILENAME:STRING=${EXPECTED_BATCH_FILENAME}
379+
-DEXPECTED_WRAPPER_FILENAME:STRING=${EXPECTED_WRAPPER_FILENAME}
380+
-DEXPECTED_FIND_VCVARSALL:BOOL=OFF
343381
)
344382

0 commit comments

Comments
 (0)