Skip to content
Snippets Groups Projects
Commit 730ec4ab authored by Cyril Moineau's avatar Cyril Moineau
Browse files

[CMake] Update CMakeLists to enable standalone compilation using Cmake package system.

parent 59855419
No related branches found
No related tags found
No related merge requests found
cmake_minimum_required(VERSION 3.11)
set(project aidge)
set(project aidge_core) # This will also be python module name
set(module_name _${project}) # target name
set(version 2.0.0)
project(${project})
enable_testing()
# TODO : use a file to store module_name ?
set(module_name aidge_core) # This will be python module name
set(component core) # Traget name must be different than pybind target
##############################################
# Import utils CMakeLists
......@@ -20,7 +19,6 @@ option(WERROR "Warning as error" OFF)
##############################################
# Find system dependencies
generate_python_binding(aidge_${module_name}) # TODO : cannot be component because of target name
##############################################
# Create target and set properties
......@@ -28,50 +26,53 @@ generate_python_binding(aidge_${module_name}) # TODO : cannot be component becau
file(GLOB_RECURSE src_files "src/*.cpp")
file(GLOB_RECURSE inc_files "include/*.hpp")
add_library(${component} ${src_files} ${inc_files})
# namespaced alias
add_library(${project}::${component} ALIAS ${component})
add_library(${module_name} ${src_files} ${inc_files})
#Set target properties
set_property(TARGET ${component} PROPERTY POSITION_INDEPENDENT_CODE ON)
target_include_directories(${component}
set_property(TARGET ${module_name} PROPERTY POSITION_INDEPENDENT_CODE ON)
target_include_directories(${module_name}
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src
)
# PYTHON BINDING
generate_python_binding(${project} ${module_name})
if (PYBIND)
message(STATUS "PYTHON INCLUDE DIR : ${PYTHON_INCLUDE_DIRS}")
message(STATUS "PYTHON PYTHON_LIBRARY : ${PYTHON_LIBRARIES}")
target_include_directories(${component}
target_include_directories(${module_name}
PUBLIC
$<BUILD_INTERFACE:${PYTHON_INCLUDE_DIRS}>
)
target_link_libraries(${component}
target_link_libraries(${module_name}
PRIVATE
${PYTHON_LIBRARIES}
)
endif()
target_compile_features(${component} PRIVATE cxx_std_14)
target_compile_features(${module_name} PRIVATE cxx_std_14)
if(WERROR)
target_compile_options(${component} PRIVATE
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:GNU>>:
-Wall -Wextra -Wold-style-cast -Winline -pedantic -Werror=narrowing -Wshadow -Werror>)
target_compile_options(${component} PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:
/W4>)
target_compile_options(${module_name} PRIVATE
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:GNU>>:
-Wall -Wextra -Wold-style-cast -Winline -pedantic -Werror=narrowing -Wshadow -Werror>)
target_compile_options(${module_name} PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:
/W4>)
else()
target_compile_options(${component} PRIVATE
target_compile_options(${module_name} PRIVATE
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:GNU>>:
-Wall -Wextra -Wold-style-cast -Winline -pedantic -Werror=narrowing -Wshadow -Wpedantic>)
target_compile_options(${component} PRIVATE
target_compile_options(${module_name} PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:
/W4>)
endif()
endif()
##############################################
# Installation instructions
......@@ -79,66 +80,51 @@ else()
include(GNUInstallDirs)
set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${project})
install(TARGETS ${component} EXPORT ${component}-targets
COMPONENT ${component}
install(TARGETS ${module_name} EXPORT ${project}-targets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
#Export the targets to a script
install(EXPORT ${component}-targets
FILE "${project}-${component}-targets.cmake"
NAMESPACE ${project}::
DESTINATION ${INSTALL_CONFIGDIR}
COMPONENT ${component}
)
install(EXPORT ${project}-targets
FILE "${project}-targets.cmake"
DESTINATION ${INSTALL_CONFIGDIR}
# COMPONENT ${module_name}
)
#Create a ConfigVersion.cmake file
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/${project}-${component}-config-version.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${project}-config-version.cmake"
VERSION ${version}
COMPATIBILITY AnyNewerVersion
)
configure_package_config_file("${component}-config.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/${project}-${component}-config.cmake"
configure_package_config_file("${project}-config.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/${project}-config.cmake"
INSTALL_DESTINATION ${INSTALL_CONFIGDIR}
)
#Install the config, configversion and custom find modules
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/${project}-${component}-config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${project}-${component}-config-version.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${project}-config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${project}-config-version.cmake"
DESTINATION ${INSTALL_CONFIGDIR}
COMPONENT ${component}
)
##############################################
## Exporting from the build tree
export(EXPORT ${component}-targets
FILE "${CMAKE_CURRENT_BINARY_DIR}/${project}-${component}-targets.cmake"
NAMESPACE ${project}::)
export(EXPORT ${project}-targets
FILE "${CMAKE_CURRENT_BINARY_DIR}/${project}-targets.cmake")
##############################################
## Add test
enable_testing()
add_subdirectory(unit_tests)
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${CMAKE_BINARY_DIR}/${project}-config-version.cmake"
VERSION ${version}
COMPATIBILITY AnyNewerVersion
)
# install(
# FILES
# "${CMAKE_BINARY_DIR}/${project}-config.cmake"
# DESTINATION lib/cmake/${project}
# )
if (BUILD_CORE_ALONE)
project(Aidge_Core)
cmake_minimum_required(VERSION 3.11)
add_compile_options(-Wall -Wextra -fPIC)
endif()
if (PYBIND)
add_definitions(-DPYBIND)
Include(FetchContent)
FetchContent_Declare(
PyBind11
GIT_REPOSITORY https://github.com/pybind/pybind11.git
GIT_TAG v2.10.4 # or a later release
)
FetchContent_MakeAvailable(PyBind11)
file(GLOB_RECURSE pybind_src_files "python_binding/*.cpp")
pybind11_add_module(aidge_core MODULE ${pybind_src_files} "NO_EXTRAS")
target_include_directories(aidge_core PUBLIC ${pybind11_INCLUDE_DIRS} "python_binding")
target_link_libraries(aidge_core PUBLIC core)
# generate_python_binding(aidge_core core)
endif()
add_library(core STATIC)
# Add include directories
target_include_directories(core PUBLIC "include")
# Containers module
file(GLOB_RECURSE src_files "src/*.cpp")
target_sources(core PRIVATE ${src_files})
set_property(TARGET core PROPERTY POSITION_INDEPENDENT_CODE ON)
if (PYBIND)
target_include_directories(core PUBLIC $<BUILD_INTERFACE:${PYTHON_INCLUDE_DIRS}>)
target_link_libraries(core PRIVATE ${PYTHON_LIBRARIES})
endif()
if (NOT BUILD_CORE_ALONE)
# Activate compile time reducer for aidge_core
set_target_properties(core PROPERTIES COTIRE_ADD_UNITY_BUILD FALSE)
# set_target_properties(n2d2_cpu_lib PROPERTIES COTIRE_CXX_PREFIX_HEADER_INIT "include/utils/Precompiled.hpp")
cotire(core)
endif()
if (TESTS)
add_subdirectory(tests)
endif()
\ No newline at end of file
@PACKAGE_INIT@
include(${CMAKE_CURRENT_LIST_DIR}/aidge_core-config-version.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/aidge_core-targets.cmake)
function(generate_python_binding name)
function(generate_python_binding name target_to_bind)
if (PYBIND)
add_definitions(-DPYBIND)
Include(FetchContent)
......@@ -14,6 +14,7 @@ function(generate_python_binding name)
file(GLOB_RECURSE pybind_src_files "python_binding/*.cpp")
pybind11_add_module(${name} MODULE ${pybind_src_files})
target_include_directories(${name} PUBLIC ${pybind11_INCLUDE_DIRS} "python_binding")
target_link_libraries(${name} PUBLIC ${component})
target_link_libraries(${name} PUBLIC ${target_to_bind})
endif()
endfunction()
enable_testing()
Include(FetchContent)
FetchContent_Declare(
......@@ -13,13 +10,13 @@ FetchContent_MakeAvailable(Catch2)
file(GLOB_RECURSE src_files "*.cpp")
add_executable(tests_core ${src_files})
add_executable(tests${module_name} ${src_files})
target_link_libraries(tests_core PUBLIC core)
target_link_libraries(tests${module_name} PUBLIC ${module_name})
target_link_libraries(tests_core PRIVATE Catch2::Catch2WithMain)
target_link_libraries(tests${module_name} PRIVATE Catch2::Catch2WithMain)
list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras)
include(CTest)
include(Catch)
catch_discover_tests(tests_core)
catch_discover_tests(tests${module_name})
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment