mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-04-01 07:21:34 +00:00
Some key points for programmers: - Source code files are mostly listed in a 'Sourcefile'. So you no longer directly edit the object list. There can be multiple Sourcefiles and they can even live in subdirectories--the directory name will be prepended to every filename in the list. Of course, the Makefile still needs to be edited to read from each Sourcefile. - Different rules are no longer required for source code files that live in subdirectories (such as sdl/ or hardware/). Subdirectories Just Work so go ham! In addition to those points, another important change is that the bin directory is no longer divided into platform subdirectories (Linux64, Mingw, etc). Executables now go directly into bin. If you use DEBUGMODE or target 64-bit, then subdirectories for 'debug' and '64' will be made though. Oh by the way, I don't think make clean actually removed files before on Windows. It should now. I also fixed as many little inconsistencies like that as I noticed. And now just an overview of the technical aspects that shouldn't affect anyone who doesn't REALLY care about the Makefile... objs and dep directories have been moved to a make directory. Makefile.cfg and its variants have been moved out of their various subdirectories to src/Makefile.d make distclean removes the bin and make directories entirely, but make clean and cleandep still only affect the current build target. When I say automation, I mean that a lot of copy pasting in the Makefile has been reduced.
158 lines
5.2 KiB
CMake
158 lines
5.2 KiB
CMake
cmake_minimum_required(VERSION 3.0)
|
|
|
|
# Enable CCache early
|
|
set(SRB2_USE_CCACHE OFF CACHE BOOL "Use CCache")
|
|
if (${SRB2_USE_CCACHE})
|
|
find_program(CCACHE_PROGRAM ccache)
|
|
if(CCACHE_PROGRAM)
|
|
message(STATUS "Found CCache: ${CCACHE_PROGRAM}")
|
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
|
|
else()
|
|
message(WARNING "You have specified to use CCACHE but it was not found. Object files will not be cached.")
|
|
endif()
|
|
endif()
|
|
|
|
file(STRINGS src/version.h SRB2_VERSION)
|
|
string(REGEX MATCH "[0-9]+\\.[0-9.]+" SRB2_VERSION ${SRB2_VERSION})
|
|
|
|
# DO NOT CHANGE THIS SRB2 STRING! Some variable names depend on this string.
|
|
# Version change is fine.
|
|
project(SRB2
|
|
VERSION ${SRB2_VERSION}
|
|
LANGUAGES C)
|
|
|
|
if(${PROJECT_SOURCE_DIR} MATCHES ${PROJECT_BINARY_DIR})
|
|
message(FATAL_ERROR "In-source builds will bring you a world of pain. Please make a separate directory to invoke CMake from.")
|
|
endif()
|
|
|
|
if ((${SRB2_USE_CCACHE}) AND (${CMAKE_C_COMPILER} MATCHES "clang"))
|
|
message(WARNING "Using clang and CCache: You may want to set environment variable CCACHE_CPP2=yes to prevent include errors during compile.")
|
|
endif()
|
|
|
|
# Set up CMAKE path
|
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
|
|
|
|
### Useful functions
|
|
|
|
# Prepend sources with current source directory
|
|
function(prepend_sources SOURCE_FILES)
|
|
foreach(SOURCE_FILE ${${SOURCE_FILES}})
|
|
set(MODIFIED ${MODIFIED} ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE})
|
|
endforeach()
|
|
set(${SOURCE_FILES} ${MODIFIED} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# Macro to add OSX framework
|
|
macro(add_framework fwname appname)
|
|
find_library(FRAMEWORK_${fwname}
|
|
NAMES ${fwname}
|
|
PATHS ${CMAKE_OSX_SYSROOT}/System/Library
|
|
${CMAKE_OSX_SYSROOT}/Library
|
|
/System/Library
|
|
/Library
|
|
ATH_SUFFIXES Frameworks
|
|
NO_DEFAULT_PATH)
|
|
if( ${FRAMEWORK_${fwname}} STREQUAL FRAMEWORK_${fwname}-NOTFOUND)
|
|
MESSAGE(ERROR ": Framework ${fwname} not found")
|
|
else()
|
|
TARGET_LINK_LIBRARIES(${appname} PRIVATE "${FRAMEWORK_${fwname}}/${fwname}")
|
|
MESSAGE(STATUS "Framework ${fwname} found at ${FRAMEWORK_${fwname}}")
|
|
endif()
|
|
endmacro()
|
|
|
|
# Macro to copy Windows DLLs to Debug/Release folder for easy debugging
|
|
# Note: this is general purpose, we could copy anything. Just using for DLLs on MSVC though
|
|
macro(copy_files_to_build_dir target dlllist_var)
|
|
if(MSVC)
|
|
# http://stackoverflow.com/a/26983405/3064195
|
|
foreach(dlllist_item ${${dlllist_var}})
|
|
get_filename_component(dllname ${dlllist_item} NAME)
|
|
add_custom_command(TARGET ${target} POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
${dlllist_item}
|
|
$<TARGET_FILE_DIR:${target}>/${dllname}
|
|
)
|
|
endforeach()
|
|
endif()
|
|
endmacro()
|
|
|
|
# bitness check
|
|
set(SRB2_SYSTEM_BITS 0)
|
|
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
message(STATUS "Target is 64-bit")
|
|
set(SRB2_SYSTEM_BITS 64)
|
|
endif()
|
|
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
|
message(STATUS "Target is 32-bit")
|
|
set(SRB2_SYSTEM_BITS 32)
|
|
endif()
|
|
if(${SRB2_SYSTEM_BITS} EQUAL 0)
|
|
message(STATUS "Target bitness is unknown")
|
|
endif()
|
|
|
|
# OS macros
|
|
if (UNIX)
|
|
add_definitions(-DUNIXCOMMON)
|
|
endif()
|
|
|
|
if(CMAKE_COMPILER_IS_GNUCC)
|
|
find_program(OBJCOPY objcopy)
|
|
endif()
|
|
|
|
if(${CMAKE_SYSTEM} MATCHES "Linux")
|
|
add_definitions(-DLINUX)
|
|
if(${SRB2_SYSTEM_BITS} EQUAL 64)
|
|
add_definitions(-DLINUX64)
|
|
endif()
|
|
endif()
|
|
|
|
if(${CMAKE_SYSTEM} MATCHES "Darwin")
|
|
add_definitions(-DMACOSX)
|
|
endif()
|
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
|
|
set(CMAKE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
|
|
|
|
# Set EXE names so the assets CMakeLists can refer to its target
|
|
set(SRB2_SDL2_EXE_NAME srb2 CACHE STRING "Executable binary output name")
|
|
|
|
include_directories(${CMAKE_CURRENT_BINARY_DIR}/src)
|
|
|
|
add_subdirectory(src)
|
|
#add_subdirectory(assets)
|
|
|
|
|
|
## config.h generation
|
|
set(GIT_EXECUTABLE "git" CACHE FILEPATH "Path to git binary")
|
|
include(GitUtilities)
|
|
git_latest_commit(SRB2_COMP_COMMIT "${CMAKE_SOURCE_DIR}")
|
|
git_current_branch(SRB2_GIT_BRANCH "${CMAKE_SOURCE_DIR}")
|
|
set(SRB2_COMP_BRANCH "${SRB2_GIT_BRANCH}")
|
|
set(SRB2_COMP_REVISION "${SRB2_COMP_COMMIT}")
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/config.h)
|
|
|
|
##### PACKAGE CONFIGURATION #####
|
|
|
|
set(SRB2_CPACK_GENERATOR "" CACHE STRING "Generator to use for making a package. E.g., ZIP, TGZ, DragNDrop (OSX only). Leave blank for default generator.")
|
|
|
|
if("${SRB2_CPACK_GENERATOR}" STREQUAL "")
|
|
if(${CMAKE_SYSTEM} MATCHES "Windows")
|
|
set(SRB2_CPACK_GENERATOR "ZIP")
|
|
elseif(${CMAKE_SYSTEM} MATCHES "Linux")
|
|
set(SRB2_CPACK_GENERATOR "TGZ")
|
|
elseif(${CMAKE_SYSTEM} MATCHES "Darwin")
|
|
set(SRB2_CPACK_GENERATOR "TGZ")
|
|
endif()
|
|
endif()
|
|
|
|
set(CPACK_GENERATOR ${SRB2_CPACK_GENERATOR})
|
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Sonic Robo Blast 2" CACHE STRING "Program name for display purposes")
|
|
set(CPACK_PACKAGE_VENDOR "Sonic Team Jr." CACHE STRING "Vendor name for display purposes")
|
|
#set(CPACK_PACKAGE_DESCRIPTION_FILE )
|
|
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
|
|
set(CPACK_PACKAGE_VERSION_MAJOR ${SRB2_VERSION_MAJOR})
|
|
set(CPACK_PACKAGE_VERSION_MINOR ${SRB2_VERSION_MINOR})
|
|
set(CPACK_PACKAGE_VERSION_PATCH ${SRB2_VERSION_PATCH})
|
|
set(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${CMAKE_VERSION_MAJOR}.${CMAKE_VERSION_MINOR}")
|
|
SET(CPACK_OUTPUT_FILE_PREFIX package)
|
|
include(CPack)
|