# 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()