ICT290 / CMakeLists.txt
CMakeLists.txt
Raw
   cmake_minimum_required(VERSION 3.17)
# set the project name
set(PROJECT_NAME ICT290)
set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
project(${PROJECT_NAME} VERSION 0.1.0 LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 17)

# create bin directory
set(directory ${CMAKE_BINARY_DIR}/bin)
file(MAKE_DIRECTORY ${directory})

enable_testing()

# add associated directory for main executable
add_subdirectory(src)
# add associated directory for tests executable
add_subdirectory(test)

# Add executable
add_executable(${CMAKE_PROJECT_NAME} ${SOURCES})
# Create library (needed to make code accessible to tests)
add_library(${CMAKE_PROJECT_NAME}_lib SHARED STATIC ${SOURCES})

# Build libs
add_subdirectory(lib)
# add resources directory to copy files to binary dir
add_subdirectory(res)

IF (WIN32)
    set_target_properties(SDL2 PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
ELSEIF (UNIX OR APPLE)
    set(MY_TARGET_LIBS
            -lm -ldl -lm -ldl -lX11 -lXrandr -lXi -lstdc++ -lGL -lSDL2 # link libs from system on unix
            )
    target_link_libraries(${PROJECT_NAME} PUBLIC ${MY_TARGET_LIBS})
    target_link_libraries(${PROJECT_NAME}_lib PUBLIC ${MY_TARGET_LIBS})
ENDIF ()

set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

# view cmake dependency tree
#set_property(GLOBAL PROPERTY GLOBAL_DEPENDS_DEBUG_MODE 1)

#Ignore MSVC CRT Secure warnings
if (MSVC)
    add_definitions(-D_CRT_SECURE_NO_WARNINGS)
endif ()

# Set compile options
target_compile_options(${PROJECT_NAME} PRIVATE
        # Clang and AppleClang
        $<$<AND:$<AND:$<CXX_COMPILER_ID:Clang>,$<CONFIG:Debug>>,$<BOOL:${SANITISERS}>>: -Wall -Wextra -Wno-error=deprecated-declarations -march=native -fsanitize=address,undefined,leak>
        $<$<AND:$<AND:$<CXX_COMPILER_ID:Clang>,$<CONFIG:Debug>>,$<NOT:$<BOOL:${SANITISERS}>>>: -Wall -Wextra -Wno-error=deprecated-declarations>
        $<$<AND:$<CXX_COMPILER_ID:Clang>,$<CONFIG:Release>>: -v -Wall -Wextra -Wno-error=deprecated-declarations>

        # GNU GCC/G++
        $<$<AND:$<AND:$<CXX_COMPILER_ID:GNU>,$<CONFIG:Debug>>,$<BOOL:${SANITISERS}>>: -Wall -Wextra -pedantic -fsanitize=address,leak>
        $<$<AND:$<AND:$<CXX_COMPILER_ID:GNU>,$<CONFIG:Debug>>,$<NOT:$<BOOL:${SANITISERS}>>>: -Wall -Wextra -pedantic>
        $<$<AND:$<CXX_COMPILER_ID:GNU>,$<CONFIG:Release>>: -Wall -Wextra -pedantic>

        # MSVC, /wd4201 ignore nameless struct/union for glm
        $<$<AND:$<AND:$<CXX_COMPILER_ID:MSVC>,$<CONFIG:Debug>>,$<BOOL:${SANITISERS}>>: /W4 /wd4201 /fsanitize=address>
        $<$<AND:$<AND:$<CXX_COMPILER_ID:MSVC>,$<CONFIG:Debug>>,$<NOT:$<BOOL:${SANITISERS}>>>: /W4 /wd4201>
        $<$<AND:$<CXX_COMPILER_ID:MSVC>,$<CONFIG:Release>>: /W4 /wd4201>
        )

target_link_options(${PROJECT_NAME} PRIVATE
        # Clang and AppleClang
        $<$<AND:$<AND:$<CXX_COMPILER_ID:Clang>,$<CONFIG:Debug>>,$<BOOL:${SANITISERS}>>: -fsanitize=address,undefined,leak>

        # GNU GCC/G++
        $<$<AND:$<AND:$<CXX_COMPILER_ID:GNU>,$<CONFIG:Debug>>,$<BOOL:${SANITISERS}>>: -fsanitize=address,leak>

        # MSVC
        $<$<AND:$<AND:$<CXX_COMPILER_ID:MSVC>,$<CONFIG:Debug>>,$<BOOL:${SANITISERS}>>: /INFERASANLIBS /WHOLEARCHIVE /DEBUG>
        $<$<CXX_COMPILER_ID:MSVC>:/SubSystem:console>
        )

# Doxygen and graphiz
find_package(Doxygen)
if (DOXYGEN_FOUND)
    set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile)
    add_custom_target(doc ALL
            COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_IN}
            WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src
            COMMENT "Generating API documentation with Doxygen"
            VERBATIM)
endif ()

# Create shortcut to executable
message("-- Creating shortcut to binary")
if (WIN32)
    if (NOT EXISTS ${PROJECT_NAME}.exe)
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND mklink ICT290.exe bin\\${PROJECT_NAME}.exe
                )
    endif ()
elseif (UNIX OR APPLE)
    if (NOT EXISTS ${PROJECT_NAME})
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ln -s bin/${PROJECT_NAME}
                )
    endif ()
endif ()