CMakeLists.txt 5.16 KB
Newer Older
1
cmake_minimum_required(VERSION 3.0)
Marco Z committed
2 3 4 5 6 7 8 9 10 11 12 13 14

# 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()

15 16 17
file(STRINGS src/version.h SRB2_VERSION)
string(REGEX MATCH "[0-9]+\\.[0-9.]+" SRB2_VERSION ${SRB2_VERSION})

18 19
# DO NOT CHANGE THIS SRB2 STRING! Some variable names depend on this string.
# Version change is fine.
20
project(SRB2
21
	VERSION ${SRB2_VERSION}
22
	LANGUAGES C)
23

24 25 26 27
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()

Marco Z committed
28 29 30 31
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()

32 33 34 35 36 37 38 39 40 41 42 43 44
# 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()

ShaderWraith committed
45 46 47
# Macro to add OSX framework
macro(add_framework fwname appname)
	find_library(FRAMEWORK_${fwname}
Alam Ed Arias committed
48 49 50 51 52 53 54
	NAMES ${fwname}
	PATHS ${CMAKE_OSX_SYSROOT}/System/Library
		${CMAKE_OSX_SYSROOT}/Library
		/System/Library
		/Library
	ATH_SUFFIXES Frameworks
	NO_DEFAULT_PATH)
ShaderWraith committed
55 56 57 58 59 60 61 62
    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()

63 64 65 66 67 68 69 70 71 72
# 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}
73
				$<TARGET_FILE_DIR:${target}>/${dllname}
74 75 76 77 78
			)
		endforeach()
	endif()
endmacro()

79 80
# bitness check
set(SRB2_SYSTEM_BITS 0)
81
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
82 83
	message(STATUS "Target is 64-bit")
	set(SRB2_SYSTEM_BITS 64)
84 85 86
endif()
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
	message(STATUS "Target is 32-bit")
87 88
	set(SRB2_SYSTEM_BITS 32)
endif()
89 90 91
if(${SRB2_SYSTEM_BITS} EQUAL 0)
	message(STATUS "Target bitness is unknown")
endif()
92

93 94 95 96
# OS macros
if (UNIX)
	add_definitions(-DUNIXCOMMON)
endif()
ShaderWraith committed
97

98 99 100 101
if(CMAKE_COMPILER_IS_GNUCC)
	find_program(OBJCOPY objcopy)
endif()

102 103
if(${CMAKE_SYSTEM} MATCHES "Linux")
	add_definitions(-DLINUX)
104 105 106
	if(${SRB2_SYSTEM_BITS} EQUAL 64)
		add_definitions(-DLINUX64)
	endif()
107
endif()
ShaderWraith committed
108 109 110 111 112

if(${CMAKE_SYSTEM} MATCHES "Darwin")
	add_definitions(-DMACOSX)
endif()

ShaderWraith committed
113 114 115
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set(CMAKE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

116
# Set EXE names so the assets CMakeLists can refer to its target
117
set(SRB2_SDL2_EXE_NAME srb2 CACHE STRING "Executable binary output name")
118

119 120
include_directories(${CMAKE_CURRENT_BINARY_DIR}/src)

121 122 123 124
add_subdirectory(src)
add_subdirectory(assets)


125 126 127
## config.h generation
set(GIT_EXECUTABLE "git" CACHE FILEPATH "Path to git binary")
include(GitUtilities)
128
git_latest_commit(SRB2_COMP_COMMIT "${CMAKE_SOURCE_DIR}")
129
git_current_branch(SRB2_GIT_BRANCH "${CMAKE_SOURCE_DIR}")
130
set(SRB2_COMP_BRANCH "${SRB2_GIT_BRANCH}")
131
set(SRB2_COMP_REVISION "${SRB2_COMP_COMMIT}")
132 133
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/config.h)

134 135
##### PACKAGE CONFIGURATION #####

136 137 138 139 140 141 142 143 144 145
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()
146
endif()
147

148
set(CPACK_GENERATOR ${SRB2_CPACK_GENERATOR})
149 150
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")
151 152 153 154 155 156
#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}")
157
SET(CPACK_OUTPUT_FILE_PREFIX package)
158
include(CPack)