cmake_minimum_required(VERSION 3.13) option(PS1_BUILD "Build for the original Sony Playstation" OFF) option(HOST_BUILD "Build for host platform using SDL-1.2" OFF) option(WIN9X_BUILD "Build for Win9x using SDL-1.2" OFF) if(NOT PS1_BUILD AND NOT HOST_BUILD AND NOT WIN9X_BUILD) message(FATAL_ERROR "Please define target platform. Available options: PS1_BUILD HOST_BUILD WIN9X_BUILD Run CMake again using one of the available platforms e.g.: cmake .. -DPS1_BUILD=1") endif() if(PS1_BUILD) if("$ENV{PSXSDK_PATH}" STREQUAL "") message(FATAL_ERROR "Please set PSXSDK_PATH env variable first") endif() set(CMAKE_C_COMPILER psx-gcc) set(CMAKE_AR mipsel-unknown-elf-ar) elseif(WIN9X_BUILD) set(CMAKE_C_COMPILER i386-mingw32-gcc) endif() project(rts) add_executable(${PROJECT_NAME} "src/main.c") set(cdroot ${CMAKE_BINARY_DIR}/cdimg) if(PS1_BUILD) file(MAKE_DIRECTORY ${cdroot}) target_link_directories(${PROJECT_NAME} PUBLIC $ENV{PSXSDK_PATH}/lib) target_link_libraries(${PROJECT_NAME} PUBLIC -lpsx -lfixmath) target_compile_definitions(${PROJECT_NAME} PUBLIC FIXMATH_FAST_SIN PSXSDK_DEBUG) target_include_directories(${PROJECT_NAME} PRIVATE . $ENV{PSXSDK_PATH}/include) add_custom_target(exe ALL elf2exe ${PROJECT_NAME} ${cdroot}/${PROJECT_NAME}.exe -mark="A homebrew game created with PSXSDK" DEPENDS ${PROJECT_NAME}) add_custom_target(iso ALL mkisofs -o ${PROJECT_NAME}.iso -V ${PROJECT_NAME} -sysid PLAYSTATION ${cdroot} DEPENDS exe) set(license $ENV{PSXSDK_PATH}/share/licenses/infoeur.dat) add_custom_target(bin_cue ALL mkpsxiso ${PROJECT_NAME}.iso ${PROJECT_NAME}.bin ${license} -s DEPENDS iso) # add_custom_target(libpsx ALL DEPENDS $ENV{PSXSDK_PATH}/lib/libpsx.a) # add_dependencies(${PROJECT_NAME} libpsx) if(NOT EXISTS "${cdroot}/system.cnf") file(COPY "src/system.cnf" DESTINATION "${cdroot}") endif() elseif(WIN9X_BUILD) file(MAKE_DIRECTORY ${cdroot}) if("$ENV{SDL_PATH}" STREQUAL "") message(FATAL_ERROR "please define env variable SDL_PATH") elseif("$ENV{SDL_TTF_PATH}" STREQUAL "") message(FATAL_ERROR "please define env variable SDL_TTF_PATH") elseif("$ENV{FREETYPE_PATH}" STREQUAL "") message(FATAL_ERROR "please define env variable FREETYPE_PATH") elseif("$ENV{SDL_MIXER_PATH}" STREQUAL "") message(FATAL_ERROR "please define env variable SDL_MIXER_PATH") endif() add_custom_command(OUTPUT ${cdroot}/${PROJECT_NAME} COMMAND i386-mingw32-strip ${PROJECT_NAME} -o ${cdroot}/${PROJECT_NAME} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} DEPENDS ${PROJECT_NAME} VERBATIM) add_custom_target(stripped-exe ALL DEPENDS ${cdroot}/${PROJECT_NAME}) target_link_directories(${PROJECT_NAME} PRIVATE $ENV{SDL_PATH}/lib $ENV{SDL_TTF_PATH}/lib $ENV{FREETYPE_PATH}/lib $ENV{SDL_MIXER_PATH}/lib) include_directories($ENV{SDL_PATH}/include $ENV{SDL_PATH}/include/SDL $ENV{SDL_TTF_PATH}/include $ENV{FREETYPE_PATH}/include $ENV{SDL_MIXER_PATH}/include) add_compile_options(-march=i386) link_libraries(gdi32 user32 winmm dxguid freetype) set(SDL1_2_BUILD 1) elseif(HOST_BUILD) file(MAKE_DIRECTORY ${cdroot}) find_package(SDL 1.2 REQUIRED) find_package(SDL_mixer 1.2 REQUIRED) set(SDL1_2_BUILD 1) #find_package(SDL_ttf 2.0 REQUIRED) endif() # libfixmath is already bundled with PSXSDK. if(NOT PS1_BUILD) if("$ENV{FIXMATH_PATH}" STREQUAL "") message(FATAL_ERROR "please define env variable FIXMATH_PATH") endif() add_subdirectory($ENV{FIXMATH_PATH} ${CMAKE_BINARY_DIR}/libfixmath) endif() add_subdirectory("res") set(components building camera container font game gfx gui header instance pad player resource sfx system terrain unit util ) set(interfaces tech ) # Avoid C11 since it is not supported by the i386-mingw32 toolchain. set(cflags -Wall -g3 -ffunction-sections -fdata-sections -pedantic -std=c99) if(WIN9X_BUILD) if(CMAKE_BUILD_TYPE STREQUAL "Debug") # i386-mingw32-gcc 3.4.5 does not support -Og. set(cflags ${cflags} -O0) else() set(cflags ${cflags} -O2) endif() elseif(PS1_BUILD) if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(cflags ${cflags} -Og) else() set(cflags ${cflags} -Os) endif() set(cflags ${cflags} -fshort-enums) else() if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(cflags ${cflags} -Og) else() set(cflags ${cflags} -O3) endif() endif() target_compile_options(${PROJECT_NAME} PUBLIC ${cflags}) foreach(c ${components}) add_subdirectory("src/${c}") target_compile_options(${c} PUBLIC ${cflags}) target_link_libraries(${PROJECT_NAME} PRIVATE ${c}) endforeach() foreach(i ${interfaces}) add_subdirectory("src/${i}") target_compile_options(${i} INTERFACE ${cflags}) target_link_libraries(${PROJECT_NAME} PRIVATE ${c}) endforeach() target_link_options(${PROJECT_NAME} PRIVATE -Wl,--gc-sections)