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()
 |