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

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

parent e697fd4d
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_backend_cpu) # 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_cpu) # This will be python module name
set(component cpu) # Target name must be different than pybind target (prefix module name with _ ? _${module_name} ?
############################################## ##############################################
# Import utils CMakeLists # Import utils CMakeLists
...@@ -20,7 +18,7 @@ option(WERROR "Warning as error" OFF) ...@@ -20,7 +18,7 @@ option(WERROR "Warning as error" OFF)
############################################## ##############################################
# Find system dependencies # Find system dependencies
generate_python_binding(${module_name}) # TODO : cannot be component because of target name find_package(aidge_core REQUIRED)
############################################## ##############################################
# Create target and set properties # Create target and set properties
...@@ -28,17 +26,15 @@ generate_python_binding(${module_name}) # TODO : cannot be component because of ...@@ -28,17 +26,15 @@ generate_python_binding(${module_name}) # TODO : cannot be component because of
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})
target_link_libraries(${module_name}
PUBLIC
# namespaced alias _aidge_core # _ is added because we link the target not the project
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>
...@@ -46,45 +42,37 @@ target_include_directories(${component} ...@@ -46,45 +42,37 @@ target_include_directories(${component}
${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src
) )
message(STATUS "INSTALL INCLUDE DIR : ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}") # PYTHON BINDING
message(STATUS "INSTALL LIB DIR : ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") generate_python_binding(${project} ${module_name})
# TODO : is it good ? Get headers already installed
# Need to get shared objects !
target_include_directories(${component}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}>
PRIVATE
${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}
)
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()
...@@ -95,67 +83,50 @@ endif() ...@@ -95,67 +83,50 @@ endif()
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}
) )
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_CPU_ALONE)
project(Aidge_CPU)
cmake_minimum_required(VERSION 3.11)
add_compile_options(-Wall -Wextra -fPIC)
# Need the Core library to compile the CPU library
set(BUILD_CORE_ALONE ON)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../_Core _Core)
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_cpu MODULE ${pybind_src_files} "NO_EXTRAS")
target_include_directories(aidge_cpu PUBLIC ${pybind11_INCLUDE_DIRS} "python_binding")
target_link_libraries(aidge_cpu PUBLIC cpu)
# generate_python_binding(aidge_cpu cpu)
endif()
add_library(cpu STATIC)
# Add include directories
target_include_directories(cpu PUBLIC "include")
# Containers module
file(GLOB_RECURSE src_files "src/*.cpp")
target_sources(cpu PRIVATE ${src_files})
target_link_libraries(cpu PUBLIC core)
set_property(TARGET cpu PROPERTY POSITION_INDEPENDENT_CODE ON)
if (PYBIND)
target_include_directories(cpu PUBLIC $<BUILD_INTERFACE:${PYTHON_INCLUDE_DIRS}>)
target_link_libraries(cpu PRIVATE ${PYTHON_LIBRARIES})
endif()
if (NOT BUILD_CPU_ALONE)
# Activate compile time reducer for aidge_core
set_target_properties(cpu PROPERTIES COTIRE_ADD_UNITY_BUILD FALSE)
# set_target_properties(n2d2_cpu_lib PROPERTIES COTIRE_CXX_PREFIX_HEADER_INIT "include/utils/Precompiled.hpp")
cotire(cpu)
endif()
if (TESTS)
add_subdirectory(tests)
endif()
include(${CMAKE_CURRENT_LIST_DIR}/aidge_backend_cpu-config-version.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/aidge_backend_cpu-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)
...@@ -12,8 +12,9 @@ function(generate_python_binding name) ...@@ -12,8 +12,9 @@ function(generate_python_binding name)
FetchContent_MakeAvailable(PyBind11) FetchContent_MakeAvailable(PyBind11)
message(STATUS "Creating binding for module ${name}") message(STATUS "Creating binding for module ${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()
include(${CMAKE_CURRENT_LIST_DIR}/aidge-cpu-config-version.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/aidge-cpu-targets.cmake)
...@@ -10,7 +10,7 @@ void init_Aidge(py::module& /*m*/){ ...@@ -10,7 +10,7 @@ void init_Aidge(py::module& /*m*/){
} }
PYBIND11_MODULE(aidge_cpu, m) { PYBIND11_MODULE(aidge_backend_cpu, m) {
init_Aidge(m); init_Aidge(m);
} }
} }
enable_testing()
Include(FetchContent) Include(FetchContent)
FetchContent_Declare( FetchContent_Declare(
...@@ -12,14 +10,14 @@ FetchContent_Declare( ...@@ -12,14 +10,14 @@ FetchContent_Declare(
FetchContent_MakeAvailable(Catch2) FetchContent_MakeAvailable(Catch2)
file(GLOB_RECURSE src_files "*.cpp") file(GLOB_RECURSE src_files "*.cpp")
message(STATUS "TEST FILES : ${src_files}")
add_executable(tests${module_name} ${src_files})
add_executable(tests_cpu ${src_files}) target_link_libraries(tests${module_name} PUBLIC ${module_name})
target_link_libraries(tests_cpu PUBLIC cpu)
target_link_libraries(tests_cpu 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_cpu) 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