2018-08-08 19:15:13 +08:00
## # vcpkg_install_msbuild
##
2019-03-15 04:43:49 +08:00
## Build and install a msbuild-based project. This replaces `vcpkg_build_msbuild()`.
2018-08-08 19:15:13 +08:00
##
## ## Usage
## ```cmake
## vcpkg_install_msbuild(
## SOURCE_PATH <${SOURCE_PATH}>
## PROJECT_SUBPATH <port.sln>
## [INCLUDES_SUBPATH <include>]
## [LICENSE_SUBPATH <LICENSE>]
## [RELEASE_CONFIGURATION <Release>]
## [DEBUG_CONFIGURATION <Debug>]
## [TARGET <Build>]
## [TARGET_PLATFORM_VERSION <10.0.15063.0>]
## [PLATFORM <${TRIPLET_SYSTEM_ARCH}>]
## [PLATFORM_TOOLSET <${VCPKG_PLATFORM_TOOLSET}>]
## [OPTIONS </p:ZLIB_INCLUDE_PATH=X>...]
## [OPTIONS_RELEASE </p:ZLIB_LIB=X>...]
## [OPTIONS_DEBUG </p:ZLIB_LIB=X>...]
## [USE_VCPKG_INTEGRATION]
## [ALLOW_ROOT_INCLUDES | REMOVE_ROOT_INCLUDES]
## )
## ```
##
## ## Parameters
## ### SOURCE_PATH
## The path to the root of the source tree.
##
## Because MSBuild uses in-source builds, the source tree will be copied into a temporary location for the build. This
## parameter is the base for that copy and forms the base for all XYZ_SUBPATH options.
##
## ### USE_VCPKG_INTEGRATION
## Apply the normal `integrate install` integration for building the project.
##
## By default, projects built with this command will not automatically link libraries or have header paths set.
##
## ### PROJECT_SUBPATH
## The subpath to the solution (`.sln`) or project (`.vcxproj`) file relative to `SOURCE_PATH`.
##
## ### LICENSE_SUBPATH
## The subpath to the license file relative to `SOURCE_PATH`.
##
## ### INCLUDES_SUBPATH
## The subpath to the includes directory relative to `SOURCE_PATH`.
##
## This parameter should be a directory and should not end in a trailing slash.
##
## ### ALLOW_ROOT_INCLUDES
## Indicates that top-level include files (e.g. `include/zlib.h`) should be allowed.
##
## ### REMOVE_ROOT_INCLUDES
## Indicates that top-level include files (e.g. `include/Makefile.am`) should be removed.
##
2018-10-26 03:34:45 +08:00
## ### SKIP_CLEAN
## Indicates that the intermediate files should not be removed.
##
## Ports using this option should later call [`vcpkg_clean_msbuild()`](vcpkg_clean_msbuild.md) to manually clean up.
##
2018-08-08 19:15:13 +08:00
## ### RELEASE_CONFIGURATION
## The configuration (``/p:Configuration`` msbuild parameter) used for Release builds.
##
## ### DEBUG_CONFIGURATION
2018-10-26 03:34:45 +08:00
## The configuration (``/p:Configuration`` msbuild parameter) used for Debug builds.
2018-08-08 19:15:13 +08:00
##
## ### TARGET_PLATFORM_VERSION
## The WindowsTargetPlatformVersion (``/p:WindowsTargetPlatformVersion`` msbuild parameter)
##
## ### TARGET
## The MSBuild target to build. (``/t:<TARGET>``)
##
## ### PLATFORM
## The platform (``/p:Platform`` msbuild parameter) used for the build.
##
## ### PLATFORM_TOOLSET
## The platform toolset (``/p:PlatformToolset`` msbuild parameter) used for the build.
##
## ### OPTIONS
## Additional options passed to msbuild for all builds.
##
## ### OPTIONS_RELEASE
## Additional options passed to msbuild for Release builds. These are in addition to `OPTIONS`.
##
## ### OPTIONS_DEBUG
## Additional options passed to msbuild for Debug builds. These are in addition to `OPTIONS`.
##
## ## Examples
##
2018-10-26 03:34:45 +08:00
## * [xalan-c](https://github.com/Microsoft/vcpkg/blob/master/ports/xalan-c/portfile.cmake)
2018-08-08 19:15:13 +08:00
## * [libimobiledevice](https://github.com/Microsoft/vcpkg/blob/master/ports/libimobiledevice/portfile.cmake)
2018-10-26 03:34:45 +08:00
include ( vcpkg_clean_msbuild )
2018-08-08 19:15:13 +08:00
function ( vcpkg_install_msbuild )
2020-10-27 10:30:27 +08:00
# parse parameters such that semicolons in options arguments to COMMAND don't get erased
2018-08-08 19:15:13 +08:00
cmake_parse_arguments (
2020-10-27 10:30:27 +08:00
P A R S E _ A R G V 0
2018-08-08 19:15:13 +08:00
_ c s c
2018-10-26 03:34:45 +08:00
" U S E _ V C P K G _ I N T E G R A T I O N ; A L L O W _ R O O T _ I N C L U D E S ; R E M O V E _ R O O T _ I N C L U D E S ; S K I P _ C L E A N "
2018-08-08 19:15:13 +08:00
" S O U R C E _ P A T H ; P R O J E C T _ S U B P A T H ; I N C L U D E S _ S U B P A T H ; L I C E N S E _ S U B P A T H ; R E L E A S E _ C O N F I G U R A T I O N ; D E B U G _ C O N F I G U R A T I O N ; P L A T F O R M ; P L A T F O R M _ T O O L S E T ; T A R G E T _ P L A T F O R M _ V E R S I O N ; T A R G E T "
" O P T I O N S ; O P T I O N S _ R E L E A S E ; O P T I O N S _ D E B U G "
)
if ( NOT DEFINED _csc_RELEASE_CONFIGURATION )
set ( _csc_RELEASE_CONFIGURATION Release )
endif ( )
if ( NOT DEFINED _csc_DEBUG_CONFIGURATION )
set ( _csc_DEBUG_CONFIGURATION Debug )
endif ( )
if ( NOT DEFINED _csc_PLATFORM )
if ( VCPKG_TARGET_ARCHITECTURE STREQUAL x64 )
set ( _csc_PLATFORM x64 )
elseif ( VCPKG_TARGET_ARCHITECTURE STREQUAL x86 )
set ( _csc_PLATFORM Win32 )
elseif ( VCPKG_TARGET_ARCHITECTURE STREQUAL ARM )
set ( _csc_PLATFORM ARM )
2019-11-20 03:02:13 +08:00
elseif ( VCPKG_TARGET_ARCHITECTURE STREQUAL arm64 )
set ( _csc_PLATFORM arm64 )
2018-08-08 19:15:13 +08:00
else ( )
message ( FATAL_ERROR "Unsupported target architecture" )
endif ( )
endif ( )
if ( NOT DEFINED _csc_PLATFORM_TOOLSET )
set ( _csc_PLATFORM_TOOLSET ${ VCPKG_PLATFORM_TOOLSET } )
endif ( )
if ( NOT DEFINED _csc_TARGET_PLATFORM_VERSION )
vcpkg_get_windows_sdk ( _csc_TARGET_PLATFORM_VERSION )
endif ( )
if ( NOT DEFINED _csc_TARGET )
set ( _csc_TARGET Rebuild )
endif ( )
list ( APPEND _csc_OPTIONS
/ t : $ { _ c s c _ T A R G E T }
/ p : P l a t f o r m = $ { _ c s c _ P L A T F O R M }
/ p : P l a t f o r m T o o l s e t = $ { _ c s c _ P L A T F O R M _ T O O L S E T }
/ p : V C P k g L o c a l A p p D a t a D i s a b l e d = t r u e
/ p : U s e I n t e l M K L = N o
/ p : W i n d o w s T a r g e t P l a t f o r m V e r s i o n = $ { _ c s c _ T A R G E T _ P L A T F O R M _ V E R S I O N }
2020-05-09 04:55:11 +08:00
/ p : V c p k g T r i p l e t = $ { T A R G E T _ T R I P L E T }
2020-06-04 10:31:28 +08:00
" / p : V c p k g C u r r e n t I n s t a l l e d D i r = $ { C U R R E N T _ I N S T A L L E D _ D I R } "
[vcpkg manifest] Manifest Implementation (#11757)
==== Changes Related to manifests ====
* Add the `manifests` feature flag
* This only says whether we look for a `vcpkg.json` in the cwd, not
whether we support parsing manifests (for ports, for example)
* Changes to the manifests RFC
* `"authors"` -> `"maintainers"`
* `--x-classic-mode` -> `-manifests` \in `vcpkg_feature_flags`
* reserve `"core"` in addition to `"default"`, since that's already
reserved for features
* Add a small helper note about what identifiers must look like
* `<license-string>`: SPDX v3.8 -> v3.9
* `"feature"."description"` is allowed to be an array of strings as well
* `"version"` -> `"version-string"` for forward-compat with versions
RFC
* Add the `--feature-flags` option
* Add the ability to turn off feature flags via passing
`-<feature-flag>` to `VCPKG_FEATURE_FLAGS` or `--feature-flags`
* Add CMake toolchain support for manifests
* Requires either:
* a feature flag of `manifests` in either `Env{VCPKG_FEATURE_FLAGS}`
or `VCPKG_FEATURE_FLAGS`
* Passing the `VCPKG_ENABLE_MANIFESTS` option
* The toolchain will install your packages to
`${VCPKG_MANIFEST_DIR}/vcpkg_installed`.
* Add MSBuild `vcpkg integrate install` support for manifests
* Requires `VcpkgEnableManifest` to be true
* `vcpkg create` creates a port that has a `vcpkg.json` instead of a
`CONTROL`
* argparse, abseil, 3fd, and avisynthplus ports switched to manifest
from CONTROL
* Add support for `--x-manifest-root`, as well as code for finding it if
not passed
* Add support for parsing manifests!
* Add a filesystem lock!
==== Important Changes which are somewhat unrelated to manifests ====
* Rename `logicexpression.{h,cpp}` to `platform-expression.{h,cpp}`
* Add `PlatformExpression` type which takes the place of the old logic
expression
* Split the parsing of platform expressions from checking whether
they're true or not
* Eagerly parse PlatformExpressions as opposed to leaving them as
strings
* Add checking for feature flag consistency
* i.e., if `-binarycaching` is passed, you shouldn't be passing
`--binarysource`
* Add the `Json::Reader` type which, with the help of user-defined
visitors, converts JSON to your internal type
* VcpkgArgParser: place the switch names into a constant as opposed to
using magic constants
* In general update the parsing code so that this ^ works
* Add `Port-Version` fields to CONTROL files
* This replaces the existing practice of
`Version: <my-version>-<port-version>`
==== Smaller changes ====
* small drive-by cleanups to some CMake
* `${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}` ->
`${CURRENT_INSTALLED_DIR}`
* Remove `-analyze` when compiling with clang-cl, since that's not a
supported flag (vcpkg's build system)
* Add a message about which compiler is detected by vcpkg's build
system machinery
* Fix `Expected::then`
* Convert `""` to `{}` for `std::string` and `fs::path`, to avoid a
`strlen` (additionally, `.empty()` instead of `== ""`, and `.clear()`)
* Add `Strings::strto` which converts strings to numeric types
* Support built-in arrays and `StringView` for `Strings::join`
* Add `operator<` and friends to `StringView`
* Add `substr` to `StringView`
* SourceParagraphParser gets some new errors
2020-07-01 01:40:18 +08:00
/ p : V c p k g M a n i f e s t I n s t a l l = f a l s e
2018-08-08 19:15:13 +08:00
/ m
)
if ( VCPKG_LIBRARY_LINKAGE STREQUAL "static" )
# Disable LTCG for static libraries because this setting introduces ABI incompatibility between minor compiler versions
# TODO: Add a way for the user to override this if they want to opt-in to incompatibility
list ( APPEND _csc_OPTIONS /p:WholeProgramOptimization=false )
endif ( )
if ( _csc_USE_VCPKG_INTEGRATION )
2019-09-13 14:52:52 +08:00
list ( APPEND _csc_OPTIONS /p:ForceImportBeforeCppTargets= ${ SCRIPTS } /buildsystems/msbuild/vcpkg.targets /p:VcpkgApplocalDeps=false )
2018-08-08 19:15:13 +08:00
endif ( )
get_filename_component ( SOURCE_PATH_SUFFIX "${_csc_SOURCE_PATH}" NAME )
if ( NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release" )
message ( STATUS "Building ${_csc_PROJECT_SUBPATH} for Release" )
file ( REMOVE_RECURSE ${ CURRENT_BUILDTREES_DIR } / ${ TARGET_TRIPLET } -rel )
file ( MAKE_DIRECTORY ${ CURRENT_BUILDTREES_DIR } / ${ TARGET_TRIPLET } -rel )
file ( COPY ${ _csc_SOURCE_PATH } DESTINATION ${ CURRENT_BUILDTREES_DIR } / ${ TARGET_TRIPLET } -rel )
set ( SOURCE_COPY_PATH ${ CURRENT_BUILDTREES_DIR } / ${ TARGET_TRIPLET } -rel/ ${ SOURCE_PATH_SUFFIX } )
vcpkg_execute_required_process (
C O M M A N D m s b u i l d $ { S O U R C E _ C O P Y _ P A T H } / $ { _ c s c _ P R O J E C T _ S U B P A T H }
/ p : C o n f i g u r a t i o n = $ { _ c s c _ R E L E A S E _ C O N F I G U R A T I O N }
$ { _ c s c _ O P T I O N S }
$ { _ c s c _ O P T I O N S _ R E L E A S E }
W O R K I N G _ D I R E C T O R Y $ { S O U R C E _ C O P Y _ P A T H }
L O G N A M E b u i l d - $ { T A R G E T _ T R I P L E T } - r e l
)
file ( GLOB_RECURSE LIBS ${ SOURCE_COPY_PATH } /*.lib )
file ( GLOB_RECURSE DLLS ${ SOURCE_COPY_PATH } /*.dll )
file ( GLOB_RECURSE EXES ${ SOURCE_COPY_PATH } /*.exe )
if ( LIBS )
file ( COPY ${ LIBS } DESTINATION ${ CURRENT_PACKAGES_DIR } /lib )
endif ( )
if ( DLLS )
file ( COPY ${ DLLS } DESTINATION ${ CURRENT_PACKAGES_DIR } /bin )
endif ( )
if ( EXES )
file ( COPY ${ EXES } DESTINATION ${ CURRENT_PACKAGES_DIR } /tools/ ${ PORT } )
vcpkg_copy_tool_dependencies ( ${ CURRENT_PACKAGES_DIR } /tools/ ${ PORT } )
endif ( )
endif ( )
if ( NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug" )
message ( STATUS "Building ${_csc_PROJECT_SUBPATH} for Debug" )
file ( REMOVE_RECURSE ${ CURRENT_BUILDTREES_DIR } / ${ TARGET_TRIPLET } -dbg )
file ( MAKE_DIRECTORY ${ CURRENT_BUILDTREES_DIR } / ${ TARGET_TRIPLET } -dbg )
file ( COPY ${ _csc_SOURCE_PATH } DESTINATION ${ CURRENT_BUILDTREES_DIR } / ${ TARGET_TRIPLET } -dbg )
set ( SOURCE_COPY_PATH ${ CURRENT_BUILDTREES_DIR } / ${ TARGET_TRIPLET } -dbg/ ${ SOURCE_PATH_SUFFIX } )
vcpkg_execute_required_process (
C O M M A N D m s b u i l d $ { S O U R C E _ C O P Y _ P A T H } / $ { _ c s c _ P R O J E C T _ S U B P A T H }
/ p : C o n f i g u r a t i o n = $ { _ c s c _ D E B U G _ C O N F I G U R A T I O N }
$ { _ c s c _ O P T I O N S }
$ { _ c s c _ O P T I O N S _ D E B U G }
W O R K I N G _ D I R E C T O R Y $ { S O U R C E _ C O P Y _ P A T H }
L O G N A M E b u i l d - $ { T A R G E T _ T R I P L E T } - d b g
)
file ( GLOB_RECURSE LIBS ${ SOURCE_COPY_PATH } /*.lib )
file ( GLOB_RECURSE DLLS ${ SOURCE_COPY_PATH } /*.dll )
if ( LIBS )
file ( COPY ${ LIBS } DESTINATION ${ CURRENT_PACKAGES_DIR } /debug/lib )
endif ( )
if ( DLLS )
file ( COPY ${ DLLS } DESTINATION ${ CURRENT_PACKAGES_DIR } /debug/bin )
endif ( )
endif ( )
vcpkg_copy_pdbs ( )
2018-10-26 03:34:45 +08:00
if ( NOT _csc_SKIP_CLEAN )
vcpkg_clean_msbuild ( )
endif ( )
2018-08-08 19:15:13 +08:00
if ( DEFINED _csc_INCLUDES_SUBPATH )
file ( COPY ${ _csc_SOURCE_PATH } / ${ _csc_INCLUDES_SUBPATH } / DESTINATION ${ CURRENT_PACKAGES_DIR } /include/ )
file ( GLOB ROOT_INCLUDES LIST_DIRECTORIES false ${ CURRENT_PACKAGES_DIR } /include/* )
if ( ROOT_INCLUDES )
if ( _csc_REMOVE_ROOT_INCLUDES )
file ( REMOVE ${ ROOT_INCLUDES } )
elseif ( _csc_ALLOW_ROOT_INCLUDES )
else ( )
message ( FATAL_ERROR "Top-level files were found in ${CURRENT_PACKAGES_DIR}/include; this may indicate a problem with the call to `vcpkg_install_msbuild()`.\nTo avoid conflicts with other libraries, it is recommended to not put includes into the root `include/` directory.\nPass either ALLOW_ROOT_INCLUDES or REMOVE_ROOT_INCLUDES to handle these files.\n" )
endif ( )
endif ( )
endif ( )
if ( DEFINED _csc_LICENSE_SUBPATH )
file ( INSTALL ${ _csc_SOURCE_PATH } / ${ _csc_LICENSE_SUBPATH } DESTINATION ${ CURRENT_PACKAGES_DIR } /share/ ${ PORT } RENAME copyright )
endif ( )
endfunction ( )