Skip to content

Commit

Permalink
Updated CMakeLists to fix certain conan behavior
Browse files Browse the repository at this point in the history
  • Loading branch information
msparapa committed Mar 15, 2024
1 parent c4de551 commit fe70a13
Showing 1 changed file with 106 additions and 54 deletions.
160 changes: 106 additions & 54 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,79 +1,131 @@
cmake_minimum_required(VERSION 3.19)
cmake_minimum_required(VERSION 3.23)

get_directory_property(hasParent PARENT_DIRECTORY)
project("Lielab"
VERSION 0.1.1
LANGUAGES CXX)

if (hasParent)
# Is an add_subdirectory() of another project.
# Only compile the lielab module (for now).
option(LIELAB_BUILD_TESTS "Build Lielab tests" OFF)
option(LIELAB_BUILD_PYTHON "Build Lielab python module" OFF)
if (CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
# Is top level, compile everything.
# Is "PROJECT_IS_TOP_LEVEL" the same thing?
set(IS_TOPLEVEL_PROJECT TRUE)
else()
# Top level directory. Compile everything.
option(LIELAB_BUILD_TESTS "Build Lielab tests" ON)
option(LIELAB_BUILD_PYTHON "Build Lielab python module" ON)
# Not top level. Imported into another project.
set(IS_TOPLEVEL_PROJECT FALSE)
endif()

option(LIELAB_INSTALL_LIBRARY "Install Lielab into default locations." ${IS_TOPLEVEL_PROJECT})
option(LIELAB_BUILD_TESTS "Build lielab tests" ${IS_TOPLEVEL_PROJECT})
option(LIELAB_BUILD_PYTHON "Build lielab python module" ${IS_TOPLEVEL_PROJECT})

################################
# Make the main project
#
# Always build this regardless of how this CMakeLists is called.
################################
project("Lielab" LANGUAGES CXX)
include(GNUInstallDirs)

add_library(Lielab INTERFACE)
add_library(Lielab::Lielab ALIAS Lielab)
target_include_directories(Lielab INTERFACE "lielab")

target_include_directories(Lielab INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/lielab>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)


# Uncomment these if you want to manually include dependencies and build with CMake.
# add_subdirectory(include/Catch2)
# add_subdirectory(include/Eigen3)
# add_subdirectory(include/pybind11)

# Eigen3 required for the header only pure C++ version
find_package(Eigen3 REQUIRED)
# if (NOT DEFINED Eigen3_FOUND)
# find_package(Eigen3 REQUIRED)
# endif()

if (LIELAB_INSTALL_LIBRARY)
# TODO: Are these needed?
# PUBLIC_HEADER DESTINATION include COMPONENT Development
# BUNDLE DESTINATION bin COMPONENT Runtime
install(TARGETS Lielab
EXPORT LielabTargets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

include(CMakePackageConfigHelpers)
# configure_package_config_file(
# "${PROJECT_SOURCE_DIR}/cmake/LielabConfig.cmake.in"
# "${PROJECT_BINARY_DIR}/LielabConfig.cmake"
# INSTALL_DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/Lielab/cmake
# )

# install(EXPORT LielabTargets
# FILE LielabTargets.cmake
# NAMESPACE Lielab::
# DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/Lielab/cmake)

# install(FILES "${PROJECT_BINARY_DIR}/LielabConfigVersion.cmake"
# "${PROJECT_BINARY_DIR}/LielabConfig.cmake"
# DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/Lielab/cmake)

# Copy the extra files in the root
# install(FILES Lielab.hpp
# DESTINATION include)
install(FILES LICENSE
DESTINATION licenses)

# Copy the whole "lielab" directory
install(DIRECTORY ${PROJECT_SOURCE_DIR}/lielab DESTINATION include)
endif()


###
# add sources so target shows up in IDE
file(GLOB Lielab_main_files "lielab/*.hpp" "lielab/lielab" "lielab/topos" "lielab/functions" "lielab/domain")
file(GLOB Lielab_domain_files "lielab/src/domain/*.hpp")
file(GLOB Lielab_domain_liealgebras_files "lielab/src/domain/liealgebras/*.hpp")
file(GLOB Lielab_domain_liegroups_files "lielab/src/domain/liegroups/*.hpp")
file(GLOB Lielab_domain_ops_files "lielab/src/domain/ops/*.hpp")
file(GLOB Lielab_functions_files "lielab/src/functions/*.hpp")
file(GLOB Lielab_topos_files "lielab/src/topos/*.hpp")
file(GLOB Lielab_topos_functions_files "lielab/src/topos/functions/*.hpp")
target_sources(Lielab PRIVATE ${Lielab_main_files})
target_sources(Lielab PRIVATE ${Lielab_domain_files})
target_sources(Lielab PRIVATE ${Lielab_domain_liealgebras_files})
target_sources(Lielab PRIVATE ${Lielab_domain_liegroups_files})
target_sources(Lielab PRIVATE ${Lielab_domain_ops_files})
target_sources(Lielab PRIVATE ${Lielab_functions_files})
target_sources(Lielab PRIVATE ${Lielab_topos_files})
target_sources(Lielab PRIVATE ${Lielab_topos_functions_files})

source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/lielab" FILES ${Lielab_main_files})
source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/lielab/src" FILES
${Lielab_domain_files}
${Lielab_domain_liealgebras_files}
${Lielab_domain_liegroups_files}
${Lielab_domain_ops_files}
${Lielab_functions_files}
${Lielab_topos_files}
${Lielab_topos_functions_files})

if(MSVC)
target_compile_definitions(Lielab INTERFACE "_USE_MATH_DEFINES")
target_compile_options(Lielab INTERFACE "-bigobj")
target_compile_options(Lielab INTERFACE "/fp:precise")
target_compile_definitions(Lielab INTERFACE "_CRT_SECURE_NO_WARNINGS")
target_compile_options(Lielab INTERFACE "/Zc:preprocessor") # use new standard-conforming preprocessor by default
# CMake does not set include path correctly for interface targets
get_target_property(EIGEN3_INCLUDE_DIRS Eigen3::Eigen INTERFACE_INCLUDE_DIRECTORIES)
get_target_property(LIELAB_INCLUDE_DIRS Lielab INTERFACE_INCLUDE_DIRECTORIES)
foreach(dir ${EIGEN3_INCLUDE_DIRS} ${LIELAB_INCLUDE_DIRS})
string(APPEND LIELAB_INCLUDE_DIR_STRING "${dir};")
endforeach()
set_target_properties(Lielab PROPERTIES VS_GLOBAL_IncludePath "${LIELAB_INCLUDE_DIR_STRING}")
endif(MSVC)
# file(GLOB Lielab_main_files "lielab/*.hpp" "lielab/lielab" "lielab/topos" "lielab/functions" "lielab/domain")
# file(GLOB Lielab_domain_files "lielab/src/domain/*.hpp")
# file(GLOB Lielab_domain_liealgebras_files "lielab/src/domain/liealgebras/*.hpp")
# file(GLOB Lielab_domain_liegroups_files "lielab/src/domain/liegroups/*.hpp")
# file(GLOB Lielab_domain_ops_files "lielab/src/domain/ops/*.hpp")
# file(GLOB Lielab_functions_files "lielab/src/functions/*.hpp")
# file(GLOB Lielab_topos_files "lielab/src/topos/*.hpp")
# file(GLOB Lielab_topos_functions_files "lielab/src/topos/functions/*.hpp")
# target_sources(Lielab PRIVATE ${Lielab_main_files})
# target_sources(Lielab PRIVATE ${Lielab_domain_files})
# target_sources(Lielab PRIVATE ${Lielab_domain_liealgebras_files})
# target_sources(Lielab PRIVATE ${Lielab_domain_liegroups_files})
# target_sources(Lielab PRIVATE ${Lielab_domain_ops_files})
# target_sources(Lielab PRIVATE ${Lielab_functions_files})
# target_sources(Lielab PRIVATE ${Lielab_topos_files})
# target_sources(Lielab PRIVATE ${Lielab_topos_functions_files})

# source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/lielab" FILES ${Lielab_main_files})
# source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/lielab/src" FILES
# ${Lielab_domain_files}
# ${Lielab_domain_liealgebras_files}
# ${Lielab_domain_liegroups_files}
# ${Lielab_domain_ops_files}
# ${Lielab_functions_files}
# ${Lielab_topos_files}
# ${Lielab_topos_functions_files})

# if(MSVC)
# target_compile_definitions(Lielab INTERFACE "_USE_MATH_DEFINES")
# target_compile_options(Lielab INTERFACE "-bigobj")
# target_compile_options(Lielab INTERFACE "/fp:precise")
# target_compile_definitions(Lielab INTERFACE "_CRT_SECURE_NO_WARNINGS")
# target_compile_options(Lielab INTERFACE "/Zc:preprocessor") # use new standard-conforming preprocessor by default
# # CMake does not set include path correctly for interface targets
# # get_target_property(EIGEN3_INCLUDE_DIRS Eigen3::Eigen INTERFACE_INCLUDE_DIRECTORIES)
# get_target_property(LIELAB_INCLUDE_DIRS Lielab INTERFACE_INCLUDE_DIRECTORIES)
# foreach(dir ${EIGEN3_INCLUDE_DIRS} ${LIELAB_INCLUDE_DIRS})
# string(APPEND LIELAB_INCLUDE_DIR_STRING "${dir};")
# endforeach()
# set_target_properties(Lielab PROPERTIES VS_GLOBAL_IncludePath "${LIELAB_INCLUDE_DIR_STRING}")
# endif(MSVC)
###

# Set C++20
target_compile_features(Lielab INTERFACE cxx_std_20)
Expand Down

0 comments on commit fe70a13

Please sign in to comment.