cmake_minimum_required(VERSION 3.16) list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) project(pd C CXX) include(TargetArch) include(FindPkgConfig) include(AssetUtils) set(CMAKE_C_STANDARD 11) set(CMAKE_C_EXTENSIONS OFF) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_EXTENSIONS OFF) # On first build set the build type to RelWithDebInfo if it's not already set if (NOT EXISTS ${CMAKE_BINARY_DIR}/CMakeCache.txt) if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "" FORCE) endif() endif() # Options set(ROMID "ntsc-final" CACHE STRING "Which ROM to build an executable for: ntsc-final, pal-final or jpn-final") option(FORCE_CROSSCOMPILE "Force cross compiling" NO) # Determine target arch target_architecture(TARGET_ARCH) if(TARGET_ARCH STREQUAL "i386") # for historical reasons set(TARGET_ARCH "i686") endif() # TODO set(TARGET_IS_BIG_ENDIAN FALSE) if((TARGET_ARCH MATCHES "unknown") OR (TARGET_ARCH STREQUAL "")) message(FATAL_ERROR "Unknown target arch") elseif(TARGET_ARCH MATCHES "64") set(TARGET_IS_64BIT TRUE) else() set(TARGET_IS_64BIT FALSE) endif() message(STATUS "Target arch: ${TARGET_ARCH}") # Determine target OS and platform identifier ($arch-$os) if(WIN32) # Windows set(TARGET_OS "windows") elseif(APPLE) # OSX set(TARGET_OS "osx") elseif(UNIX) # Generic *nix; assume Linux set(TARGET_OS "linux") else() # ??? message(FATAL_ERROR "Unknown target OS or compiler") endif() set(TARGET_PLATFORM "${TARGET_ARCH}-${TARGET_OS}") message(STATUS "Target platform: ${TARGET_PLATFORM}") # Calculate version info and binary name set(VERSION_IS_PAL 0) if(ROMID STREQUAL "ntsc-final") set(VERSION 2) set(BIN_REGION "") elseif(ROMID STREQUAL "pal-final") set(VERSION 4) set(BIN_REGION ".pal") set(VERSION_IS_PAL 1) elseif(ROMID STREQUAL "jpn-final") set(VERSION 5) set(BIN_REGION ".jpn") else() message(FATAL_ERROR "Unknown ROM ID: ${ROMID}") endif() # git commit hash execute_process( COMMAND git rev-parse --short HEAD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE VERSION_HASH OUTPUT_STRIP_TRAILING_WHITESPACE ) # git branch name execute_process( COMMAND git rev-parse --abbrev-ref HEAD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE VERSION_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE ) set(VERSION_TARGET "${TARGET_PLATFORM}") set(VERSION_ARCH "${TARGET_ARCH}") set(VERSION_ROMID "${ROMID}") set(VERSION_BUILD "${CMAKE_BUILD_TYPE}") if((VERSION_BRANCH STREQUAL "") OR (VERSION_BRANCH STREQUAL "HEAD")) set(VERSION_BRANCH "port-custom") endif() message(STATUS "Version: ${VERSION_ROMID}, hash ${VERSION_HASH}, branch ${VERSION_BRANCH}") configure_file("${CMAKE_SOURCE_DIR}/port/include/versioninfo.h.in" "${CMAKE_BINARY_DIR}/port/include/versioninfo.h" @ONLY) set(ASSET_DIR "src/assets/${ROMID}") set(GENERATED_DIR "src/generated/${ROMID}") set(ENV{ROMID} ${ROMID}) # Build folder postfix set(BUILD_ID "${VERSION_ROMID}-${VERSION_TARGET}") # Compiler defs add_definitions( -DMATCHING=0 -DPIRACYCHECKS=0 -DROM_SIZE=32 -DAVOID_UB=1 -D_LANGUAGE_C=1 -DPAL=${VERSION_IS_PAL} -DVERSION=${VERSION} ) if(TARGET_IS_64BIT) add_definitions(-DPLATFORM_64BIT=1) endif() # Compiler flags # Include directories include_directories("${CMAKE_SOURCE_DIR}/include") include_directories("${CMAKE_SOURCE_DIR}/include/PR") include_directories("${CMAKE_SOURCE_DIR}/src/include") include_directories("${CMAKE_BINARY_DIR}/src/generated/${ROMID}") include_directories("${CMAKE_SOURCE_DIR}/src/lib/ultra/audio") include_directories("${CMAKE_SOURCE_DIR}/port/include") include_directories("${CMAKE_BINARY_DIR}/port/include") # Common CFLAGS add_compile_options( -fno-inline-functions -fno-strict-aliasing -funsigned-char -fwrapv -include "versioninfo.h" ) # Common warning flags add_compile_options( -Wall -Wno-address -Wno-int-in-bool-context -Wno-misleading-indentation -Wno-missing-braces -Wno-multichar -Wno-tautological-compare -Wno-unused-but-set-variable -Wno-unused-value -Wno-unused-variable -Wno-format-truncation ) # C specific flags add_compile_options($<$:-Wno-pointer-sign>) # C++ specific flags add_compile_options($<$:-Wno-unused-function>) # Dependencies set(LIBS ) # SDL2 find_package(SDL2 REQUIRED) include_directories(SYSTEM "${SDL2_INCLUDE_DIR}") list(APPEND LIBS "${SDL2_LIBRARY}") # ZLib find_package(ZLIB REQUIRED) list(APPEND LIBS "${ZLIB_LIBRARY}") # GL if(NOT GL_LIBRARY) if(WIN32) set(GL_LIBRARY "opengl32") else() set(GL_LIBRARY "GL") endif() endif() list(APPEND LIBS "${GL_LIBRARY}") # Platform-specific extra libs if(NOT EXTRA_LIBRARIES) if(WIN32) set(EXTRA_LIBRARIES dbghelp) else() set(EXTRA_LIBRARIES m dl) endif() endif() list(APPEND LIBS "${EXTRA_LIBRARIES}") # Sources file(GLOB_RECURSE SRC_PORT "${CMAKE_SOURCE_DIR}/port/*.c") file(GLOB_RECURSE SRC_PORT_CXX "${CMAKE_SOURCE_DIR}/port/*.cpp") file(GLOB_RECURSE SRC_GAME "${CMAKE_SOURCE_DIR}/src/game/*.c") file(GLOB SRC_LIB_MP3 "${CMAKE_SOURCE_DIR}/src/lib/mp3/*.c") file(GLOB SRC_LIB_NAUDIO "${CMAKE_SOURCE_DIR}/src/lib/naudio/*.c") file(GLOB SRC_LIB_ULTRA_AUDIO "${CMAKE_SOURCE_DIR}/src/lib/ultra/audio/*.c") file(GLOB SRC_LIB_GU "${CMAKE_SOURCE_DIR}/src/lib/ultra/gu/*.c") set(SRC_LIB src/lib/ultra/io/vimodentsclan1.c src/lib/ultra/io/vimodepallan1.c src/lib/ultra/io/vimodempallan1.c src/lib/ultra/io/vitbl.c src/lib/ailist.c src/lib/anim.c src/lib/args.c src/lib/audiodma.c src/lib/audiomgr.c src/lib/base.c src/lib/collision.c src/lib/debughud.c src/lib/dma.c src/lib/fault.c src/lib/joy.c src/lib/lib_2f490_c.c src/lib/lib_2fc60.c src/lib/lib_3e3e0.c src/lib/lib_04f60nb.c src/lib/lib_17ce0.c src/lib/lib_034d0.c src/lib/lib_39c80.c src/lib/lib_15850.c src/lib/mema.c src/lib/memp.c src/lib/model.c src/lib/modelasm_c.c src/lib/mp3.c src/lib/mtx_c.c src/lib/mtx.c src/lib/music.c src/lib/path.c src/lib/profile.c src/lib/rdp.c src/lib/rmon.c src/lib/rng_c.c src/lib/rzip_c.c src/lib/snd.c src/lib/speaker.c src/lib/varsinit.c src/lib/vi.c src/textureconfig.c ) list(PREPEND SRC_LIB "${CMAKE_SOURCE_DIR}") set(SRC ${SRC_GAME} ${SRC_PORT} ${SRC_PORT_CXX} ${SRC_LIB_MP3} ${SRC_LIB_NAUDIO} ${SRC_LIB_ULTRA_AUDIO} ${SRC_LIB_GU} ${SRC_LIB} ) # Asset files generate_asset_headers("lang/" "${CMAKE_SOURCE_DIR}/tools/assetmgr/mklang" "en" JSON_HEADERS) generate_asset_headers("pads/" "${CMAKE_SOURCE_DIR}/tools/assetmgr/mkpads" "" JSON_HEADERS) generate_asset_headers("tiles/" "${CMAKE_SOURCE_DIR}/tools/assetmgr/mktiles" "" JSON_HEADERS) generate_asset_headers("animations.json" "${CMAKE_SOURCE_DIR}/tools/assetmgr/mkanims" "" JSON_HEADERS) generate_asset_headers("sequences.json" "${CMAKE_SOURCE_DIR}/tools/assetmgr/mksequences" "" JSON_HEADERS) generate_asset_headers("textures.json" "${CMAKE_SOURCE_DIR}/tools/assetmgr/mktextures" "" JSON_HEADERS) add_custom_target(pd_headers ALL DEPENDS ${JSON_HEADERS}) # Game target add_executable(pd ${SRC}) add_dependencies(pd pd_headers) target_link_libraries(pd ${LIBS}) set_target_properties(pd PROPERTIES OUTPUT_NAME "pd${BIN_REGION}.${TARGET_ARCH}")