2018-11-26 19:47:20 +00:00
cmake_minimum_required ( VERSION 2.8 )
file ( STRINGS src/game/version.h VERSION_LINE
L I M I T _ C O U N T 1
R E G E X G A M E _ R E L E A S E _ V E R S I O N
)
if ( VERSION_LINE MATCHES "\" ( [0-9]+ ) \\.([0-9]+)\\.([0-9]+)\"")
set ( VERSION_MAJOR ${ CMAKE_MATCH_1 } )
set ( VERSION_MINOR ${ CMAKE_MATCH_2 } )
set ( VERSION_PATCH ${ CMAKE_MATCH_3 } )
elseif ( VERSION_LINE MATCHES "\" ( [0-9]+ ) \\.([0-9]+)\"")
set ( VERSION_MAJOR ${ CMAKE_MATCH_1 } )
set ( VERSION_MINOR ${ CMAKE_MATCH_2 } )
set ( VERSION_PATCH "0" )
else ( )
message ( FATAL_ERROR "Couldn't parse version from src/game/version.h" )
endif ( )
if ( POLICY CMP0048 )
cmake_policy ( SET CMP0048 NEW )
project ( teeworlds VERSION ${ VERSION_MAJOR } . ${ VERSION_MINOR } . ${ VERSION_PATCH } )
else ( )
project ( teeworlds )
set ( PROJECT_VERSION_MAJOR ${ VERSION_MAJOR } )
set ( PROJECT_VERSION_MINOR ${ VERSION_MINOR } )
set ( PROJECT_VERSION_PATCH ${ VERSION_PATCH } )
set ( PROJECT_VERSION ${ VERSION_MAJOR } . ${ VERSION_MINOR } . ${ VERSION_PATCH } )
endif ( )
set ( ORIGINAL_CMAKE_MODULE_PATH ${ CMAKE_MODULE_PATH } )
set ( ORIGINAL_CMAKE_REQUIRED_INCLUDES ${ CMAKE_REQUIRED_INCLUDES } )
set ( ORIGINAL_CMAKE_REQUIRED_LIBRARIES ${ CMAKE_REQUIRED_LIBRARIES } )
set ( OWN_CMAKE_MODULE_PATH ${ CMAKE_MODULE_PATH } ${ PROJECT_SOURCE_DIR } /cmake )
set ( CMAKE_MODULE_PATH ${ OWN_CMAKE_MODULE_PATH } )
if ( CMAKE_SIZEOF_VOID_P EQUAL 8 )
set ( TARGET_BITS "64" )
elseif ( CMAKE_SIZEOF_VOID_P EQUAL 4 )
set ( TARGET_BITS "32" )
endif ( )
if ( CMAKE_SYSTEM_NAME STREQUAL "Windows" )
set ( TARGET_OS "windows" )
elseif ( CMAKE_SYSTEM_NAME STREQUAL "Linux" )
set ( TARGET_OS "linux" )
elseif ( CMAKE_SYSTEM_NAME STREQUAL "Darwin" )
set ( TARGET_OS "mac" )
endif ( )
include ( CheckCCompilerFlag )
include ( CheckCXXCompilerFlag )
include ( CheckSymbolExists )
check_symbol_exists ( __i386 "" TARGET_ARCH_X86_i386 )
if ( TARGET_ARCH_X86_i386 )
set ( TARGET_ARCH x86 )
else ( )
set ( TARGET_ARCH )
endif ( )
set ( AUTO_DEPENDENCIES_DEFAULT OFF )
if ( TARGET_OS STREQUAL "windows" )
set ( AUTO_DEPENDENCIES_DEFAULT ON )
endif ( )
option ( CLIENT "Compile client" ON )
option ( PREFER_BUNDLED_LIBS "Prefer bundled libraries over system libraries" ${ AUTO_DEPENDENCIES_DEFAULT } )
option ( DEV "Don't generate stuff necessary for packaging" OFF )
# Set the default build type to Release
if ( NOT(CMAKE_BUILD_TYPE ) )
if ( DEV )
set ( CMAKE_BUILD_TYPE Release )
else ( )
set ( CMAKE_BUILD_TYPE Debug )
endif ( )
endif ( )
set ( DBG $< OR:$<CONFIG:Debug > , $< CONFIG:RelWithDebInfo > > )
set_property ( DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
s r c / g a m e / v e r s i o n . h
)
set ( SERVER_EXECUTABLE teeworlds_srv CACHE STRING "Name of the built server executable" )
set ( CLIENT_EXECUTABLE teeworlds CACHE STRING "Name of the build client executable" )
########################################################################
# Compiler flags
########################################################################
function ( add_c_compiler_flag_if_supported VARIABLE FLAG )
if ( ARGC GREATER 2 )
set ( CHECKED_FLAG "${ARGV2}" )
else ( )
set ( CHECKED_FLAG "${FLAG}" )
endif ( )
string ( REGEX REPLACE "[^A-Za-z0-9]" "_" CONFIG_VARIABLE "FLAG_SUPPORTED${CHECKED_FLAG}" )
check_c_compiler_flag ( "${CHECKED_FLAG}" ${ CONFIG_VARIABLE } )
if ( ${ CONFIG_VARIABLE } )
if ( ${ VARIABLE } )
set ( "${VARIABLE}" "${${VARIABLE}};${FLAG}" PARENT_SCOPE )
else ( )
set ( "${VARIABLE}" "${FLAG}" PARENT_SCOPE )
endif ( )
endif ( )
endfunction ( )
if ( NOT MSVC )
# Protect the stack pointer.
# -fstack-protector-all doesn't work on MinGW.
add_c_compiler_flag_if_supported ( OUR_FLAGS -fstack-protector-all )
# Inaccurate floating point numbers cause problems on mingw-w64-gcc when
# compiling for x86, might cause problems elsewhere. So don't store floats
# in registers but keep them at higher accuracy.
if ( TARGET_ARCH STREQUAL "x86" )
add_c_compiler_flag_if_supported ( OUR_FLAGS -ffloat-store )
endif ( )
if ( TARGET_OS STREQUAL "mac" )
add_c_compiler_flag_if_supported ( OUR_FLAGS -stdlib=libc++ )
add_c_compiler_flag_if_supported ( OUR_FLAGS -mmacosx-version-min=10.7 )
endif ( )
add_c_compiler_flag_if_supported ( OUR_FLAGS_OWN -Wall )
if ( CMAKE_VERSION VERSION_GREATER 3.3 OR CMAKE_VERSION VERSION_EQUAL 3.3 )
add_c_compiler_flag_if_supported ( OUR_FLAGS_OWN
$ < $ < C O M P I L E _ L A N G U A G E : C > : - W d e c l a r a t i o n - a f t e r - s t a t e m e n t >
- W d e c l a r a t i o n - a f t e r - s t a t e m e n t
)
endif ( )
add_c_compiler_flag_if_supported ( OUR_FLAGS_OWN -Wextra )
add_c_compiler_flag_if_supported ( OUR_FLAGS_OWN -Wno-unused-parameter )
add_c_compiler_flag_if_supported ( OUR_FLAGS_OWN -Wno-missing-field-initializers )
add_c_compiler_flag_if_supported ( OUR_FLAGS_OWN -Wformat=2 ) # Warn about format strings.
add_c_compiler_flag_if_supported ( OUR_FLAGS_DEP -Wno-implicit-function-declaration )
endif ( )
if ( NOT MSVC )
check_c_compiler_flag ( "-O2;-Wp,-Werror;-D_FORTIFY_SOURCE=2" DEFINE_FORTIFY_SOURCE ) # Some distributions define _FORTIFY_SOURCE by themselves.
endif ( )
########################################################################
# COMMON FUNCTIONS
########################################################################
function ( set_glob VAR GLOBBING EXTS DIRECTORY ) # ...
set ( GLOBS )
foreach ( ext ${ EXTS } )
list ( APPEND GLOBS "${DIRECTORY}/*.${ext}" )
endforeach ( )
file ( ${ GLOBBING } GLOB_RESULT ${ GLOBS } )
list ( SORT GLOB_RESULT )
set ( FILES )
foreach ( file ${ ARGN } )
list ( APPEND FILES "${PROJECT_SOURCE_DIR}/${DIRECTORY}/${file}" )
endforeach ( )
if ( NOT FILES STREQUAL GLOB_RESULT )
message ( AUTHOR_WARNING "${VAR} does not contain every file from directory ${DIRECTORY}" )
set ( LIST_BUT_NOT_GLOB )
if ( POLICY CMP0057 )
cmake_policy ( SET CMP0057 NEW )
foreach ( file ${ FILES } )
if ( NOT file IN_LIST GLOB_RESULT )
list ( APPEND LIST_BUT_NOT_GLOB ${ file } )
endif ( )
endforeach ( )
if ( LIST_BUT_NOT_GLOB )
message ( AUTHOR_WARNING "Entries only present in ${VAR}: ${LIST_BUT_NOT_GLOB}" )
endif ( )
set ( GLOB_BUT_NOT_LIST )
foreach ( file ${ GLOB_RESULT } )
if ( NOT file IN_LIST FILES )
list ( APPEND GLOB_BUT_NOT_LIST ${ file } )
endif ( )
endforeach ( )
if ( GLOB_BUT_NOT_LIST )
message ( AUTHOR_WARNING "Entries only present in ${DIRECTORY}: ${GLOB_BUT_NOT_LIST}" )
endif ( )
endif ( )
endif ( )
set ( ${ VAR } ${ FILES } PARENT_SCOPE )
endfunction ( )
function ( set_src VAR GLOBBING DIRECTORY ) # ...
set_glob ( ${ VAR } ${ GLOBBING } "c;cpp;h" ${ DIRECTORY } ${ ARGN } )
set ( ${ VAR } ${ ${VAR } } PARENT_SCOPE )
endfunction ( )
########################################################################
# INITIALIZE TARGET LISTS
########################################################################
set ( TARGETS_OWN )
set ( TARGETS_DEP )
set ( TARGETS_LINK ) # Targets with a linking stage.
########################################################################
# DEPENDENCIES
########################################################################
function ( set_extra_dirs_lib VARIABLE NAME )
set ( "PATHS_${VARIABLE}_LIBDIR" PARENT_SCOPE )
set ( "HINTS_${VARIABLE}_LIBDIR" PARENT_SCOPE )
if ( PREFER_BUNDLED_LIBS )
set ( TYPE HINTS )
else ( )
set ( TYPE PATHS )
endif ( )
if ( TARGET_BITS AND TARGET_OS )
set ( DIR "other/${NAME}/${TARGET_OS}/lib${TARGET_BITS}" )
set ( "${TYPE}_${VARIABLE}_LIBDIR" "${DIR}" PARENT_SCOPE )
set ( "EXTRA_${VARIABLE}_LIBDIR" "${DIR}" PARENT_SCOPE )
endif ( )
endfunction ( )
function ( set_extra_dirs_include VARIABLE NAME LIBRARY )
set ( "PATHS_${VARIABLE}_INCLUDEDIR" PARENT_SCOPE )
set ( "HINTS_${VARIABLE}_INCLUDEDIR" PARENT_SCOPE )
is_bundled ( IS_BUNDLED "${LIBRARY}" )
if ( IS_BUNDLED )
set ( "HINTS_${VARIABLE}_INCLUDEDIR" "other/${NAME}/include" "other/${NAME}/include/${TARGET_OS}" PARENT_SCOPE )
endif ( )
endfunction ( )
if ( CMAKE_CROSSCOMPILING )
set ( CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH NO_CMAKE_SYSTEM_PATH )
else ( )
set ( CROSSCOMPILING_NO_CMAKE_SYSTEM_PATH )
endif ( )
function ( is_bundled VARIABLE PATH )
if ( PATH )
string ( FIND "${PATH}" "${PROJECT_SOURCE_DIR}" LOCAL_PATH_POS )
if ( LOCAL_PATH_POS EQUAL 0 AND TARGET_BITS AND TARGET_OS )
set ( "${VARIABLE}" ON PARENT_SCOPE )
else ( )
set ( "${VARIABLE}" OFF PARENT_SCOPE )
endif ( )
else ( )
set ( "${VARIABLE}" OFF PARENT_SCOPE )
endif ( )
endfunction ( )
if ( NOT CMAKE_CROSSCOMPILING )
# Check for PkgConfig once so all the other `find_package` calls can do it
# quietly.
find_package ( PkgConfig )
endif ( )
find_package ( ZLIB )
find_package ( Freetype )
find_package ( Git )
find_package ( Pnglite )
find_package ( PythonInterp )
find_package ( SDL2 )
find_package ( Threads )
find_package ( Wavpack )
if ( TARGET_OS AND TARGET_OS STREQUAL "mac" )
find_program ( CMAKE_OTOOL otool )
find_program ( DMG dmg )
find_program ( HFSPLUS hfsplus )
find_program ( NEWFS_HFS newfs_hfs )
if ( DMG AND HFSPLUS AND NEWFS_HFS )
set ( DMGTOOLS_FOUND ON )
else ( )
set ( DMGTOOLS_FOUND OFF )
endif ( )
find_program ( HDIUTIL hdiutil )
endif ( )
message ( STATUS "******** Teeworlds ********" )
message ( STATUS "Target OS: ${TARGET_OS} ${TARGET_BITS}bit" )
message ( STATUS "Compiler: ${CMAKE_CXX_COMPILER}" )
message ( STATUS "Build type: ${CMAKE_BUILD_TYPE}" )
message ( STATUS "Dependencies:" )
function ( show_dependency_status OUTPUT_NAME NAME )
if ( ${ NAME } _FOUND )
if ( ${ NAME } _BUNDLED )
message ( STATUS " * ${OUTPUT_NAME} not found (using bundled version)" )
else ( )
message ( STATUS " * ${OUTPUT_NAME} found" )
endif ( )
else ( )
message ( STATUS " * ${OUTPUT_NAME} not found" )
endif ( )
endfunction ( )
if ( TARGET_OS AND TARGET_OS STREQUAL "mac" )
show_dependency_status ( "Dmg tools" DMGTOOLS )
endif ( )
show_dependency_status ( "Freetype" FREETYPE )
if ( TARGET_OS AND TARGET_OS STREQUAL "mac" )
show_dependency_status ( "Hdiutil" HDIUTIL )
endif ( )
show_dependency_status ( "Pnglite" PNGLITE )
show_dependency_status ( "PythonInterp" PYTHONINTERP )
show_dependency_status ( "SDL2" SDL2 )
show_dependency_status ( "Wavpack" WAVPACK )
show_dependency_status ( "Zlib" ZLIB )
if ( NOT(PYTHONINTERP_FOUND ) )
message ( SEND_ERROR "You must install Python to compile Teeworlds" )
endif ( )
if ( CLIENT AND NOT(FREETYPE_FOUND ) )
message ( SEND_ERROR "You must install Freetype to compile the Teeworlds client" )
endif ( )
if ( CLIENT AND NOT(SDL2_FOUND ) )
message ( SEND_ERROR "You must install SDL2 to compile the Teeworlds client" )
endif ( )
if ( TARGET_OS STREQUAL "windows" )
set ( PLATFORM_CLIENT )
set ( PLATFORM_CLIENT_LIBS opengl32 glu32 winmm )
set ( PLATFORM_LIBS ws2_32 ) # Windows sockets
elseif ( TARGET_OS STREQUAL "mac" )
find_library ( CARBON Carbon )
find_library ( COCOA Cocoa )
find_library ( OPENGL OpenGL )
set ( PLATFORM_CLIENT
s r c / o s x l a u n c h / c l i e n t . h
s r c / o s x l a u n c h / c l i e n t . m
)
set ( PLATFORM_CLIENT_LIBS ${ COCOA } ${ OPENGL } )
set ( PLATFORM_LIBS ${ CARBON } )
else ( )
set ( PLATFORM_CLIENT )
set ( PLATFORM_CLIENT_LIBS GL GLU X11 )
if ( TARGET_OS STREQUAL "linux" )
set ( PLATFORM_LIBS rt ) # clock_gettime for glibc < 2.17
else ( )
set ( PLATFORM_LIBS )
endif ( )
endif ( )
########################################################################
# DEPENDENCY COMPILATION
########################################################################
set_src ( DEP_JSON_SRC GLOB src/engine/external/json-parser json.c json.h )
add_library ( json EXCLUDE_FROM_ALL OBJECT ${ DEP_JSON_SRC } )
set_src ( DEP_MD5_SRC GLOB src/engine/external/md5 md5.c md5.h )
add_library ( md5 EXCLUDE_FROM_ALL OBJECT ${ DEP_MD5_SRC } )
list ( APPEND TARGETS_DEP json md5 )
set ( DEP_MD5 $< TARGET_OBJECTS:json > $< TARGET_OBJECTS:md5 > )
########################################################################
# DATA
########################################################################
set_glob ( DATA GLOB_RECURSE "json;map;png;rules;ttf;txt;wv" datasrc
a u d i o / f o l e y _ b o d y _ i m p a c t - 0 1 . w v
a u d i o / f o l e y _ b o d y _ i m p a c t - 0 2 . w v
a u d i o / f o l e y _ b o d y _ i m p a c t - 0 3 . w v
a u d i o / f o l e y _ b o d y _ s p l a t - 0 1 . w v
a u d i o / f o l e y _ b o d y _ s p l a t - 0 2 . w v
a u d i o / f o l e y _ b o d y _ s p l a t - 0 3 . w v
a u d i o / f o l e y _ b o d y _ s p l a t - 0 4 . w v
a u d i o / f o l e y _ d b l j u m p - 0 1 . w v
a u d i o / f o l e y _ d b l j u m p - 0 2 . w v
a u d i o / f o l e y _ d b l j u m p - 0 3 . w v
a u d i o / f o l e y _ f o o t _ l e f t - 0 1 . w v
a u d i o / f o l e y _ f o o t _ l e f t - 0 2 . w v
a u d i o / f o l e y _ f o o t _ l e f t - 0 3 . w v
a u d i o / f o l e y _ f o o t _ l e f t - 0 4 . w v
a u d i o / f o l e y _ f o o t _ r i g h t - 0 1 . w v
a u d i o / f o l e y _ f o o t _ r i g h t - 0 2 . w v
a u d i o / f o l e y _ f o o t _ r i g h t - 0 3 . w v
a u d i o / f o l e y _ f o o t _ r i g h t - 0 4 . w v
a u d i o / f o l e y _ l a n d - 0 1 . w v
a u d i o / f o l e y _ l a n d - 0 2 . w v
a u d i o / f o l e y _ l a n d - 0 3 . w v
a u d i o / f o l e y _ l a n d - 0 4 . w v
a u d i o / h o o k _ a t t a c h - 0 1 . w v
a u d i o / h o o k _ a t t a c h - 0 2 . w v
a u d i o / h o o k _ a t t a c h - 0 3 . w v
a u d i o / h o o k _ l o o p - 0 1 . w v
a u d i o / h o o k _ l o o p - 0 2 . w v
a u d i o / h o o k _ n o a t t a c h - 0 1 . w v
a u d i o / h o o k _ n o a t t a c h - 0 2 . w v
a u d i o / h o o k _ n o a t t a c h - 0 3 . w v
a u d i o / m u s i c _ m e n u . w v
a u d i o / s f x _ c t f _ c a p _ p l . w v
a u d i o / s f x _ c t f _ d r o p . w v
a u d i o / s f x _ c t f _ g r a b _ e n . w v
a u d i o / s f x _ c t f _ g r a b _ p l . w v
a u d i o / s f x _ c t f _ r t n . w v
a u d i o / s f x _ h i t _ s t r o n g - 0 1 . w v
a u d i o / s f x _ h i t _ s t r o n g - 0 2 . w v
a u d i o / s f x _ h i t _ w e a k - 0 1 . w v
a u d i o / s f x _ h i t _ w e a k - 0 2 . w v
a u d i o / s f x _ h i t _ w e a k - 0 3 . w v
a u d i o / s f x _ m s g - c l i e n t . w v
a u d i o / s f x _ m s g - h i g h l i g h t . w v
a u d i o / s f x _ m s g - s e r v e r . w v
a u d i o / s f x _ p i c k u p _ a r m - 0 1 . w v
a u d i o / s f x _ p i c k u p _ a r m - 0 2 . w v
a u d i o / s f x _ p i c k u p _ a r m - 0 3 . w v
a u d i o / s f x _ p i c k u p _ a r m - 0 4 . w v
a u d i o / s f x _ p i c k u p _ g u n . w v
a u d i o / s f x _ p i c k u p _ h r t - 0 1 . w v
a u d i o / s f x _ p i c k u p _ h r t - 0 2 . w v
a u d i o / s f x _ p i c k u p _ l a u n c h e r . w v
a u d i o / s f x _ p i c k u p _ n i n j a . w v
a u d i o / s f x _ p i c k u p _ s g . w v
a u d i o / s f x _ s k i d - 0 1 . w v
a u d i o / s f x _ s k i d - 0 2 . w v
a u d i o / s f x _ s k i d - 0 3 . w v
a u d i o / s f x _ s k i d - 0 4 . w v
a u d i o / s f x _ s p a w n _ w p n - 0 1 . w v
a u d i o / s f x _ s p a w n _ w p n - 0 2 . w v
a u d i o / s f x _ s p a w n _ w p n - 0 3 . w v
a u d i o / v o _ t e e f a u l t _ c r y - 0 1 . w v
a u d i o / v o _ t e e f a u l t _ c r y - 0 2 . w v
a u d i o / v o _ t e e f a u l t _ n i n j a - 0 1 . w v
a u d i o / v o _ t e e f a u l t _ n i n j a - 0 2 . w v
a u d i o / v o _ t e e f a u l t _ n i n j a - 0 3 . w v
a u d i o / v o _ t e e f a u l t _ n i n j a - 0 4 . w v
a u d i o / v o _ t e e f a u l t _ p a i n _ l o n g - 0 1 . w v
a u d i o / v o _ t e e f a u l t _ p a i n _ l o n g - 0 2 . w v
a u d i o / v o _ t e e f a u l t _ p a i n _ s h o r t - 0 1 . w v
a u d i o / v o _ t e e f a u l t _ p a i n _ s h o r t - 0 2 . w v
a u d i o / v o _ t e e f a u l t _ p a i n _ s h o r t - 0 3 . w v
a u d i o / v o _ t e e f a u l t _ p a i n _ s h o r t - 0 4 . w v
a u d i o / v o _ t e e f a u l t _ p a i n _ s h o r t - 0 5 . w v
a u d i o / v o _ t e e f a u l t _ p a i n _ s h o r t - 0 6 . w v
a u d i o / v o _ t e e f a u l t _ p a i n _ s h o r t - 0 7 . w v
a u d i o / v o _ t e e f a u l t _ p a i n _ s h o r t - 0 8 . w v
a u d i o / v o _ t e e f a u l t _ p a i n _ s h o r t - 0 9 . w v
a u d i o / v o _ t e e f a u l t _ p a i n _ s h o r t - 1 0 . w v
a u d i o / v o _ t e e f a u l t _ p a i n _ s h o r t - 1 1 . w v
a u d i o / v o _ t e e f a u l t _ p a i n _ s h o r t - 1 2 . w v
a u d i o / v o _ t e e f a u l t _ s l e d g e - 0 1 . w v
a u d i o / v o _ t e e f a u l t _ s l e d g e - 0 2 . w v
a u d i o / v o _ t e e f a u l t _ s l e d g e - 0 3 . w v
a u d i o / v o _ t e e f a u l t _ s p a w n - 0 1 . w v
a u d i o / v o _ t e e f a u l t _ s p a w n - 0 2 . w v
a u d i o / v o _ t e e f a u l t _ s p a w n - 0 3 . w v
a u d i o / v o _ t e e f a u l t _ s p a w n - 0 4 . w v
a u d i o / v o _ t e e f a u l t _ s p a w n - 0 5 . w v
a u d i o / v o _ t e e f a u l t _ s p a w n - 0 6 . w v
a u d i o / v o _ t e e f a u l t _ s p a w n - 0 7 . w v
a u d i o / w p _ f l u m p _ e x p l o - 0 1 . w v
a u d i o / w p _ f l u m p _ e x p l o - 0 2 . w v
a u d i o / w p _ f l u m p _ e x p l o - 0 3 . w v
a u d i o / w p _ f l u m p _ l a u n c h - 0 1 . w v
a u d i o / w p _ f l u m p _ l a u n c h - 0 2 . w v
a u d i o / w p _ f l u m p _ l a u n c h - 0 3 . w v
a u d i o / w p _ g u n _ f i r e - 0 1 . w v
a u d i o / w p _ g u n _ f i r e - 0 2 . w v
a u d i o / w p _ g u n _ f i r e - 0 3 . w v
a u d i o / w p _ h a m m e r _ h i t - 0 1 . w v
a u d i o / w p _ h a m m e r _ h i t - 0 2 . w v
a u d i o / w p _ h a m m e r _ h i t - 0 3 . w v
a u d i o / w p _ h a m m e r _ s w i n g - 0 1 . w v
a u d i o / w p _ h a m m e r _ s w i n g - 0 2 . w v
a u d i o / w p _ h a m m e r _ s w i n g - 0 3 . w v
a u d i o / w p _ l a s e r _ b n c e - 0 1 . w v
a u d i o / w p _ l a s e r _ b n c e - 0 2 . w v
a u d i o / w p _ l a s e r _ b n c e - 0 3 . w v
a u d i o / w p _ l a s e r _ f i r e - 0 1 . w v
a u d i o / w p _ l a s e r _ f i r e - 0 2 . w v
a u d i o / w p _ l a s e r _ f i r e - 0 3 . w v
a u d i o / w p _ n i n j a _ a t t a c k - 0 1 . w v
a u d i o / w p _ n i n j a _ a t t a c k - 0 2 . w v
a u d i o / w p _ n i n j a _ a t t a c k - 0 3 . w v
a u d i o / w p _ n i n j a _ a t t a c k - 0 4 . w v
a u d i o / w p _ n i n j a _ h i t - 0 1 . w v
a u d i o / w p _ n i n j a _ h i t - 0 2 . w v
a u d i o / w p _ n i n j a _ h i t - 0 3 . w v
a u d i o / w p _ n i n j a _ h i t - 0 4 . w v
a u d i o / w p _ n o a m m o - 0 1 . w v
a u d i o / w p _ n o a m m o - 0 2 . w v
a u d i o / w p _ n o a m m o - 0 3 . w v
a u d i o / w p _ n o a m m o - 0 4 . w v
a u d i o / w p _ n o a m m o - 0 5 . w v
a u d i o / w p _ s h o t t y _ f i r e - 0 1 . w v
a u d i o / w p _ s h o t t y _ f i r e - 0 2 . w v
a u d i o / w p _ s h o t t y _ f i r e - 0 3 . w v
a u d i o / w p _ s w i t c h - 0 1 . w v
a u d i o / w p _ s w i t c h - 0 2 . w v
a u d i o / w p _ s w i t c h - 0 3 . w v
c o u n t r y f l a g s / A D . p n g
c o u n t r y f l a g s / A E . p n g
c o u n t r y f l a g s / A F . p n g
c o u n t r y f l a g s / A G . p n g
c o u n t r y f l a g s / A I . p n g
c o u n t r y f l a g s / A L . p n g
c o u n t r y f l a g s / A M . p n g
c o u n t r y f l a g s / A O . p n g
c o u n t r y f l a g s / A R . p n g
c o u n t r y f l a g s / A S . p n g
c o u n t r y f l a g s / A T . p n g
c o u n t r y f l a g s / A U . p n g
c o u n t r y f l a g s / A W . p n g
c o u n t r y f l a g s / A X . p n g
c o u n t r y f l a g s / A Z . p n g
c o u n t r y f l a g s / B A . p n g
c o u n t r y f l a g s / B B . p n g
c o u n t r y f l a g s / B D . p n g
c o u n t r y f l a g s / B E . p n g
c o u n t r y f l a g s / B F . p n g
c o u n t r y f l a g s / B G . p n g
c o u n t r y f l a g s / B H . p n g
c o u n t r y f l a g s / B I . p n g
c o u n t r y f l a g s / B J . p n g
c o u n t r y f l a g s / B L . p n g
c o u n t r y f l a g s / B M . p n g
c o u n t r y f l a g s / B N . p n g
c o u n t r y f l a g s / B O . p n g
c o u n t r y f l a g s / B R . p n g
c o u n t r y f l a g s / B S . p n g
c o u n t r y f l a g s / B T . p n g
c o u n t r y f l a g s / B W . p n g
c o u n t r y f l a g s / B Y . p n g
c o u n t r y f l a g s / B Z . p n g
c o u n t r y f l a g s / C A . p n g
c o u n t r y f l a g s / C C . p n g
c o u n t r y f l a g s / C D . p n g
c o u n t r y f l a g s / C F . p n g
c o u n t r y f l a g s / C G . p n g
c o u n t r y f l a g s / C H . p n g
c o u n t r y f l a g s / C I . p n g
c o u n t r y f l a g s / C K . p n g
c o u n t r y f l a g s / C L . p n g
c o u n t r y f l a g s / C M . p n g
c o u n t r y f l a g s / C N . p n g
c o u n t r y f l a g s / C O . p n g
c o u n t r y f l a g s / C R . p n g
c o u n t r y f l a g s / C U . p n g
c o u n t r y f l a g s / C V . p n g
c o u n t r y f l a g s / C W . p n g
c o u n t r y f l a g s / C X . p n g
c o u n t r y f l a g s / C Y . p n g
c o u n t r y f l a g s / C Z . p n g
c o u n t r y f l a g s / D E . p n g
c o u n t r y f l a g s / D J . p n g
c o u n t r y f l a g s / D K . p n g
c o u n t r y f l a g s / D M . p n g
c o u n t r y f l a g s / D O . p n g
c o u n t r y f l a g s / D Z . p n g
c o u n t r y f l a g s / E C . p n g
c o u n t r y f l a g s / E E . p n g
c o u n t r y f l a g s / E G . p n g
c o u n t r y f l a g s / E H . p n g
c o u n t r y f l a g s / E R . p n g
c o u n t r y f l a g s / E S . p n g
c o u n t r y f l a g s / E T . p n g
c o u n t r y f l a g s / F I . p n g
c o u n t r y f l a g s / F J . p n g
c o u n t r y f l a g s / F K . p n g
c o u n t r y f l a g s / F M . p n g
c o u n t r y f l a g s / F O . p n g
c o u n t r y f l a g s / F R . p n g
c o u n t r y f l a g s / G A . p n g
c o u n t r y f l a g s / G B . p n g
c o u n t r y f l a g s / G D . p n g
c o u n t r y f l a g s / G E . p n g
c o u n t r y f l a g s / G F . p n g
c o u n t r y f l a g s / G G . p n g
c o u n t r y f l a g s / G H . p n g
c o u n t r y f l a g s / G I . p n g
c o u n t r y f l a g s / G L . p n g
c o u n t r y f l a g s / G M . p n g
c o u n t r y f l a g s / G N . p n g
c o u n t r y f l a g s / G P . p n g
c o u n t r y f l a g s / G Q . p n g
c o u n t r y f l a g s / G R . p n g
c o u n t r y f l a g s / G S . p n g
c o u n t r y f l a g s / G T . p n g
c o u n t r y f l a g s / G U . p n g
c o u n t r y f l a g s / G W . p n g
c o u n t r y f l a g s / G Y . p n g
c o u n t r y f l a g s / H K . p n g
c o u n t r y f l a g s / H N . p n g
c o u n t r y f l a g s / H R . p n g
c o u n t r y f l a g s / H T . p n g
c o u n t r y f l a g s / H U . p n g
c o u n t r y f l a g s / I D . p n g
c o u n t r y f l a g s / I E . p n g
c o u n t r y f l a g s / I L . p n g
c o u n t r y f l a g s / I M . p n g
c o u n t r y f l a g s / I N . p n g
c o u n t r y f l a g s / I O . p n g
c o u n t r y f l a g s / I Q . p n g
c o u n t r y f l a g s / I R . p n g
c o u n t r y f l a g s / I S . p n g
c o u n t r y f l a g s / I T . p n g
c o u n t r y f l a g s / J E . p n g
c o u n t r y f l a g s / J M . p n g
c o u n t r y f l a g s / J O . p n g
c o u n t r y f l a g s / J P . p n g
c o u n t r y f l a g s / K E . p n g
c o u n t r y f l a g s / K G . p n g
c o u n t r y f l a g s / K H . p n g
c o u n t r y f l a g s / K I . p n g
c o u n t r y f l a g s / K M . p n g
c o u n t r y f l a g s / K N . p n g
c o u n t r y f l a g s / K P . p n g
c o u n t r y f l a g s / K R . p n g
c o u n t r y f l a g s / K W . p n g
c o u n t r y f l a g s / K Y . p n g
c o u n t r y f l a g s / K Z . p n g
c o u n t r y f l a g s / L A . p n g
c o u n t r y f l a g s / L B . p n g
c o u n t r y f l a g s / L C . p n g
c o u n t r y f l a g s / L I . p n g
c o u n t r y f l a g s / L K . p n g
c o u n t r y f l a g s / L R . p n g
c o u n t r y f l a g s / L S . p n g
c o u n t r y f l a g s / L T . p n g
c o u n t r y f l a g s / L U . p n g
c o u n t r y f l a g s / L V . p n g
c o u n t r y f l a g s / L Y . p n g
c o u n t r y f l a g s / M A . p n g
c o u n t r y f l a g s / M C . p n g
c o u n t r y f l a g s / M D . p n g
c o u n t r y f l a g s / M E . p n g
c o u n t r y f l a g s / M F . p n g
c o u n t r y f l a g s / M G . p n g
c o u n t r y f l a g s / M H . p n g
c o u n t r y f l a g s / M K . p n g
c o u n t r y f l a g s / M L . p n g
c o u n t r y f l a g s / M M . p n g
c o u n t r y f l a g s / M N . p n g
c o u n t r y f l a g s / M O . p n g
c o u n t r y f l a g s / M P . p n g
c o u n t r y f l a g s / M Q . p n g
c o u n t r y f l a g s / M R . p n g
c o u n t r y f l a g s / M S . p n g
c o u n t r y f l a g s / M T . p n g
c o u n t r y f l a g s / M U . p n g
c o u n t r y f l a g s / M V . p n g
c o u n t r y f l a g s / M W . p n g
c o u n t r y f l a g s / M X . p n g
c o u n t r y f l a g s / M Y . p n g
c o u n t r y f l a g s / M Z . p n g
c o u n t r y f l a g s / N A . p n g
c o u n t r y f l a g s / N C . p n g
c o u n t r y f l a g s / N E . p n g
c o u n t r y f l a g s / N F . p n g
c o u n t r y f l a g s / N G . p n g
c o u n t r y f l a g s / N I . p n g
c o u n t r y f l a g s / N L . p n g
c o u n t r y f l a g s / N O . p n g
c o u n t r y f l a g s / N P . p n g
c o u n t r y f l a g s / N R . p n g
c o u n t r y f l a g s / N U . p n g
c o u n t r y f l a g s / N Z . p n g
c o u n t r y f l a g s / O M . p n g
c o u n t r y f l a g s / P A . p n g
c o u n t r y f l a g s / P E . p n g
c o u n t r y f l a g s / P F . p n g
c o u n t r y f l a g s / P G . p n g
c o u n t r y f l a g s / P H . p n g
c o u n t r y f l a g s / P K . p n g
c o u n t r y f l a g s / P L . p n g
c o u n t r y f l a g s / P M . p n g
c o u n t r y f l a g s / P N . p n g
c o u n t r y f l a g s / P R . p n g
c o u n t r y f l a g s / P S . p n g
c o u n t r y f l a g s / P T . p n g
c o u n t r y f l a g s / P W . p n g
c o u n t r y f l a g s / P Y . p n g
c o u n t r y f l a g s / Q A . p n g
c o u n t r y f l a g s / R E . p n g
c o u n t r y f l a g s / R O . p n g
c o u n t r y f l a g s / R S . p n g
c o u n t r y f l a g s / R U . p n g
c o u n t r y f l a g s / R W . p n g
c o u n t r y f l a g s / S A . p n g
c o u n t r y f l a g s / S B . p n g
c o u n t r y f l a g s / S C . p n g
c o u n t r y f l a g s / S D . p n g
c o u n t r y f l a g s / S E . p n g
c o u n t r y f l a g s / S G . p n g
c o u n t r y f l a g s / S H . p n g
c o u n t r y f l a g s / S I . p n g
c o u n t r y f l a g s / S K . p n g
c o u n t r y f l a g s / S L . p n g
c o u n t r y f l a g s / S M . p n g
c o u n t r y f l a g s / S N . p n g
c o u n t r y f l a g s / S O . p n g
c o u n t r y f l a g s / S R . p n g
c o u n t r y f l a g s / S S . p n g
c o u n t r y f l a g s / S T . p n g
c o u n t r y f l a g s / S V . p n g
c o u n t r y f l a g s / S X . p n g
c o u n t r y f l a g s / S Y . p n g
c o u n t r y f l a g s / S Z . p n g
c o u n t r y f l a g s / T C . p n g
c o u n t r y f l a g s / T D . p n g
c o u n t r y f l a g s / T F . p n g
c o u n t r y f l a g s / T G . p n g
c o u n t r y f l a g s / T H . p n g
c o u n t r y f l a g s / T J . p n g
c o u n t r y f l a g s / T K . p n g
c o u n t r y f l a g s / T L . p n g
c o u n t r y f l a g s / T M . p n g
c o u n t r y f l a g s / T N . p n g
c o u n t r y f l a g s / T O . p n g
c o u n t r y f l a g s / T R . p n g
c o u n t r y f l a g s / T T . p n g
c o u n t r y f l a g s / T V . p n g
c o u n t r y f l a g s / T W . p n g
c o u n t r y f l a g s / T Z . p n g
c o u n t r y f l a g s / U A . p n g
c o u n t r y f l a g s / U G . p n g
c o u n t r y f l a g s / U S . p n g
c o u n t r y f l a g s / U Y . p n g
c o u n t r y f l a g s / U Z . p n g
c o u n t r y f l a g s / V A . p n g
c o u n t r y f l a g s / V C . p n g
c o u n t r y f l a g s / V E . p n g
c o u n t r y f l a g s / V G . p n g
c o u n t r y f l a g s / V I . p n g
c o u n t r y f l a g s / V N . p n g
c o u n t r y f l a g s / V U . p n g
c o u n t r y f l a g s / W F . p n g
c o u n t r y f l a g s / W S . p n g
c o u n t r y f l a g s / X B Z . p n g
c o u n t r y f l a g s / X C A . p n g
c o u n t r y f l a g s / X E N . p n g
c o u n t r y f l a g s / X E S . p n g
c o u n t r y f l a g s / X G A . p n g
c o u n t r y f l a g s / X N I . p n g
c o u n t r y f l a g s / X S C . p n g
c o u n t r y f l a g s / X W A . p n g
c o u n t r y f l a g s / Y E . p n g
c o u n t r y f l a g s / Z A . p n g
c o u n t r y f l a g s / Z M . p n g
c o u n t r y f l a g s / Z W . p n g
c o u n t r y f l a g s / d e f a u l t . p n g
c o u n t r y f l a g s / i n d e x . j s o n
d e a d t e e . p n g
e d i t o r / a u t o m a p / g r a s s _ d o o d a d s . j s o n
e d i t o r / a u t o m a p / g r a s s _ m a i n . j s o n
e d i t o r / b a c k g r o u n d . p n g
e d i t o r / c h e c k e r . p n g
e d i t o r / c u r s o r . p n g
e d i t o r / d e s e r t _ m a i n . r u l e s
e d i t o r / e n t i t i e s . p n g
e d i t o r / g r a s s _ m a i n . r u l e s
e d i t o r / j u n g l e _ m a i n . r u l e s
e d i t o r / w i n t e r _ m a i n . r u l e s
e m o t i c o n s . p n g
f o n t s / D e j a V u S a n s . t t f
g a m e . p n g
l a n g u a g e s / b e l a r u s i a n . j s o n
l a n g u a g e s / b o s n i a n . j s o n
l a n g u a g e s / b r a z i l i a n _ p o r t u g u e s e . j s o n
l a n g u a g e s / b r e t o n . j s o n
l a n g u a g e s / b u l g a r i a n . j s o n
l a n g u a g e s / c a t a l a n . j s o n
l a n g u a g e s / c h i n e s e . j s o n
l a n g u a g e s / c h u v a s h . j s o n
l a n g u a g e s / c z e c h . j s o n
l a n g u a g e s / d a n i s h . j s o n
l a n g u a g e s / d u t c h . j s o n
l a n g u a g e s / e s p e r a n t o . j s o n
l a n g u a g e s / e s t o n i a n . j s o n
l a n g u a g e s / f i n n i s h . j s o n
l a n g u a g e s / f r e n c h . j s o n
l a n g u a g e s / g a e l i c _ s c o t t i s h . j s o n
l a n g u a g e s / g a l i c i a n . j s o n
l a n g u a g e s / g e r m a n . j s o n
l a n g u a g e s / g r e e k . j s o n
l a n g u a g e s / h u n g a r i a n . j s o n
l a n g u a g e s / i n d e x . j s o n
l a n g u a g e s / i r i s h . j s o n
l a n g u a g e s / i t a l i a n . j s o n
l a n g u a g e s / j a p a n e s e . j s o n
l a n g u a g e s / k o r e a n . j s o n
l a n g u a g e s / k y r g y z . j s o n
l a n g u a g e s / l i c e n s e . t x t
l a n g u a g e s / l i t h u a n i a n . j s o n
l a n g u a g e s / n o r w e g i a n . j s o n
l a n g u a g e s / p o l i s h . j s o n
l a n g u a g e s / p o r t u g u e s e . j s o n
l a n g u a g e s / r e a d m e . t x t
l a n g u a g e s / r o m a n i a n . j s o n
l a n g u a g e s / r u s s i a n . j s o n
l a n g u a g e s / s e r b i a n . j s o n
l a n g u a g e s / s i m p l i f i e d _ c h i n e s e . j s o n
l a n g u a g e s / s l o v a k . j s o n
l a n g u a g e s / s l o v e n i a n . j s o n
l a n g u a g e s / s p a n i s h . j s o n
l a n g u a g e s / s w e d i s h . j s o n
l a n g u a g e s / t u r k i s h . j s o n
l a n g u a g e s / u k r a i n i a n . j s o n
m a p r e s / b g _ c l o u d 1 . p n g
m a p r e s / b g _ c l o u d 2 . p n g
m a p r e s / b g _ c l o u d 3 . p n g
m a p r e s / d e s e r t _ d o o d a d s . p n g
m a p r e s / d e s e r t _ m a i n . p n g
m a p r e s / d e s e r t _ m o u n t a i n s . p n g
m a p r e s / d e s e r t _ m o u n t a i n s 2 . p n g
m a p r e s / d e s e r t _ s u n . p n g
m a p r e s / g e n e r i c _ d e a t h t i l e s . p n g
m a p r e s / g e n e r i c _ l a m p s . p n g
m a p r e s / g e n e r i c _ s h a d o w s . p n g
m a p r e s / g e n e r i c _ u n h o o k a b l e . p n g
m a p r e s / g r a s s _ d o o d a d s . p n g
m a p r e s / g r a s s _ m a i n . p n g
m a p r e s / j u n g l e _ b a c k g r o u n d . p n g
m a p r e s / j u n g l e _ d e a t h t i l e s . p n g
m a p r e s / j u n g l e _ d o o d a d s . p n g
m a p r e s / j u n g l e _ m a i n . p n g
m a p r e s / j u n g l e _ m i d g r o u n d . p n g
m a p r e s / j u n g l e _ u n h o o k a b l e s . p n g
m a p r e s / l i g h t . p n g
m a p r e s / m o o n . p n g
m a p r e s / m o u n t a i n s . p n g
m a p r e s / s n o w . p n g
m a p r e s / s t a r s . p n g
m a p r e s / s u n . p n g
m a p r e s / w i n t e r _ d o o d a d s . p n g
m a p r e s / w i n t e r _ m a i n . p n g
m a p r e s / w i n t e r _ m o u n t a i n s . p n g
m a p r e s / w i n t e r _ m o u n t a i n s 2 . p n g
m a p r e s / w i n t e r _ m o u n t a i n s 3 . p n g
m a p s / c t f 1 . m a p
m a p s / c t f 2 . m a p
m a p s / c t f 3 . m a p
m a p s / c t f 4 . m a p
m a p s / c t f 5 . m a p
m a p s / c t f 6 . m a p
m a p s / c t f 7 . m a p
m a p s / c t f 8 . m a p
m a p s / d m 1 . m a p
m a p s / d m 2 . m a p
m a p s / d m 3 . m a p
m a p s / d m 6 . m a p
m a p s / d m 7 . m a p
m a p s / d m 8 . m a p
m a p s / d m 9 . m a p
m a p s / l i c e n s e . t x t
m a p s / l m s 1 . m a p
m a p s / r e a d m e . t x t
p a r t i c l e s . p n g
s k i n s / b l u e k i t t y . j s o n
s k i n s / b l u e s t r i p e . j s o n
s k i n s / b o d y / b e a r . p n g
s k i n s / b o d y / k i t t y . p n g
s k i n s / b o d y / s t a n d a r d . p n g
s k i n s / b o d y / x _ n i n j a . p n g
s k i n s / b r o w n b e a r . j s o n
s k i n s / c a m m o . j s o n
s k i n s / c a m m o s t r i p e s . j s o n
s k i n s / d e c o r a t i o n / h a i r . p n g
s k i n s / d e c o r a t i o n / t w i n b o p p . p n g
s k i n s / d e c o r a t i o n / u n i b o p . p n g
s k i n s / d e f a u l t . j s o n
s k i n s / e y e s / s t a n d a r d . p n g
s k i n s / e y e s / s t a n d a r d r e a l . p n g
s k i n s / e y e s / x _ n i n j a . p n g
s k i n s / f e e t / s t a n d a r d . p n g
s k i n s / h a n d s / s t a n d a r d . p n g
s k i n s / k o a l a . j s o n
s k i n s / l i m e k i t t y . j s o n
s k i n s / m a r k i n g / b e a r . p n g
s k i n s / m a r k i n g / c a m m o 1 . p n g
s k i n s / m a r k i n g / c a m m o 2 . p n g
s k i n s / m a r k i n g / c a m m o s t r i p e s . p n g
s k i n s / m a r k i n g / d o n n y . p n g
s k i n s / m a r k i n g / d u o d o n n y . p n g
s k i n s / m a r k i n g / s a d d o . p n g
s k i n s / m a r k i n g / s t r i p e . p n g
s k i n s / m a r k i n g / s t r i p e s . p n g
s k i n s / m a r k i n g / t o p t r i . p n g
s k i n s / m a r k i n g / t w i n t r i . p n g
s k i n s / m a r k i n g / u p p y . p n g
s k i n s / m a r k i n g / w a r p a i n t . p n g
s k i n s / m a r k i n g / w h i s k e r . p n g
s k i n s / p i n k y . j s o n
s k i n s / r e d b o p p . j s o n
s k i n s / r e d s t r i p e . j s o n
s k i n s / s a d d o . j s o n
s k i n s / t o p t r i . j s o n
s k i n s / t w i n b o p . j s o n
s k i n s / t w i n t r i . j s o n
s k i n s / w a r p a i n t . j s o n
s k i n s / x _ n i n j a . j s o n
s k i n s / x m a s _ h a t . p n g
u i / b l o b . p n g
u i / c o n s o l e . p n g
u i / c o n s o l e _ b a r . p n g
u i / d e b u g _ f o n t . p n g
u i / d e m o _ b u t t o n s . p n g
u i / f i l e _ i c o n s . p n g
u i / g a m e t y p e s / c t f . p n g
u i / g a m e t y p e s / d m . p n g
u i / g a m e t y p e s / l m s . p n g
u i / g a m e t y p e s / l t s . p n g
u i / g a m e t y p e s / m o d . p n g
u i / g a m e t y p e s / t d m . p n g
u i / g u i _ b u t t o n s . p n g
u i / g u i _ c u r s o r . p n g
u i / g u i _ i c o n s . p n g
u i / g u i _ l o g o . p n g
u i / i c o n s / a r r o w s . p n g
u i / i c o n s / b r o w s e . p n g
u i / i c o n s / c h a t _ w h i s p e r . p n g
u i / i c o n s / f r i e n d . p n g
u i / i c o n s / l e v e l . p n g
u i / i c o n s / m e n u . p n g
u i / i c o n s / s i d e b a r . p n g
u i / i c o n s / t o o l s . p n g
u i / m e n u i m a g e s / d e m o s . p n g
u i / m e n u i m a g e s / e d i t o r . p n g
u i / m e n u i m a g e s / l o c a l _ s e r v e r . p n g
u i / m e n u i m a g e s / p l a y _ g a m e . p n g
u i / m e n u i m a g e s / s e t t i n g s . p n g
u i / n o _ s k i n p a r t . p n g
u i / t h e m e s / h e a v e n s . p n g
u i / t h e m e s / h e a v e n s _ d a y . m a p
u i / t h e m e s / h e a v e n s _ n i g h t . m a p
u i / t h e m e s / j u n g l e . p n g
u i / t h e m e s / j u n g l e _ d a y . m a p
u i / t h e m e s / j u n g l e _ n i g h t . m a p
u i / t h e m e s / n o n e . p n g
)
########################################################################
# COPY DATA AND DLLS
########################################################################
foreach ( datafile ${ DATA } )
file ( RELATIVE_PATH OUT ${ PROJECT_SOURCE_DIR } /datasrc ${ datafile } )
get_filename_component ( DESTINATION data/ ${ OUT } PATH )
file ( MAKE_DIRECTORY ${ DESTINATION } )
file ( COPY ${ datafile } DESTINATION ${ DESTINATION } )
endforeach ( )
set ( COPY_FILES
$ { F R E E T Y P E _ C O P Y _ F I L E S }
$ { S D L 2 _ C O P Y _ F I L E S }
)
file ( COPY ${ COPY_FILES } DESTINATION . )
########################################################################
# CODE GENERATION
########################################################################
function ( chash output_file )
add_custom_command ( OUTPUT ${ output_file }
C O M M A N D $ { P Y T H O N _ E X E C U T A B L E } s c r i p t s / c m d 5 . p y $ { A R G N }
> " $ { P R O J E C T _ B I N A R Y _ D I R } / $ { o u t p u t _ f i l e } "
D E P E N D S s c r i p t s / c m d 5 . p y $ { A R G N }
W O R K I N G _ D I R E C T O R Y $ { P R O J E C T _ S O U R C E _ D I R }
)
endfunction ( )
function ( generate_source output_file script_parameter )
add_custom_command ( OUTPUT ${ output_file }
C O M M A N D $ { P Y T H O N _ E X E C U T A B L E } d a t a s r c / c o m p i l e . p y $ { s c r i p t _ p a r a m e t e r }
> " $ { P R O J E C T _ B I N A R Y _ D I R } / $ { o u t p u t _ f i l e } "
D E P E N D S
d a t a s r c / c o m p i l e . p y
d a t a s r c / c o n t e n t . p y
d a t a s r c / d a t a t y p e s . p y
d a t a s r c / n e t w o r k . p y
W O R K I N G _ D I R E C T O R Y $ { P R O J E C T _ S O U R C E _ D I R }
)
endfunction ( )
file ( MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/src/generated/" )
if ( GIT_FOUND )
execute_process ( COMMAND ${ GIT_EXECUTABLE } rev-parse --git-dir
E R R O R _ Q U I E T
O U T P U T _ V A R I A B L E P R O J E C T _ G I T _ D I R
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E
R E S U L T _ V A R I A B L E P R O J E C T _ G I T _ D I R _ E R R O R
)
if ( NOT PROJECT_GIT_DIR_ERROR )
set ( GIT_REVISION_EXTRA_DEPS
$ { P R O J E C T _ G I T _ D I R } / i n d e x
$ { P R O J E C T _ G I T _ D I R } / l o g s / H E A D
)
endif ( )
endif ( )
add_custom_command ( OUTPUT ${ PROJECT_BINARY_DIR } /src/generated/git_revision.cpp
C O M M A N D $ { P Y T H O N _ E X E C U T A B L E }
s c r i p t s / g i t _ r e v i s i o n . p y
> $ { P R O J E C T _ B I N A R Y _ D I R } / s r c / g e n e r a t e d / g i t _ r e v i s i o n . c p p
W O R K I N G _ D I R E C T O R Y $ { P R O J E C T _ S O U R C E _ D I R }
D E P E N D S
$ { G I T _ R E V I S I O N _ E X T R A _ D E P S }
s c r i p t s / g i t _ r e v i s i o n . p y
)
chash ( "src/generated/nethash.cpp"
" s r c / e n g i n e / s h a r e d / p r o t o c o l . h "
" s r c / g a m e / t u n i n g . h "
" s r c / g a m e / g a m e c o r e . c p p "
" $ { P R O J E C T _ B I N A R Y _ D I R } / s r c / g e n e r a t e d / p r o t o c o l . h "
)
generate_source ( "src/generated/client_data.cpp" "client_content_source" )
generate_source ( "src/generated/client_data.h" "client_content_header" )
generate_source ( "src/generated/protocol.cpp" "network_source" )
generate_source ( "src/generated/protocol.h" "network_header" )
generate_source ( "src/generated/server_data.cpp" "server_content_source" )
generate_source ( "src/generated/server_data.h" "server_content_header" )
########################################################################
# SHARED
########################################################################
# Sources
set_src ( BASE GLOB_RECURSE src/base
c o l o r . h
d e t e c t . h
m a t h . h
s y s t e m . c
s y s t e m . h
t l / a l g o r i t h m . h
t l / a l l o c a t o r . h
t l / a r r a y . h
t l / b a s e . h
t l / r a n g e . h
t l / s o r t e d _ a r r a y . h
t l / s t r i n g . h
t l / t h r e a d i n g . h
v m a t h . h
)
set_src ( ENGINE_INTERFACE GLOB src/engine
c l i e n t . h
c o n f i g . h
c o n s o l e . h
d e m o . h
e d i t o r . h
e n g i n e . h
f r i e n d s . h
g r a p h i c s . h
i n p u t . h
k e r n e l . h
k e y s . h
m a p . h
m a s t e r s e r v e r . h
m e s s a g e . h
s e r v e r . h
s e r v e r b r o w s e r . h
s o u n d . h
s t o r a g e . h
t e x t r e n d e r . h
)
set_src ( ENGINE_SHARED GLOB src/engine/shared
c o m p r e s s i o n . c p p
c o m p r e s s i o n . h
c o n f i g . c p p
c o n f i g . h
c o n f i g _ v a r i a b l e s . h
c o n s o l e . c p p
c o n s o l e . h
d a t a f i l e . c p p
d a t a f i l e . h
d e m o . c p p
d e m o . h
e c o n . c p p
e c o n . h
e n g i n e . c p p
f i l e c o l l e c t i o n . c p p
f i l e c o l l e c t i o n . h
h u f f m a n . c p p
h u f f m a n . h
j o b s . c p p
j o b s . h
k e r n e l . c p p
l i n e r e a d e r . c p p
l i n e r e a d e r . h
m a p . c p p
m a p c h e c k e r . c p p
m a p c h e c k e r . h
m a s t e r s e r v e r . c p p
m e m h e a p . c p p
m e m h e a p . h
m e s s a g e . h
n e t b a n . c p p
n e t b a n . h
n e t w o r k . c p p
n e t w o r k . h
n e t w o r k _ c l i e n t . c p p
n e t w o r k _ c o n n . c p p
n e t w o r k _ c o n s o l e . c p p
n e t w o r k _ c o n s o l e _ c o n n . c p p
n e t w o r k _ s e r v e r . c p p
n e t w o r k _ t o k e n . c p p
p a c k e r . c p p
p a c k e r . h
p r o t o c o l . h
r i n g b u f f e r . c p p
r i n g b u f f e r . h
s n a p s h o t . c p p
s n a p s h o t . h
s t o r a g e . c p p
)
set ( ENGINE_GENERATED_SHARED src/generated/protocol.cpp src/generated/protocol.h )
set_src ( GAME_SHARED GLOB src/game
c o l l i s i o n . c p p
c o l l i s i o n . h
g a m e c o r e . c p p
g a m e c o r e . h
l a y e r s . c p p
l a y e r s . h
m a p i t e m s . h
t u n i n g . h
v a r i a b l e s . h
v e r s i o n . h
v o t i n g . h
)
set ( GAME_GENERATED_SHARED
s r c / g e n e r a t e d / g i t _ r e v i s i o n . c p p
s r c / g e n e r a t e d / n e t h a s h . c p p
s r c / g e n e r a t e d / p r o t o c o l . h
)
set ( DEPS ${ DEP_MD5 } ${ ZLIB_DEP } )
# Libraries
set ( LIBS ${ CMAKE_THREAD_LIBS_INIT } ${ ZLIB_LIBRARIES } ${ PLATFORM_LIBS } )
# Targets
add_library ( engine-shared EXCLUDE_FROM_ALL OBJECT ${ ENGINE_INTERFACE } ${ ENGINE_SHARED } ${ ENGINE_GENERATED_SHARED } ${ BASE } )
add_library ( game-shared EXCLUDE_FROM_ALL OBJECT ${ GAME_SHARED } ${ GAME_GENERATED_SHARED } )
list ( APPEND TARGETS_OWN engine-shared game-shared )
########################################################################
# CLIENT
########################################################################
if ( CLIENT )
# Sources
set_src ( ENGINE_CLIENT GLOB src/engine/client
b a c k e n d _ s d l . c p p
b a c k e n d _ s d l . h
c l i e n t . c p p
c l i e n t . h
f r i e n d s . c p p
f r i e n d s . h
g r a p h i c s _ t h r e a d e d . c p p
g r a p h i c s _ t h r e a d e d . h
i n p u t . c p p
i n p u t . h
k e y n a m e s . h
s e r v e r b r o w s e r . c p p
s e r v e r b r o w s e r . h
s e r v e r b r o w s e r _ e n t r y . h
s e r v e r b r o w s e r _ f a v . c p p
s e r v e r b r o w s e r _ f a v . h
s e r v e r b r o w s e r _ f i l t e r . c p p
s e r v e r b r o w s e r _ f i l t e r . h
s o u n d . c p p
s o u n d . h
t e x t . c p p
)
set_src ( GAME_CLIENT GLOB_RECURSE src/game/client
a n i m s t a t e . c p p
a n i m s t a t e . h
c o m p o n e n t . h
c o m p o n e n t s / b i n d s . c p p
c o m p o n e n t s / b i n d s . h
c o m p o n e n t s / b r o a d c a s t . c p p
c o m p o n e n t s / b r o a d c a s t . h
c o m p o n e n t s / c a m e r a . c p p
c o m p o n e n t s / c a m e r a . h
c o m p o n e n t s / c h a t . c p p
c o m p o n e n t s / c h a t . h
c o m p o n e n t s / c o n s o l e . c p p
c o m p o n e n t s / c o n s o l e . h
c o m p o n e n t s / c o n t r o l s . c p p
c o m p o n e n t s / c o n t r o l s . h
c o m p o n e n t s / c o u n t r y f l a g s . c p p
c o m p o n e n t s / c o u n t r y f l a g s . h
c o m p o n e n t s / d a m a g e i n d . c p p
c o m p o n e n t s / d a m a g e i n d . h
c o m p o n e n t s / d e b u g h u d . c p p
c o m p o n e n t s / d e b u g h u d . h
c o m p o n e n t s / e f f e c t s . c p p
c o m p o n e n t s / e f f e c t s . h
c o m p o n e n t s / e m o t i c o n . c p p
c o m p o n e n t s / e m o t i c o n . h
c o m p o n e n t s / f l o w . c p p
c o m p o n e n t s / f l o w . h
c o m p o n e n t s / h u d . c p p
c o m p o n e n t s / h u d . h
c o m p o n e n t s / i t e m s . c p p
c o m p o n e n t s / i t e m s . h
c o m p o n e n t s / k i l l m e s s a g e s . c p p
c o m p o n e n t s / k i l l m e s s a g e s . h
c o m p o n e n t s / m a p i m a g e s . c p p
c o m p o n e n t s / m a p i m a g e s . h
c o m p o n e n t s / m a p l a y e r s . c p p
c o m p o n e n t s / m a p l a y e r s . h
c o m p o n e n t s / m e n u s . c p p
c o m p o n e n t s / m e n u s . h
c o m p o n e n t s / m e n u s _ b r o w s e r . c p p
c o m p o n e n t s / m e n u s _ c a l l b a c k . c p p
c o m p o n e n t s / m e n u s _ d e m o . c p p
c o m p o n e n t s / m e n u s _ i n g a m e . c p p
c o m p o n e n t s / m e n u s _ p o p u p s . c p p
c o m p o n e n t s / m e n u s _ s e t t i n g s . c p p
c o m p o n e n t s / m e n u s _ s t a r t . c p p
c o m p o n e n t s / m o t d . c p p
c o m p o n e n t s / m o t d . h
c o m p o n e n t s / n a m e p l a t e s . c p p
c o m p o n e n t s / n a m e p l a t e s . h
c o m p o n e n t s / p a r t i c l e s . c p p
c o m p o n e n t s / p a r t i c l e s . h
c o m p o n e n t s / p l a y e r s . c p p
c o m p o n e n t s / p l a y e r s . h
c o m p o n e n t s / s c o r e b o a r d . c p p
c o m p o n e n t s / s c o r e b o a r d . h
c o m p o n e n t s / s k i n s . c p p
c o m p o n e n t s / s k i n s . h
c o m p o n e n t s / s o u n d s . c p p
c o m p o n e n t s / s o u n d s . h
c o m p o n e n t s / s p e c t a t o r . c p p
c o m p o n e n t s / s p e c t a t o r . h
c o m p o n e n t s / v o t i n g . c p p
c o m p o n e n t s / v o t i n g . h
g a m e c l i e n t . c p p
g a m e c l i e n t . h
l i n e i n p u t . c p p
l i n e i n p u t . h
l o c a l i z a t i o n . c p p
l o c a l i z a t i o n . h
r e n d e r . c p p
r e n d e r . h
r e n d e r _ m a p . c p p
u i . c p p
u i . h
)
set_src ( GAME_EDITOR GLOB src/game/editor
a u t o _ m a p . c p p
a u t o _ m a p . h
e d i t o r . c p p
e d i t o r . h
i o . c p p
l a y e r _ g a m e . c p p
l a y e r _ q u a d s . c p p
l a y e r _ t i l e s . c p p
p o p u p s . c p p
)
set ( GAME_GENERATED_CLIENT
s r c / g e n e r a t e d / c l i e n t _ d a t a . c p p
s r c / g e n e r a t e d / c l i e n t _ d a t a . h
)
set ( CLIENT_SRC ${ PLATFORM_CLIENT } ${ ENGINE_CLIENT } ${ GAME_CLIENT } ${ GAME_EDITOR } ${ GAME_GENERATED_CLIENT } )
set ( DEPS_CLIENT ${ DEPS } ${ PNGLITE_DEP } ${ WAVPACK_DEP } )
# Libraries
set ( LIBS_CLIENT
$ { L I B S }
$ { F R E E T Y P E _ L I B R A R I E S }
$ { P N G L I T E _ L I B R A R I E S }
$ { S D L 2 _ L I B R A R I E S }
$ { W A V P A C K _ L I B R A R I E S }
$ { P L A T F O R M _ C L I E N T _ L I B S }
)
if ( TARGET_OS STREQUAL "windows" )
set ( CLIENT_ICON "other/icons/${CLIENT_EXECUTABLE}.rc" )
else ( )
set ( CLIENT_ICON )
endif ( )
# Target
set ( TARGET_CLIENT ${ CLIENT_EXECUTABLE } )
add_executable ( ${ TARGET_CLIENT }
$ { C L I E N T _ S R C }
$ { C L I E N T _ I C O N }
$ { C L I E N T _ M A N I F E S T }
$ { D E P S _ C L I E N T }
$ < T A R G E T _ O B J E C T S : e n g i n e - s h a r e d >
$ < T A R G E T _ O B J E C T S : g a m e - s h a r e d >
)
target_link_libraries ( ${ TARGET_CLIENT } ${ LIBS_CLIENT } )
target_include_directories ( ${ TARGET_CLIENT } PRIVATE
$ { F R E E T Y P E _ I N C L U D E _ D I R S }
$ { P N G L I T E _ I N C L U D E _ D I R S }
$ { S D L 2 _ I N C L U D E _ D I R S }
$ { W A V P A C K _ I N C L U D E _ D I R S }
)
set ( PARAMS "${WAVPACK_INCLUDE_DIRS};${WAVPACK_INCLUDE_DIRS}" )
if ( NOT(WAVPACK_OPEN_FILE_INPUT_EX_PARAMS STREQUAL PARAMS ) )
unset ( WAVPACK_OPEN_FILE_INPUT_EX CACHE )
endif ( )
set ( WAVPACK_OPEN_FILE_INPUT_EX_PARAMS "${PARAMS}" CACHE INTERNAL "" )
set ( CMAKE_REQUIRED_INCLUDES ${ ORIGINAL_CMAKE_REQUIRED_INCLUDES } ${ WAVPACK_INCLUDE_DIRS } )
set ( CMAKE_REQUIRED_LIBRARIES ${ ORIGINAL_CMAKE_REQUIRED_LIBRARIES } ${ WAVPACK_LIBRARIES } )
check_symbol_exists ( WavpackOpenFileInputEx wavpack.h WAVPACK_OPEN_FILE_INPUT_EX )
set ( CMAKE_REQUIRED_INCLUDES ${ ORIGINAL_CMAKE_REQUIRED_INCLUDES } )
set ( CMAKE_REQUIRED_LIBRARIES ${ ORIGINAL_CMAKE_REQUIRED_LIBRARIES } )
if ( WAVPACK_OPEN_FILE_INPUT_EX )
target_compile_definitions ( ${ TARGET_CLIENT } PRIVATE CONF_WAVPACK_OPEN_FILE_INPUT_EX )
endif ( )
list ( APPEND TARGETS_OWN ${ TARGET_CLIENT } )
list ( APPEND TARGETS_LINK ${ TARGET_CLIENT } )
endif ( )
########################################################################
# SERVER
########################################################################
# Sources
set_src ( ENGINE_SERVER GLOB src/engine/server
r e g i s t e r . c p p
r e g i s t e r . h
s e r v e r . c p p
s e r v e r . h
)
set_src ( GAME_SERVER GLOB_RECURSE src/game/server
a l l o c . h
e n t i t i e s / c h a r a c t e r . c p p
e n t i t i e s / c h a r a c t e r . h
e n t i t i e s / f l a g . c p p
e n t i t i e s / f l a g . h
e n t i t i e s / l a s e r . c p p
e n t i t i e s / l a s e r . h
e n t i t i e s / p i c k u p . c p p
e n t i t i e s / p i c k u p . h
e n t i t i e s / p r o j e c t i l e . c p p
e n t i t i e s / p r o j e c t i l e . h
e n t i t y . c p p
e n t i t y . h
e v e n t h a n d l e r . c p p
e v e n t h a n d l e r . h
g a m e c o n t e x t . c p p
g a m e c o n t e x t . h
g a m e c o n t r o l l e r . c p p
g a m e c o n t r o l l e r . h
g a m e m o d e s / c t f . c p p
g a m e m o d e s / c t f . h
g a m e m o d e s / d m . c p p
g a m e m o d e s / d m . h
g a m e m o d e s / l m s . c p p
g a m e m o d e s / l m s . h
g a m e m o d e s / l t s . c p p
g a m e m o d e s / l t s . h
g a m e m o d e s / m o d . c p p
g a m e m o d e s / m o d . h
g a m e m o d e s / t d m . c p p
g a m e m o d e s / t d m . h
g a m e w o r l d . c p p
g a m e w o r l d . h
p l a y e r . c p p
p l a y e r . h
)
set ( GAME_GENERATED_SERVER
s r c / g e n e r a t e d / s e r v e r _ d a t a . c p p
s r c / g e n e r a t e d / s e r v e r _ d a t a . h
)
set ( SERVER_SRC ${ ENGINE_SERVER } ${ GAME_SERVER } ${ GAME_GENERATED_SERVER } )
if ( TARGET_OS STREQUAL "windows" )
set ( SERVER_ICON "other/icons/${SERVER_EXECUTABLE}.rc" )
else ( )
set ( SERVER_ICON )
endif ( )
# Libraries
set ( LIBS_SERVER ${ LIBS } )
# Target
set ( TARGET_SERVER ${ SERVER_EXECUTABLE } )
add_executable ( ${ TARGET_SERVER }
$ { D E P S }
$ { S E R V E R _ S R C }
$ { S E R V E R _ I C O N }
$ < T A R G E T _ O B J E C T S : e n g i n e - s h a r e d >
$ < T A R G E T _ O B J E C T S : g a m e - s h a r e d >
)
target_link_libraries ( ${ TARGET_SERVER } ${ LIBS_SERVER } )
list ( APPEND TARGETS_OWN ${ TARGET_SERVER } )
list ( APPEND TARGETS_LINK ${ TARGET_SERVER } )
if ( TARGET_OS AND TARGET_OS STREQUAL "mac" )
set ( SERVER_LAUNCHER_SRC src/osxlaunch/server.mm )
set ( TARGET_SERVER_LAUNCHER ${ TARGET_SERVER } -Launcher )
add_executable ( ${ TARGET_SERVER_LAUNCHER } ${ SERVER_LAUNCHER_SRC } )
target_link_libraries ( ${ TARGET_SERVER_LAUNCHER } ${ COCOA } )
list ( APPEND TARGETS_OWN ${ TARGET_SERVER_LAUNCHER } )
list ( APPEND TARGETS_LINK ${ TARGET_SERVER_LAUNCHER } )
endif ( )
########################################################################
# VARIOUS TARGETS
########################################################################
set_src ( MASTERSRV_SRC GLOB src/mastersrv mastersrv.cpp mastersrv.h )
set_src ( VERSIONSRV_SRC GLOB src/versionsrv mapversions.h versionsrv.cpp versionsrv.h )
set ( TARGET_MASTERSRV mastersrv )
set ( TARGET_VERSIONSRV versionsrv )
add_executable ( ${ TARGET_MASTERSRV } EXCLUDE_FROM_ALL ${ MASTERSRV_SRC } $< TARGET_OBJECTS:engine-shared > ${ DEPS } )
add_executable ( ${ TARGET_VERSIONSRV } EXCLUDE_FROM_ALL ${ VERSIONSRV_SRC } $< TARGET_OBJECTS:engine-shared > ${ DEPS } )
target_link_libraries ( ${ TARGET_MASTERSRV } ${ LIBS } )
target_link_libraries ( ${ TARGET_VERSIONSRV } ${ LIBS } )
list ( APPEND TARGETS_OWN ${ TARGET_MASTERSRV } ${ TARGET_VERSIONSRV } )
list ( APPEND TARGETS_LINK ${ TARGET_MASTERSRV } ${ TARGET_VERSIONSRV } )
set ( TARGETS_TOOLS )
set_src ( TOOLS GLOB src/tools
c r a p n e t . c p p
f a k e _ s e r v e r . c p p
m a p _ r e s a v e . c p p
m a p _ v e r s i o n . c p p
p a c k e t g e n . c p p
)
foreach ( ABS_T ${ TOOLS } )
file ( RELATIVE_PATH T "${PROJECT_SOURCE_DIR}/src/tools/" ${ ABS_T } )
if ( T MATCHES "\\.cpp$" )
string ( REGEX REPLACE "\\.cpp$" "" TOOL "${T}" )
add_executable ( ${ TOOL } EXCLUDE_FROM_ALL
$ { D E P S }
s r c / t o o l s / $ { T O O L } . c p p
$ { E X T R A _ T O O L _ S R C }
$ < T A R G E T _ O B J E C T S : e n g i n e - s h a r e d >
)
target_link_libraries ( ${ TOOL } ${ LIBS } )
list ( APPEND TARGETS_TOOLS ${ TOOL } )
endif ( )
endforeach ( )
list ( APPEND TARGETS_OWN ${ TARGETS_TOOLS } )
list ( APPEND TARGETS_LINK ${ TARGETS_TOOLS } )
add_custom_target ( tools DEPENDS ${ TARGETS_TOOLS } )
add_custom_target ( everything DEPENDS ${ TARGETS_OWN } )
########################################################################
# INSTALLATION
########################################################################
function ( escape_regex VAR STRING )
string ( REGEX REPLACE "([][^$.+*?|()\\\\])" "\\\\\\1" ESCAPED "${STRING}" )
set ( ${ VAR } ${ ESCAPED } PARENT_SCOPE )
endfunction ( )
function ( escape_backslashes VAR STRING )
string ( REGEX REPLACE "\\\\" "\\\\\\\\" ESCAPED "${STRING}" )
set ( ${ VAR } ${ ESCAPED } PARENT_SCOPE )
endfunction ( )
function ( max_length VAR )
set ( MAX_LENGTH 0 )
foreach ( str ${ ARGN } )
string ( LENGTH ${ str } LENGTH )
if ( LENGTH GREATER MAX_LENGTH )
set ( MAX_LENGTH ${ LENGTH } )
endif ( )
endforeach ( )
set ( ${ VAR } ${ MAX_LENGTH } PARENT_SCOPE )
endfunction ( )
# Tries to generate a list of regex that matches everything except the given
# parameters.
function ( regex_inverted VAR )
max_length ( MAX_LENGTH ${ ARGN } )
math ( EXPR UPPER_BOUND "${MAX_LENGTH}-1" )
set ( REMAINING ${ ARGN } )
set ( RESULT )
foreach ( i RANGE ${ UPPER_BOUND } )
set ( TEMP ${ REMAINING } )
set ( REMAINING )
foreach ( str ${ TEMP } )
string ( LENGTH ${ str } LENGTH )
if ( i LESS LENGTH )
list ( APPEND REMAINING ${ str } )
endif ( )
endforeach ( )
set ( ADDITIONAL )
foreach ( outer ${ REMAINING } )
string ( SUBSTRING ${ outer } 0 ${ i } OUTER_PREFIX )
set ( CHARS "" )
foreach ( inner ${ REMAINING } )
string ( SUBSTRING ${ inner } 0 ${ i } INNER_PREFIX )
if ( OUTER_PREFIX STREQUAL INNER_PREFIX )
string ( SUBSTRING ${ inner } ${ i } 1 INNER_NEXT )
set ( CHARS "${CHARS}${INNER_NEXT}" )
endif ( )
endforeach ( )
escape_regex ( OUTER_PREFIX_ESCAPED "${OUTER_PREFIX}" )
list ( APPEND ADDITIONAL "${OUTER_PREFIX_ESCAPED}([^${CHARS}]|$)" )
endforeach ( )
list ( REMOVE_DUPLICATES ADDITIONAL )
list ( APPEND RESULT ${ ADDITIONAL } )
endforeach ( )
set ( ${ VAR } ${ RESULT } PARENT_SCOPE )
endfunction ( )
set ( CPACK_PACKAGE_NAME ${ PROJECT_NAME } )
set ( CPACK_GENERATOR TGZ TXZ )
set ( CPACK_ARCHIVE_COMPONENT_INSTALL ON )
set ( CPACK_STRIP_FILES TRUE )
set ( CPACK_COMPONENTS_ALL portable )
set ( CPACK_SOURCE_GENERATOR ZIP TGZ TBZ2 TXZ )
set ( CPACK_PACKAGE_VERSION_MAJOR ${ PROJECT_VERSION_MAJOR } )
set ( CPACK_PACKAGE_VERSION_MINOR ${ PROJECT_VERSION_MINOR } )
set ( CPACK_PACKAGE_VERSION_PATCH ${ PROJECT_VERSION_PATCH } )
set ( CPACK_PACKAGE_VERSION ${ CPACK_PACKAGE_VERSION_MAJOR } . ${ CPACK_PACKAGE_VERSION_MINOR } . ${ CPACK_PACKAGE_VERSION_PATCH } )
set ( CPACK_SYSTEM_NAME ${ CMAKE_SYSTEM_NAME } )
if ( TARGET_OS AND TARGET_BITS )
if ( TARGET_OS STREQUAL "windows" )
set ( CPACK_SYSTEM_NAME "win${TARGET_BITS}" )
set ( CPACK_GENERATOR ZIP )
elseif ( TARGET_OS STREQUAL "linux" )
# Assuming Intel here.
if ( TARGET_BITS EQUAL 32 )
set ( CPACK_SYSTEM_NAME "linux_x86" )
elseif ( TARGET_BITS EQUAL 64 )
set ( CPACK_SYSTEM_NAME "linux_x86_64" )
endif ( )
elseif ( TARGET_OS STREQUAL "mac" )
set ( CPACK_SYSTEM_NAME "osx" )
set ( CPACK_GENERATOR DMG )
endif ( )
endif ( )
set ( CPACK_PACKAGE_FILE_NAME ${ CPACK_PACKAGE_NAME } - ${ CPACK_PACKAGE_VERSION } - ${ CPACK_SYSTEM_NAME } )
set ( CPACK_ARCHIVE_PORTABLE_FILE_NAME ${ CPACK_PACKAGE_FILE_NAME } )
set ( CPACK_SOURCE_PACKAGE_FILE_NAME ${ CPACK_PACKAGE_NAME } - ${ CPACK_PACKAGE_VERSION } -src )
set ( CPACK_SOURCE_FILES
C M a k e L i s t s . t x t
b a m . l u a
c m a k e /
c o n f i g u r e . l u a
d a t a s r c /
l i c e n s e . t x t
o t h e r /
r e a d m e . m d
s c r i p t s /
s r c /
s t o r a g e . c f g
)
set ( CPACK_SOURCE_IGNORE_FILES
" \ \ \ \ . o $ "
" \ \ \ \ . p y c $ "
" / \ \ \ \ . g i t "
" / _ _ p y c a c h e _ _ / "
)
regex_inverted ( CPACK_SOURCE_FILES_INVERTED ${ CPACK_SOURCE_FILES } )
escape_regex ( PROJECT_SOURCE_DIR_ESCAPED ${ PROJECT_SOURCE_DIR } )
foreach ( str ${ CPACK_SOURCE_FILES_INVERTED } )
escape_backslashes ( STR_ESCAPED "${PROJECT_SOURCE_DIR_ESCAPED}/${str}" )
list ( APPEND CPACK_SOURCE_IGNORE_FILES "${STR_ESCAPED}" )
endforeach ( )
set ( CMAKE_INSTALL_DEFAULT_COMPONENT_NAME ${ PROJECT_NAME } )
set ( CPACK_TARGETS
$ { T A R G E T _ C L I E N T }
$ { T A R G E T _ S E R V E R }
)
set ( CPACK_DIRS ${ PROJECT_BINARY_DIR } /data )
set ( CPACK_FILES
l i c e n s e . t x t
s t o r a g e . c f g
$ { C O P Y _ F I L E S }
)
if ( TARGET_OS STREQUAL "windows" )
list ( APPEND CPACK_FILES other/config_directory.bat )
endif ( )
if ( NOT DEV )
install ( DIRECTORY ${ PROJECT_BINARY_DIR } /data DESTINATION share/ ${ PROJECT_NAME } COMPONENT data )
install ( TARGETS ${ TARGET_CLIENT } DESTINATION bin COMPONENT client )
install ( TARGETS ${ TARGET_SERVER } DESTINATION bin COMPONENT server )
endif ( )
if ( DEV )
# Don't generate CPack targets.
elseif ( CMAKE_VERSION VERSION_LESS 3.6 OR CMAKE_VERSION VERSION_EQUAL 3.6 )
message ( WARNING "Cannot create CPack targets, CMake version too old. Use CMake 3.6 or newer." )
else ( )
set ( EXTRA_ARGS DESTINATION ${ CPACK_PACKAGE_FILE_NAME } COMPONENT portable EXCLUDE_FROM_ALL )
install ( TARGETS ${ CPACK_TARGETS } ${ EXTRA_ARGS } )
install ( DIRECTORY ${ CPACK_DIRS } ${ EXTRA_ARGS } )
install ( FILES ${ CPACK_FILES } ${ EXTRA_ARGS } )
endif ( )
set ( PACKAGE_TARGETS )
if ( CLIENT AND ( DMGTOOLS_FOUND OR HDIUTIL ) )
file ( MAKE_DIRECTORY bundle/client/ )
file ( MAKE_DIRECTORY bundle/server/ )
configure_file ( other/bundle/client/Info.plist.in bundle/client/Info.plist )
configure_file ( other/bundle/server/Info.plist.in bundle/server/Info.plist )
if ( HDIUTIL )
set ( DMG_PARAMS --hdiutil ${ HDIUTIL } )
elseif ( DMGTOOLS_FOUND )
set ( DMG_PARAMS --dmgtools ${ DMG } ${ HFSPLUS } ${ NEWFS_HFS } )
endif ( )
set ( DMG_TMPDIR pack_ ${ CPACK_PACKAGE_FILE_NAME } _dmg )
set ( DMG_MKDIRS
$ { T A R G E T _ C L I E N T } . a p p
$ { T A R G E T _ C L I E N T } . a p p / C o n t e n t s
$ { T A R G E T _ C L I E N T } . a p p / C o n t e n t s / F r a m e w o r k s
$ { T A R G E T _ C L I E N T } . a p p / C o n t e n t s / M a c O S
$ { T A R G E T _ C L I E N T } . a p p / C o n t e n t s / R e s o u r c e s
$ { T A R G E T _ S E R V E R } . a p p
$ { T A R G E T _ S E R V E R } . a p p / C o n t e n t s
$ { T A R G E T _ S E R V E R } . a p p / C o n t e n t s / M a c O S
$ { T A R G E T _ S E R V E R } . a p p / C o n t e n t s / R e s o u r c e s
$ { T A R G E T _ S E R V E R } . a p p / C o n t e n t s / R e s o u r c e s / d a t a
# Needed so the server recognizes the data directory.
$ { T A R G E T _ S E R V E R } . a p p / C o n t e n t s / R e s o u r c e s / d a t a / m a p r e s
)
set ( DMG_MKDIR_COMMANDS )
foreach ( dir ${ DMG_MKDIRS } )
list ( APPEND DMG_MKDIR_COMMANDS COMMAND ${ CMAKE_COMMAND } -E make_directory ${ DMG_TMPDIR } / ${ dir } )
endforeach ( )
add_custom_command ( OUTPUT ${ CPACK_PACKAGE_FILE_NAME } .dmg
C O M M A N D $ { C M A K E _ C O M M A N D } - E r e m o v e _ d i r e c t o r y $ { D M G _ T M P D I R }
$ { D M G _ M K D I R _ C O M M A N D S }
# CLIENT
C O M M A N D $ { C M A K E _ C O M M A N D } - E c o p y _ d i r e c t o r y d a t a $ { D M G _ T M P D I R } / $ { T A R G E T _ C L I E N T } . a p p / C o n t e n t s / R e s o u r c e s / d a t a
C O M M A N D $ { C M A K E _ C O M M A N D } - E c o p y $ { P R O J E C T _ S O U R C E _ D I R } / o t h e r / i c o n s / $ { T A R G E T _ C L I E N T } . i c n s $ { D M G _ T M P D I R } / $ { T A R G E T _ C L I E N T } . a p p / C o n t e n t s / R e s o u r c e s /
C O M M A N D $ { C M A K E _ C O M M A N D } - E c o p y b u n d l e / c l i e n t / I n f o . p l i s t $ { P R O J E C T _ S O U R C E _ D I R } / o t h e r / b u n d l e / c l i e n t / P k g I n f o $ { D M G _ T M P D I R } / $ { T A R G E T _ C L I E N T } . a p p / C o n t e n t s /
C O M M A N D $ { C M A K E _ C O M M A N D } - E c o p y $ < T A R G E T _ F I L E : $ { T A R G E T _ C L I E N T } > $ { D M G _ T M P D I R } / $ { T A R G E T _ C L I E N T } . a p p / C o n t e n t s / M a c O S /
C O M M A N D $ { C M A K E _ C O M M A N D } - E c o p y _ d i r e c t o r y $ { P R O J E C T _ S O U R C E _ D I R } / o t h e r / s d l / m a c / l i b 6 4 / S D L 2 . f r a m e w o r k $ { D M G _ T M P D I R } / $ { T A R G E T _ C L I E N T } . a p p / C o n t e n t s / F r a m e w o r k s / S D L 2 . f r a m e w o r k
2018-12-25 20:42:24 +00:00
C O M M A N D $ { C M A K E _ C O M M A N D } - E c o p y $ { F R E E T Y P E _ L I B R A R Y } $ { D M G _ T M P D I R } / $ { T A R G E T _ C L I E N T } . a p p / C o n t e n t s / F r a m e w o r k s /
2018-11-26 19:47:20 +00:00
C O M M A N D $ { P Y T H O N _ E X E C U T A B L E } $ { P R O J E C T _ S O U R C E _ D I R } / s c r i p t s / d a r w i n _ c h a n g e _ d y l i b . p y c h a n g e - - t o o l s $ { C M A K E _ I N S T A L L _ N A M E _ T O O L } $ { C M A K E _ O T O O L } $ { D M G _ T M P D I R } / $ { T A R G E T _ C L I E N T } . a p p / C o n t e n t s / M a c O S / $ { T A R G E T _ C L I E N T } S D L 2 @ e x e c u t a b l e _ p a t h / . . / F r a m e w o r k s / S D L 2 . f r a m e w o r k / S D L 2
C O M M A N D $ { P Y T H O N _ E X E C U T A B L E } $ { P R O J E C T _ S O U R C E _ D I R } / s c r i p t s / d a r w i n _ c h a n g e _ d y l i b . p y c h a n g e - - t o o l s $ { C M A K E _ I N S T A L L _ N A M E _ T O O L } $ { C M A K E _ O T O O L } $ { D M G _ T M P D I R } / $ { T A R G E T _ C L I E N T } . a p p / C o n t e n t s / M a c O S / $ { T A R G E T _ C L I E N T } l i b f r e e t y p e @ e x e c u t a b l e _ p a t h / . . / F r a m e w o r k s / l i b f r e e t y p e . 6 . d y l i b
# SERVER
C O M M A N D $ { C M A K E _ C O M M A N D } - E c o p y _ d i r e c t o r y d a t a / m a p s $ { D M G _ T M P D I R } / $ { T A R G E T _ S E R V E R } . a p p / C o n t e n t s / R e s o u r c e s / d a t a / m a p s
C O M M A N D $ { C M A K E _ C O M M A N D } - E c o p y $ { P R O J E C T _ S O U R C E _ D I R } / o t h e r / i c o n s / $ { T A R G E T _ S E R V E R } . i c n s $ { D M G _ T M P D I R } / $ { T A R G E T _ S E R V E R } . a p p / C o n t e n t s / R e s o u r c e s /
C O M M A N D $ { C M A K E _ C O M M A N D } - E c o p y b u n d l e / s e r v e r / I n f o . p l i s t $ { P R O J E C T _ S O U R C E _ D I R } / o t h e r / b u n d l e / s e r v e r / P k g I n f o $ { D M G _ T M P D I R } / $ { T A R G E T _ S E R V E R } . a p p / C o n t e n t s /
C O M M A N D $ { C M A K E _ C O M M A N D } - E c o p y $ < T A R G E T _ F I L E : $ { T A R G E T _ S E R V E R } > $ < T A R G E T _ F I L E : $ { T A R G E T _ S E R V E R _ L A U N C H E R } > $ { D M G _ T M P D I R } / $ { T A R G E T _ S E R V E R } . a p p / C o n t e n t s / M a c O S /
# DMG
C O M M A N D $ { P Y T H O N _ E X E C U T A B L E } $ { P R O J E C T _ S O U R C E _ D I R } / s c r i p t s / d m g . p y c r e a t e $ { D M G _ P A R A M S } $ { C P A C K _ P A C K A G E _ F I L E _ N A M E } . d m g $ { C P A C K _ P A C K A G E _ F I L E _ N A M E } $ { D M G _ T M P D I R }
D E P E N D S
$ { T A R G E T _ C L I E N T }
$ { T A R G E T _ S E R V E R _ L A U N C H E R }
$ { T A R G E T _ S E R V E R }
$ { P R O J E C T _ B I N A R Y _ D I R } / b u n d l e / c l i e n t / I n f o . p l i s t
$ { P R O J E C T _ B I N A R Y _ D I R } / b u n d l e / s e r v e r / I n f o . p l i s t
o t h e r / b u n d l e / c l i e n t / P k g I n f o
o t h e r / b u n d l e / s e r v e r / P k g I n f o
o t h e r / i c o n s / $ { T A R G E T _ C L I E N T } . i c n s
o t h e r / i c o n s / $ { T A R G E T _ S E R V E R } . i c n s
s c r i p t s / d m g . p y
)
add_custom_target ( package_dmg DEPENDS ${ CPACK_PACKAGE_FILE_NAME } .dmg )
list ( APPEND PACKAGE_TARGETS package_dmg )
endif ( )
foreach ( ext zip tar.gz tar.xz )
set ( TAR_MODE c )
set ( TAR_EXTRA_ARGS )
string ( REPLACE . _ EXT_SLUG ${ ext } )
set ( TMPDIR pack_ ${ CPACK_PACKAGE_FILE_NAME } _ ${ EXT_SLUG } / ${ CPACK_PACKAGE_FILE_NAME } )
set ( COPY_FILE_COMMANDS )
set ( COPY_DIR_COMMANDS )
set ( COPY_TARGET_COMMANDS )
set ( STRIP_TARGET_COMMANDS )
foreach ( file ${ CPACK_FILES } )
list ( APPEND COPY_FILE_COMMANDS COMMAND ${ CMAKE_COMMAND } -E copy ${ PROJECT_SOURCE_DIR } / ${ file } ${ TMPDIR } / )
endforeach ( )
foreach ( dir ${ CPACK_DIRS } )
get_filename_component ( NAME ${ dir } NAME )
list ( APPEND COPY_DIR_COMMANDS COMMAND ${ CMAKE_COMMAND } -E copy_directory ${ dir } ${ TMPDIR } / ${ NAME } )
endforeach ( )
foreach ( target ${ CPACK_TARGETS } )
list ( APPEND COPY_TARGET_COMMANDS COMMAND ${ CMAKE_COMMAND } -E copy $< TARGET_FILE:${target} > ${ TMPDIR } / )
endforeach ( )
if ( ext STREQUAL zip )
set ( TAR_EXTRA_ARGS --format=zip )
elseif ( ext STREQUAL tar.gz )
set ( TAR_MODE cz )
elseif ( ext STREQUAL tar.xz )
set ( TAR_MODE cJ )
endif ( )
add_custom_command ( OUTPUT ${ CPACK_PACKAGE_FILE_NAME } . ${ ext }
C O M M A N D $ { C M A K E _ C O M M A N D } - E r e m o v e _ d i r e c t o r y $ { T M P D I R }
C O M M A N D $ { C M A K E _ C O M M A N D } - E m a k e _ d i r e c t o r y $ { T M P D I R }
$ { C O P Y _ F I L E _ C O M M A N D S }
$ { C O P Y _ D I R _ C O M M A N D S }
$ { C O P Y _ T A R G E T _ C O M M A N D S }
$ { S T R I P _ T A R G E T _ C O M M A N D S }
C O M M A N D $ { C M A K E _ C O M M A N D } - E c h d i r p a c k _ $ { C P A C K _ P A C K A G E _ F I L E _ N A M E } _ $ { E X T _ S L U G } $ { C M A K E _ C O M M A N D } - E t a r $ { T A R _ M O D E } . . / $ { C P A C K _ P A C K A G E _ F I L E _ N A M E } . $ { e x t } $ { T A R _ E X T R A _ A R G S } - - $ { C P A C K _ P A C K A G E _ F I L E _ N A M E } /
D E P E N D S $ { C P A C K _ T A R G E T S }
)
add_custom_target ( package_ ${ EXT_SLUG } DEPENDS ${ CPACK_PACKAGE_FILE_NAME } . ${ ext } )
list ( APPEND PACKAGE_TARGETS package_ ${ EXT_SLUG } )
endforeach ( )
set ( PACKAGE_DEFAULT tar_xz )
if ( TARGET_OS STREQUAL "windows" )
set ( PACKAGE_DEFAULT zip )
elseif ( TARGET_OS STREQUAL "mac" )
set ( PACKAGE_DEFAULT dmg )
endif ( )
add_custom_target ( package_default DEPENDS package_ ${ PACKAGE_DEFAULT } )
add_custom_target ( package_all DEPENDS ${ PACKAGE_TARGETS } )
# Unset these variables, they might do something in the future of CPack.
unset ( CPACK_SOURCE_FILES )
unset ( CPACK_SOURCE_FILES_INVERTED )
unset ( CPACK_TARGETS )
unset ( CPACK_DIRS )
unset ( CPACK_FILES )
include ( CPack )
########################################################################
# COMPILER-SPECIFICS
########################################################################
# In the future (CMake 3.8.0+), use source_group(TREE ...)
macro ( source_group_tree dir )
file ( GLOB ents RELATIVE ${ PROJECT_SOURCE_DIR } / ${ dir } ${ PROJECT_SOURCE_DIR } / ${ dir } /* )
foreach ( ent ${ ents } )
if ( IS_DIRECTORY ${ PROJECT_SOURCE_DIR } / ${ dir } / ${ ent } )
source_group_tree ( ${ dir } / ${ ent } )
else ( )
string ( REPLACE "/" "\\" group ${ dir } )
source_group ( ${ group } FILES ${ PROJECT_SOURCE_DIR } / ${ dir } / ${ ent } )
endif ( )
endforeach ( )
endmacro ( )
source_group_tree ( src )
set ( TARGETS ${ TARGETS_OWN } ${ TARGETS_DEP } )
foreach ( target ${ TARGETS } )
if ( MSVC )
target_compile_options ( ${ target } PRIVATE $< $<NOT:${DBG} > :/MT> $< ${DBG}:/MTd > ) # Use static CRT
target_compile_options ( ${ target } PRIVATE /MP ) # Use multiple cores
target_compile_options ( ${ target } PRIVATE /EHsc ) # Only catch C++ exceptions with catch.
target_compile_options ( ${ target } PRIVATE /GS ) # Protect the stack pointer.
target_compile_options ( ${ target } PRIVATE /wd4996 ) # Use of non-_s functions.
endif ( )
if ( OUR_FLAGS )
target_compile_options ( ${ target } PRIVATE ${ OUR_FLAGS } )
endif ( )
if ( DEFINE_FORTIFY_SOURCE )
target_compile_definitions ( ${ target } PRIVATE $< $<NOT:$<CONFIG:Debug > >:_FORTIFY_SOURCE=2> ) # Detect some buffer overflows.
endif ( )
endforeach ( )
foreach ( target ${ TARGETS_LINK } )
if ( MSVC )
set_property ( TARGET ${ target } APPEND PROPERTY LINK_FLAGS /SAFESEH:NO ) # Disable SafeSEH because the shipped libraries don't support it (would cause error LNK2026 otherwise).
endif ( )
if ( TARGET_OS STREQUAL "mac" )
target_link_libraries ( ${ target } -stdlib=libc++ )
target_link_libraries ( ${ target } -mmacosx-version-min=10.7 )
endif ( )
if ( ( MINGW OR TARGET_OS STREQUAL "linux" ) AND PREFER_BUNDLED_LIBS )
# Statically link the standard libraries with on MinGW/Linux so we don't
# have to ship them as DLLs.
target_link_libraries ( ${ target } -static-libgcc )
target_link_libraries ( ${ target } -static-libstdc++ )
if ( MINGW )
# Link pthread library statically instead of dynamically.
# Solution from https://stackoverflow.com/a/28001261.
target_link_libraries ( ${ target } -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic )
endif ( )
endif ( )
endforeach ( )
foreach ( target ${ TARGETS_OWN } )
if ( MSVC )
target_compile_options ( ${ target } PRIVATE /wd4244 ) # Possible loss of data (float -> int, int -> float, etc.).
target_compile_options ( ${ target } PRIVATE /wd4267 ) # Possible loss of data (size_t - int on win64).
target_compile_options ( ${ target } PRIVATE /wd4800 ) # Implicit conversion of int to bool.
endif ( )
if ( OUR_FLAGS_OWN )
target_compile_options ( ${ target } PRIVATE ${ OUR_FLAGS_OWN } )
endif ( )
target_include_directories ( ${ target } PRIVATE ${ PROJECT_BINARY_DIR } /src )
target_include_directories ( ${ target } PRIVATE src )
target_compile_definitions ( ${ target } PRIVATE $< $<CONFIG:Debug > :CONF_DEBUG> )
target_include_directories ( ${ target } PRIVATE ${ CURL_INCLUDE_DIRS } )
target_include_directories ( ${ target } PRIVATE ${ ZLIB_INCLUDE_DIRS } )
endforeach ( )
foreach ( target ${ TARGETS_DEP } )
if ( MSVC )
target_compile_options ( ${ target } PRIVATE /W0 )
endif ( )
if ( OUR_FLAGS_DEP )
target_compile_options ( ${ target } PRIVATE ${ OUR_FLAGS_DEP } )
endif ( )
endforeach ( )