cmake_minimum_required(VERSION 3.10) project(videogame) set(CMAKE_CXX_COMPILER "clang++") set(CMAKE_CXX_STANDARD 20) file(GLOB_RECURSE SRC_FILES ./src/*.cpp ./src/game/*.cpp ./src/util/config/*.cpp) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) if(UNIX) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build) else() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) endif() add_executable(app ${SRC_FILES}) find_package(PkgConfig REQUIRED) pkg_check_modules(SDL2 REQUIRED sdl2) pkg_check_modules(FREETYPE REQUIRED freetype2) pkg_check_modules(GLEW REQUIRED glew) find_package(OpenGL REQUIRED) # release build settings set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wno-nontrivial-memcall") # debug build settings if(WIN32) set(CMAKE_CXX_FLAGS_DEBUG "-g -DDEBUG=1 -Wno-nontrivial-memcall") else() set(CMAKE_CXX_FLAGS_DEBUG "-g -DDEBUG=1 -fsanitize=address -Wno-nontrivial-memcall") endif() # Platform-specific linking if(WIN32) function(resolve_static_archives OUT_VAR LIB_DIRS_VAR LIBS_VAR) set(_resolved "") foreach(_lib IN LISTS ${LIBS_VAR}) if(IS_ABSOLUTE "${_lib}") set(_archive_path "${_lib}") else() if(_lib MATCHES "^-") message(FATAL_ERROR "Unexpected link flag in static library list: ${_lib}") endif() find_file( _archive_path NAMES "lib${_lib}.a" "${_lib}.a" PATHS ${${LIB_DIRS_VAR}} NO_DEFAULT_PATH ) if(NOT _archive_path) message(FATAL_ERROR "Could not find static archive for '${_lib}' in: ${${LIB_DIRS_VAR}}") endif() endif() string(TOLOWER "${_archive_path}" _archive_path_lower) if(NOT _archive_path_lower MATCHES "\\.a$" OR _archive_path_lower MATCHES "\\.dll\\.a$") message(FATAL_ERROR "Expected static archive (.a), got: ${_archive_path}") endif() list(APPEND _resolved "${_archive_path}") unset(_archive_path CACHE) endforeach() set(${OUT_VAR} "${_resolved}" PARENT_SCOPE) endfunction() set(SDL2_INCLUDE_DIRS ${SDL2_STATIC_INCLUDE_DIRS}) set(FREETYPE_INCLUDE_DIRS ${FREETYPE_STATIC_INCLUDE_DIRS}) set(GLEW_INCLUDE_DIRS ${GLEW_STATIC_INCLUDE_DIRS}) resolve_static_archives( SDL2_LIBRARIES SDL2_STATIC_LIBRARY_DIRS SDL2_STATIC_LIBRARIES ) resolve_static_archives( FREETYPE_LIBRARIES FREETYPE_STATIC_LIBRARY_DIRS FREETYPE_STATIC_LIBRARIES ) resolve_static_archives( GLEW_LIBRARIES GLEW_STATIC_LIBRARY_DIRS GLEW_STATIC_LIBRARIES ) set(CXX_STDLIB_LIBRARY_DIRS ${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES} ${SDL2_STATIC_LIBRARY_DIRS} ) set(CXX_STDLIB_LIBRARY_NAMES c++ c++abi unwind) resolve_static_archives( CXX_STDLIB_LIBRARIES CXX_STDLIB_LIBRARY_DIRS CXX_STDLIB_LIBRARY_NAMES ) foreach(APP_LINK_OPTION IN LISTS SDL2_STATIC_LDFLAGS_OTHER FREETYPE_STATIC_LDFLAGS_OTHER GLEW_STATIC_LDFLAGS_OTHER) if(NOT APP_LINK_OPTION STREQUAL "") set_property(TARGET app APPEND_STRING PROPERTY LINK_FLAGS " ${APP_LINK_OPTION}") endif() endforeach() target_compile_definitions(app PRIVATE GLEW_STATIC) target_link_libraries(app PRIVATE ${SDL2_LIBRARIES} ${FREETYPE_LIBRARIES} ${GLEW_LIBRARIES} ${CXX_STDLIB_LIBRARIES} ${OPENGL_LIBRARIES} winmm # For timeGetDevCaps, timeBeginPeriod, timeEndPeriod ) else() target_link_libraries(app PRIVATE ${SDL2_LIBRARIES} ${FREETYPE_LIBRARIES} ${GLEW_LIBRARIES} ${OPENGL_LIBRARIES} ) endif() target_include_directories(app PRIVATE ${SDL2_INCLUDE_DIRS} ${FREETYPE_INCLUDE_DIRS} ${GLEW_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIR} ) target_compile_options(app PRIVATE -Wall) target_compile_options(app PRIVATE -Wno-nontrivial-memcall) add_custom_target(debug COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug ${CMAKE_BINARY_DIR} COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Building ~~**DEBUG**~~" ) add_custom_target(release COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Release ${CMAKE_BINARY_DIR} COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Building ~~**RELEASE**~~" )