diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..d19ad21 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,49 @@ +cmake_minimum_required(VERSION 3.21) +project(Engine) + +# set output directories +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/static) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +# configure C11 +set(CMAKE_C_STANDARD 11) # request C11 +set(CMAKE_C_STANDARD_REQUIRED ON) # enforce requested standard +set(CMAKE_C_EXTENSIONS OFF) # disable compiler specific extensions + +# configure C++17 +set(CMAKE_CXX_STANDARD 17) # request C++17 +set(CMAKE_CXX_STANDARD_REQUIRED ON) # enforce requested standard +set(CMAKE_CXX_EXTENSIONS OFF) # disable compiler specific extensions + +# helper function to simplify definition of projects +function(target name) + file(GLOB_RECURSE SRC "${name}/*") # recursively collect all files in sub-folder for project + add_executable(${name} ${SRC}) # define project "name" based on files found in SRC + + #set required warning flags + if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR + "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + target_compile_options(${name} PRIVATE + -Wall # enable "all" warnings + -Wextra # enable extra warnings + -Wpedantic # enable strict conformance warnings + -Wconversion # enable warnings for dangerous implicit conversions + -Werror=vla # disable support for VLAs + ) + target_link_libraries(${name} PRIVATE + m # math library must be explicitly linked on Unix + ) + elseif("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + target_compile_options(${name} PRIVATE + /W4 # enable almost all "necessary" warnings + /permissive- # enforce strict standard compliance + /JMC # optimize debugging experience + /MP # enable parallel compilation + ) + else() + message(WARNING "unknown compiler, no warning flags set!") + endif() +endfunction() + +target(Engine) # Foldername of the source code