aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/cmake
diff options
context:
space:
mode:
authornicole mazzuca <mazzucan@outlook.com>2020-08-10 12:32:34 -0700
committerGitHub <noreply@github.com>2020-08-10 12:32:34 -0700
commit895678db8f8bfc3c1988a118b3bb5a13ea4d5248 (patch)
treef341f05574a16589e7e0ee15446a907e142e679c /toolsrc/cmake
parent481738beaeb77bca19ff7fa01b4c02be7fc9deb2 (diff)
downloadvcpkg-895678db8f8bfc3c1988a118b3bb5a13ea4d5248.tar.gz
vcpkg-895678db8f8bfc3c1988a118b3bb5a13ea4d5248.zip
[vcpkg] Rewrite CMake build system to be more target-based (#12698)
* Change to using more target-focused cmake * Add vcpkg_target_add_warning_options * targetify the rest * move the globs together * Force-include pch.h on non-windows * Rename VCPKGLIB_NON_PCH_* to VCPKGLIB_* in globs * Remove `include "pch.h"`s * missed a few lines * fix build * fix CMAKE_CURRENT_SOURCE_DIR * try to fix VCPKG_REQUIRE_LINK_CXXFS * change msvc-stl logic * fix build * CR * clang-format * Apply suggestions from code review Thanks @ras0219! Co-authored-by: JackBoosY <yuzaiyang@beyondsoft.com> Co-authored-by: ras0219 <533828+ras0219@users.noreply.github.com>
Diffstat (limited to 'toolsrc/cmake')
-rw-r--r--toolsrc/cmake/utilities.cmake70
1 files changed, 61 insertions, 9 deletions
diff --git a/toolsrc/cmake/utilities.cmake b/toolsrc/cmake/utilities.cmake
index b99063a65..f04c1ddbb 100644
--- a/toolsrc/cmake/utilities.cmake
+++ b/toolsrc/cmake/utilities.cmake
@@ -77,7 +77,7 @@ int main() {}
_VCPKG_STANDARD_LIBRARY_LIBCXX)
check_cxx_source_compiles([[
#include <ciso646>
-#if !defined(_MSVC_STL_VERSION)
+#if !defined(_MSVC_STL_VERSION) && !(defined(_MSC_VER) && _MSC_VER <= 1900)
#error "not MSVC stl"
#endif
int main() {}
@@ -101,7 +101,7 @@ int main() {}
endif()
endfunction()
-# Outputs to Cache: VCPKG_USE_STD_FILESYSTEM, VCPKG_REQUIRE_LINK_CXXFS
+# Outputs to Cache: VCPKG_USE_STD_FILESYSTEM, VCPKG_CXXFS_LIBRARY
function(vcpkg_detect_std_filesystem)
vcpkg_detect_standard_library()
@@ -129,10 +129,14 @@ int main() {}
int main() {}
]]
_VCPKG_USE_STD_FILESYSTEM)
+
+ if(_VCPKG_REQUIRE_LINK_CXXFS)
+ set(_VCPKG_CXXFS_LIBRARY "stdc++fs")
+ endif()
elseif(VCPKG_STANDARD_LIBRARY STREQUAL "libc++")
if(CMAKE_CXX_COMPILER_ID MATCHES "AppleClang")
# AppleClang never requires (or allows) -lc++fs, even with libc++ version 8.0.0
- set(_VCPKG_REQUIRE_LINK_CXXFS OFF)
+ set(_VCPKG_CXXFS_LIBRARY OFF)
else()
check_cxx_source_compiles([[
#include <ciso646>
@@ -142,6 +146,10 @@ int main() {}
int main() {}
]]
_VCPKG_REQUIRE_LINK_CXXFS)
+
+ if(_VCPKG_REQUIRE_LINK_CXXFS)
+ set(_VCPKG_CXXFS_LIBRARY "c++fs")
+ endif()
endif()
# We don't support versions of libc++ < 7.0.0, and libc++ 7.0.0 has <filesystem>
@@ -155,16 +163,16 @@ int main() {}
int main() {}"
_VCPKG_USE_STD_FILESYSTEM)
- set(_VCPKG_REQUIRE_LINK_CXXFS OFF)
+ set(_VCPKG_CXXFS_LIBRARY OFF)
endif()
set(VCPKG_USE_STD_FILESYSTEM ${_VCPKG_USE_STD_FILESYSTEM}
CACHE BOOL
"Whether to use <filesystem>, as opposed to <experimental/filesystem>"
FORCE)
- set(VCPKG_REQUIRE_LINK_CXXFS ${_VCPKG_REQUIRE_LINK_CXXFS}
- CACHE BOOL
- "Whether it's required to pass -l[std]c++fs in order to use <filesystem>"
+ set(VCPKG_CXXFS_LIBRARY ${_VCPKG_CXXFS_LIBRARY}
+ CACHE STRING
+ "Library to link (if any) in order to use <filesystem>"
FORCE)
if(VCPKG_USE_STD_FILESYSTEM)
@@ -172,10 +180,54 @@ int main() {}
else()
set(msg "<experimental/filesystem>")
endif()
- if(VCPKG_REQUIRE_LINK_CXXFS)
- set(msg "${msg} with -l[std]c++fs")
+ if(VCPKG_CXXFS_LIBRARY)
+ set(msg "${msg} with -l${VCPKG_CXXFS_LIBRARY}")
endif()
message(STATUS "Detecting how to use the C++ filesystem library - ${msg}")
endif()
endfunction()
+
+function(vcpkg_target_add_warning_options TARGET)
+ if(MSVC)
+ # either MSVC, or clang-cl
+ target_compile_options(${TARGET} PRIVATE -FC)
+
+ if (MSVC_VERSION GREATER 1900)
+ # Visual Studio 2017 or later
+ target_compile_options(${TARGET} PRIVATE -permissive- -utf-8)
+ endif()
+
+ if(VCPKG_DEVELOPMENT_WARNINGS)
+ target_compile_options(${TARGET} PRIVATE -W4)
+ if(VCPKG_COMPILER STREQUAL "clang")
+ target_compile_options(${TARGET} PRIVATE -Wmissing-prototypes -Wno-missing-field-initializers)
+ else()
+ target_compile_options(${TARGET} PRIVATE -analyze)
+ endif()
+ else()
+ target_compile_options(${TARGET} PRIVATE -W3)
+ endif()
+
+ if(VCPKG_WARNINGS_AS_ERRORS)
+ target_compile_options(${TARGET} PRIVATE -WX)
+ endif()
+ else()
+ if(VCPKG_DEVELOPMENT_WARNINGS)
+ target_compile_options(${TARGET} PRIVATE
+ -Wall -Wextra -Wpedantic
+ -Wno-unknown-pragmas -Wno-missing-field-initializers -Wno-redundant-move)
+
+ # GCC and clang have different names for the same warning
+ if(VCPKG_COMPILER STREQUAL "gcc")
+ target_compile_options(${TARGET} PRIVATE -Wmissing-declarations)
+ elseif(VCPKG_COMPILER STREQUAL "clang")
+ target_compile_options(${TARGET} PRIVATE -Wmissing-prototypes)
+ endif()
+ endif()
+
+ if(VCPKG_WARNINGS_AS_ERRORS)
+ target_compile_options(${TARGET} PRIVATE -Werror)
+ endif()
+ endif()
+endfunction()