diff options
author | ai4rei <ai4rei@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2011-10-07 21:35:12 +0000 |
---|---|---|
committer | ai4rei <ai4rei@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2011-10-07 21:35:12 +0000 |
commit | 033373a5a75599f8607107cb28b97cc6a653b0b5 (patch) | |
tree | c520e925018ac7de37d05f690d357fcf55b56ec4 /CMakeLists.txt | |
parent | 692dd1e5737b01ef26ba889f60d013cb992c3cec (diff) | |
download | hercules-033373a5a75599f8607107cb28b97cc6a653b0b5.tar.gz hercules-033373a5a75599f8607107cb28b97cc6a653b0b5.tar.bz2 hercules-033373a5a75599f8607107cb28b97cc6a653b0b5.tar.xz hercules-033373a5a75599f8607107cb28b97cc6a653b0b5.zip |
* Merged changes from trunk [14895:14966/trunk].
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/branches/renewal@14967 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 426 |
1 files changed, 383 insertions, 43 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 523d445ef..0aee569a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,3 +1,5 @@ +##################################################################### +# # "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 @@ -11,8 +13,22 @@ # 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 -cmake_minimum_required( VERSION 2.8.4 ) -project( eAthena ) +# +##################################################################### + + +#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() # @@ -21,27 +37,49 @@ project( eAthena ) 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 create a separate folder and build there.\nExample:\n mkdir build\n cd build\n cmake -G\"Unix Makefiles\" ..\n make install\nTo skip this check, set ALLOW_SAME_DIRECTORY to 1 or ON" ) + 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 CACHE INTERNAL "" ) -set( GLOBAL_INCLUDE_DIRS CACHE INTERNAL "" ) -set( GLOBAL_DEFINITIONS CACHE INTERNAL "" ) +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 ) - list( APPEND GLOBAL_DEFINITIONS FD_SETSIZE=4096 ) - list( APPEND GLOBAL_LIBRARIES "oldnames.lib" "ws2_32.lib" ) + set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DFD_SETSIZE=4096" ) endif() if( MSVC ) - list( APPEND GLOBAL_DEFINITIONS _CRT_SECURE_NO_DEPRECATE _CRT_NONSTDC_NO_DEPRECATE DB_MANUAL_CAST_TO_UNION ) + 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 +# +add_subdirectory( 3rdparty ) +include( CheckCSourceCompiles ) +include( CheckCSourceRuns ) +include( CheckIncludeFile ) +include( CheckFunctionExists ) +include( FindFunctionLibrary ) +include( TestBigEndian ) + + +# # Find svnversion # message( STATUS "Detecting svnversion" ) @@ -60,20 +98,6 @@ message( STATUS "Detecting Subversion" ) find_package( Subversion ) message( STATUS "Detecting Subversion - done" ) - -# -# Find math library (FreeBSD) -# -message( STATUS "Detecting math library" ) -find_library( M_LIBRARIES m ) -mark_as_advanced( M_LIBRARIES ) -if( M_LIBRARIES ) - message( STATUS "Found m: ${M_LIBRARIES}" ) - list( APPEND GLOBAL_LIBRARIES ${M_LIBRARIES} ) -endif() -message( STATUS "Detecting math library - done" ) - - # # PACKETVER # @@ -87,17 +111,285 @@ 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 ) 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} eAthena ) if( eAthena_WC_URL ) string( REGEX MATCH "[^/]+$" BRANCH ${eAthena_WC_URL} ) set( SVNVERSION "${BRANCH}-${SVNVERSION}" ) + message( STATUS "Found branch: ${BRANCH}" ) + endif() + message( STATUS "Getting svn branch - done" ) +endif() + + +# +# 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 typecast to union +# +message( STATUS "Check for typecast to union" ) +set( SOURCECODE + "typedef union Foonion{\n" + " int i;\n" + " unsigned int ui;\n" + " const char* s;\n" + "} Foonion;\n" + "int get_i(Foonion onion){ return onion.i; }\n" + "int main(int argc, char** argv){\n" + " int i = 0;\n" + " return get_i(((Foonion)(int)i));\n" + "}\n" + ) +CHECK_C_SOURCE_COMPILES( "${SOURCECODE}" HAVE_TYPECAST_TO_UNION ) +if( HAVE_TYPECAST_TO_UNION ) + message( STATUS "Check for typecast to union - yes" ) +else() + message( STATUS "Check for typecast to union - no" ) + set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DDB_MANUAL_CAST_TO_UNION" ) +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" ) +set( SOURCECODE + "#include <sys/time.h>\n" + "#include <time.h>\n" + "#include <unistd.h>\n" + "int main(int argc, char** argv){\n" + " struct timespec tval;\n" + " return clock_gettime(CLOCK_MONOTONIC, &tval);\n" + "}\n" + ) +find_library( RT_LIBRARY rt )# (optional, rt on Debian) +mark_as_advanced( RT_LIBRARY ) +set( CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} ${RT_LIBRARY} ) +CHECK_C_SOURCE_RUNS( "${SOURCECODE}" 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() @@ -110,13 +402,16 @@ 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( NOT 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 "CPACK not found, package creation disabled" ) + message( STATUS "Disabled package creation" ) endif() set( Runtime "Runtime files" CACHE INTERNAL "" ) @@ -135,8 +430,8 @@ cpack_add_component( Development_base DESCRIPTION ${Development_base} DISPLAY_NA # # install stuff # -option( WITH_COMPONENT_RUNTIME "install/package files needed to run the project" ON ) -option( WITH_COMPONENT_DEVELOPMENT "install/package files needed to build the project" OFF ) +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 ) @@ -221,7 +516,7 @@ set( RUNTIME_DIRECTORIES ) if( INSTALL_TO_SOURCE )# skip, already in the source dir else() - if( WITH_COMPONENT_RUNTIME ) + if( INSTALL_COMPONENT_RUNTIME ) install( FILES ${RUNTIME_FILES} DESTINATION "." COMPONENT Runtime_base ) @@ -232,8 +527,8 @@ else() PATTERN ${SVN_FOLDER_PATTERN} EXCLUDE PATTERN "conf/import-tmpl" EXCLUDE ) endforeach() - endif() - if( WITH_COMPONENT_DEVELOPMENT ) + endif( INSTALL_COMPONENT_RUNTIME ) + if( INSTALL_COMPONENT_DEVELOPMENT ) install( FILES ${DEVELOPMENT_FILES} DESTINATION "." COMPONENT Development_base ) @@ -243,23 +538,68 @@ else() COMPONENT Development_base PATTERN ${SVN_FOLDER_PATTERN} EXCLUDE ) endforeach() - endif() + endif( INSTALL_COMPONENT_DEVELOPMENT ) endif() -if( WITH_COMPONENT_RUNTIME ) +if( INSTALL_COMPONENT_RUNTIME ) # templates - install( DIRECTORY "save-tmpl/" - DESTINATION "save" - COMPONENT Runtime_templates - PATTERN ${SVN_FOLDER_PATTERN} EXCLUDE ) - install( DIRECTORY "conf/import-tmpl/" - DESTINATION "conf/import" - COMPONENT Runtime_templates - PATTERN ${SVN_FOLDER_PATTERN} EXCLUDE ) -endif() + 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 ) # -# subdirectories +# sources # -add_subdirectory( 3rdparty ) +set( TARGET_LIST CACHE INTERNAL "" ) 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() |