##################################################################### # # "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 @ eAthena forum/irc # flaviojs2005 \A-T/ gmail 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( eAthena 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 ) add_subdirectory( 3rdparty/msinttypes )# setup global variables # # Test if include files exist: # inttypes.h - see src/common/cbasetypes.h # stdint.h - see src/common/cbasetypes.h # sys/select.h - see src/common/socket.h # execinfo.h - see src/common/sig.c # net/socket.h - see src/common/socket.h # foreach( _filename inttypes.h stdint.h sys/select.h execinfo.h net/socket.h ) set( _define HAVE_${_filename} ) string( TOUPPER "${_define}" _define ) string( REGEX REPLACE "[^A-Z]" "_" _define "${_define}" ) set( CMAKE_REQUIRED_INCLUDES ${GLOBAL_INCLUDE_DIRS} ) CHECK_INCLUDE_FILE( "${_filename}" ${_define} ) unset( CMAKE_REQUIRED_INCLUDES ) unset( _define ) endforeach() # # Test if functions exist: # setrlimit - used to set the socket limit # strnlen - string length with upper scan bound # getpid - process id # gettid - thread id # foreach( _function setrlimit strnlen getpid gettid ) set( _define HAVE_${_filename} ) string( TOUPPER "${_define}" _define ) string( REGEX REPLACE "[^A-Z]" "_" _define "${_define}" ) set( CMAKE_REQUIRED_INCLUDES ${GLOBAL_INCLUDE_DIRS} ) CHECK_FUNCTION_EXISTS( "${_function}" ${_define} ) unset( CMAKE_REQUIRED_INCLUDES ) unset( _define ) endforeach() # # Test compiler keywords and attributes # message( STATUS "Testing compiler keywords and attributes" ) include( TestInline ) message( STATUS "Testing compiler keywords and attributes - done" ) # # PACKETVER # set( PACKETVER ${PACKETVER} CACHE STRING "Sets the PACKETVER define of the servers. (see src/common/mmo.h)" ) if( PACKETVER ) message( STATUS "Using PACKETVER: ${PACKETVER}" ) endif() # # SVNVERSION # message( STATUS "Detecting SVNVERSION" ) if( NOT DEFINED SVNVERSION ) message( STATUS "Detecting svnversion" ) find_program( SVNVERSION_EXECUTABLE svnversion ) mark_as_advanced( SVNVERSION_EXECUTABLE ) message( STATUS "Detecting svnversion - done" ) message( STATUS "Detecting Subversion" ) find_package( Subversion ) message( STATUS "Detecting Subversion - done" ) if( SVNVERSION_EXECUTABLE ) message( STATUS "Found svnversion: ${SVNVERSION_EXECUTABLE}" ) execute_process( COMMAND ${SVNVERSION_EXECUTABLE} ${PROJECT_SOURCE_DIR} OUTPUT_VARIABLE SVNVERSION OUTPUT_STRIP_TRAILING_WHITESPACE ) message( STATUS "Found version: ${SVNVERSION}" ) endif() if( SVNVERSION MATCHES "^Unversioned" ) set( SVNVERSION )# unversioned, keep empty elseif( SVNVERSION STREQUAL "exported" ) # exported, nothing to do elseif( Subversion_FOUND AND SVNVERSION ) Subversion_WC_INFO( ${PROJECT_SOURCE_DIR} eAthena ) if( eAthena_WC_URL ) string( REGEX MATCH "[^/]+$" BRANCH ${eAthena_WC_URL} ) set( SVNVERSION "${BRANCH}-${SVNVERSION}" ) message( STATUS "Found branch: ${BRANCH}" ) endif() string( REGEX REPLACE "[^0-9a-zA-Z]" "_" SVNVERSION "${SVNVERSION}" ) endif() endif() message( STATUS "Using SVNVERSION: ${SVNVERSION}" ) message( STATUS "Detecting SVNVERSION - 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 # set( CMAKE_REQUIRED_INCLUDES ${GLOBAL_INCLUDE_DIRS} ) # needed to determine the type of a 16bit integer TEST_BIG_ENDIAN( BIG_ENDIAN ) unset( CMAKE_REQUIRED_INCLUDES ) 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() # # 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 dashboard reports # option( ENABLE_DASHBOARD_REPORTS "enable reporting build and test results to the dashboard (default=OFF)" OFF ) if( ENABLE_DASHBOARD_REPORTS ) enable_testing() include( CTest ) message( STATUS "Enabled dashboard reports" ) endif() ##################################################################### # package stuff # set( CPACK_PACKAGE_NAME "eAthena" ) 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}/eAthena-6.dsw" "${CMAKE_CURRENT_SOURCE_DIR}/eAthena-7.1.sln" "${CMAKE_CURRENT_SOURCE_DIR}/eAthena-8.sln" "${CMAKE_CURRENT_SOURCE_DIR}/eAthena-9.sln" "${CMAKE_CURRENT_SOURCE_DIR}/eAthena-10.sln" ) set( DEVELOPMENT_DIRECTORIES "3rdparty" "conf/import-tmpl" "save-tmpl" "src" "vcproj-6" "vcproj-7.1" "vcproj-8" "vcproj-9" "vcproj-10" ) set( RUNTIME_FILES "${CMAKE_CURRENT_SOURCE_DIR}/athena-start" "${CMAKE_CURRENT_SOURCE_DIR}/Changelog-Trunk.txt" "${CMAKE_CURRENT_SOURCE_DIR}/char-server.sh" "${CMAKE_CURRENT_SOURCE_DIR}/charserv-sql.bat" "${CMAKE_CURRENT_SOURCE_DIR}/charserv.bat" "${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll" "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE" "${CMAKE_CURRENT_SOURCE_DIR}/login-server.sh" "${CMAKE_CURRENT_SOURCE_DIR}/logserv-sql.bat" "${CMAKE_CURRENT_SOURCE_DIR}/logserv.bat" "${CMAKE_CURRENT_SOURCE_DIR}/map-server.sh" "${CMAKE_CURRENT_SOURCE_DIR}/mapserv-sql.bat" "${CMAKE_CURRENT_SOURCE_DIR}/mapserv.bat" "${CMAKE_CURRENT_SOURCE_DIR}/notice.txt" "${CMAKE_CURRENT_SOURCE_DIR}/readme.html" "${CMAKE_CURRENT_SOURCE_DIR}/runserver-sql.bat" "${CMAKE_CURRENT_SOURCE_DIR}/runserver.bat" "${CMAKE_CURRENT_SOURCE_DIR}/serv.bat" "${CMAKE_CURRENT_SOURCE_DIR}/start" ) set( RUNTIME_DIRECTORIES "conf" "db" "doc" "log" "npc" "plugins" "readme" "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 "save-tmpl" "save" "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 ) # # config header # message( STATUS "Creating config.h" ) configure_file( "${CMAKE_SOURCE_DIR}/src/common/config.h.cmakein" "${CMAKE_BINARY_DIR}/include/config.h" @ONLY ) set_property( CACHE GLOBAL_INCLUDE_DIRS PROPERTY VALUE ${GLOBAL_INCLUDE_DIRS} "${CMAKE_BINARY_DIR}/include" ) set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DHAVE_CONFIG_H" ) message( STATUS "Creating config.h - done" ) # # sources # set( TARGET_LIST CACHE INTERNAL "" ) add_subdirectory( 3rdparty ) add_subdirectory( src ) ##################################################################### # final checks and warnings # if( NOT (CMAKE_SIZEOF_VOID_P EQUAL 4) AND NOT (CMAKE_SIZEOF_VOID_P EQUAL 8) ) 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() if( ENABLE_DASHBOARD_REPORTs ) #TODO show extra info here endif()