122 lines
4 KiB
CMake
122 lines
4 KiB
CMake
function (add_library_module libname)
|
|
set(PUBLIC_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/public_includes")
|
|
file(MAKE_DIRECTORY "${PUBLIC_INCLUDE_DIR}")
|
|
file(CREATE_LINK
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/public/"
|
|
"${PUBLIC_INCLUDE_DIR}/${libname}"
|
|
SYMBOLIC
|
|
)
|
|
|
|
if ("${ARGN}" STREQUAL "") # Header only library
|
|
message("Adding INTERFACE library ${libname}")
|
|
add_library(${libname} INTERFACE)
|
|
target_include_directories(${libname} INTERFACE ${PUBLIC_INCLUDE_DIR})
|
|
|
|
# Do not link base against base :D
|
|
if (NOT ${libname} STREQUAL "base")
|
|
target_link_libraries(${libname} INTERFACE base)
|
|
endif ()
|
|
|
|
else () # Compiled library
|
|
set(source_files)
|
|
set(source_directory "${CMAKE_CURRENT_SOURCE_DIR}/private")
|
|
foreach (source_file ${ARGN})
|
|
list(APPEND source_files "${source_directory}/${source_file}")
|
|
endforeach ()
|
|
|
|
message("Adding library ${libname} with source files: ${source_files}")
|
|
add_library(${libname} ${source_files})
|
|
|
|
set(PRIVATE_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/private_includes")
|
|
file(MAKE_DIRECTORY "${PRIVATE_INCLUDE_DIR}")
|
|
file(CREATE_LINK
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/private/"
|
|
"${PRIVATE_INCLUDE_DIR}/${libname}"
|
|
SYMBOLIC
|
|
)
|
|
|
|
target_include_directories(${libname}
|
|
PUBLIC ${PUBLIC_INCLUDE_DIR}
|
|
PRIVATE ${PRIVATE_INCLUDE_DIR}
|
|
)
|
|
|
|
# Do not link base against base :D
|
|
if (NOT ${libname} STREQUAL "base")
|
|
target_link_libraries(${libname} PUBLIC base)
|
|
endif ()
|
|
endif ()
|
|
|
|
endfunction ()
|
|
|
|
function (add_executable_module exename)
|
|
set(source_files)
|
|
set(source_directory "${CMAKE_CURRENT_SOURCE_DIR}/private")
|
|
foreach (source_file ${ARGN})
|
|
list(APPEND source_files "${source_directory}/${source_file}")
|
|
endforeach ()
|
|
|
|
message("Adding executable ${exename} with source files: ${source_files}")
|
|
|
|
set(PUBLIC_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/public_includes")
|
|
file(MAKE_DIRECTORY "${PUBLIC_INCLUDE_DIR}")
|
|
file(CREATE_LINK
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/public/"
|
|
"${PUBLIC_INCLUDE_DIR}/${exename}"
|
|
SYMBOLIC
|
|
)
|
|
set(PRIVATE_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/private_includes")
|
|
file(MAKE_DIRECTORY "${PRIVATE_INCLUDE_DIR}")
|
|
file(CREATE_LINK
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/private/"
|
|
"${PRIVATE_INCLUDE_DIR}${exename}"
|
|
SYMBOLIC
|
|
)
|
|
|
|
add_executable(${exename} ${source_files})
|
|
target_link_libraries(${exename} PRIVATE base)
|
|
target_include_directories(${exename} PRIVATE ${PUBLIC_INCLUDE_DIR} ${PRIVATE_INCLUDE_DIR})
|
|
endfunction ()
|
|
|
|
function (add_test_module target_lib_name)
|
|
if (NOT ${ENABLE_TESTS})
|
|
return()
|
|
endif ()
|
|
|
|
set(source_files)
|
|
set(source_directory "${CMAKE_CURRENT_SOURCE_DIR}/private")
|
|
foreach (source_file ${ARGN})
|
|
list(APPEND source_files "${source_directory}/${source_file}")
|
|
endforeach ()
|
|
|
|
message("Adding test executable ${target_lib_name}_tests with source files: ${source_files}")
|
|
|
|
set(PUBLIC_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/public_includes")
|
|
file(MAKE_DIRECTORY "${PUBLIC_INCLUDE_DIR}")
|
|
file(CREATE_LINK
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/public/"
|
|
"${PUBLIC_INCLUDE_DIR}/${target_lib_name}"
|
|
SYMBOLIC
|
|
)
|
|
set(PRIVATE_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/private_includes")
|
|
file(MAKE_DIRECTORY "${PRIVATE_INCLUDE_DIR}")
|
|
file(CREATE_LINK
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/private/"
|
|
"${PRIVATE_INCLUDE_DIR}${target_lib_name}"
|
|
SYMBOLIC
|
|
)
|
|
|
|
add_executable(${target_lib_name}_tests ${source_files})
|
|
target_link_libraries(${target_lib_name}_tests PRIVATE ${target_lib_name} base test)
|
|
|
|
endfunction ()
|
|
|
|
function (add_option option help)
|
|
option(${option} ${help})
|
|
|
|
if (${option})
|
|
message(STATUS "${option}: ON")
|
|
add_compile_definitions(${option}=1)
|
|
else ()
|
|
message(STATUS "${option}: OFF")
|
|
endif ()
|
|
endfunction ()
|