1 # DEPRECATED BY ports/vcpkg-cmake/vcpkg_cmake_configure
3 # vcpkg_configure_cmake
5 Configure CMake for Debug and Release builds of a project.
10 SOURCE_PATH <${SOURCE_PATH}>
12 [DISABLE_PARALLEL_CONFIGURE]
14 [GENERATOR <"NMake Makefiles">]
15 [OPTIONS <-DUSE_THIS_IN_ALL_BUILDS=1>...]
16 [OPTIONS_RELEASE <-DOPTIMIZE=1>...]
17 [OPTIONS_DEBUG <-DDEBUGGABLE=1>...]
23 Specifies the directory containing the `CMakeLists.txt`.
24 By convention, this is usually set in the portfile as the variable `SOURCE_PATH`.
27 Indicates that, when available, Vcpkg should use Ninja to perform the build.
28 This should be specified unless the port is known to not work under Ninja.
30 ### DISABLE_PARALLEL_CONFIGURE
31 Disables running the CMake configure step in parallel.
32 This is needed for libraries which write back into their source directory during configure.
34 This also disables CMAKE_DISABLE_SOURCE_CHANGES.
37 Disables passing `utf-8` as the default character set to `CMAKE_C_FLAGS` and `CMAKE_CXX_FLAGS`.
39 This is needed for libraries that set their own source code's character set.
42 Specifies the precise generator to use.
44 This is useful if some project-specific buildsystem has been wrapped in a cmake script that won't perform an actual build.
45 If used for this purpose, it should be set to `"NMake Makefiles"`.
48 Additional options passed to CMake during the configuration.
51 Additional options passed to CMake during the Release configuration. These are in addition to `OPTIONS`.
54 Additional options passed to CMake during the Debug configuration. These are in addition to `OPTIONS`.
57 Name of the log to write the output of the configure call to.
60 This command supplies many common arguments to CMake. To see the full list, examine the source.
64 * [zlib](https://github.com/Microsoft/vcpkg/blob/master/ports/zlib/portfile.cmake)
65 * [cpprestsdk](https://github.com/Microsoft/vcpkg/blob/master/ports/cpprestsdk/portfile.cmake)
66 * [poco](https://github.com/Microsoft/vcpkg/blob/master/ports/poco/portfile.cmake)
67 * [opencv](https://github.com/Microsoft/vcpkg/blob/master/ports/opencv/portfile.cmake)
70 function(vcpkg_configure_cmake)
71 if(Z_VCPKG_CMAKE_CONFIGURE_GUARD)
72 message(FATAL_ERROR "The ${PORT} port already depends on vcpkg-cmake; using both vcpkg-cmake and vcpkg_configure_cmake in the same port is unsupported.")
75 cmake_parse_arguments(PARSE_ARGV 0 arg
76 "PREFER_NINJA;DISABLE_PARALLEL_CONFIGURE;NO_CHARSET_FLAG"
77 "SOURCE_PATH;GENERATOR;LOGNAME"
78 "OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE"
81 if(NOT VCPKG_PLATFORM_TOOLSET)
82 message(FATAL_ERROR "Vcpkg has been updated with VS2017 support; "
83 "however, vcpkg.exe must be rebuilt by re-running bootstrap-vcpkg.bat\n")
87 set(arg_LOGNAME config-${TARGET_TRIPLET})
91 if(DEFINED ENV{PROCESSOR_ARCHITEW6432})
92 set(arg_HOST_ARCHITECTURE $ENV{PROCESSOR_ARCHITEW6432})
94 set(arg_HOST_ARCHITECTURE $ENV{PROCESSOR_ARCHITECTURE})
98 set(NINJA_CAN_BE_USED ON) # Ninja as generator
99 set(NINJA_HOST ON) # Ninja as parallel configurator
101 if(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore")
102 set(_TARGETTING_UWP 1)
105 if(arg_HOST_ARCHITECTURE STREQUAL "x86")
106 # Prebuilt ninja binaries are only provided for x64 hosts
107 set(NINJA_CAN_BE_USED OFF)
109 elseif(_TARGETTING_UWP)
110 # Ninja and MSBuild have many differences when targetting UWP, so use MSBuild to maximize existing compatibility
111 set(NINJA_CAN_BE_USED OFF)
115 set(GENERATOR ${arg_GENERATOR})
116 elseif(arg_PREFER_NINJA AND NINJA_CAN_BE_USED)
117 set(GENERATOR "Ninja")
118 elseif(VCPKG_CHAINLOAD_TOOLCHAIN_FILE OR (VCPKG_CMAKE_SYSTEM_NAME AND NOT _TARGETTING_UWP))
119 set(GENERATOR "Ninja")
121 elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86" AND VCPKG_PLATFORM_TOOLSET STREQUAL "v120")
122 set(GENERATOR "Visual Studio 12 2013")
123 elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64" AND VCPKG_PLATFORM_TOOLSET STREQUAL "v120")
124 set(GENERATOR "Visual Studio 12 2013 Win64")
125 elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm" AND VCPKG_PLATFORM_TOOLSET STREQUAL "v120")
126 set(GENERATOR "Visual Studio 12 2013 ARM")
128 elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86" AND VCPKG_PLATFORM_TOOLSET STREQUAL "v140")
129 set(GENERATOR "Visual Studio 14 2015")
130 elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64" AND VCPKG_PLATFORM_TOOLSET STREQUAL "v140")
131 set(GENERATOR "Visual Studio 14 2015 Win64")
132 elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm" AND VCPKG_PLATFORM_TOOLSET STREQUAL "v140")
133 set(GENERATOR "Visual Studio 14 2015 ARM")
135 elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86" AND VCPKG_PLATFORM_TOOLSET STREQUAL "v141")
136 set(GENERATOR "Visual Studio 15 2017")
137 elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64" AND VCPKG_PLATFORM_TOOLSET STREQUAL "v141")
138 set(GENERATOR "Visual Studio 15 2017 Win64")
139 elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm" AND VCPKG_PLATFORM_TOOLSET STREQUAL "v141")
140 set(GENERATOR "Visual Studio 15 2017 ARM")
141 elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64" AND VCPKG_PLATFORM_TOOLSET STREQUAL "v141")
142 set(GENERATOR "Visual Studio 15 2017")
145 elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86" AND VCPKG_PLATFORM_TOOLSET STREQUAL "v142")
146 set(GENERATOR "Visual Studio 16 2019")
148 elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64" AND VCPKG_PLATFORM_TOOLSET STREQUAL "v142")
149 set(GENERATOR "Visual Studio 16 2019")
151 elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm" AND VCPKG_PLATFORM_TOOLSET STREQUAL "v142")
152 set(GENERATOR "Visual Studio 16 2019")
154 elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64" AND VCPKG_PLATFORM_TOOLSET STREQUAL "v142")
155 set(GENERATOR "Visual Studio 16 2019")
159 if(NOT VCPKG_CMAKE_SYSTEM_NAME)
160 set(VCPKG_CMAKE_SYSTEM_NAME Windows)
162 message(FATAL_ERROR "Unable to determine appropriate generator for: "
163 "${VCPKG_CMAKE_SYSTEM_NAME}-${VCPKG_TARGET_ARCHITECTURE}-${VCPKG_PLATFORM_TOOLSET}")
166 # If we use Ninja, make sure it's on PATH
167 if(GENERATOR STREQUAL "Ninja" AND NOT DEFINED ENV{VCPKG_FORCE_SYSTEM_BINARIES})
168 vcpkg_find_acquire_program(NINJA)
169 get_filename_component(NINJA_PATH ${NINJA} DIRECTORY)
170 vcpkg_add_to_path("${NINJA_PATH}")
171 list(APPEND arg_OPTIONS "-DCMAKE_MAKE_PROGRAM=${NINJA}")
174 file(REMOVE_RECURSE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg)
176 if(DEFINED VCPKG_CMAKE_SYSTEM_NAME)
177 list(APPEND arg_OPTIONS "-DCMAKE_SYSTEM_NAME=${VCPKG_CMAKE_SYSTEM_NAME}")
178 if(_TARGETTING_UWP AND NOT DEFINED VCPKG_CMAKE_SYSTEM_VERSION)
179 set(VCPKG_CMAKE_SYSTEM_VERSION 10.0)
180 elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "Android" AND NOT DEFINED VCPKG_CMAKE_SYSTEM_VERSION)
181 set(VCPKG_CMAKE_SYSTEM_VERSION 21)
185 if(DEFINED VCPKG_CMAKE_SYSTEM_VERSION)
186 list(APPEND arg_OPTIONS "-DCMAKE_SYSTEM_VERSION=${VCPKG_CMAKE_SYSTEM_VERSION}")
189 if(VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic")
190 list(APPEND arg_OPTIONS -DBUILD_SHARED_LIBS=ON)
191 elseif(VCPKG_LIBRARY_LINKAGE STREQUAL "static")
192 list(APPEND arg_OPTIONS -DBUILD_SHARED_LIBS=OFF)
195 "Invalid setting for VCPKG_LIBRARY_LINKAGE: \"${VCPKG_LIBRARY_LINKAGE}\". "
196 "It must be \"static\" or \"dynamic\"")
199 macro(check_both_vars_are_set var1 var2)
200 if((NOT DEFINED ${var1} OR NOT DEFINED ${var2}) AND (DEFINED ${var1} OR DEFINED ${var2}))
201 message(FATAL_ERROR "Both ${var1} and ${var2} must be set.")
205 check_both_vars_are_set(VCPKG_CXX_FLAGS_DEBUG VCPKG_C_FLAGS_DEBUG)
206 check_both_vars_are_set(VCPKG_CXX_FLAGS_RELEASE VCPKG_C_FLAGS_RELEASE)
207 check_both_vars_are_set(VCPKG_CXX_FLAGS VCPKG_C_FLAGS)
209 set(VCPKG_SET_CHARSET_FLAG ON)
210 if(arg_NO_CHARSET_FLAG)
211 set(VCPKG_SET_CHARSET_FLAG OFF)
214 if(NOT VCPKG_CHAINLOAD_TOOLCHAIN_FILE)
215 if(NOT DEFINED VCPKG_CMAKE_SYSTEM_NAME OR _TARGETTING_UWP)
216 set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/windows.cmake")
217 elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "Linux")
218 set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/linux.cmake")
219 elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "Android")
220 set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/android.cmake")
221 elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "Darwin")
222 set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/osx.cmake")
223 elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "iOS")
224 set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/ios.cmake")
225 elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
226 set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/freebsd.cmake")
227 elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "OpenBSD")
228 set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/openbsd.cmake")
229 elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "MinGW")
230 set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/mingw.cmake")
235 list(APPEND arg_OPTIONS
236 "-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}"
237 "-DVCPKG_TARGET_TRIPLET=${TARGET_TRIPLET}"
238 "-DVCPKG_SET_CHARSET_FLAG=${VCPKG_SET_CHARSET_FLAG}"
239 "-DVCPKG_PLATFORM_TOOLSET=${VCPKG_PLATFORM_TOOLSET}"
240 "-DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON"
241 "-DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=ON"
242 "-DCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY=ON"
243 "-DCMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP=TRUE"
244 "-DCMAKE_VERBOSE_MAKEFILE=ON"
245 "-DVCPKG_APPLOCAL_DEPS=OFF"
246 "-DCMAKE_TOOLCHAIN_FILE=${SCRIPTS}/buildsystems/vcpkg.cmake"
247 "-DCMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION=ON"
248 "-DVCPKG_CXX_FLAGS=${VCPKG_CXX_FLAGS}"
249 "-DVCPKG_CXX_FLAGS_RELEASE=${VCPKG_CXX_FLAGS_RELEASE}"
250 "-DVCPKG_CXX_FLAGS_DEBUG=${VCPKG_CXX_FLAGS_DEBUG}"
251 "-DVCPKG_C_FLAGS=${VCPKG_C_FLAGS}"
252 "-DVCPKG_C_FLAGS_RELEASE=${VCPKG_C_FLAGS_RELEASE}"
253 "-DVCPKG_C_FLAGS_DEBUG=${VCPKG_C_FLAGS_DEBUG}"
254 "-DVCPKG_CRT_LINKAGE=${VCPKG_CRT_LINKAGE}"
255 "-DVCPKG_LINKER_FLAGS=${VCPKG_LINKER_FLAGS}"
256 "-DVCPKG_LINKER_FLAGS_RELEASE=${VCPKG_LINKER_FLAGS_RELEASE}"
257 "-DVCPKG_LINKER_FLAGS_DEBUG=${VCPKG_LINKER_FLAGS_DEBUG}"
258 "-DVCPKG_TARGET_ARCHITECTURE=${VCPKG_TARGET_ARCHITECTURE}"
259 "-DCMAKE_INSTALL_LIBDIR:STRING=lib"
260 "-DCMAKE_INSTALL_BINDIR:STRING=bin"
261 "-D_VCPKG_ROOT_DIR=${VCPKG_ROOT_DIR}"
262 "-D_VCPKG_INSTALLED_DIR=${_VCPKG_INSTALLED_DIR}"
263 "-DVCPKG_MANIFEST_INSTALL=OFF"
267 list(APPEND arg_OPTIONS
272 # Sets configuration variables for macOS builds
273 foreach(config_var INSTALL_NAME_DIR OSX_DEPLOYMENT_TARGET OSX_SYSROOT OSX_ARCHITECTURES)
274 if(DEFINED VCPKG_${config_var})
275 list(APPEND arg_OPTIONS "-DCMAKE_${config_var}=${VCPKG_${config_var}}")
280 ${CMAKE_COMMAND} ${arg_SOURCE_PATH} "${arg_OPTIONS}" "${arg_OPTIONS_RELEASE}"
282 -DCMAKE_BUILD_TYPE=Release
283 -DCMAKE_INSTALL_PREFIX=${CURRENT_PACKAGES_DIR})
285 ${CMAKE_COMMAND} ${arg_SOURCE_PATH} "${arg_OPTIONS}" "${arg_OPTIONS_DEBUG}"
287 -DCMAKE_BUILD_TYPE=Debug
288 -DCMAKE_INSTALL_PREFIX=${CURRENT_PACKAGES_DIR}/debug)
290 if(NINJA_HOST AND CMAKE_HOST_WIN32 AND NOT arg_DISABLE_PARALLEL_CONFIGURE)
291 list(APPEND arg_OPTIONS "-DCMAKE_DISABLE_SOURCE_CHANGES=ON")
293 vcpkg_find_acquire_program(NINJA)
294 get_filename_component(NINJA_PATH ${NINJA} DIRECTORY)
295 vcpkg_add_to_path("${NINJA_PATH}")
297 #parallelize the configure step
299 "rule CreateProcess\n command = $process\n\n"
302 macro(_build_cmakecache whereat build_type)
303 set(${build_type}_line "build ${whereat}/CMakeCache.txt: CreateProcess\n process = cmd /c \"cd ${whereat} &&")
304 foreach(arg ${${build_type}_command})
305 set(${build_type}_line "${${build_type}_line} \"${arg}\"")
307 set(_contents "${_contents}${${build_type}_line}\"\n\n")
310 if(NOT DEFINED VCPKG_BUILD_TYPE)
311 _build_cmakecache(".." "rel")
312 _build_cmakecache("../../${TARGET_TRIPLET}-dbg" "dbg")
313 elseif(VCPKG_BUILD_TYPE STREQUAL "release")
314 _build_cmakecache(".." "rel")
315 elseif(VCPKG_BUILD_TYPE STREQUAL "debug")
316 _build_cmakecache("../../${TARGET_TRIPLET}-dbg" "dbg")
319 file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/vcpkg-parallel-configure)
320 file(WRITE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/vcpkg-parallel-configure/build.ninja "${_contents}")
322 message(STATUS "Configuring ${TARGET_TRIPLET}")
323 vcpkg_execute_required_process(
325 WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/vcpkg-parallel-configure
326 LOGNAME ${arg_LOGNAME}
329 if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
330 message(STATUS "Configuring ${TARGET_TRIPLET}-dbg")
331 file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg)
332 vcpkg_execute_required_process(
333 COMMAND ${dbg_command}
334 WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg
335 LOGNAME ${arg_LOGNAME}-dbg
339 if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
340 message(STATUS "Configuring ${TARGET_TRIPLET}-rel")
341 file(MAKE_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel)
342 vcpkg_execute_required_process(
343 COMMAND ${rel_command}
344 WORKING_DIRECTORY ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel
345 LOGNAME ${arg_LOGNAME}-rel
350 set(Z_VCPKG_CMAKE_GENERATOR "${GENERATOR}" PARENT_SCOPE)