You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
3.2 KiB

9 months ago
# Creates a CMake target for a given libigl module. This convenience function also defines common
# compilation flags, as well as installation rules for the target. Target sources and dependencies
# need to be added separately.
function(igl_add_library module_name)
# Check if category is `copyleft` or `restricted`
if(${module_name} MATCHES "^igl_copyleft")
set(suffix "_copyleft")
elseif(${module_name} MATCHES "^igl_restricted")
set(suffix "_restricted")
else()
set(suffix "")
endif()
# Check module name
if(NOT ${module_name} MATCHES "^igl_")
message(FATAL_ERROR "Libigl module name should start with 'igl_'")
endif()
string(REPLACE "igl${suffix}_" "" module_shortname ${module_name})
# Define target
if(LIBIGL_USE_STATIC_LIBRARY)
add_library(${module_name} STATIC)
else()
add_library(${module_name} INTERFACE)
endif()
# Alias target name
message(STATUS "Creating target: igl${suffix}::${module_shortname} (${module_name})")
add_library(igl${suffix}::${module_shortname} ALIAS ${module_name})
# Compile definitions
if(LIBIGL_USE_STATIC_LIBRARY)
target_compile_definitions(${module_name} ${IGL_SCOPE} -DIGL_STATIC_LIBRARY)
endif()
# C++11 features
target_compile_features(${module_name} ${IGL_SCOPE} cxx_std_11)
# Other compilation flags
if(MSVC)
# Enable parallel compilation for Visual Studio
target_compile_options(${module_name} ${IGL_SCOPE} $<$<COMPILE_LANGUAGE:CXX>:/MP> $<$<COMPILE_LANGUAGE:CXX>:/bigobj>)
target_compile_definitions(${module_name} ${IGL_SCOPE} -DNOMINMAX)
# Silencing some compilation warnings
if(LIBIGL_USE_STATIC_LIBRARY)
target_compile_options(${module_name} PRIVATE
# Type conversion warnings. These can be fixed with some effort and possibly more verbose code.
/wd4267 # conversion from 'size_t' to 'type', possible loss of data
/wd4244 # conversion from 'type1' to 'type2', possible loss of data
/wd4018 # signed/unsigned mismatch
/wd4305 # truncation from 'double' to 'float'
# This one is from template instantiations generated by autoexplicit.sh:
/wd4667 # no function template defined that matches forced instantiation ()
# This one is easy to fix, just need to switch to safe version of C functions
/wd4996 # this function or variable may be unsafe
# This one is when using bools in adjacency matrices
/wd4804 #'+=': unsafe use of type 'bool' in operation
)
endif()
endif()
# Generate position independent code
if(LIBIGL_POSITION_INDEPENDENT_CODE)
set_target_properties(${module_name} PROPERTIES INTERFACE_POSITION_INDEPENDENT_CODE ON)
if(LIBIGL_USE_STATIC_LIBRARY)
set_target_properties(${module_name} PROPERTIES POSITION_INDEPENDENT_CODE ON)
endif()
endif()
# Folder for IDE
if(LIBIGL_USE_STATIC_LIBRARY OR CMAKE_VERSION VERSION_GREATER_EQUAL 3.19.0)
set_target_properties(${module_name} PROPERTIES FOLDER "Libigl")
endif()
endfunction()