diff options
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 593 |
1 files changed, 593 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..de011379a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,593 @@ +##################################################################### +# +# "Getting Started with CMake", a tutorial video by Eric Wing. +# Part 1 of 6: http://www.youtube.com/watch?v=CLvZTyji_Uw +# Part 2 of 6: http://www.youtube.com/watch?v=gUW-RrRQjEg +# Part 3 of 6: http://www.youtube.com/watch?v=sz6cPhbuTk4 +# Part 4 of 6: http://www.youtube.com/watch?v=JICZOkyNXbg +# Part 5 of 6: http://www.youtube.com/watch?v=lAiuLHy4dCk +# Part 6 of 6: http://www.youtube.com/watch?v=fAtJNzDZdH8 +# +# You can use notepad++ for syntax highlighting. +# Naming conventions: +# WITH_* : option to use an external package or not +# ENABLE_* : option to use an internal feature/code or not +# HAVE_* : internal variable indicating if we have and are using something +# +# Maintainer: Fl�vio J. Saraiva (feel free to send complaints or suggestions) +# flaviojs @ rAthena forum/irc +# flaviojs2005 \A-T/ gmail <D.o,T> com +# +##################################################################### + + +#cmake_minimum_required( VERSION 2.8.4 ) +# Functional changes from 2.8.3 to 2.8.4: +# string(SUBSTRING) works with length -1 as "rest of string" +# changes to some CPack generators +# CYGWIN no longer defines WIN32 +# CMP0017: Prefer files from the CMake module directory when including from there. +set( CMAKE_LEGACY_CYGWIN_WIN32 0 ) +cmake_minimum_required( VERSION 2.8.3 ) +project( rAthena C ) +if( CYGWIN ) + unset( WIN32 ) +endif() + + +# +# Prevent building in the source directory by default +# +if( ALLOW_SAME_DIRECTORY ) +elseif( "${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}" ) + option( ALLOW_SAME_DIRECTORY "Allow CMake to build in the source directory." OFF ) + message( FATAL_ERROR + "Do not use the source directory to build your files, instead delete CMakeCache.txt, create a separate folder and build there.\n" + "Example: (build in subdir 'build' and install to source dir)\n" + " rm -f CMakeCache.txt\n" + " mkdir build\n" + " cd build\n" + " cmake -G\"Unix Makefiles\" -DINSTALL_TO_SOURCE=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo ..\n" + " make install\n" + " cd ..\n" + " rm -rf build\n" + "To skip this check, set ALLOW_SAME_DIRECTORY to ON (-DALLOW_SAME_DIRECTORY=ON)" ) +endif() + + +# +# Global stuff +# +set( GLOBAL_LIBRARIES ${LINK_LIBRARIES} CACHE INTERNAL "" )# list (comma separated values) +set( GLOBAL_INCLUDE_DIRS ${INCLUDE_DIRECTORIES} CACHE INTERNAL "" )# list (comma separated values) +set( GLOBAL_DEFINITIONS ${COMPILE_DEFINITIONS} CACHE INTERNAL "" )# string (space separated values -DFOO=bar) +mark_as_advanced( GLOBAL_LIBRARIES GLOBAL_INCLUDE_DIRS GLOBAL_DEFINITIONS ) +if( WIN32 ) + set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DFD_SETSIZE=4096" ) +endif() +if( MSVC ) + set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} "oldnames.lib" "ws2_32.lib" ) + set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE" ) +endif() + + +# +# 3rd party +# +set( CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/cmake CACHE INTERNAL "" ) +include( CheckCSourceCompiles ) +include( CheckCSourceRuns ) +include( CheckIncludeFile ) +include( CheckFunctionExists ) +include( FindFunctionLibrary ) +include( TestBigEndian ) + + +# +# Find svnversion +# +message( STATUS "Detecting svnversion" ) +find_program( SVNVERSION_EXECUTABLE svnversion ) +mark_as_advanced( SVNVERSION_EXECUTABLE ) +if( SVNVERSION_EXECUTABLE ) + message( STATUS "Found svnversion: ${SVNVERSION_EXECUTABLE}" ) +endif() +message( STATUS "Detecting svnversion - done" ) + + +# +# Find Subversion +# +message( STATUS "Detecting Subversion" ) +find_package( Subversion ) +message( STATUS "Detecting Subversion - done" ) + +# +# PACKETVER +# +set( PACKETVER CACHE STRING "Sets the PACKETVER define of the servers. (see src/common/mmo.h)" ) +if( PACKETVER ) + list( APPEND GLOBAL_DEFINITIONS PACKETVER=${PACKETVER} ) +endif() + + +# +# SVNVERSION +# +if( SVNVERSION_EXECUTABLE ) + message( STATUS "Getting svn version" ) + execute_process( COMMAND ${SVNVERSION_EXECUTABLE} ${PROJECT_SOURCE_DIR} + OUTPUT_VARIABLE SVNVERSION + OUTPUT_STRIP_TRAILING_WHITESPACE ) + if( SVNVERSION MATCHES "^Unversioned" ) + set( SVNVERSION ) + endif() + string( REGEX REPLACE "[^1234567890MSexported]" "_" SVNVERSION "${SVNVERSION}" ) + message( STATUS "Found version: ${SVNVERSION}" ) + message( STATUS "Getting svn version - done" ) +endif() +if( Subversion_FOUND AND SVNVERSION ) + message( STATUS "Getting svn branch" ) + Subversion_WC_INFO( ${PROJECT_SOURCE_DIR} rAthena ) + if( rAthena_WC_URL ) + string( REGEX MATCH "[^/]+$" BRANCH ${rAthena_WC_URL} ) + set( SVNVERSION "${BRANCH}-${SVNVERSION}" ) + message( STATUS "Found branch: ${BRANCH}" ) + endif() + message( STATUS "Getting svn branch - done" ) +endif() + + +# +# threads +# +message( STATUS "Detecting threads library" ) +set( CMAKE_THREAD_PREFER_PTHREAD 1 ) +find_package(Threads REQUIRED) +if( CMAKE_THREAD_LIBS_INIT ) + message( STATUS "Adding global library: ${FUNCTION_FLOOR_LIBRARIES}" ) + set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ) +endif() +message( STATUS "Detecting threads library - done" ) + + +# +# math library (FreeBSD/Linux/Solaris) +# +message( STATUS "Detecting math library (m)" ) +CHECK_INCLUDE_FILE( math.h HAVE_MATH_H ) +if( NOT HAVE_MATH_H ) + message( FATAL_ERROR "math.h not found" ) +endif() +set( CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} ) +find_function_library( floor FUNCTION_FLOOR_LIBRARIES m ) +if( FUNCTION_FLOOR_LIBRARIES ) + message( STATUS "Adding global library: ${FUNCTION_FLOOR_LIBRARIES}" ) + set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${FUNCTION_FLOOR_LIBRARIES} ) +endif() +message( STATUS "Detecting math library (m) - done" ) + + +# +# dynamic loading library (Linux) +# +if( NOT WIN32 ) +message( STATUS "Detecting dynamic loading library (dl)" ) +set( CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} ) +find_function_library( dlopen FUNCTION_DLOPEN_LIBRARIES dl ) +if( FUNCTION_DLOPEN_LIBRARIES ) + message( STATUS "Adding global library: ${FUNCTION_DLOPEN_LIBRARIES}" ) + set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${FUNCTION_DLOPEN_LIBRARIES} ) +endif() +message( STATUS "Detecting dynamic loading library (dl) - done" ) +endif() + + +# +# networking library (Solaris/MinGW) +# +if( NOT MSVC ) +message( STATUS "Detecting networking library (socket/nsl/ws2_32)" ) +set( CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} ) +find_function_library( bind FUNCTION_BIND_LIBRARIES socket ws2_32 ) +if( FUNCTION_BIND_LIBRARIES ) + message( STATUS "Adding global library: ${FUNCTION_BIND_LIBRARIES}" ) + set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${FUNCTION_BIND_LIBRARIES} ) +endif() +set( CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} ) +find_function_library( gethostbyname FUNCTION_GETHOSTBYNAME_LIBRARIES nsl ) +if( FUNCTION_GETHOSTBYNAME_LIBRARIES ) + message( STATUS "Adding global library: ${FUNCTION_GETHOSTBYNAME_LIBRARIES}" ) + set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${FUNCTION_GETHOSTBYNAME_LIBRARIES} ) +endif() +message( STATUS "Detecting networking library (socket/nsl/ws2_32) - done" ) +endif() + + +# +# Test for big endian +# +TEST_BIG_ENDIAN( BIG_ENDIAN ) +if( NOT DEFINED BIG_ENDIAN ) + message( WARNING "unable to determine endianess, only LITTLE ENDIAN is supported" ) +elseif( BIG_ENDIAN ) + message( FATAL_ERROR "bigendian is not supported" ) +endif() + + +# +# Test monotonic clock +# +# CLOCK_MONOTONIC clock for clock_gettime +# Normally defines _POSIX_TIMERS > 0 and _POSIX_MONOTONIC_CLOCK (for posix +# compliant systems) and __FreeBSD_cc_version >= 500005 (for FreeBSD +# >= 5.1.0, which does not have the posix defines (ref. r11983)) would be +# checked but some systems define them even when they do not support it +# (ref. bugreport:1003). +# +message( STATUS "Check for monotonic clock" ) +find_library( RT_LIBRARY rt )# (optional, rt on Debian) +mark_as_advanced( RT_LIBRARY ) +set( CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} ${RT_LIBRARY} ) +file( READ "${CMAKE_SOURCE_DIR}/3rdparty/cmake/tests/HAVE_MONOTONIC_CLOCK.c" _SOURCE ) +CHECK_C_SOURCE_RUNS( "${_SOURCE}" HAVE_MONOTONIC_CLOCK ) +if( HAVE_MONOTONIC_CLOCK ) + message( STATUS "Check for monotonic clock - yes" ) + set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${RT_LIBRARY} ) + set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DHAVE_MONOTONIC_CLOCK" ) +else() + message( STATUS "Check for monotonic clock - no" ) +endif() + + +# +# Test if function exists: +# setrlimit - used to set the socket limit +# strnlen - string length with upper scan bound +# getpid - process id +# gettid - thread id +# +CHECK_FUNCTION_EXISTS( setrlimit HAVE_SETRLIMIT ) +CHECK_FUNCTION_EXISTS( strnlen HAVE_STRNLEN ) +CHECK_FUNCTION_EXISTS( getpid HAVE_GETPID ) +CHECK_FUNCTION_EXISTS( gettid HAVE_GETTID ) +foreach( define HAVE_SETRLIMIT HAVE_STRNLEN HAVE_GETPID HAVE_GETTID ) + if( ${define} ) + set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -D${define}" ) + endif() +endforeach() + + +# +# Use RDTSC instruction as a timing source (time stamp counter on x86 since Pentium) (default=OFF) +# +# Enable it when you've timing issues. (ex: in conjunction with XEN or Other Virtualization mechanisms) +# Please ensure that you've disabled dynamic CPU-Frequencys, such as power saving options. +# (On the most modern Dedicated Servers cpufreq is preconfigured, see your distribution's manual how to disable it) +# +option( ENABLE_RDTSC "use RDTSC instruction as a timing source (default=OFF)" OFF ) +if( ENABLE_RDTSC ) + set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DENABLE_RDTSC" ) + message( STATUS "Enabled RDTSC as a timing source" ) +endif() + + +# +# Enable extra debug code (default=OFF) +# +option( ENABLE_EXTRA_DEBUG_CODE "enable extra debug code (default=OFF)" OFF ) +if( ENABLE_EXTRA_DEBUG_CODE ) + set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DDEBUG" ) + message( STATUS "Enabled extra DEBUG code" ) +endif() + + +# +# Enable builtin memory manager (default=default) +# +set( MEMMGR_OPTIONS "default;yes;no" ) +set( ENABLE_MEMMGR "default" CACHE STRING "enable builtin memory manager: ${MEMMGR_OPTIONS} (default=default)" ) +set_property( CACHE ENABLE_MEMMGR PROPERTY STRINGS ${MEMMGR_OPTIONS} ) +if( ENABLE_MEMMGR STREQUAL "default" ) + # use source code default +elseif( ENABLE_MEMMGR STREQUAL "yes" ) + set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DUSE_MEMMGR" ) + message( STATUS "Enabled the builtin memory manager" ) +elseif( ENABLE_MEMMGR STREQUAL "no" ) + set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DNO_MEMMGR" ) + message( STATUS "Disabled the builtin memory manager" ) +else() + message( FATAL_ERROR "invalid option ENABLE_MEMMGR=${ENABLE_MEMMGR} (valid options: ${MEMMGR_OPTIONS})" ) +endif() + + +# +# Enable memory library (default=system) +# +set( MEMORY_OPTIONS "system;memwatch;dmalloc;gcollect" ) +set( ENABLE_MEMORY "system" CACHE STRING "enable memory library: ${MEMORY_OPTIONS} (default=system)" ) +set_property( CACHE ENABLE_MEMORY PROPERTY STRINGS ${MEMORY_OPTIONS} ) +if( ENABLE_MEMORY STREQUAL "system" ) + # use system functions + +elseif( ENABLE_MEMORY STREQUAL "memwatch" ) + CHECK_INCLUDE_FILE( memwatch.h HAVE_MEMWATCH_H ) + find_library( MEMWATCH_LIBRARY memwatch ) + mark_as_advanced( MEMWATCH_LIBRARY ) + if( HAVE_MEMWATCH_H AND MEMWATCH_LIBRARY ) + message( STATUS "Adding global library: ${MEMWATCH_LIBRARY}" ) + set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${MEMWATCH_LIBRARY} ) + set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DMEMWATCH" ) + message( STATUS "Enabled the memory library memwatch" ) + else() + message( FATAL_ERROR "Failed to enable the memory library memwatch" ) + endif() + +elseif( ENABLE_MEMORY STREQUAL "dmalloc" ) + CHECK_INCLUDE_FILE( dmalloc.h HAVE_DMALLOC_H ) + find_library( DMALLOC_LIBRARY dmalloc ) + mark_as_advanced( DMALLOC_LIBRARY ) + if( HAVE_DMALLOC_H AND DMALLOC_LIBRARY ) + message( STATUS "Adding global library: ${DMALLOC_LIBRARY}" ) + set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${DMALLOC_LIBRARY} ) + set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DDMALLOC -DDMALLOC_FUNC_CHECK" ) + message( STATUS "Enabled the memory library dmalloc" ) + else() + message( FATAL_ERROR "Failed to enable the memory library dmalloc" ) + endif() + +elseif( ENABLE_MEMORY STREQUAL "gcollect" ) + CHECK_INCLUDE_FILE( gc.h HAVE_GC_H ) + find_library( GC_LIBRARY gc ) + mark_as_advanced( GC_LIBRARY ) + if( HAVE_GC_H AND GC_LIBRARY ) + message( STATUS "Adding global library: ${GC_LIBRARY}" ) + set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${GC_LIBRARY} ) + set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DGCOLLECT" ) + message( STATUS "Enabled the memory library gcollect" ) + else() + message( FATAL_ERROR "Failed to enable the memory library gcollect" ) + endif() + +else() + message( FATAL_ERROR "invalid option ENABLE_MEMORY=${ENABLE_MEMORY} (valid options: ${MEMORY_OPTIONS})" ) +endif() + + +# +# Enable profiler (default=none) +# +set( PROFILER_OPTIONS "none;gprof" ) +set( ENABLE_PROFILER "none" CACHE STRING "enable profiler: ${PROFILER_OPTIONS} (default=none)" ) +set_property( CACHE ENABLE_PROFILER PROPERTY STRINGS ${PROFILER_OPTIONS} ) +if( ENABLE_PROFILER STREQUAL "none" ) + # no profiler + +elseif( ENABLE_PROFILER STREQUAL "gprof" ) + if( CMAKE_C_COMPILER_ID STREQUAL "GNU" ) + if( NOT HAVE_GPROF_FLAGS ) + set_property( CACHE CMAKE_C_FLAGS PROPERTY VALUE "${CMAKE_C_FLAGS} -pg" ) + set_property( CACHE CMAKE_EXE_LINKER_FLAGS PROPERTY VALUE "${CMAKE_EXE_LINKER_FLAGS} -pg" ) + set( HAVE_GPROF_FLAGS ON CACHE INTERNAL "" ) + endif() + message( STATUS "Enabled the profiler gprof" ) + else() + message( FATAL_ERROR "Failed to enable the profiler gprof - not GNU" ) + endif() + +else() + message( FATAL_ERROR "invalid option ENABLE_PROFILER=${ENABLE_PROFILER} (valid options: ${PROFILER_OPTIONS})" ) +endif() + + +# +# Enable extra buildbot code (default=OFF) +# +option( ENABLE_EXTRA_BUILDBOT_CODE "enable extra buildbot code (default=OFF)" OFF ) +if( ENABLE_EXTRA_BUILDBOT_CODE ) + set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DBUILDBOT" ) + message( STATUS "Enabled extra BUILDBOT code" ) +endif() + + +##################################################################### +# package stuff +# +set( CPACK_PACKAGE_NAME "rAthena" ) +set( CPACK_PACKAGE_DESCRIPTION_SUMMARY "MMORPG server package" ) +set( CPACK_PACKAGE_VERSION ${SVNVERSION} ) +set( CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE ) +#set( CPACK_MONOLITHIC_INSTALL ON ) +include( CPACK OPTIONAL RESULT_VARIABLE HAVE_CPACK ) +if( HAVE_CPACK ) + option( WITH_CPACK "enable building packages with CPack ('package' target)" ON ) +endif() +if( NOT WITH_CPACK ) + # empty replacements + macro( cpack_add_component_group ) + endmacro() + macro( cpack_add_component ) + endmacro() + message( STATUS "Disabled package creation" ) +endif() + +set( Runtime "Runtime files" CACHE INTERNAL "" ) +set( Runtime_base "configurations, dbs, npcs, docs, ..." CACHE INTERNAL "" ) +set( Runtime_templates "conf/import and save (generated from conf/import-tmpl and save-tmpl)" CACHE INTERNAL "" ) +cpack_add_component_group( Runtime DESCRIPTION ${Runtime} DISPLAY_NAME "Runtime" ) +cpack_add_component( Runtime_base DESCRIPTION ${Runtime_base} DISPLAY_NAME "Base files" GROUP Runtime ) +cpack_add_component( Runtime_templates DESCRIPTION ${Runtime_templates} DISPLAY_NAME "Base templates" GROUP Runtime ) + +set( Development "Development files" CACHE INTERNAL "" ) +set( Development_base "projects, 3rdparty, sources, templates" CACHE INTERNAL "" ) +cpack_add_component_group( Development DESCRIPTION ${Development} DISPLAY_NAME "Development" ) +cpack_add_component( Development_base DESCRIPTION ${Development_base} DISPLAY_NAME "Base files" GROUP Development ) + + +# +# install stuff +# +option( INSTALL_COMPONENT_RUNTIME "install/package files needed to run the project" ON ) +option( INSTALL_COMPONENT_DEVELOPMENT "install/package files needed to build the project" OFF ) +option( INSTALL_TO_PATH "copy files to INSTALL_PATH" OFF ) +option( INSTALL_TO_SOURCE "copy files to source directory, skips what is already there (${CMAKE_CURRENT_SOURCE_DIR})" OFF ) +option( INSTALL_TO_SUBDIR "copy files to subdirectory (${CMAKE_CURRENT_BINARY_DIR}/install)" OFF ) +set( INSTALL_PATH "${CMAKE_INSTALL_PREFIX}" CACHE STRING "install path (only used when INSTALL_TO_PATH is set)" ) +mark_as_advanced( CMAKE_INSTALL_PREFIX ) +if( INSTALL_TO_PATH AND NOT ("${INSTALL_TO}" STREQUAL "path") )# changed to path + set_property( CACHE INSTALL_TO_SOURCE INSTALL_TO_SUBDIR PROPERTY VALUE OFF ) +elseif( INSTALL_TO_SOURCE AND NOT ("${INSTALL_TO}" STREQUAL "source") )# changed to source + set_property( CACHE INSTALL_TO_PATH INSTALL_TO_SUBDIR PROPERTY VALUE OFF ) +elseif( INSTALL_TO_SUBDIR AND NOT ("${INSTALL_TO}" STREQUAL "subdir") )# changed to subdir + set_property( CACHE INSTALL_TO_PATH INSTALL_TO_SOURCE PROPERTY VALUE OFF ) +elseif( NOT INSTALL_TO_PATH AND NOT INSTALL_TO_SOURCE AND NOT INSTALL_TO_SUBDIR )# default + set_property( CACHE INSTALL_TO_SUBDIR PROPERTY VALUE ON ) +endif() +if( INSTALL_TO_PATH ) + set( INSTALL_TO "path" CACHE INTERNAL "" ) + set_property( CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "${INSTALL_PATH}" ) +elseif( INSTALL_TO_SOURCE ) + set( INSTALL_TO "source" CACHE INTERNAL "" ) + set_property( CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "${CMAKE_CURRENT_SOURCE_DIR}" ) +elseif( INSTALL_TO_SUBDIR ) + set( INSTALL_TO "subdir" CACHE INTERNAL "" ) + set_property( CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "${CMAKE_CURRENT_BINARY_DIR}/install" ) +endif() +set( SVN_FOLDER_PATTERN "[\\.]svn" CACHE STRING "pattern of svn folder that we exclude from instalations" ) +mark_as_advanced( SVN_FOLDER_PATTERN ) +set( DEVELOPMENT_FILES + "${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt" + "${CMAKE_CURRENT_SOURCE_DIR}/configure" + "${CMAKE_CURRENT_SOURCE_DIR}/configure.in" + "${CMAKE_CURRENT_SOURCE_DIR}/rAthena-9.sln" + "${CMAKE_CURRENT_SOURCE_DIR}/rAthena-10.sln" + ) +set( DEVELOPMENT_DIRECTORIES + "3rdparty" + "conf/import-tmpl" + "src" + "vcproj-9" + "vcproj-10" + ) +set( RUNTIME_FILES + "${CMAKE_CURRENT_SOURCE_DIR}/athena-start" + "${CMAKE_CURRENT_SOURCE_DIR}/char-server.sh" + "${CMAKE_CURRENT_SOURCE_DIR}/charserv-sql.bat" + "${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll" + "${CMAKE_CURRENT_SOURCE_DIR}/libmysql.dll" + "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE" + "${CMAKE_CURRENT_SOURCE_DIR}/login-server.sh" + "${CMAKE_CURRENT_SOURCE_DIR}/logserv-sql.bat" + "${CMAKE_CURRENT_SOURCE_DIR}/map-server.sh" + "${CMAKE_CURRENT_SOURCE_DIR}/mapserv-sql.bat" + "${CMAKE_CURRENT_SOURCE_DIR}/pcre3.dll" + "${CMAKE_CURRENT_SOURCE_DIR}/README.txt" + "${CMAKE_CURRENT_SOURCE_DIR}/runserver-sql.bat" + "${CMAKE_CURRENT_SOURCE_DIR}/serv.bat" + "${CMAKE_CURRENT_SOURCE_DIR}/start" + "${CMAKE_CURRENT_SOURCE_DIR}/zlib1.dll" + ) +set( RUNTIME_DIRECTORIES + "conf" + "db" + "doc" + "log" + "npc" + "sql-files" + "tools" + ) +if( INSTALL_TO_SOURCE )# skip, already in the source dir +else() + if( INSTALL_COMPONENT_RUNTIME ) + install( FILES ${RUNTIME_FILES} + DESTINATION "." + COMPONENT Runtime_base ) + foreach( DIR IN ITEMS ${RUNTIME_DIRECTORIES} ) + if( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${DIR}/" ) + install( DIRECTORY "${DIR}/" + DESTINATION "${DIR}" + COMPONENT Runtime_base + PATTERN ${SVN_FOLDER_PATTERN} EXCLUDE + PATTERN "conf/import-tmpl" EXCLUDE ) + else() + # create empty directory + install( CODE "file(MAKE_DIRECTORY \"\${ENV}\${CMAKE_INSTALL_PREFIX}/${DIR}\")" + COMPONENT Runtime_base ) + endif() + endforeach() + endif( INSTALL_COMPONENT_RUNTIME ) + if( INSTALL_COMPONENT_DEVELOPMENT ) + install( FILES ${DEVELOPMENT_FILES} + DESTINATION "." + COMPONENT Development_base ) + foreach( DIR IN ITEMS ${DEVELOPMENT_DIRECTORIES} ) + install( DIRECTORY "${DIR}/" + DESTINATION "${DIR}" + COMPONENT Development_base + PATTERN ${SVN_FOLDER_PATTERN} EXCLUDE ) + endforeach() + endif( INSTALL_COMPONENT_DEVELOPMENT ) +endif() +if( INSTALL_COMPONENT_RUNTIME ) + # templates + set( _TEMPLATES + "conf/import-tmpl" "conf/import" + ) + set( INSTALL_TEMPLATES_FILE "${CMAKE_CURRENT_BINARY_DIR}/InstallTemplates.cmake" ) + file( WRITE "${INSTALL_TEMPLATES_FILE}" + "macro( INSTALL_TEMPLATE _SRC _DST )\n" + " set( SRC \"${CMAKE_CURRENT_SOURCE_DIR}/\${_SRC}\" )\n" + " set( DST \"\${CMAKE_INSTALL_PREFIX}/\${_DST}\" )\n" + " if( EXISTS \"\${DST}\" )\n" + " message( \"-- Already exists: \${DST}\" )\n" + " else()\n" + " message( \"-- Installing template: \${DST}\" )\n" + " execute_process( COMMAND \"${CMAKE_COMMAND}\" -E copy \"\${SRC}\" \"\${DST}\" )\n" + " endif()\n" + "endmacro()\n" + ) + while( _TEMPLATES ) + list( GET _TEMPLATES 0 _SRC ) + list( GET _TEMPLATES 1 _DST ) + list( REMOVE_AT _TEMPLATES 0 1 ) + if( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${_SRC}" ) + file( GLOB _PATHS "${CMAKE_CURRENT_SOURCE_DIR}/${_SRC}/*" ) + foreach( _PATH IN ITEMS ${_PATHS} ) + string( REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/${_SRC}/" "" _PATH "${_PATH}" ) + if( NOT "${_PATH}" MATCHES "${SVN_FOLDER_PATTERN}" ) + list( APPEND _TEMPLATES "${_SRC}/${_PATH}" "${_DST}/${_PATH}" ) + endif() + endforeach() + else() + file( APPEND "${INSTALL_TEMPLATES_FILE}" "INSTALL_TEMPLATE( \"${_SRC}\" \"${_DST}\" )\n" ) + endif() + endwhile() + install( SCRIPT "${INSTALL_TEMPLATES_FILE}" + COMPONENT Runtime_templates ) +endif( INSTALL_COMPONENT_RUNTIME ) + + +# +# sources +# +set( TARGET_LIST CACHE INTERNAL "" ) +add_subdirectory( 3rdparty ) +add_subdirectory( src ) + + +##################################################################### +# final checks and warnings +# +if( CMAKE_SIZEOF_VOID_P EQUAL 8 ) + message( WARNING "64bit should work, but is not recommended." ) +elseif( NOT CMAKE_SIZEOF_VOID_P EQUAL 4 ) + message( FATAL_ERROR "unexpected architecture (CMAKE_SIZEOF_VOID_P is ${CMAKE_SIZEOF_VOID_P})" ) +endif() +list( LENGTH TARGET_LIST _LEN ) +if( _LEN EQUAL 0 ) + message( FATAL_ERROR "no targets available" ) +endif() +message( STATUS "Available targets:" ) +foreach( _TARGET IN ITEMS ${TARGET_LIST} ) + message( STATUS "\t${_TARGET}" ) +endforeach() |