Skip to content

Commit

Permalink
Build a CUDA printf library separately.
Browse files Browse the repository at this point in the history
  • Loading branch information
eyalroz committed Oct 20, 2021
1 parent 132bee4 commit f96e16b
Showing 1 changed file with 51 additions and 21 deletions.
72 changes: 51 additions & 21 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required (VERSION 3.13)
cmake_minimum_required (VERSION 3.20)

include(CheckTypeSize)

Expand All @@ -10,6 +10,12 @@ project(
VERSION 5.0.0
)

option(BUILD_FOR_CUDA "Built a version of the library for CUDA device-side use" OFF)
if (BUILD_FOR_CUDA)
enable_language(CUDA)
endif()


option(BUILD_TESTS "Build test programs for the library" OFF)
option(BUILD_STATIC_LIBRARY "Build the library as static rather than shared" OFF)

Expand Down Expand Up @@ -62,34 +68,59 @@ if (BUILD_STATIC_LIBRARY)
else()
add_library(printf SHARED)
endif()
set(built_targets printf)

if (BUILD_FOR_CUDA)
add_library(cuda_printf STATIC)
list(APPEND built_targets cuda_printf)
endif()

set(GENERATED_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/include")
configure_file("printf_config.h.in" "${GENERATED_INCLUDE_DIR}/printf_config.h" @ONLY)
target_sources(printf PRIVATE printf.c "${GENERATED_INCLUDE_DIR}/printf_config.h" printf.h)
target_compile_definitions(printf PRIVATE PRINTF_INCLUDE_CONFIG_H)
target_include_directories(printf PRIVATE "$<BUILD_INTERFACE:${GENERATED_INCLUDE_DIR}>")

set_property(TARGET printf PROPERTY C_STANDARD 99)
set_property(TARGET printf PROPERTY C_STANDARD_REQUIRED ON)
set_property(TARGET printf PROPERTY C_EXTENSIONS OFF)

target_include_directories(
foreach(tgt ${built_targets})
target_sources(${tgt} PRIVATE "${GENERATED_INCLUDE_DIR}/printf_config.h" printf.h)
target_compile_definitions(${tgt} PRIVATE PRINTF_INCLUDE_CONFIG_H)
target_include_directories(${tgt}
PRIVATE
"$<BUILD_INTERFACE:${GENERATED_INCLUDE_DIR}>"
${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
)
set_target_properties(${tgt} PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib
ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
endforeach()
target_sources(printf PRIVATE printf.c)
set_target_properties(
printf
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
PUBLIC
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
PROPERTIES
C_STANDARD 99
C_STANDARD_REQUIRED YES
C_EXTENSIONS OFF
)
if (BUILD_FOR_CUDA)
file(WRITE printf.cu
"#include \"printf.c\""
)
target_sources(cuda_printf PRIVATE printf.cu)
set_target_properties(
cuda_printf
PROPERTIES
CUDA_STANDARD_REQUIRED YES
CUDA_EXTENSIONS OFF
CUDA_SEPARABLE_COMPILATION ON
)
endif()

set_target_properties(printf PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib
ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)

if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
if (CMAKE_C_COMPILER_ID STREQUAL "MSVC")
target_compile_options(printf PRIVATE /W4)
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR
CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
elseif (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR
CMAKE_C_COMPILER_ID STREQUAL "Clang")
target_compile_options(printf PRIVATE -Wall -Wextra -pedantic)
endif()
# TODO: Consider also enabling warnings with nvcc or other CUDA compilers

if (BUILD_TESTS)
enable_testing()
Expand All @@ -116,7 +147,6 @@ if (UNIX)
DEPENDS printf
BYPRODUCTS printf.lst
COMMENT Dissassembles the compiled library into an .lst file)

endif()

# -------------------------
Expand Down

0 comments on commit f96e16b

Please sign in to comment.