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) 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) set(version 2.0.0)
project(${project}) 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 # Import utils CMakeLists
...@@ -20,7 +19,6 @@ option(WERROR "Warning as error" OFF) ...@@ -20,7 +19,6 @@ option(WERROR "Warning as error" OFF)
############################################## ##############################################
# Find system dependencies # Find system dependencies
generate_python_binding(aidge_${module_name}) # TODO : cannot be component because of target name
############################################## ##############################################
# Create target and set properties # Create target and set properties
...@@ -28,50 +26,53 @@ generate_python_binding(aidge_${module_name}) # TODO : cannot be component becau ...@@ -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 src_files "src/*.cpp")
file(GLOB_RECURSE inc_files "include/*.hpp") file(GLOB_RECURSE inc_files "include/*.hpp")
add_library(${component} ${src_files} ${inc_files}) add_library(${module_name} ${src_files} ${inc_files})
# namespaced alias
add_library(${project}::${component} ALIAS ${component})
#Set target properties #Set target properties
set_property(TARGET ${component} PROPERTY POSITION_INDEPENDENT_CODE ON) set_property(TARGET ${module_name} PROPERTY POSITION_INDEPENDENT_CODE ON)
target_include_directories(${component} target_include_directories(${module_name}
PUBLIC PUBLIC
$<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
PRIVATE PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src
) )
# PYTHON BINDING
generate_python_binding(${project} ${module_name})
if (PYBIND) if (PYBIND)
message(STATUS "PYTHON INCLUDE DIR : ${PYTHON_INCLUDE_DIRS}") message(STATUS "PYTHON INCLUDE DIR : ${PYTHON_INCLUDE_DIRS}")
message(STATUS "PYTHON PYTHON_LIBRARY : ${PYTHON_LIBRARIES}") message(STATUS "PYTHON PYTHON_LIBRARY : ${PYTHON_LIBRARIES}")
target_include_directories(${component} target_include_directories(${module_name}
PUBLIC PUBLIC
$<BUILD_INTERFACE:${PYTHON_INCLUDE_DIRS}> $<BUILD_INTERFACE:${PYTHON_INCLUDE_DIRS}>
) )
target_link_libraries(${component} target_link_libraries(${module_name}
PRIVATE PRIVATE
${PYTHON_LIBRARIES} ${PYTHON_LIBRARIES}
) )
endif() endif()
target_compile_features(${component} PRIVATE cxx_std_14)
target_compile_features(${module_name} PRIVATE cxx_std_14)
if(WERROR) if(WERROR)
target_compile_options(${component} PRIVATE target_compile_options(${module_name} PRIVATE
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:GNU>>: $<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:GNU>>:
-Wall -Wextra -Wold-style-cast -Winline -pedantic -Werror=narrowing -Wshadow -Werror>) -Wall -Wextra -Wold-style-cast -Winline -pedantic -Werror=narrowing -Wshadow -Werror>)
target_compile_options(${component} PRIVATE target_compile_options(${module_name} PRIVATE
$<$<CXX_COMPILER_ID:MSVC>: $<$<CXX_COMPILER_ID:MSVC>:
/W4>) /W4>)
else() 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>>: $<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:GNU>>:
-Wall -Wextra -Wold-style-cast -Winline -pedantic -Werror=narrowing -Wshadow -Wpedantic>) -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>: $<$<CXX_COMPILER_ID:MSVC>:
/W4>) /W4>)
endif() endif()
############################################## ##############################################
# Installation instructions # Installation instructions
...@@ -79,66 +80,51 @@ else() ...@@ -79,66 +80,51 @@ else()
include(GNUInstallDirs) include(GNUInstallDirs)
set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${project}) set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${project})
install(TARGETS ${component} EXPORT ${component}-targets install(TARGETS ${module_name} EXPORT ${project}-targets
COMPONENT ${component}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
) )
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
#Export the targets to a script #Export the targets to a script
install(EXPORT ${component}-targets
FILE "${project}-${component}-targets.cmake" install(EXPORT ${project}-targets
NAMESPACE ${project}:: FILE "${project}-targets.cmake"
DESTINATION ${INSTALL_CONFIGDIR} DESTINATION ${INSTALL_CONFIGDIR}
COMPONENT ${component} # COMPONENT ${module_name}
) )
#Create a ConfigVersion.cmake file #Create a ConfigVersion.cmake file
include(CMakePackageConfigHelpers) include(CMakePackageConfigHelpers)
write_basic_package_version_file( write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/${project}-${component}-config-version.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${project}-config-version.cmake"
VERSION ${version} VERSION ${version}
COMPATIBILITY AnyNewerVersion COMPATIBILITY AnyNewerVersion
) )
configure_package_config_file("${component}-config.cmake.in" configure_package_config_file("${project}-config.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/${project}-${component}-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${project}-config.cmake"
INSTALL_DESTINATION ${INSTALL_CONFIGDIR} INSTALL_DESTINATION ${INSTALL_CONFIGDIR}
) )
#Install the config, configversion and custom find modules #Install the config, configversion and custom find modules
install(FILES install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/${project}-${component}-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${project}-config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${project}-${component}-config-version.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${project}-config-version.cmake"
DESTINATION ${INSTALL_CONFIGDIR} DESTINATION ${INSTALL_CONFIGDIR}
COMPONENT ${component}
) )
############################################## ##############################################
## Exporting from the build tree ## Exporting from the build tree
export(EXPORT ${component}-targets export(EXPORT ${project}-targets
FILE "${CMAKE_CURRENT_BINARY_DIR}/${project}-${component}-targets.cmake" FILE "${CMAKE_CURRENT_BINARY_DIR}/${project}-targets.cmake")
NAMESPACE ${project}::)
############################################## ##############################################
## Add test ## Add test
enable_testing()
add_subdirectory(unit_tests) 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-config-version.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/aidge_core-targets.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) if (PYBIND)
add_definitions(-DPYBIND) add_definitions(-DPYBIND)
Include(FetchContent) Include(FetchContent)
...@@ -14,6 +14,7 @@ function(generate_python_binding name) ...@@ -14,6 +14,7 @@ function(generate_python_binding name)
file(GLOB_RECURSE pybind_src_files "python_binding/*.cpp") file(GLOB_RECURSE pybind_src_files "python_binding/*.cpp")
pybind11_add_module(${name} MODULE ${pybind_src_files}) pybind11_add_module(${name} MODULE ${pybind_src_files})
target_include_directories(${name} PUBLIC ${pybind11_INCLUDE_DIRS} "python_binding") 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() endif()
endfunction() endfunction()
enable_testing()
Include(FetchContent) Include(FetchContent)
FetchContent_Declare( FetchContent_Declare(
...@@ -13,13 +10,13 @@ FetchContent_MakeAvailable(Catch2) ...@@ -13,13 +10,13 @@ FetchContent_MakeAvailable(Catch2)
file(GLOB_RECURSE src_files "*.cpp") 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) list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras)
include(CTest) include(CTest)
include(Catch) 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