CMakeLists.txt
changeset 8614 5f74a047cf2c
parent 8613 82c649dfc7c3
child 8635 c1c6b815691e
equal deleted inserted replaced
8613:82c649dfc7c3 8614:5f74a047cf2c
    17 
    17 
    18 #use available modules, fallback to ours if not present (CMP0017 helps)
    18 #use available modules, fallback to ours if not present (CMP0017 helps)
    19 set(CMAKE_MODULE_PATH "${CMAKE_ROOT}/Modules" "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules")
    19 set(CMAKE_MODULE_PATH "${CMAKE_ROOT}/Modules" "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules")
    20 
    20 
    21 
    21 
    22 #usually this is set at release time
    22 #possible cmake configuration
    23 option(NOREVISION "Build Hedgewars without revision information [default: off]" OFF)
       
    24 
       
    25 #set other default values
       
    26 option(NOSERVER "Disable gameServer build [default: auto]" OFF)
    23 option(NOSERVER "Disable gameServer build [default: auto]" OFF)
    27 option(NOPNG "Disable screenshoot compression [default: auto]" OFF)
    24 option(NOPNG "Disable screenshoot compression [default: auto]" OFF)
    28 option(NOVIDEOREC "Disable video recording [default: auto]" OFF)
    25 option(NOVIDEOREC "Disable video recording [default: auto]" OFF)
    29 
    26 
    30 #set this to ON when 2.1.0 becomes more widespread (and only for linux)
    27 #set this to ON when 2.1.0 becomes more widespread (and only for linux)
    39 set(GHFLAGS "" CACHE STRING "Additional Haskell flags")
    36 set(GHFLAGS "" CACHE STRING "Additional Haskell flags")
    40 if(UNIX AND NOT APPLE)
    37 if(UNIX AND NOT APPLE)
    41     set(DATA_INSTALL_DIR "share/hedgewars" CACHE STRING "Resource folder path")
    38     set(DATA_INSTALL_DIR "share/hedgewars" CACHE STRING "Resource folder path")
    42 endif()
    39 endif()
    43 
    40 
    44 #detect Mercurial revision (if present)
    41 
    45 if(NOT NOREVISION)
    42 #detect Mercurial revision and init rev/hash information
       
    43 find_program(HGCOMMAND hg)
       
    44 if(HGCOMMAND AND (EXISTS ${CMAKE_SOURCE_DIR}/.hg))
       
    45     execute_process(COMMAND ${HGCOMMAND} identify -in
       
    46                     WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
       
    47                     OUTPUT_VARIABLE internal_version
       
    48                     ERROR_QUIET
       
    49                 )
       
    50     #check local repo status
       
    51     string(REGEX REPLACE "[^+]" "" HGCHANGED ${internal_version})
       
    52     string(REGEX REPLACE "[0-9a-zA-Z]+(.*) ([0-9]+)(.*)" "\\2" revision_number ${internal_version})
       
    53     string(REGEX REPLACE "([0-9a-zA-Z]+)(.*) [0-9]+(.*)" "\\1" hash_number ${internal_version})
       
    54 
       
    55     if(HGCHANGED)
       
    56         message(${WARNING} "You have uncommitted changes in your repository!")
       
    57     endif()
       
    58     #let's assume that if you have hg you might be interested in debugging
    46     set(default_build_type "DEBUG")
    59     set(default_build_type "DEBUG")
    47     set(HW_DEV true) #becomes isDevBuild
    60 else()
    48     find_program(HGCOMMAND hg)
       
    49     if(HGCOMMAND AND (EXISTS ${CMAKE_SOURCE_DIR}/.hg))
       
    50         execute_process(COMMAND ${HGCOMMAND} identify -in
       
    51                         WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
       
    52                         OUTPUT_VARIABLE internal_version
       
    53                         ERROR_QUIET
       
    54                     )
       
    55         #check local repo status
       
    56         string(REGEX REPLACE "[^+]" "" HGCHANGED ${internal_version})
       
    57 
       
    58         string(REGEX REPLACE "[0-9a-zA-Z]+(.*) ([0-9]+)(.*)" "\\2" revision_number ${internal_version})
       
    59         string(REGEX REPLACE "([0-9a-zA-Z]+)(.*) [0-9]+(.*)" "\\1" hash_number ${internal_version})
       
    60 
       
    61         message(STATUS "Building revision ${revision_number} from hash ${hash_number}")
       
    62         if(HGCHANGED)
       
    63             MESSAGE(${WARNING} "You have uncommitted changes in your repository!")
       
    64         endif()
       
    65     endif()
       
    66 else(NOT NOREVISION)
       
    67     set(default_build_type "RELEASE")
    61     set(default_build_type "RELEASE")
    68     set(HWDEV false)
    62     # TODO think of a better fallback when hg not found
    69     message(STATUS "Building distributable version")
    63     set(revision_number "0000")
    70 endif(NOT NOREVISION)
    64     set(hash_number "unknown")
       
    65 endif()
    71 
    66 
    72 
    67 
    73 #versioning
    68 #versioning
    74 set(CPACK_PACKAGE_VERSION_MAJOR 0)
    69 set(CPACK_PACKAGE_VERSION_MAJOR 0)
    75 set(CPACK_PACKAGE_VERSION_MINOR 9)
    70 set(CPACK_PACKAGE_VERSION_MINOR 9)
    76 set(CPACK_PACKAGE_VERSION_PATCH 19)
    71 set(CPACK_PACKAGE_VERSION_PATCH 19)
    77 set(HEDGEWARS_PROTO_VER 44)
    72 set(HEDGEWARS_PROTO_VER 44)
    78 set(HEDGEWARS_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
    73 set(HEDGEWARS_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
    79 
    74 
    80 
    75 message(STATUS "Building ${HEDGEWARS_VERSION}-r${revision_number} (${hash_number})")
       
    76 
       
    77 
       
    78 #where to build libs and bins
    81 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    79 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    82 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    80 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    83 
    81 
       
    82 #resource paths
    84 if(UNIX AND NOT APPLE)
    83 if(UNIX AND NOT APPLE)
    85     set(target_binary_install_dir "bin")
    84     set(target_binary_install_dir "bin")
    86     set(target_library_install_dir "lib")
    85     set(target_library_install_dir "lib")
    87     set(SHAREPATH "${DATA_INSTALL_DIR}/")
    86     set(SHAREPATH "${DATA_INSTALL_DIR}/")
    88 else()
    87 else()
   184 
   183 
   185 #when build type is not specified, assume Debug/Release according to build version information
   184 #when build type is not specified, assume Debug/Release according to build version information
   186 if (CMAKE_BUILD_TYPE)
   185 if (CMAKE_BUILD_TYPE)
   187     string (TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE)
   186     string (TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE)
   188     if ( NOT( (CMAKE_BUILD_TYPE MATCHES "RELEASE") OR (CMAKE_BUILD_TYPE MATCHES "DEBUG") ) )
   187     if ( NOT( (CMAKE_BUILD_TYPE MATCHES "RELEASE") OR (CMAKE_BUILD_TYPE MATCHES "DEBUG") ) )
   189         set (CMAKE_BUILD_TYPE ${default_build_type} CACHE STRING "Choose the build type, options are: Debug Release." FORCE)
   188         set (CMAKE_BUILD_TYPE ${default_build_type} CACHE STRING "Build type (Debug/Release)" FORCE)
   190         message (STATUS "Unknown build type, using default (${default_build_type})")
   189         message (STATUS "Unknown build type, using default (${default_build_type})")
   191     endif ()
   190     endif ()
   192 else (CMAKE_BUILD_TYPE)
   191 else (CMAKE_BUILD_TYPE)
   193     set (CMAKE_BUILD_TYPE ${default_build_type} CACHE STRING "Choose the build type, options are: Debug Release." FORCE)
   192     set (CMAKE_BUILD_TYPE ${default_build_type} CACHE STRING "Build type (Debug/Release)" FORCE)
   194 endif (CMAKE_BUILD_TYPE)
   193 endif (CMAKE_BUILD_TYPE)
       
   194 
   195 
   195 
   196 #set default flags values for all projects (unless MINIMAL_FLAGS is true)
   196 #set default flags values for all projects (unless MINIMAL_FLAGS is true)
   197 if(NOT ${MINIMAL_FLAGS})
   197 if(NOT ${MINIMAL_FLAGS})
   198     set(CMAKE_C_FLAGS "-pipe ${CMAKE_C_FLAGS}")
   198     set(CMAKE_C_FLAGS "-pipe ${CMAKE_C_FLAGS}")
   199     set(CMAKE_C_FLAGS_RELEASE "-w -Os -fomit-frame-pointer ${CMAKE_C_FLAGS_RELEASE}")
   199     set(CMAKE_C_FLAGS_RELEASE "-w -Os -fomit-frame-pointer ${CMAKE_C_FLAGS_RELEASE}")
   206     set(CMAKE_C_FLAGS_RELEASE "")
   206     set(CMAKE_C_FLAGS_RELEASE "")
   207     set(CMAKE_C_FLAGS_DEBUG "-Wall -DDEBUG")
   207     set(CMAKE_C_FLAGS_DEBUG "-Wall -DDEBUG")
   208     set(CMAKE_CXX_FLAGS_RELEASE "")
   208     set(CMAKE_CXX_FLAGS_RELEASE "")
   209     set(CMAKE_CXX_FLAGS_DEBUG "-Wall -DDEBUG")
   209     set(CMAKE_CXX_FLAGS_DEBUG "-Wall -DDEBUG")
   210 endif()
   210 endif()
       
   211 
   211 
   212 
   212 #parse additional parameters
   213 #parse additional parameters
   213 if(FPFLAGS OR GHFLAGS)
   214 if(FPFLAGS OR GHFLAGS)
   214     if(${allow_parse_args})
   215     if(${allow_parse_args})
   215         message(${WARNING} "FPFLAGS and GHFLAGS are available only when using CMake >= 2.8")
   216         message(${WARNING} "FPFLAGS and GHFLAGS are available only when using CMake >= 2.8")
   229                  "-vewnq"                         # fpc output verbosity
   230                  "-vewnq"                         # fpc output verbosity
   230                  "-dDEBUGFILE"                    # macro for engine output
   231                  "-dDEBUGFILE"                    # macro for engine output
   231                  )
   232                  )
   232 list(APPEND haskell_flags "-O2" ${ghflags_parsed})
   233 list(APPEND haskell_flags "-O2" ${ghflags_parsed})
   233 
   234 
       
   235 
   234 #get BUILD_TYPE and enable/disable optimisation
   236 #get BUILD_TYPE and enable/disable optimisation
   235 message(STATUS "Using ${CMAKE_BUILD_TYPE} configuration")
   237 message(STATUS "Using ${CMAKE_BUILD_TYPE} configuration")
   236 if(CMAKE_BUILD_TYPE MATCHES "DEBUG")
   238 if(CMAKE_BUILD_TYPE MATCHES "DEBUG")
       
   239     set(HW_DEV true) #becomes isDevBuild
       
   240 
   237     list(APPEND pascal_flags "-O-"              # disable all optimisations
   241     list(APPEND pascal_flags "-O-"              # disable all optimisations
   238                              "-g"               # enable debug symbols
   242                              "-g"               # enable debug symbols
   239                              "-gl"              # add line info to bt
   243                              "-gl"              # add line info to bt
   240                              "-gv"              # allow valgrind
   244                              "-gv"              # allow valgrind
   241                              )
   245                              )
   242     list(APPEND haskell_flags "-Wall" "-debug" "-dcore-lint" "-fno-warn-unused-do-bind")
   246     list(APPEND haskell_flags "-Wall" "-debug" "-dcore-lint" "-fno-warn-unused-do-bind")
   243 else()
   247 else()
       
   248     set(HW_DEV false)
       
   249 
   244     list(APPEND pascal_flags "-Os"              # optimise for size
   250     list(APPEND pascal_flags "-Os"              # optimise for size
   245                              "-Xs"              # strip binary
   251                              "-Xs"              # strip binary
   246                              "-Si"              # turn on inlining
   252                              "-Si"              # turn on inlining
   247                              )
   253                              )
   248     list(APPEND haskell_flags "-w" "-fno-warn-unused-do-bind")
   254     list(APPEND haskell_flags "-w" "-fno-warn-unused-do-bind")
   249 endif()
   255 endif()
       
   256 
   250 
   257 
   251 
   258 
   252 #server discovery
   259 #server discovery
   253 if(NOT NOSERVER)
   260 if(NOT NOSERVER)
   254     if(GHC)
   261     if(GHC)
   335     add_subdirectory(bin)
   342     add_subdirectory(bin)
   336     add_subdirectory(QTfrontend)
   343     add_subdirectory(QTfrontend)
   337     add_subdirectory(share)
   344     add_subdirectory(share)
   338     add_subdirectory(tools)
   345     add_subdirectory(tools)
   339 endif()
   346 endif()
       
   347 
   340 
   348 
   341 
   349 
   342 # CPack variables
   350 # CPack variables
   343 set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Hedgewars, a free turn-based strategy")
   351 set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Hedgewars, a free turn-based strategy")
   344 set(CPACK_PACKAGE_VENDOR "Hedgewars Project")
   352 set(CPACK_PACKAGE_VENDOR "Hedgewars Project")