blob: 04a29f17b12db3092aee4f3e8327db74ffc78586 [file] [log] [blame]
# 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()