2019-09-05 01:57:56 +03:00
# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2022-02-12 04:49:26 +03:00
cmake_minimum_required ( VERSION 3.22 )
2019-09-05 22:29:04 +03:00
set ( CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY )
2019-09-05 01:57:56 +03:00
project ( msvc_standard_libraries LANGUAGES CXX )
2022-05-24 03:57:01 +03:00
include ( CheckCXXSourceCompiles )
check_cxx_source_compiles ( [=[
#include <sdkddkver.h>
static_assert ( WDK_NTDDI_VERSION >= NTDDI_WIN10_CO, "Inspecting WDK_NTDDI_VERSION, the Windows SDK version." ) ;
i n t main ( ) { }
] = ] W I N D O W S _ S D K _ V E R S I O N _ C H E C K )
if ( NOT WINDOWS_SDK_VERSION_CHECK )
message ( FATAL_ERROR "The STL must be built with the Windows 11 SDK (10.0.22000.0) or later. Make sure it's available by selecting it in the Individual Components tab of the VS Installer." )
endif ( )
2022-05-24 04:36:43 +03:00
if ( NOT DEFINED VCLIBS_TARGET_ARCHITECTURE )
set ( VCLIBS_TARGET_ARCHITECTURE "${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}" )
endif ( )
string ( TOLOWER "${VCLIBS_TARGET_ARCHITECTURE}" VCLIBS_TARGET_ARCHITECTURE )
if ( VCLIBS_TARGET_ARCHITECTURE MATCHES "^x64$|^x86$" )
enable_language ( ASM_MASM )
endif ( )
2022-05-05 12:40:19 +03:00
# add the tools subdirectory _before_ we change all the flags
add_subdirectory ( tools EXCLUDE_FROM_ALL )
# these allow the targets to show up in the top-level
# (as opposed to under the tools subdirectory)
if ( TARGET run-format )
add_custom_target ( format )
add_dependencies ( format run-format )
endif ( )
if ( TARGET run-validate )
add_custom_target ( validate )
add_dependencies ( validate run-validate )
endif ( )
2020-04-14 18:10:37 +03:00
option ( BUILD_TESTING "Enable testing" ON )
2020-04-01 21:41:55 +03:00
set ( VCLIBS_SUFFIX "_oss" CACHE STRING "suffix for built DLL names to avoid conflicts with distributed DLLs" )
2019-09-05 01:57:56 +03:00
2019-09-07 05:23:11 +03:00
set ( CMAKE_CXX_FLAGS "" )
set ( CMAKE_CXX_FLAGS_DEBUG "" )
set ( CMAKE_CXX_FLAGS_RELEASE "" )
set ( CMAKE_CXX_STANDARD_LIBRARIES "kernel32.lib" )
set ( CMAKE_CXX_STANDARD_LIBRARIES_INIT "kernel32.lib" )
set ( CMAKE_MSVC_RUNTIME_LIBRARY "" )
2022-05-24 04:36:43 +03:00
if ( "${VCLIBS_TARGET_ARCHITECTURE}" MATCHES "^x86$" )
2019-09-07 05:23:11 +03:00
set ( VCLIBS_TARGET_ARCHITECTURE "x86" )
2019-09-05 01:57:56 +03:00
set ( VCLIBS_I386_OR_AMD64 "i386" )
set ( VCLIBS_X86_OR_X64 "x86" )
2019-09-07 05:23:11 +03:00
# Note that we set _WIN32_WINNT to a high level to make declarations available, but still engage downlevel
# runtime dynamic linking by setting our own _STL_WIN32_WINNT back to Windows XP.
2022-05-12 23:36:47 +03:00
add_compile_definitions ( _X86_ _VCRT_WIN32_WINNT=0x0501 _STL_WIN32_WINNT=0x0501 )
2022-05-24 04:36:43 +03:00
add_compile_options ( $< $<COMPILE_LANGUAGE:CXX > :/arch:IA32> )
elseif ( VCLIBS_TARGET_ARCHITECTURE MATCHES "^x64$" )
2019-09-07 05:23:11 +03:00
set ( VCLIBS_TARGET_ARCHITECTURE "x64" )
2019-09-05 01:57:56 +03:00
set ( VCLIBS_I386_OR_AMD64 "amd64" )
set ( VCLIBS_X86_OR_X64 "x64" )
2022-05-12 23:36:47 +03:00
add_compile_definitions ( _AMD64_ _VCRT_WIN32_WINNT=0x0501 _STL_WIN32_WINNT=0x0501 )
2022-05-24 04:36:43 +03:00
elseif ( VCLIBS_TARGET_ARCHITECTURE MATCHES "^armv7$" )
2019-09-07 05:23:11 +03:00
set ( VCLIBS_TARGET_ARCHITECTURE "arm" )
2019-09-05 01:57:56 +03:00
set ( VCLIBS_I386_OR_AMD64 "arm" )
set ( VCLIBS_X86_OR_X64 "arm" )
2022-05-12 23:36:47 +03:00
add_compile_definitions ( _ARM_ _VCRT_WIN32_WINNT=0x0602 _STL_WIN32_WINNT=0x0602 )
2019-09-07 05:23:11 +03:00
string ( APPEND CMAKE_CXX_STANDARD_LIBRARIES " Synchronization.lib" )
2022-05-24 04:36:43 +03:00
elseif ( VCLIBS_TARGET_ARCHITECTURE MATCHES "^arm64$" )
2019-09-07 05:23:11 +03:00
set ( VCLIBS_TARGET_ARCHITECTURE "arm64" )
2019-09-05 01:57:56 +03:00
set ( VCLIBS_I386_OR_AMD64 "arm64" )
set ( VCLIBS_X86_OR_X64 "arm64" )
2022-05-12 23:36:47 +03:00
add_compile_definitions ( _ARM64_ _VCRT_WIN32_WINNT=0x0A00 _STL_WIN32_WINNT=0x0A00 )
2019-09-07 05:23:11 +03:00
string ( APPEND CMAKE_CXX_STANDARD_LIBRARIES " Synchronization.lib" )
2019-09-05 01:57:56 +03:00
else ( )
2019-09-07 05:23:11 +03:00
message ( FATAL_ERROR "Could not determine target architecture: VCLIBS_TARGET_ARCHITECTURE: ${VCLIBS_TARGET_ARCHITECTURE}" )
2019-09-05 01:57:56 +03:00
endif ( )
2019-09-07 05:23:11 +03:00
add_compile_definitions (
2019-09-05 01:57:56 +03:00
_ A L L O W _ I T E R A T O R _ D E B U G _ L E V E L _ M I S M A T C H W I N 3 2 _ L E A N _ A N D _ M E A N S T R I C T _ C R T _ S T D I O _ A R B I T R A R Y _ W I D E _ S P E C I F I E R S
2022-05-12 23:36:47 +03:00
_ C R T _ D E C L A R E _ N O N S T D C _ N A M E S = 1 _ W I N 3 2 _ W I N N T = 0 x 0 A 0 0 N T D D I _ V E R S I O N = N T D D I _ W I N 1 0 _ C O )
2019-09-05 01:57:56 +03:00
2022-05-24 04:36:43 +03:00
add_compile_options ( /WX /Gy
" $ < $ < C O M P I L E _ L A N G U A G E : C X X > : / d i a g n o s t i c s : c a r e t ; / W 4 ; / w 1 4 2 6 5 ; / w 1 5 0 3 8 ; / d 1 F a s t F a i l ; / g u a r d : c f ; / Z 7 ; / Z p 8 ; / s t d : c + + l a t e s t ; / p e r m i s s i v e - ; / Z c : t h r e a d S a f e I n i t - ; / Z l > "
# note that /Zi generates debug info inside the object file, it's the same as /Z7 for msvc
" $ < $ < C O M P I L E _ L A N G U A G E : A S M _ M A S M > : / Z i ; / W 3 ; / n o l o g o > " )
2019-09-05 01:57:56 +03:00
2022-05-24 04:36:43 +03:00
set ( VCLIBS_DEBUG_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:/Od>" )
2022-05-05 12:53:26 +03:00
# TRANSITION: Potentially remove `/Os` if it results in speed improvements.
# This requires benchmarking!
# Note that in MSVC version 19.32.31328,
# `/Os` results in a binary size difference of 102K
# in the release DLL (a gain of 18.4%).
# So, make certain that that tradeoff is considered when or if `/Os` is removed.
# See GH-2108 for more info.
2022-05-24 04:36:43 +03:00
set ( VCLIBS_RELEASE_OPTIONS "$<$<COMPILE_LANGUAGE:CXX>:/O2;/Os>" )
2019-09-05 01:57:56 +03:00
set ( CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/out/lib/${VCLIBS_I386_OR_AMD64}" )
set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/out/lib/${VCLIBS_I386_OR_AMD64}" )
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/out/bin/${VCLIBS_I386_OR_AMD64}" )
set ( CMAKE_STATIC_LINKER_FLAGS "/WX" )
set ( CMAKE_STATIC_LINKER_FLAGS_DEBUG "" )
set ( CMAKE_STATIC_LINKER_FLAGS_RELEASE "" )
set ( CMAKE_SHARED_LINKER_FLAGS "/DEBUG:FULL /WX /RELEASE /SUBSYSTEM:Console /NODEFAULTLIB /INCREMENTAL:NO /MANIFEST:NO /DLL /profile /guard:cf /DEBUGTYPE:cv,fixup /LARGEADDRESSAWARE" )
set ( CMAKE_SHARED_LINKER_FLAGS_DEBUG "" )
set ( CMAKE_SHARED_LINKER_FLAGS_RELEASE "" )
get_filename_component ( TOOLSET_BINARIES_DIR "${CMAKE_CXX_COMPILER}" DIRECTORY ) # Example: $\VC\Tools\MSVC\14.23.27931\bin\Hostx86\x86
get_filename_component ( TOOLSET_ROOT_DIR "${TOOLSET_BINARIES_DIR}" DIRECTORY ) # $\VC\Tools\MSVC\14.23.27931\bin\Hostx86
get_filename_component ( TOOLSET_ROOT_DIR "${TOOLSET_ROOT_DIR}" DIRECTORY ) # $\VC\Tools\MSVC\14.23.27931\bin
get_filename_component ( TOOLSET_ROOT_DIR "${TOOLSET_ROOT_DIR}" DIRECTORY ) # $\VC\Tools\MSVC\14.23.27931
set ( TOOLSET_LIB "${TOOLSET_ROOT_DIR}/lib/${VCLIBS_X86_OR_X64}" )
2021-08-27 07:38:38 +03:00
add_subdirectory ( boost-math )
2019-09-05 01:57:56 +03:00
add_subdirectory ( stl )
2020-03-25 23:56:03 +03:00
2020-04-02 23:23:34 +03:00
if ( BUILD_TESTING )
2020-04-01 00:05:46 +03:00
enable_testing ( )
add_subdirectory ( tests )
endif ( )