This repository has been archived by the owner on May 6, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 189
/
Copy pathCMakeLists.txt
137 lines (125 loc) · 5.19 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# Copyright 2014 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
cmake_minimum_required(VERSION 2.8.12)
set(PROJECT_NAME MathFu)
project(MathFu)
# Call fplutil to get locations of dependencies and set common build settings.
include("cmake/find_fplutil.cmake")
include("${fplutil_dir}/buildutil/cmake_common.txt")
set_common_build_variables()
# Options that control the build configuration.
# To configure MathFu flags per build target, see the
# mathfu_configure_flags() function.
option(mathfu_enable_simd "Use SIMD implementations when available." ON)
option(mathfu_build_benchmarks "Build MathFu benchmarks." ON)
option(mathfu_build_tests "Build MathFu unit tests." ON)
# Save the mathfu directory, store this in the cache so that it's globally
# accessible from mathfu_configure_flags().
set(mathfu_dir ${CMAKE_CURRENT_LIST_DIR} CACHE INTERNAL "mathfu directory")
# Set build options for ${target} that are required to build with MathFu.
# This takes the optional arguments "enable_simd force_padding".
#
# If enable_simd is specified it configures whether the project should be
# built with SIMD optimized functions. If force_padding is specified and
# SIMD is enabled, some data structures are padded to work more efficiently
# with SIMD instructions.
#
# If enable_simd is not specified, the mathfu_enable_simd option is used.
# If force_padding isn't specified padding is enabled based upon the
# best general configuration for the target architecture.
function(mathfu_configure_flags target)
if(fpl_ios)
set(enable_simd NO)
else()
set(enable_simd ${mathfu_enable_simd})
endif()
# Add required includes to the target.
target_include_directories(${target}
PRIVATE ${mathfu_dir}/include ${dependencies_vectorial_dir}/include)
# Parse optional arguments.
set(additional_args ${ARGN})
list(LENGTH additional_args num_additional_args)
if(${num_additional_args} GREATER 0)
list(GET additional_args 0 enable_simd)
endif()
if(${num_additional_args} GREATER 1)
list(GET additional_args 1 force_padding)
endif()
# If the SIMD build option is enabled.
if(enable_simd)
# Enable SSE4.1 when building with GCC / Clang.
# NOTE: It's also possible to build the library using using SSE2 with GCC /
# Clang, change -msse4.1 to -msse2.
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR
CMAKE_COMPILER_IS_CLANGXX)
target_compile_options(${target} PRIVATE -msse4.1)
endif()
# Enable SSE2 by default when building with MSVC for 32-bit targets.
# Note that SSE2 is enabled by default for 64-bit targets, and the
# compile option will generate an "unknown option" warning.
if(MSVC AND CMAKE_SIZEOF_VOID_P EQUAL 4)
target_compile_options(${target} PRIVATE /arch:SSE2)
endif()
# Conditionally enable padding.
if(DEFINED force_padding)
if(force_padding)
target_compile_definitions(${target} PRIVATE
-DMATHFU_COMPILE_FORCE_PADDING=1)
else()
target_compile_definitions(${target} PRIVATE
-DMATHFU_COMPILE_FORCE_PADDING=0)
endif()
endif()
else()
target_compile_definitions(${target} PRIVATE
-DMATHFU_COMPILE_WITHOUT_SIMD_SUPPORT)
endif()
endfunction()
# Modify CMAKE_C_FLAGS and CMAKE_CXX_FLAGS to enable a maximum reasonable
# warning level.
function(mathfu_enable_warnings target)
get_target_property(target_compile_flags ${target} COMPILE_FLAGS)
if(MSVC)
# C4127: conditional expression is constant
# C4577: 'noexcept' used with no exception handling mode specified.
target_compile_options(${target} PRIVATE /W4 /WX /wd4127 /wd4577)
elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR
CMAKE_COMPILER_IS_CLANGXX)
# Set the maximum warning level for gcc.
target_compile_options(${target} PRIVATE -Wall -Wextra -Werror
-Wno-long-long -Wno-variadic-macros)
endif()
endfunction()
# Macro defined here so that it can be used by all projects included
macro(mathfu_set_ios_attributes project)
if(fpl_ios)
set_target_properties(${project} PROPERTIES
XCODE_ATTRIBUTE_SDKROOT "iphoneos")
set_target_properties(${project} PROPERTIES
XCODE_ATTRIBUTE_ARCHS "$(ARCHS_STANDARD)")
set_target_properties(${project} PROPERTIES
XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH "NO")
set_target_properties(${project} PROPERTIES
XCODE_ATTRIBUTE_VALID_ARCHS "$(ARCHS_STANDARD)")
set_target_properties(${project} PROPERTIES
XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "8.0")
endif()
endmacro(mathfu_set_ios_attributes)
file(GLOB_RECURSE MATHFU_HEADERS ${CMAKE_CURRENT_LIST_DIR}/include/mathfu *.h)
if(mathfu_build_benchmarks)
add_subdirectory(benchmarks)
endif()
if(mathfu_build_tests)
add_subdirectory(unit_tests)
endif()