[Cmake-commits] CMake branch, next, updated. v2.8.12.1-5909-gf187ec0
Stephen Kelly
steveire at gmail.com
Thu Nov 28 10:18:06 EST 2013
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".
The branch, next has been updated
via f187ec0eed864f4d049ab3e5a44a9b4f133a8455 (commit)
via 1cac803880a7cb62a2f18e2015f26c914761adee (commit)
via 23c7e19e35fb632169e135466ec228793fb8b943 (commit)
via 422e75415ee8209f4877445425c6cea890d86568 (commit)
via 3c061ed76955cab4101f616ee573e32ec688f5f7 (commit)
via 756c56a04bdec9674840bad725ce544151ddee8c (commit)
via 38a6d6fd2bb50d4defa9243a6ebe926ea2f90526 (commit)
from 1344b9ccf22ef29d78050b2a1ddb8e870a327588 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=f187ec0eed864f4d049ab3e5a44a9b4f133a8455
commit f187ec0eed864f4d049ab3e5a44a9b4f133a8455
Merge: 1344b9c 1cac803
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Thu Nov 28 10:18:00 2013 -0500
Commit: CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Thu Nov 28 10:18:00 2013 -0500
Merge topic 'target_compile_features' into next
1cac803 Add the WriteCompilerDetectionHeader module.
23c7e19 Add a cxx_binary_literals feature.
422e754 Genex: Add $<HAVE_COMPILER_FEATURE:LANG,FEATURE> genex.
3c061ed Add a cxx_variadic_templates feature.
756c56a Remove version checks.
38a6d6f Add version checks for compilers.
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=1cac803880a7cb62a2f18e2015f26c914761adee
commit 1cac803880a7cb62a2f18e2015f26c914761adee
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Mon Oct 21 16:59:40 2013 +0200
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Thu Nov 28 16:11:06 2013 +0100
Add the WriteCompilerDetectionHeader module.
Provide a function to write a portable header to detect compiler
features.
diff --git a/Modules/Compiler/Clang-CXX-FeatureTests.cmake b/Modules/Compiler/Clang-CXX-FeatureTests.cmake
index f98f787..2fb6cd8 100644
--- a/Modules/Compiler/Clang-CXX-FeatureTests.cmake
+++ b/Modules/Compiler/Clang-CXX-FeatureTests.cmake
@@ -1,4 +1,6 @@
+set(_cmake_compiler_test_macro __clang__)
+
set(testable_features
cxx_delegating_constructors
cxx_variadic_templates
diff --git a/Modules/Compiler/GNU-CXX-FeatureTests.cmake b/Modules/Compiler/GNU-CXX-FeatureTests.cmake
index 68ac0c0..5f5426e 100644
--- a/Modules/Compiler/GNU-CXX-FeatureTests.cmake
+++ b/Modules/Compiler/GNU-CXX-FeatureTests.cmake
@@ -1,4 +1,6 @@
+set(_cmake_compiler_test_macro __GNUC__)
+
set(_cmake_feature_test_gnuxx_typeof "!defined(__STRICT_ANSI__)")
# For GCC 4.7, we can test the standard __cplusplus macro, ...
diff --git a/Modules/Compiler/MSVC-CXX-FeatureTests.cmake b/Modules/Compiler/MSVC-CXX-FeatureTests.cmake
index 7a56acd..ea0a349 100644
--- a/Modules/Compiler/MSVC-CXX-FeatureTests.cmake
+++ b/Modules/Compiler/MSVC-CXX-FeatureTests.cmake
@@ -1,2 +1,4 @@
+set(_cmake_compiler_test_macro _MSC_VER)
+
set(_cmake_feature_test_msvcxx_sealed "_MSC_VER >= 1400")
diff --git a/Modules/WriteCompilerDetectionHeader.cmake b/Modules/WriteCompilerDetectionHeader.cmake
new file mode 100644
index 0000000..c876301
--- /dev/null
+++ b/Modules/WriteCompilerDetectionHeader.cmake
@@ -0,0 +1,124 @@
+
+#=============================================================================
+# Copyright 2013 Stephen Kelly <steveire at gmail.com>
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+# Should we enable the highest supported lang flag?
+
+include(${CMAKE_CURRENT_LIST_DIR}/CMakeParseArguments.cmake)
+
+function(_load_compiler_variables CompilerId lang)
+ include("${CMAKE_ROOT}/Modules/Compiler/${CompilerId}-${lang}-FeatureTests.cmake" OPTIONAL)
+ if (NOT _cmake_compiler_test_macro)
+ message(FATAL_ERROR "Compiler ${CompilerId} does not define _cmake_compiler_test_macro")
+ endif()
+ foreach(feature ${ARGN})
+ set(x ${_cmake_feature_tests_${feature}})
+ if (_cmake_feature_test_${feature})
+ set(n "defined (${_cmake_compiler_test_macro})")
+ if (NOT _cmake_feature_test_${feature} STREQUAL "1")
+ set(n "(${n} && ${_cmake_feature_test_${feature}})")
+ endif()
+ list(APPEND x ${n})
+ set(_cmake_feature_tests_${feature} ${x} PARENT_SCOPE)
+ endif()
+ endforeach()
+endfunction()
+
+function(write_compiler_detection_header
+ file_keyword file_arg
+ prefix_keyword prefix_arg
+ )
+ if (NOT file_keyword STREQUAL FILE)
+ message(FATAL_ERROR "Wrong parameters for function.")
+ endif()
+ if (NOT prefix_keyword STREQUAL PREFIX)
+ message(FATAL_ERROR "Wrong parameters for function.")
+ endif()
+ set(options)
+ set(oneValueArgs VERSION)
+ set(multiValueArgs COMPILERS FEATURES)
+ cmake_parse_arguments(_WCD "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+ if(NOT _WCD_COMPILERS OR NOT _WCD_FEATURES)
+ message(FATAL_ERROR "Invalid arguments.")
+ endif()
+
+ if(_WCD_UNPARSED_ARGUMENTS)
+ message(FATAL_ERROR "Unparsed arguments: ${_WCD_UNPARSED_ARGUMENTS}")
+ endif()
+
+ if(NOT _WCD_VERSION)
+ set(_WCD_VERSION ${CMAKE_MINIMUM_REQUIRED_VERSION})
+ endif()
+# if (_WCD_VERSION VERSION_LESS 3.0.0) # Version which introduced this function
+# message(FATAL_ERROR "VERSION parameter too low.")
+# endif()
+
+ set(ordered_compilers
+ # Order is relevant here. We need to list the compilers which pretend to
+ # be GNU/MSVC before the actual GNU/MSVC compiler.
+ Clang
+ GNU
+ MSVC
+ )
+ foreach(_comp ${_WCD_COMPILERS})
+ list(FIND ordered_compilers ${_comp} idx)
+ if (idx EQUAL -1)
+ message(FATAL_ERROR "Unsupported compiler ${_comp}.")
+ endif()
+ endforeach()
+
+ file(WRITE ${file_arg} "
+// This is a generated file. Do not edit!
+
+#ifndef ${prefix_arg}_COMPILER_DETECTION_H
+#define ${prefix_arg}_COMPILER_DETECTION_H
+
+#if !defined (__clang__)
+#define __has_extension(ext) 0
+#endif
+")
+
+ foreach(_lang CXX)
+
+ foreach(ordered_compiler ${ordered_compilers})
+ list(FIND _WCD_COMPILERS ${ordered_compiler} idx)
+ if (NOT idx EQUAL -1)
+ _load_compiler_variables(${ordered_compiler} ${_lang} ${_WCD_FEATURES})
+ endif()
+ endforeach()
+
+ if(_lang STREQUAL CXX)
+ file(APPEND "${file_arg}" "\n#ifdef __cplusplus\n")
+ endif()
+ foreach(feature ${_WCD_FEATURES})
+ list(FIND CMAKE_${_lang}_KNOWN_FEATURES ${feature} idx)
+ if (NOT idx EQUAL -1)
+ set(_define_check "\n#define ${prefix_arg}_${CMAKE_PP_NAME_${feature}} 0\n")
+ if (_cmake_feature_tests_${feature} STREQUAL "1")
+ set(_define_check "\n#define ${prefix_arg}_${CMAKE_PP_NAME_${feature}} 1\n")
+ elseif (_cmake_feature_tests_${feature})
+ string(REPLACE ";" " \\\n || " _cmake_feature_tests_${feature} "${_cmake_feature_tests_${feature}}")
+ set(_define_check "\n#if ${_cmake_feature_tests_${feature}}\n#define ${prefix_arg}_${CMAKE_PP_NAME_${feature}} 1\n#else${_define_check}#endif\n")
+ endif()
+ file(APPEND "${file_arg}" "${_define_check}")
+ endif()
+ endforeach()
+ if(_lang STREQUAL CXX)
+ file(APPEND "${file_arg}" "\n#endif\n")
+ endif()
+
+ endforeach()
+
+ file(APPEND ${file_arg} "\n#endif\n")
+endfunction()
diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index d2a2c33..3c8c116 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -412,6 +412,11 @@ if(BUILD_TESTING)
list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/Module/ExternalData")
ADD_TEST_MACRO(Module.GenerateExportHeader GenerateExportHeader)
+ if ((CMAKE_CXX_COMPILER_ID STREQUAL GNU AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.3)
+ OR CMAKE_CXX_COMPILER_ID STREQUAL Clang
+ OR (CMAKE_CXX_COMPILER_ID STREQUAL MSVC AND NOT MSVC_VERSION VERSION_LESS 1400))
+ ADD_TEST_MACRO(Module.WriteCompilerDetectionHeader WriteCompilerDetectionHeader)
+ endif()
if (APPLE OR CMAKE_CXX_COMPILER_ID MATCHES "GNU")
include(CheckCXXCompilerFlag)
diff --git a/Tests/Module/WriteCompilerDetectionHeader/CMakeLists.txt b/Tests/Module/WriteCompilerDetectionHeader/CMakeLists.txt
new file mode 100644
index 0000000..3de0cd8
--- /dev/null
+++ b/Tests/Module/WriteCompilerDetectionHeader/CMakeLists.txt
@@ -0,0 +1,97 @@
+cmake_minimum_required(VERSION 2.8)
+
+project(WriteCompilerDetectionHeader)
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+include(WriteCompilerDetectionHeader)
+
+write_compiler_detection_header(
+ FILE "${CMAKE_CURRENT_BINARY_DIR}/test_compiler_detection.h"
+ PREFIX TEST
+ COMPILERS GNU Clang MSVC
+ FEATURES
+ ${CMAKE_CXX_KNOWN_FEATURES}
+)
+
+macro(set_defines target true_defs false_defs)
+ set(defines)
+ foreach(def ${true_defs})
+ list(APPEND defines ${def}=1)
+ endforeach()
+ foreach(def ${false_defs})
+ list(APPEND defines ${def}=0)
+ endforeach()
+ target_compile_definitions(${target}
+ PRIVATE
+ ${defines}
+ )
+endmacro()
+
+if (CMAKE_CXX_COMPILER_ID STREQUAL GNU
+ OR CMAKE_CXX_COMPILER_ID STREQUAL Clang)
+ list(APPEND true_defs EXPECTED_COMPILER_CXX_BINARY_LITERALS)
+ list(APPEND false_defs EXPECTED_COMPILER_MSVCXX_SEALED)
+elseif(CMAKE_CXX_COMPILER_ID STREQUAL MSVC)
+ list(APPEND false_defs EXPECTED_COMPILER_CXX_BINARY_LITERALS)
+ list(APPEND true_defs EXPECTED_COMPILER_MSVCXX_SEALED)
+else()
+ list(APPEND false_defs EXPECTED_COMPILER_CXX_BINARY_LITERALS)
+ list(APPEND false_defs EXPECTED_COMPILER_MSVCXX_SEALED)
+endif()
+
+list(APPEND false_defs EXPECTED_COMPILER_GNUXX_TYPEOF)
+list(APPEND false_defs EXPECTED_COMPILER_CXX_DELEGATING_CONSTRUCTORS)
+list(APPEND false_defs EXPECTED_COMPILER_CXX_VARIADIC_TEMPLATES)
+
+add_executable(WriteCompilerDetectionHeader main.cpp)
+set_property(TARGET WriteCompilerDetectionHeader PROPERTY CXX_STANDARD 98)
+set_defines(WriteCompilerDetectionHeader "${true_defs}" "${false_defs}")
+
+if (CMAKE_CXX_COMPILER_ID STREQUAL GNU
+ OR CMAKE_CXX_COMPILER_ID STREQUAL Clang)
+ list(APPEND true_defs EXPECTED_COMPILER_GNUXX_TYPEOF)
+ list(REMOVE_ITEM false_defs EXPECTED_COMPILER_GNUXX_TYPEOF)
+endif()
+
+add_executable(WriteCompilerDetectionHeader_98ext main.cpp)
+set_property(TARGET WriteCompilerDetectionHeader_98ext PROPERTY CXX_STANDARD 98)
+set_property(TARGET WriteCompilerDetectionHeader_98ext PROPERTY CXX_EXTENSIONS 1)
+set_defines(WriteCompilerDetectionHeader_98ext "${true_defs}" "${false_defs}")
+
+if (CMAKE_CXX_COMPILER_ID STREQUAL GNU
+ OR CMAKE_CXX_COMPILER_ID STREQUAL Clang)
+ list(APPEND false_defs EXPECTED_COMPILER_GNUXX_TYPEOF)
+ list(REMOVE_ITEM true_defs EXPECTED_COMPILER_GNUXX_TYPEOF)
+endif()
+
+if ((CMAKE_CXX_COMPILER_ID STREQUAL GNU
+ AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7.0)
+ OR (CMAKE_CXX_COMPILER_ID STREQUAL Clang
+ AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.0.0))
+ list(APPEND true_defs EXPECTED_COMPILER_CXX_DELEGATING_CONSTRUCTORS)
+ list(REMOVE_ITEM false_defs EXPECTED_COMPILER_CXX_DELEGATING_CONSTRUCTORS)
+endif()
+
+if ((CMAKE_CXX_COMPILER_ID STREQUAL GNU
+ AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7.0)
+ OR (CMAKE_CXX_COMPILER_ID STREQUAL Clang
+ AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.0.0))
+ list(APPEND true_defs EXPECTED_COMPILER_CXX_VARIADIC_TEMPLATES)
+ list(REMOVE_ITEM false_defs EXPECTED_COMPILER_CXX_VARIADIC_TEMPLATES)
+endif()
+
+add_executable(WriteCompilerDetectionHeader_11 main.cpp)
+set_property(TARGET WriteCompilerDetectionHeader_11 PROPERTY CXX_STANDARD 11)
+set_defines(WriteCompilerDetectionHeader_11 "${true_defs}" "${false_defs}")
+
+if (CMAKE_CXX_COMPILER_ID STREQUAL GNU
+ OR CMAKE_CXX_COMPILER_ID STREQUAL Clang)
+ list(APPEND true_defs EXPECTED_COMPILER_GNUXX_TYPEOF)
+ list(REMOVE_ITEM false_defs EXPECTED_COMPILER_GNUXX_TYPEOF)
+endif()
+
+add_executable(WriteCompilerDetectionHeader_11ext main.cpp)
+set_property(TARGET WriteCompilerDetectionHeader_11ext PROPERTY CXX_STANDARD 11)
+set_property(TARGET WriteCompilerDetectionHeader_11ext PROPERTY CXX_EXTENSIONS 1)
+set_defines(WriteCompilerDetectionHeader_11ext "${true_defs}" "${false_defs}")
diff --git a/Tests/Module/WriteCompilerDetectionHeader/main.cpp b/Tests/Module/WriteCompilerDetectionHeader/main.cpp
new file mode 100644
index 0000000..7b91203
--- /dev/null
+++ b/Tests/Module/WriteCompilerDetectionHeader/main.cpp
@@ -0,0 +1,34 @@
+
+#include "test_compiler_detection.h"
+
+#define JOIN_IMPL(A, B) A ## B
+#define JOIN(A, B) JOIN_IMPL(A, B)
+#define CHECK(FEATURE) (defined(TEST_COMPILER_ ## FEATURE) \
+ && defined(EXPECTED_COMPILER_ ## FEATURE) \
+ && JOIN(TEST_COMPILER_, FEATURE) == JOIN(EXPECTED_COMPILER_, FEATURE) \
+ )
+
+#if !CHECK(CXX_BINARY_LITERALS)
+#error cxx_binary_literals expected availability did not match.
+#endif
+
+#if !CHECK(CXX_DELEGATING_CONSTRUCTORS)
+#error cxx_delegating_constructors expected availability did not match.
+#endif
+
+#if !CHECK(CXX_VARIADIC_TEMPLATES)
+#error cxx_variadic_templates expected availability did not match.
+#endif
+
+#if !CHECK(GNUXX_TYPEOF)
+#error gnuxx_typeof expected availability did not match.
+#endif
+
+#if !CHECK(MSVCXX_SEALED)
+#error msvcxx_sealed expected availability did not match.
+#endif
+
+int main(int argc, char **argv)
+{
+ return 0;
+}
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=23c7e19e35fb632169e135466ec228793fb8b943
commit 23c7e19e35fb632169e135466ec228793fb8b943
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Sun Oct 13 10:42:02 2013 +0200
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Thu Nov 28 16:11:01 2013 +0100
Add a cxx_binary_literals feature.
Supported by GCC in c++98 mode, though it is a c++1y standard feature.
diff --git a/Modules/CMakeCXXCompiler.cmake.in b/Modules/CMakeCXXCompiler.cmake.in
index 28bd1cf..af911fb 100644
--- a/Modules/CMakeCXXCompiler.cmake.in
+++ b/Modules/CMakeCXXCompiler.cmake.in
@@ -3,6 +3,7 @@ set(CMAKE_CXX_COMPILER_ARG1 "@CMAKE_CXX_COMPILER_ARG1@")
set(CMAKE_CXX_COMPILER_ID "@CMAKE_CXX_COMPILER_ID@")
set(CMAKE_CXX_COMPILER_VERSION "@CMAKE_CXX_COMPILER_VERSION@")
set(CMAKE_CXX_COMPILE_FEATURES "@CMAKE_CXX_COMPILE_FEATURES@")
+set(CMAKE_CXX98_COMPILE_FEATURES "@CMAKE_CXX98_COMPILE_FEATURES@")
set(CMAKE_CXX98_COMPILE_EXTENSIONS "@CMAKE_CXX98_COMPILE_EXTENSIONS@")
set(CMAKE_CXX11_COMPILE_FEATURES "@CMAKE_CXX11_COMPILE_FEATURES@")
set(CMAKE_CXX11_COMPILE_EXTENSIONS "@CMAKE_CXX11_COMPILE_EXTENSIONS@")
diff --git a/Modules/CMakeDetermineCompileFeatures.cmake b/Modules/CMakeDetermineCompileFeatures.cmake
index 7950144..2a7f10b 100644
--- a/Modules/CMakeDetermineCompileFeatures.cmake
+++ b/Modules/CMakeDetermineCompileFeatures.cmake
@@ -17,6 +17,7 @@ function(cmake_determine_compile_features lang)
if(lang STREQUAL CXX AND COMMAND cmake_record_cxx_compile_features)
message(STATUS "Detecting ${lang} compile features")
+ set(CMAKE_CXX98_COMPILE_FEATURES)
set(CMAKE_CXX98_COMPILE_EXTENSIONS)
set(CMAKE_CXX11_COMPILE_FEATURES)
set(CMAKE_CXX11_COMPILE_EXTENSIONS)
@@ -32,9 +33,11 @@ function(cmake_determine_compile_features lang)
string(REPLACE "${CMAKE_CXX98_COMPILE_EXTENSIONS}" "" CMAKE_CXX11_COMPILE_EXTENSIONS "${CMAKE_CXX11_COMPILE_EXTENSIONS}")
string(REPLACE "${CMAKE_CXX11_COMPILE_FEATURES}" "" CMAKE_CXX11_COMPILE_EXTENSIONS "${CMAKE_CXX11_COMPILE_EXTENSIONS}")
+ string(REPLACE "${CMAKE_CXX98_COMPILE_FEATURES}" "" CMAKE_CXX98_COMPILE_EXTENSIONS "${CMAKE_CXX98_COMPILE_EXTENSIONS}")
if(NOT CMAKE_CXX_COMPILE_FEATURES)
set(CMAKE_CXX_COMPILE_FEATURES
+ ${CMAKE_CXX98_COMPILE_FEATURES}
${CMAKE_CXX98_COMPILE_EXTENSIONS}
${CMAKE_CXX11_COMPILE_FEATURES}
${CMAKE_CXX11_COMPILE_EXTENSIONS}
diff --git a/Modules/Compiler/Clang-CXX-FeatureTests.cmake b/Modules/Compiler/Clang-CXX-FeatureTests.cmake
index 0b2ceca..f98f787 100644
--- a/Modules/Compiler/Clang-CXX-FeatureTests.cmake
+++ b/Modules/Compiler/Clang-CXX-FeatureTests.cmake
@@ -2,6 +2,7 @@
set(testable_features
cxx_delegating_constructors
cxx_variadic_templates
+ cxx_binary_literals
)
foreach(feature ${testable_features})
set(_cmake_feature_test_${feature} "__has_extension(${feature})")
diff --git a/Modules/Compiler/GNU-CXX-FeatureTests.cmake b/Modules/Compiler/GNU-CXX-FeatureTests.cmake
index 3606ed8..68ac0c0 100644
--- a/Modules/Compiler/GNU-CXX-FeatureTests.cmake
+++ b/Modules/Compiler/GNU-CXX-FeatureTests.cmake
@@ -11,3 +11,4 @@ set(_cmake_feature_test_gnuxx_typeof "!defined(__STRICT_ANSI__)")
set(_cmake_feature_test_cxx_delegating_constructors "(__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L")
set(_cmake_feature_test_cxx_variadic_templates "(__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L")
+set(_cmake_feature_test_cxx_binary_literals "1")
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 883468c..b26c3a9 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -44,6 +44,7 @@
#define FOR_EACH_CXX_FEATURE(F) \
F(cxx_delegating_constructors) \
F(cxx_variadic_templates) \
+ F(cxx_binary_literals) \
F(gnuxx_typeof) \
F(msvcxx_sealed)
diff --git a/Tests/CMakeCommands/target_compile_features/CMakeLists.txt b/Tests/CMakeCommands/target_compile_features/CMakeLists.txt
index ab79b29..35fcd43 100644
--- a/Tests/CMakeCommands/target_compile_features/CMakeLists.txt
+++ b/Tests/CMakeCommands/target_compile_features/CMakeLists.txt
@@ -32,4 +32,11 @@ target_compile_features(lib_delegating_constructors
add_executable(lib_user lib_user.cpp)
target_link_libraries(lib_user lib_delegating_constructors)
+if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU|Clang")
+ add_executable(binary_literals binary_literals.cpp)
+ target_compile_features(binary_literals
+ PRIVATE cxx_binary_literals
+ )
+endif()
+
add_subdirectory(feature_conditional_link)
diff --git a/Tests/CMakeCommands/target_compile_features/binary_literals.cpp b/Tests/CMakeCommands/target_compile_features/binary_literals.cpp
new file mode 100644
index 0000000..3956e73
--- /dev/null
+++ b/Tests/CMakeCommands/target_compile_features/binary_literals.cpp
@@ -0,0 +1,6 @@
+
+int main(int, char **)
+{
+ int i = 0b0101;
+ return i - 5;
+}
diff --git a/Tests/SystemInformation/SystemInformation.in b/Tests/SystemInformation/SystemInformation.in
index 97298dc..669a6f9 100644
--- a/Tests/SystemInformation/SystemInformation.in
+++ b/Tests/SystemInformation/SystemInformation.in
@@ -26,6 +26,7 @@ CMAKE_CXX11_STANDARD_COMPILE_OPTION == "${CMAKE_CXX11_STANDARD_COMPILE_OPTION}"
CMAKE_CXX98_EXTENSION_COMPILE_OPTION == "${CMAKE_CXX98_EXTENSION_COMPILE_OPTION}"
CMAKE_CXX11_EXTENSION_COMPILE_OPTION == "${CMAKE_CXX11_EXTENSION_COMPILE_OPTION}"
CMAKE_CXX_COMPILE_FEATURES == "${CMAKE_CXX_COMPILE_FEATURES}"
+CMAKE_CXX98_COMPILE_FEATURES == "${CMAKE_CXX98_COMPILE_FEATURES}"
CMAKE_CXX98_COMPILE_EXTENSIONS == "${CMAKE_CXX98_COMPILE_EXTENSIONS}"
CMAKE_CXX11_COMPILE_FEATURES == "${CMAKE_CXX11_COMPILE_FEATURES}"
CMAKE_CXX11_COMPILE_EXTENSIONS == "${CMAKE_CXX11_COMPILE_EXTENSIONS}"
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=422e75415ee8209f4877445425c6cea890d86568
commit 422e75415ee8209f4877445425c6cea890d86568
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Tue Oct 22 01:51:34 2013 +0200
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Thu Nov 28 16:10:17 2013 +0100
Genex: Add $<HAVE_COMPILER_FEATURE:LANG,FEATURE> genex.
diff --git a/Help/manual/cmake-generator-expressions.7.rst b/Help/manual/cmake-generator-expressions.7.rst
index ed28abd..26fa77f 100644
--- a/Help/manual/cmake-generator-expressions.7.rst
+++ b/Help/manual/cmake-generator-expressions.7.rst
@@ -81,6 +81,8 @@ otherwise expands to nothing.
else ``0``. If the policy was not set, the warning message for the policy
will be emitted. This generator expression only works for a subset of
policies.
+``$<HAVE_COMPILE_FEATURE:lang,feature>``
+ ``1`` if the ``CMAKE_<lang>_COMPILER`` supports ``feature``, otherwise ``0``.
Informational Expressions
=========================
diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx
index 0f8c4e3..7f40b0b 100644
--- a/Source/cmGeneratorExpressionEvaluator.cxx
+++ b/Source/cmGeneratorExpressionEvaluator.cxx
@@ -585,6 +585,58 @@ static const struct LinkOnlyNode : public cmGeneratorExpressionNode
} linkOnlyNode;
//----------------------------------------------------------------------------
+static const struct HaveFeatureNode : public cmGeneratorExpressionNode
+{
+ HaveFeatureNode() {}
+
+ virtual int NumExpectedParameters() const { return 2; }
+
+ std::string Evaluate(const std::vector<std::string> ¶meters,
+ cmGeneratorExpressionContext *context,
+ const GeneratorExpressionContent *content,
+ cmGeneratorExpressionDAGChecker *) const
+ {
+ if (!context->HeadTarget)
+ {
+ reportError(context, content->GetOriginalExpression(),
+ "$<HAVE_COMPILER_FEATURE:lang,feature> may only be used with "
+ "targets. It may not be used with add_custom_command.");
+ return std::string();
+ }
+ if (context->HeadTarget->GetType() == cmTarget::INTERFACE_LIBRARY)
+ {
+ return "0";
+ }
+ std::string def = "CMAKE_" + parameters.front() + "_KNOWN_FEATURES";
+ const char *knownFeatures = context->Makefile ?
+ context->Makefile->GetDefinition(
+ def.c_str()) : 0;
+ assert(knownFeatures);
+ std::vector<std::string> featuresVec;
+ cmSystemTools::ExpandListArgument(knownFeatures, featuresVec);
+ if (std::find(featuresVec.begin(),
+ featuresVec.end(),
+ parameters[1]) == featuresVec.end())
+ {
+ reportError(context, content->GetOriginalExpression(),
+ "Unknown feature!");
+ return std::string();
+ }
+ const char *tgtProp =
+ context->HeadTarget->GetProperty("COMPILE_FEATURES");
+ if(!tgtProp)
+ {
+ return "0";
+ }
+ featuresVec.clear();
+ cmSystemTools::ExpandListArgument(tgtProp, featuresVec);
+ return std::find(featuresVec.begin(),
+ featuresVec.end(),
+ parameters[1]) == featuresVec.end() ? "0" : "1";
+ }
+} haveFeatureNode;
+
+//----------------------------------------------------------------------------
static const struct ConfigurationNode : public cmGeneratorExpressionNode
{
ConfigurationNode() {}
@@ -1514,6 +1566,8 @@ cmGeneratorExpressionNode* GetNode(const std::string &identifier)
return &joinNode;
else if (identifier == "LINK_ONLY")
return &linkOnlyNode;
+ else if (identifier == "HAVE_COMPILER_FEATURE")
+ return &haveFeatureNode;
return 0;
}
diff --git a/Tests/CMakeCommands/target_compile_features/CMakeLists.txt b/Tests/CMakeCommands/target_compile_features/CMakeLists.txt
index 3a42088..ab79b29 100644
--- a/Tests/CMakeCommands/target_compile_features/CMakeLists.txt
+++ b/Tests/CMakeCommands/target_compile_features/CMakeLists.txt
@@ -31,3 +31,5 @@ target_compile_features(lib_delegating_constructors
add_executable(lib_user lib_user.cpp)
target_link_libraries(lib_user lib_delegating_constructors)
+
+add_subdirectory(feature_conditional_link)
diff --git a/Tests/CMakeCommands/target_compile_features/feature_conditional_link/CMakeLists.txt b/Tests/CMakeCommands/target_compile_features/feature_conditional_link/CMakeLists.txt
new file mode 100644
index 0000000..64c6332
--- /dev/null
+++ b/Tests/CMakeCommands/target_compile_features/feature_conditional_link/CMakeLists.txt
@@ -0,0 +1,26 @@
+
+add_library(no_variadics INTERFACE)
+target_include_directories(no_variadics INTERFACE no_variadics)
+add_library(have_variadics INTERFACE)
+target_include_directories(have_variadics INTERFACE have_variadics)
+
+add_library(maybe_variadics INTERFACE)
+target_link_libraries(maybe_variadics INTERFACE
+ $<$<HAVE_COMPILER_FEATURE:CXX,cxx_variadic_templates>:have_variadics>
+ $<$<NOT:$<HAVE_COMPILER_FEATURE:CXX,cxx_variadic_templates>>:no_variadics>
+)
+
+# Upstream publishes maybe_variadics, we use it below.
+
+add_executable(template_user_with_variadics template_user.cpp)
+target_compile_features(template_user_with_variadics PRIVATE cxx_variadic_templates)
+
+target_link_libraries(template_user_with_variadics
+ maybe_variadics
+)
+
+add_executable(template_user_no_variadics template_user.cpp)
+
+target_link_libraries(template_user_no_variadics
+ maybe_variadics
+)
diff --git a/Tests/CMakeCommands/target_compile_features/feature_conditional_link/have_variadics/interface.h b/Tests/CMakeCommands/target_compile_features/feature_conditional_link/have_variadics/interface.h
new file mode 100644
index 0000000..a4f87c0
--- /dev/null
+++ b/Tests/CMakeCommands/target_compile_features/feature_conditional_link/have_variadics/interface.h
@@ -0,0 +1,20 @@
+template<int I, int... Is>
+struct Interface;
+
+template<int I>
+struct Interface<I>
+{
+ static int accumulate()
+ {
+ return I;
+ }
+};
+
+template<int I, int... Is>
+struct Interface
+{
+ static int accumulate()
+ {
+ return I + Interface<Is...>::accumulate();
+ }
+};
diff --git a/Tests/CMakeCommands/target_compile_features/feature_conditional_link/no_variadics/interface.h b/Tests/CMakeCommands/target_compile_features/feature_conditional_link/no_variadics/interface.h
new file mode 100644
index 0000000..5c5263a
--- /dev/null
+++ b/Tests/CMakeCommands/target_compile_features/feature_conditional_link/no_variadics/interface.h
@@ -0,0 +1,6 @@
+
+template<int I1, int I2 = 0, int I3 = 0, int I4 = 0>
+struct Interface
+{
+ static int accumulate() { return I1 + I2 + I3 + I4; }
+};
diff --git a/Tests/CMakeCommands/target_compile_features/feature_conditional_link/template_user.cpp b/Tests/CMakeCommands/target_compile_features/feature_conditional_link/template_user.cpp
new file mode 100644
index 0000000..f15362c
--- /dev/null
+++ b/Tests/CMakeCommands/target_compile_features/feature_conditional_link/template_user.cpp
@@ -0,0 +1,8 @@
+
+#include <interface.h>
+
+int main(int argc, char **argv)
+{
+ int result = Interface<1, 2, 3, 4>::accumulate();
+ return result == 10 ? 0 : 1;
+}
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=3c061ed76955cab4101f616ee573e32ec688f5f7
commit 3c061ed76955cab4101f616ee573e32ec688f5f7
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Tue Oct 22 15:19:52 2013 +0200
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Thu Nov 28 14:31:18 2013 +0100
Add a cxx_variadic_templates feature.
diff --git a/Help/variable/CMAKE_CXX_KNOWN_FEATURES.rst b/Help/variable/CMAKE_CXX_KNOWN_FEATURES.rst
index 3aa5017..fdc5f82 100644
--- a/Help/variable/CMAKE_CXX_KNOWN_FEATURES.rst
+++ b/Help/variable/CMAKE_CXX_KNOWN_FEATURES.rst
@@ -14,6 +14,11 @@ cxx_delegating_constructors
.. _N1986: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1986.pdf
+cxx_variadic_templates
+ Variadic templates, as defined in N2242_.
+
+.. _N2242: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf
+
gnuxx_typeof
The GNU typeof extension.
diff --git a/Modules/Compiler/Clang-CXX-FeatureTests.cmake b/Modules/Compiler/Clang-CXX-FeatureTests.cmake
index f1eb031..0b2ceca 100644
--- a/Modules/Compiler/Clang-CXX-FeatureTests.cmake
+++ b/Modules/Compiler/Clang-CXX-FeatureTests.cmake
@@ -1,6 +1,7 @@
set(testable_features
cxx_delegating_constructors
+ cxx_variadic_templates
)
foreach(feature ${testable_features})
set(_cmake_feature_test_${feature} "__has_extension(${feature})")
diff --git a/Modules/Compiler/GNU-CXX-FeatureTests.cmake b/Modules/Compiler/GNU-CXX-FeatureTests.cmake
index e48d485..3606ed8 100644
--- a/Modules/Compiler/GNU-CXX-FeatureTests.cmake
+++ b/Modules/Compiler/GNU-CXX-FeatureTests.cmake
@@ -10,3 +10,4 @@ set(_cmake_feature_test_gnuxx_typeof "!defined(__STRICT_ANSI__)")
# set(isCxx11Mode "defined(__GXX_EXPERIMENTAL_CXX0X__)")
set(_cmake_feature_test_cxx_delegating_constructors "(__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L")
+set(_cmake_feature_test_cxx_variadic_templates "(__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L")
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index c4d175f..883468c 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -43,6 +43,7 @@
#define FOR_EACH_CXX_FEATURE(F) \
F(cxx_delegating_constructors) \
+ F(cxx_variadic_templates) \
F(gnuxx_typeof) \
F(msvcxx_sealed)
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=756c56a04bdec9674840bad725ce544151ddee8c
commit 756c56a04bdec9674840bad725ce544151ddee8c
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Thu Nov 28 13:21:25 2013 +0100
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Thu Nov 28 14:31:18 2013 +0100
Remove version checks.
These files can't have version checks as they can be read by a
CMake which has a different compiler loaded.
diff --git a/Modules/Compiler/Clang-CXX-FeatureTests.cmake b/Modules/Compiler/Clang-CXX-FeatureTests.cmake
index 3580afc..f1eb031 100644
--- a/Modules/Compiler/Clang-CXX-FeatureTests.cmake
+++ b/Modules/Compiler/Clang-CXX-FeatureTests.cmake
@@ -1,9 +1,4 @@
-if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 2.1)
- # This file is only loaded if Clang >= 2.1
- message(FATAL_ERROR "This file should not be included for Clang < 2.1.")
-endif()
-
set(testable_features
cxx_delegating_constructors
)
diff --git a/Modules/Compiler/GNU-CXX-FeatureTests.cmake b/Modules/Compiler/GNU-CXX-FeatureTests.cmake
index 13c6128..e48d485 100644
--- a/Modules/Compiler/GNU-CXX-FeatureTests.cmake
+++ b/Modules/Compiler/GNU-CXX-FeatureTests.cmake
@@ -1,11 +1,6 @@
set(_cmake_feature_test_gnuxx_typeof "!defined(__STRICT_ANSI__)")
-if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.3)
- # This file is only loaded if GCC >= 4.3
- message(FATAL_ERROR "This file should not be included for GCC < 4.3.")
-endif()
-
# For GCC 4.7, we can test the standard __cplusplus macro, ...
# set(isCxx98Mode "__cplusplus >= 199711L")
# set(isCxx11Mode "__cplusplus >= 201103L")
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=38a6d6fd2bb50d4defa9243a6ebe926ea2f90526
commit 38a6d6fd2bb50d4defa9243a6ebe926ea2f90526
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Thu Nov 28 12:01:06 2013 +0100
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Thu Nov 28 12:01:29 2013 +0100
Add version checks for compilers.
diff --git a/Tests/CMakeCommands/target_compile_features/CMakeLists.txt b/Tests/CMakeCommands/target_compile_features/CMakeLists.txt
index 128de0f..3a42088 100644
--- a/Tests/CMakeCommands/target_compile_features/CMakeLists.txt
+++ b/Tests/CMakeCommands/target_compile_features/CMakeLists.txt
@@ -9,8 +9,7 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL GNU
add_executable(gnuxx_typeof_test gnuxx_typeof_test.cpp)
target_compile_features(gnuxx_typeof_test PRIVATE gnuxx_typeof)
endif()
-if ("${CMAKE_CXX_COMPILER}" MATCHES "MSVC"
- AND NOT MSVC_VERSION VERSION_LESS 1400)
+if (CMAKE_CXX_COMPILER_ID MATCHES MSVC)
add_executable(msvcxx_sealed_test msvcxx_sealed_test.cpp)
target_compile_features(msvcxx_sealed_test PRIVATE msvcxx_sealed)
endif()
diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index b7e502d..d2a2c33 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -2203,7 +2203,12 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
ADD_TEST_MACRO(CMakeCommands.target_include_directories target_include_directories)
ADD_TEST_MACRO(CMakeCommands.target_compile_definitions target_compile_definitions)
ADD_TEST_MACRO(CMakeCommands.target_compile_options target_compile_options)
- ADD_TEST_MACRO(CMakeCommands.target_compile_features target_compile_features)
+
+ if ((CMAKE_CXX_COMPILER_ID STREQUAL GNU AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.3)
+ OR CMAKE_CXX_COMPILER_ID STREQUAL Clang
+ OR (CMAKE_CXX_COMPILER_ID STREQUAL MSVC AND NOT MSVC_VERSION VERSION_LESS 1400))
+ ADD_TEST_MACRO(CMakeCommands.target_compile_features target_compile_features)
+ endif()
ADD_TEST_MACRO(compile_features compile_features)
configure_file(
-----------------------------------------------------------------------
Summary of changes:
Help/manual/cmake-generator-expressions.7.rst | 2 +
Help/variable/CMAKE_CXX_KNOWN_FEATURES.rst | 5 +
Modules/CMakeCXXCompiler.cmake.in | 1 +
Modules/CMakeDetermineCompileFeatures.cmake | 3 +
Modules/Compiler/Clang-CXX-FeatureTests.cmake | 7 +-
Modules/Compiler/GNU-CXX-FeatureTests.cmake | 9 +-
Modules/Compiler/MSVC-CXX-FeatureTests.cmake | 2 +
Modules/WriteCompilerDetectionHeader.cmake | 124 ++++++++++++++++++++
Source/cmGeneratorExpressionEvaluator.cxx | 54 +++++++++
Source/cmMakefile.cxx | 2 +
.../target_compile_features/CMakeLists.txt | 12 ++-
.../target_compile_features/binary_literals.cpp | 6 +
.../feature_conditional_link/CMakeLists.txt | 26 ++++
.../have_variadics/interface.h | 20 +++
.../no_variadics/interface.h | 6 +
.../feature_conditional_link/template_user.cpp | 8 ++
Tests/CMakeLists.txt | 12 ++-
.../WriteCompilerDetectionHeader/CMakeLists.txt | 97 +++++++++++++++
Tests/Module/WriteCompilerDetectionHeader/main.cpp | 34 ++++++
Tests/SystemInformation/SystemInformation.in | 1 +
20 files changed, 419 insertions(+), 12 deletions(-)
create mode 100644 Modules/WriteCompilerDetectionHeader.cmake
create mode 100644 Tests/CMakeCommands/target_compile_features/binary_literals.cpp
create mode 100644 Tests/CMakeCommands/target_compile_features/feature_conditional_link/CMakeLists.txt
create mode 100644 Tests/CMakeCommands/target_compile_features/feature_conditional_link/have_variadics/interface.h
create mode 100644 Tests/CMakeCommands/target_compile_features/feature_conditional_link/no_variadics/interface.h
create mode 100644 Tests/CMakeCommands/target_compile_features/feature_conditional_link/template_user.cpp
create mode 100644 Tests/Module/WriteCompilerDetectionHeader/CMakeLists.txt
create mode 100644 Tests/Module/WriteCompilerDetectionHeader/main.cpp
hooks/post-receive
--
CMake
More information about the Cmake-commits
mailing list