diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ccf9fc..c698055 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,18 +5,6 @@ project(TensorArray C CXX) include(GNUInstallDirs) # set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}) -file( - GLOB_RECURSE TensorArray_inc - "${PROJECT_SOURCE_DIR}/src/*.h" - "${PROJECT_SOURCE_DIR}/src/*.hh" -) - -install( - FILES ${TensorArray_inc} - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - COMPONENT headers -) - include(cmake/ta_core_config.cmake) include(cmake/ta_layers_config.cmake) include(cmake/ta_interp_config.cmake) diff --git a/cmake/ta_core_config.cmake b/cmake/ta_core_config.cmake index f514b72..e1a2c2a 100644 --- a/cmake/ta_core_config.cmake +++ b/cmake/ta_core_config.cmake @@ -1,24 +1,37 @@ +set(TensorArray_Core_Dir tensor-array/core) + +file( + GLOB TensorArray_Core_inc + "${PROJECT_SOURCE_DIR}/src/${TensorArray_Core_Dir}/*.h" + "${PROJECT_SOURCE_DIR}/src/${TensorArray_Core_Dir}/*.hh" +) + +install( + FILES ${TensorArray_Core_inc} + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${TensorArray_Core_Dir}" + COMPONENT headers +) + include(CheckLanguage) check_language(CUDA) -file(GLOB TensorArray_Core_cc "${PROJECT_SOURCE_DIR}/src/tensor-array/core/*.cc") +file(GLOB TensorArray_Core_cc "${PROJECT_SOURCE_DIR}/src/${TensorArray_Core_Dir}/*.cc") if (CMAKE_CUDA_COMPILER) - file(GLOB TensorArray_Core_cu "${PROJECT_SOURCE_DIR}/src/tensor-array/core/*.cu") + file(GLOB TensorArray_Core_cu "${PROJECT_SOURCE_DIR}/src/${TensorArray_Core_Dir}/*.cu") endif() if(CMAKE_CUDA_COMPILER) enable_language(CUDA) find_package(CUDAToolkit REQUIRED) - add_library(tensorarray_core SHARED ${TensorArray_Core_cc} ${TensorArray_Core_cu}) - set_property(TARGET tensorarray_core PROPERTY CUDA_STANDARD 17) - set_property(TARGET tensorarray_core PROPERTY CUDA_STANDARD_REQUIRED ON) - set_property(TARGET tensorarray_core PROPERTY CUDA_EXTENSIONS OFF) - set_property(TARGET tensorarray_core PROPERTY CUDA_SEPARABLE_COMPILATION ON) - target_include_directories(tensorarray_core PRIVATE $<$:${CUDAToolkit_INCLUDE_DIRS}>) - target_link_libraries(tensorarray_core PRIVATE $<$:CUDA::cublas>) + add_library(tensorarray_core_object OBJECT ${TensorArray_Core_cc} ${TensorArray_Core_cu}) + set_property(TARGET tensorarray_core_object PROPERTY CUDA_STANDARD 17) + set_property(TARGET tensorarray_core_object PROPERTY CUDA_STANDARD_REQUIRED ON) + set_property(TARGET tensorarray_core_object PROPERTY CUDA_EXTENSIONS OFF) + set_property(TARGET tensorarray_core_object PROPERTY CUDA_SEPARABLE_COMPILATION ON) + target_include_directories(tensorarray_core_object PRIVATE $<$:${CUDAToolkit_INCLUDE_DIRS}>) if(MSVC) - target_compile_definitions(tensorarray_core PRIVATE TENSOR_ARRAY_CORE_EXPORTS) + target_compile_definitions(tensorarray_core_object PRIVATE TENSOR_ARRAY_CORE_EXPORTS) endif() # find_package(CUDAToolkit REQUIRED) @@ -26,29 +39,56 @@ if(CMAKE_CUDA_COMPILER) # set(CMAKE_CUDA_SEPARABLE_COMPILATION ON) # list(APPEND CMAKE_CUDA_FLAGS "--default-stream per-thread") else() - add_library(tensorarray_core SHARED ${TensorArray_Core_cc} ${TensorArray_Core_cu}) + add_library(tensorarray_core_object OBJECT ${TensorArray_Core_cc}) endif() - # file(MAKE_DIRECTORY "include/tensor_array/core") -set_property(TARGET tensorarray_core PROPERTY C_STANDARD 11) -set_property(TARGET tensorarray_core PROPERTY C_STANDARD_REQUIRED ON) -set_property(TARGET tensorarray_core PROPERTY C_EXTENSIONS OFF) +set_property(TARGET tensorarray_core_object PROPERTY C_STANDARD 11) +set_property(TARGET tensorarray_core_object PROPERTY C_STANDARD_REQUIRED ON) +set_property(TARGET tensorarray_core_object PROPERTY C_EXTENSIONS OFF) + +set_property(TARGET tensorarray_core_object PROPERTY CXX_STANDARD 17) +set_property(TARGET tensorarray_core_object PROPERTY CXX_STANDARD_REQUIRED ON) +set_property(TARGET tensorarray_core_object PROPERTY CXX_EXTENSIONS OFF) + +# shared libraries need PIC +set_property(TARGET tensorarray_core_object PROPERTY POSITION_INDEPENDENT_CODE 1) -set_property(TARGET tensorarray_core PROPERTY CXX_STANDARD 17) -set_property(TARGET tensorarray_core PROPERTY CXX_STANDARD_REQUIRED ON) -set_property(TARGET tensorarray_core PROPERTY CXX_EXTENSIONS OFF) +# shared and static libraries built from the same object files +add_library(tensorarray_core SHARED $) +add_library(tensorarray_core_static STATIC $) + +if(CUDAToolkit_FOUND) + set_property(TARGET tensorarray_core PROPERTY CUDA_SEPARABLE_COMPILATION ON) + target_link_libraries( + tensorarray_core + PRIVATE $<$:CUDA::cublas> + ) +endif() install( TARGETS tensorarray_core EXPORT TensorArrayTargets - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + COMPONENT Runtime + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/tensor-array" + COMPONENT Runtime + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}/tensor-array" + COMPONENT Development +) + +install( + TARGETS tensorarray_core_static + EXPORT TensorArrayTargets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT Runtime - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/tensor-array + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/tensor-array" COMPONENT Runtime - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/tensor-array/core + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}/tensor-array" COMPONENT Development ) -add_library(TensorArray::Core ALIAS tensorarray_core) +add_library(TensorArray::core ALIAS tensorarray_core) +add_library(TensorArray::core_static ALIAS tensorarray_core_static) +add_library(TensorArray::core_object ALIAS tensorarray_core_object) diff --git a/cmake/ta_interp_config.cmake b/cmake/ta_interp_config.cmake index bcc62c8..9f43e0d 100644 --- a/cmake/ta_interp_config.cmake +++ b/cmake/ta_interp_config.cmake @@ -1,12 +1,26 @@ +set(TensorArray_Interpreter_Dir tensor-array/interp) + +file( + GLOB TensorArray_Interpreter_inc + "${PROJECT_SOURCE_DIR}/src/${TensorArray_Interpreter_Dir}/*.h" + "${PROJECT_SOURCE_DIR}/src/${TensorArray_Interpreter_Dir}/*.hh" +) + +install( + FILES ${TensorArray_Interpreter_inc} + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${TensorArray_Interpreter_Dir}" + COMPONENT headers +) + file( GLOB TensorArray_Interpreter_src - "${PROJECT_SOURCE_DIR}/src/tensor-array/interp/*.c" - "${PROJECT_SOURCE_DIR}/src/tensor-array/interp/*.cc" + "${PROJECT_SOURCE_DIR}/src/${TensorArray_Interpreter_Dir}/*.c" + "${PROJECT_SOURCE_DIR}/src/${TensorArray_Interpreter_Dir}/*.cc" ) add_executable(tensorarray_interpreter ${TensorArray_Interpreter_src}) target_include_directories(tensorarray_interpreter PRIVATE ${PROJECT_SOURCE_DIR}/src) -target_link_libraries(tensorarray_interpreter TensorArray::Core) +target_link_libraries(tensorarray_interpreter PUBLIC TensorArray::core) set_property(TARGET tensorarray_interpreter PROPERTY C_STANDARD 11) set_property(TARGET tensorarray_interpreter PROPERTY C_STANDARD_REQUIRED ON) @@ -19,11 +33,11 @@ set_property(TARGET tensorarray_interpreter PROPERTY CXX_EXTENSIONS OFF) install( TARGETS tensorarray_interpreter EXPORT TensorArrayTargets - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT Runtime - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/tensor-array + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/tensor-array" COMPONENT Runtime - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/tensor-array/interp + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}/tensor-array" COMPONENT Development ) #[[ @@ -33,4 +47,4 @@ install( POST_BUILD COMMAND tensorarray_interpreter) ]] -add_executable(TensorArray::Interpreter ALIAS tensorarray_interpreter) +add_executable(TensorArray::interpreter ALIAS tensorarray_interpreter) diff --git a/cmake/ta_layers_config.cmake b/cmake/ta_layers_config.cmake index d43b446..d0961a9 100644 --- a/cmake/ta_layers_config.cmake +++ b/cmake/ta_layers_config.cmake @@ -1,31 +1,66 @@ -file(GLOB TensorArray_Layers_src "${PROJECT_SOURCE_DIR}/src/tensor-array/layers/*.cc") +set(TensorArray_Layers_Dir tensor-array/layers) -add_library(tensorarray_layers SHARED ${TensorArray_Layers_src}) +file( + GLOB TensorArray_Layers_inc + "${PROJECT_SOURCE_DIR}/src/${TensorArray_Layers_Dir}/*.h" + "${PROJECT_SOURCE_DIR}/src/${TensorArray_Layers_Dir}/*.hh" +) + +install( + FILES ${TensorArray_Layers_inc} + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${TensorArray_Layers_Dir}" + COMPONENT headers +) -target_include_directories(tensorarray_layers PRIVATE ${PROJECT_SOURCE_DIR}/src) -target_link_libraries(tensorarray_layers TensorArray::Core) +file(GLOB TensorArray_Layers_src "${PROJECT_SOURCE_DIR}/src/${TensorArray_Layers_Dir}/*.cc") -set_property(TARGET tensorarray_layers PROPERTY C_STANDARD 11) -set_property(TARGET tensorarray_layers PROPERTY C_STANDARD_REQUIRED ON) -set_property(TARGET tensorarray_layers PROPERTY C_EXTENSIONS OFF) +add_library(tensorarray_layers_object OBJECT ${TensorArray_Layers_src}) -set_property(TARGET tensorarray_layers PROPERTY CXX_STANDARD 17) -set_property(TARGET tensorarray_layers PROPERTY CXX_STANDARD_REQUIRED ON) -set_property(TARGET tensorarray_layers PROPERTY CXX_EXTENSIONS OFF) +target_include_directories(tensorarray_layers_object PRIVATE ${PROJECT_SOURCE_DIR}/src) + +set_property(TARGET tensorarray_layers_object PROPERTY C_STANDARD 11) +set_property(TARGET tensorarray_layers_object PROPERTY C_STANDARD_REQUIRED ON) +set_property(TARGET tensorarray_layers_object PROPERTY C_EXTENSIONS OFF) + +set_property(TARGET tensorarray_layers_object PROPERTY CXX_STANDARD 17) +set_property(TARGET tensorarray_layers_object PROPERTY CXX_STANDARD_REQUIRED ON) +set_property(TARGET tensorarray_layers_object PROPERTY CXX_EXTENSIONS OFF) + +# shared libraries need PIC +set_property(TARGET tensorarray_layers_object PROPERTY POSITION_INDEPENDENT_CODE 1) if(MSVC) - target_compile_definitions(tensorarray_layers PRIVATE TENSOR_ARRAY_LAYERS_EXPORTS) + target_compile_definitions(tensorarray_layers_object PRIVATE TENSOR_ARRAY_LAYERS_EXPORTS) endif() +# shared and static libraries built from the same object files +add_library(tensorarray_layers SHARED $) +add_library(tensorarray_layers_static STATIC $) + +target_link_libraries(tensorarray_layers PUBLIC TensorArray::core) + install( TARGETS tensorarray_layers EXPORT TensorArrayTargets - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + COMPONENT Runtime + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/tensor-array" + COMPONENT Runtime + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}/tensor-array" + COMPONENT Development +) + +install( + TARGETS tensorarray_layers_static + EXPORT TensorArrayTargets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT Runtime - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/tensor-array + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/tensor-array" COMPONENT Runtime - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/tensor-array/layers + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}/tensor-array" COMPONENT Development ) -add_library(TensorArray::Layers ALIAS tensorarray_layers) +add_library(TensorArray::layers ALIAS tensorarray_layers) +add_library(TensorArray::layers_static ALIAS tensorarray_layers_static) +add_library(TensorArray::layers_object ALIAS tensorarray_layers_object) diff --git a/tests/tensor-array/core/cmake/ta_core_tests.cmake b/tests/tensor-array/core/cmake/ta_core_tests.cmake index c5c2914..da6401d 100644 --- a/tests/tensor-array/core/cmake/ta_core_tests.cmake +++ b/tests/tensor-array/core/cmake/ta_core_tests.cmake @@ -17,7 +17,7 @@ create_test_sourcelist( add_executable(tensorarray_core_tests ${TensorArray_tests}) target_include_directories(tensorarray_core_tests PRIVATE ${PROJECT_SOURCE_DIR}/src) -target_link_libraries(tensorarray_core_tests TensorArray::Core) +target_link_libraries(tensorarray_core_tests PUBLIC TensorArray::core) foreach(test ${TensorArray_tests_src}) get_filename_component(TName ${test} NAME_WE)