cmake_minimum_required(VERSION 3.16) ########################################################### # COMPILER CONFIGURATION ########################################################### set(CMAKE_C_COMPILER "clang" CACHE STRING "C compiler" FORCE) set(CMAKE_CXX_COMPILER "clang++" CACHE STRING "C++ compiler" FORCE) set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O2") set(DEPENDENCY_WARNINGS "-w") set(PROJECT_WARNINGS -Werror -W -Wall -Wextra -Wshadow -Wno-unused-result -Wno-unused-function -Wno-implicit-fallthrough) set(PROJECT_PROPERTIES C_STANDARD 99 C_STANDARD_REQUIRED 99 C_EXTENSIONS OFF) if(UNIX) set(PROJECT_PROPERTIES ${PROJECT_PROPERTIES} LINK_FLAGS "-Wl,-rpath,./") endif() ########################################################### # PROJECT ########################################################### set(PROJECT obolos) project(${PROJECT}) ########################################################### # DIRECTORIES ########################################################### set(PACKAGE_DIR ${CMAKE_BINARY_DIR}/package) set(ASSET_DIR ${CMAKE_SOURCE_DIR}/assets/processed) set(3RD_PARTY_DIR ${CMAKE_SOURCE_DIR}/3rd_party) set(SRC_DIR ${CMAKE_SOURCE_DIR}/code/game) set(SHADER_DIR ${CMAKE_SOURCE_DIR}/code/shaders) set(TOOLS_DIR ${CMAKE_SOURCE_DIR}/code/tools) ########################################################### # 3RD PARTY LIBRARIES ########################################################### # glad add_subdirectory(${3RD_PARTY_DIR}/glad EXCLUDE_FROM_ALL) set_target_properties(glad PROPERTIES COMPILE_FLAGS ${DEPENDENCY_WARNINGS}) set_target_properties(glad PROPERTIES LINK_FLAGS_RELEASE -s) # SDL set(SDL_SHARED ON CACHE BOOL "" FORCE) set(SDL_STATIC OFF CACHE BOOL "" FORCE) add_subdirectory(${3RD_PARTY_DIR}/sdl-2.0.20 EXCLUDE_FROM_ALL) set_target_properties(SDL2 PROPERTIES COMPILE_FLAGS ${DEPENDENCY_WARNINGS}) set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE -s) set_target_properties(SDL2main PROPERTIES COMPILE_FLAGS ${DEPENDENCY_WARNINGS}) set_target_properties(SDL2main PROPERTIES LINK_FLAGS_RELEASE -s) ########################################################### # ASSETS ########################################################### add_custom_target(copy_assets ALL) add_custom_command( TARGET copy_assets POST_BUILD COMMAND mkdir -p ${CMAKE_BINARY_DIR}/shaders COMMAND cp -u ${SHADER_DIR}/*.glsl ${CMAKE_BINARY_DIR}/shaders COMMAND cp -u ${ASSET_DIR}/*.bin ${CMAKE_BINARY_DIR}) ########################################################### # BUILD CONFIGURATIONS ########################################################### if (CMAKE_BUILD_TYPE STREQUAL "Release") add_compile_definitions(BUILD_RELEASE) elseif (CMAKE_BUILD_TYPE STREQUAL "Debug") add_compile_definitions(BUILD_DEBUG) endif() ########################################################### # EXECUTABLE ########################################################### set(BIN ${PROJECT}) set(BIN_SRCS ${SRC_DIR}/main.c) set(BIN_LIBS glad SDL2 m) add_executable(${BIN}) set_target_properties(${BIN} PROPERTIES ${PROJECT_PROPERTIES}) set_target_properties(${BIN} PROPERTIES LINK_FLAGS_RELEASE -s) if(WIN32) set(BIN_LIBS ${BIN_LIBS} mingw32 SDL2main) endif() if (CMAKE_BUILD_TYPE STREQUAL "Release") set(BIN_SRCS ${BIN_SRCS} ${SRC_DIR}/glsl.inc) add_custom_command( PRE_BUILD OUTPUT ${SRC_DIR}/glsl.inc COMMAND ${TOOLS_DIR}/scripts/header_generator.sh ${SRC_DIR}/glsl.inc # output ${SHADER_DIR}/geo.glsl # input ${SHADER_DIR}/screen.glsl # input ${SHADER_DIR}/text.glsl # input DEPENDS ${SHADER_DIR}/geo.glsl ${SHADER_DIR}/screen.glsl ${SHADER_DIR}/text.glsl) add_custom_command( TARGET ${BIN} POST_BUILD COMMAND ${CMAKE_COMMAND} -E rm ${SRC_DIR}/glsl.inc) endif() target_sources( ${BIN} PRIVATE ${BIN_SRCS}) target_link_libraries( ${BIN} PRIVATE ${BIN_LIBS}) target_compile_options( ${BIN} PRIVATE ${PROJECT_WARNINGS}) add_custom_target( run COMMAND ${BIN} DEPENDS ${BIN} ${GAME} ${ENGINE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) ########################################################### # GAME LIBRARY ########################################################### if (CMAKE_BUILD_TYPE STREQUAL "Debug") set(GAME game) add_library(${GAME} SHARED) set(GAME_SRCS ${SRC_DIR}/all.c) set(GAME_LIBS glad SDL2 m) # Required for a valid language server compilation database to be generated with unity builds if (CMAKE_EXPORT_COMPILE_COMMANDS) file(GLOB GAME_SRCS ${SRC_DIR}/all.c ${SRC_DIR}/engine.c ${SRC_DIR}/game.c ${SRC_DIR}/engine/*.c ${SRC_DIR}/game/*.c) target_compile_options( ${GAME} PRIVATE -include ${SRC_DIR}/all.c) endif() set_target_properties(${GAME} PROPERTIES ${PROJECT_PROPERTIES}) set_target_properties(${GAME} PROPERTIES LINK_FLAGS_RELEASE -s) target_sources( ${GAME} PRIVATE ${GAME_SRCS}) target_link_libraries( ${GAME} PRIVATE ${GAME_LIBS}) target_compile_options( ${GAME} PRIVATE ${PROJECT_WARNINGS}) endif() ########################################################### # INSTALL ########################################################### list(REMOVE_ITEM BIN_LIBS "m") install( TARGETS ${BIN} ${BIN_LIBS} CONFIGURATIONS Release RUNTIME DESTINATION ${PACKAGE_DIR} LIBRARY DESTINATION ${PACKAGE_DIR}) install( DIRECTORY ${ASSET_DIR}/ CONFIGURATIONS Release DESTINATION ${PACKAGE_DIR})