140 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			CMake
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
	
		
			5.3 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})
 | |
| 
 | |
|         target_link_libraries(${libname} INTERFACE std)
 | |
| 
 | |
|     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})
 | |
| 
 | |
|         target_link_libraries(${libname} PUBLIC std)
 | |
|     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 std)
 | |
|     target_include_directories(${exename} PRIVATE ${PUBLIC_INCLUDE_DIR}
 | |
|                                                   ${PRIVATE_INCLUDE_DIR})
 | |
| endfunction()
 | |
| 
 | |
| function(add_test_module target_lib_name)
 | |
|     if(NOT ${ENABLE_UNIT_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}
 | |
|                                                            std test)
 | |
|     target_include_directories(
 | |
|         ${target_lib_name}_tests
 | |
|         PRIVATE ${PUBLIC_INCLUDE_DIR}
 | |
|         PRIVATE ${PRIVATE_INCLUDE_DIR})
 | |
| endfunction()
 | |
| 
 | |
| function(add_fuzz_module target_lib_name)
 | |
|     if(NOT ${ENABLE_FUZZ_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 fuzz executable ${target_lib_name}_fuzz 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}_fuzz ${source_files})
 | |
|     target_link_libraries(${target_lib_name}_fuzz PRIVATE ${target_lib_name}
 | |
|                                                           std fuzz_test)
 | |
|     target_link_options(${target_lib_name}_fuzz PRIVATE -fsanitize=fuzzer)
 | |
|     target_compile_options(${target_lib_name}_fuzz PRIVATE -fsanitize=fuzzer)
 | |
|     target_include_directories(
 | |
|         ${target_lib_name}_fuzz
 | |
|         PRIVATE ${PUBLIC_INCLUDE_DIR}
 | |
|         PRIVATE ${PRIVATE_INCLUDE_DIR})
 | |
| 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()
 |