217 lines
5.3 KiB
CMake
217 lines
5.3 KiB
CMake
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})
|
|
|