C++11: Do CMake-less C++11 checking.
This commit is contained in:
@@ -33,16 +33,6 @@ include (ACGOutput)
|
|||||||
# Definitions
|
# Definitions
|
||||||
# ========================================================================
|
# ========================================================================
|
||||||
|
|
||||||
set(INHIBIT_CXX11_SUPPORT OFF CACHE BOOL "Do not use C++11 even if it is available. (This is mainly useful for unit testing.)")
|
|
||||||
|
|
||||||
if (NOT INHIBIT_CXX11_SUPPORT)
|
|
||||||
find_package (CXX11)
|
|
||||||
|
|
||||||
if (CXX11_FOUND)
|
|
||||||
add_definitions(${CXX11_FLAGS} -DCPP11_ENABLED)
|
|
||||||
endif (CXX11_FOUND)
|
|
||||||
endif (NOT INHIBIT_CXX11_SUPPORT)
|
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
add_definitions(
|
add_definitions(
|
||||||
-D_USE_MATH_DEFINES -DNOMINMAX
|
-D_USE_MATH_DEFINES -DNOMINMAX
|
||||||
@@ -107,12 +97,6 @@ else()
|
|||||||
set (OPENMESH_FOUND true PARENT_SCOPE)
|
set (OPENMESH_FOUND true PARENT_SCOPE)
|
||||||
set (OPENMESH_LIBRARIES OpenMeshCore OpenMeshTools PARENT_SCOPE)
|
set (OPENMESH_LIBRARIES OpenMeshCore OpenMeshTools PARENT_SCOPE)
|
||||||
set (OPENMESH_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/src" PARENT_SCOPE)
|
set (OPENMESH_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/src" PARENT_SCOPE)
|
||||||
set (OPENMESH_FLAGS "" PARENT_SCOPE)
|
|
||||||
if (NOT INHIBIT_CXX11_SUPPORT)
|
|
||||||
if (CXX11_FOUND)
|
|
||||||
set(OPENMESH_FLAGS "${CXX11_FLAGS};-DCPP11_ENABLED" PARENT_SCOPE)
|
|
||||||
endif (CXX11_FOUND)
|
|
||||||
endif (NOT INHIBIT_CXX11_SUPPORT)
|
|
||||||
|
|
||||||
# Also define variables provided by the old legacy finder.
|
# Also define variables provided by the old legacy finder.
|
||||||
set (OPENMESH_CORE_LIBRARY OpenMeshCore PARENT_SCOPE)
|
set (OPENMESH_CORE_LIBRARY OpenMeshCore PARENT_SCOPE)
|
||||||
|
|||||||
@@ -1,71 +0,0 @@
|
|||||||
IF (NOT CXX11_FLAGS OR NOT CXX11_FOUND)
|
|
||||||
include(CheckCXXSourceCompiles)
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
|
|
||||||
set(CXX11_FLAG_CANDIDATES
|
|
||||||
#Gnu and Intel Linux
|
|
||||||
"-std=c++11"
|
|
||||||
#Microsoft Visual Studio, and everything that automatically accepts C++11
|
|
||||||
" "
|
|
||||||
#Intel windows
|
|
||||||
"/Qstd=c++0x"
|
|
||||||
)
|
|
||||||
|
|
||||||
set(CXX11_TEST_SOURCE
|
|
||||||
"
|
|
||||||
#include <algorithm>
|
|
||||||
#include <utility>
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
class Matrix {
|
|
||||||
public:
|
|
||||||
// Initializer lists
|
|
||||||
Matrix(int a, int b, int c, int d)
|
|
||||||
: data {a, b, c, d}
|
|
||||||
{
|
|
||||||
// Lambda functions
|
|
||||||
std::transform(data, data+4, data,
|
|
||||||
[](int x) { return x+1; });
|
|
||||||
}
|
|
||||||
|
|
||||||
// rvalue references
|
|
||||||
Matrix(Matrix &&rhs) {
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
int data[4];
|
|
||||||
};
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
int n[] {4,7,6,1,2};
|
|
||||||
// auto
|
|
||||||
for (auto i : n) {
|
|
||||||
Matrix mat (3,5,1,2);
|
|
||||||
|
|
||||||
// std::move, unique_ptr
|
|
||||||
std::unique_ptr<Matrix> m2(
|
|
||||||
new Matrix(std::move(mat)));
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
")
|
|
||||||
|
|
||||||
foreach(FLAG ${CXX11_FLAG_CANDIDATES})
|
|
||||||
set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
|
|
||||||
set(CMAKE_REQUIRED_FLAGS "${FLAG}")
|
|
||||||
unset(CXX11_FLAG_DETECTED CACHE)
|
|
||||||
|
|
||||||
check_cxx_source_compiles("${CXX11_TEST_SOURCE}" CXX11_FLAG_DETECTED)
|
|
||||||
set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
|
|
||||||
if(CXX11_FLAG_DETECTED)
|
|
||||||
set(CXX11_FLAGS_INTERNAL "${FLAG}")
|
|
||||||
break()
|
|
||||||
endif(CXX11_FLAG_DETECTED)
|
|
||||||
endforeach(FLAG ${CXX11_FLAG_CANDIDATES})
|
|
||||||
|
|
||||||
set(CXX11_FLAGS "${CXX11_FLAGS_INTERNAL}")
|
|
||||||
|
|
||||||
find_package_handle_standard_args(CXX11 DEFAULT_MSG CXX11_FLAGS)
|
|
||||||
mark_as_advanced(CXX11_FLAGS)
|
|
||||||
ENDIF()
|
|
||||||
@@ -77,7 +77,7 @@
|
|||||||
#include <xmmintrin.h>
|
#include <xmmintrin.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CPP11_ENABLED
|
#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <initializer_list>
|
#include <initializer_list>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
@@ -92,7 +92,7 @@ namespace OpenMesh {
|
|||||||
//== CLASS DEFINITION =========================================================
|
//== CLASS DEFINITION =========================================================
|
||||||
|
|
||||||
|
|
||||||
#if CPP11_ENABLED
|
#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
||||||
/*
|
/*
|
||||||
* Helpers for VectorT
|
* Helpers for VectorT
|
||||||
*/
|
*/
|
||||||
@@ -121,7 +121,7 @@ struct are_convertible_to<To, From> : public std::is_convertible<From, To> {};
|
|||||||
*/
|
*/
|
||||||
template<typename Scalar, int N> class VectorDataT {
|
template<typename Scalar, int N> class VectorDataT {
|
||||||
public:
|
public:
|
||||||
#ifdef CPP11_ENABLED
|
#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
||||||
VectorDataT() {}
|
VectorDataT() {}
|
||||||
|
|
||||||
template<typename... T>
|
template<typename... T>
|
||||||
@@ -141,7 +141,7 @@ template<typename Scalar, int N> class VectorDataT {
|
|||||||
/// This specialization enables us to use aligned SSE instructions.
|
/// This specialization enables us to use aligned SSE instructions.
|
||||||
template<> class VectorDataT<float, 4> {
|
template<> class VectorDataT<float, 4> {
|
||||||
public:
|
public:
|
||||||
#ifdef CPP11_ENABLED
|
#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
||||||
VectorDataT() {}
|
VectorDataT() {}
|
||||||
|
|
||||||
template<typename... T>
|
template<typename... T>
|
||||||
@@ -152,7 +152,7 @@ template<> class VectorDataT<float, 4> {
|
|||||||
#endif
|
#endif
|
||||||
union {
|
union {
|
||||||
__m128 m128;
|
__m128 m128;
|
||||||
#ifdef CPP11_ENABLED
|
#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
||||||
std::array<float, 4> values_;
|
std::array<float, 4> values_;
|
||||||
#else
|
#else
|
||||||
float values_[4];
|
float values_[4];
|
||||||
@@ -432,7 +432,7 @@ typedef VectorT<double,6> Vec6d;
|
|||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
|
||||||
|
|
||||||
#ifdef CPP11_ENABLED
|
#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
||||||
/**
|
/**
|
||||||
* Literal operator for inline specification of colors in HTML syntax.
|
* Literal operator for inline specification of colors in HTML syntax.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ public:
|
|||||||
/// default constructor creates uninitialized values.
|
/// default constructor creates uninitialized values.
|
||||||
inline VectorT() {}
|
inline VectorT() {}
|
||||||
|
|
||||||
#ifdef CPP11_ENABLED
|
#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
||||||
explicit inline VectorT(const Scalar &v) {
|
explicit inline VectorT(const Scalar &v) {
|
||||||
vectorize(v);
|
vectorize(v);
|
||||||
}
|
}
|
||||||
@@ -199,7 +199,7 @@ public:
|
|||||||
// /// cast to const Scalar array
|
// /// cast to const Scalar array
|
||||||
// inline operator const Scalar*() const { return Base::values_; }
|
// inline operator const Scalar*() const { return Base::values_; }
|
||||||
|
|
||||||
#ifdef CPP11_ENABLED
|
#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
||||||
/// access to Scalar array
|
/// access to Scalar array
|
||||||
inline Scalar* data() { return Base::values_.data(); }
|
inline Scalar* data() { return Base::values_.data(); }
|
||||||
|
|
||||||
|
|||||||
@@ -22,16 +22,6 @@ if ( OPENMESH_BUILD_UNIT_TESTS )
|
|||||||
# set additional link directories
|
# set additional link directories
|
||||||
link_directories(${GTEST_LIBRARY_DIR} )
|
link_directories(${GTEST_LIBRARY_DIR} )
|
||||||
|
|
||||||
set(INHIBIT_CXX11_SUPPORT OFF CACHE BOOL "Do not use C++11 even if it is available. (This is mainly useful for unit testing.)")
|
|
||||||
|
|
||||||
if (NOT INHIBIT_CXX11_SUPPORT)
|
|
||||||
find_package (CXX11)
|
|
||||||
|
|
||||||
if (CXX11_FOUND)
|
|
||||||
add_definitions(${CXX11_FLAGS} -DCPP11_ENABLED)
|
|
||||||
endif (CXX11_FOUND)
|
|
||||||
endif (NOT INHIBIT_CXX11_SUPPORT)
|
|
||||||
|
|
||||||
if ( CMAKE_GENERATOR MATCHES "^Visual Studio 11.*" )
|
if ( CMAKE_GENERATOR MATCHES "^Visual Studio 11.*" )
|
||||||
add_definitions( /D _VARIADIC_MAX=10 )
|
add_definitions( /D _VARIADIC_MAX=10 )
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ TEST_F(OpenMeshVectorTest, VectorCasting) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CPP11_ENABLED
|
#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
||||||
TEST_F(OpenMeshVectorTest, cpp11_constructors) {
|
TEST_F(OpenMeshVectorTest, cpp11_constructors) {
|
||||||
OpenMesh::Vec3d vec1 { 1.2, 2.0, 3.0 };
|
OpenMesh::Vec3d vec1 { 1.2, 2.0, 3.0 };
|
||||||
|
|
||||||
@@ -113,6 +113,8 @@ TEST_F(OpenMeshVectorTest, cpp11_constructors) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(OpenMeshVectorTest, cpp11_htmlColorLiteral) {
|
TEST_F(OpenMeshVectorTest, cpp11_htmlColorLiteral) {
|
||||||
|
static constexpr OpenMesh::Vec4f rose = 0xFFC7F1FF_htmlColor;
|
||||||
|
|
||||||
const OpenMesh::Vec4f light_blue = 0x1FCFFFFF_htmlColor;
|
const OpenMesh::Vec4f light_blue = 0x1FCFFFFF_htmlColor;
|
||||||
EXPECT_LE((OpenMesh::Vec4f(0.1215686274f, 0.8117647058f, 1.0f, 1.0f)
|
EXPECT_LE((OpenMesh::Vec4f(0.1215686274f, 0.8117647058f, 1.0f, 1.0f)
|
||||||
- light_blue).sqrnorm(), 1e-10);
|
- light_blue).sqrnorm(), 1e-10);
|
||||||
|
|||||||
Reference in New Issue
Block a user