CMakeLists.txt
changeset 9150 79c58ff0d4b1
parent 9141 e391e9a19b1c
child 9151 1d2df388fcc6
equal deleted inserted replaced
9149:6790f1938cd9 9150:79c58ff0d4b1
    37 
    37 
    38 set(FPFLAGS "" CACHE STRING "Additional Freepascal flags")
    38 set(FPFLAGS "" CACHE STRING "Additional Freepascal flags")
    39 set(GHFLAGS "" CACHE STRING "Additional Haskell flags")
    39 set(GHFLAGS "" CACHE STRING "Additional Haskell flags")
    40 if(UNIX AND NOT APPLE)
    40 if(UNIX AND NOT APPLE)
    41     set(DATA_INSTALL_DIR "share/hedgewars" CACHE STRING "Resource folder path")
    41     set(DATA_INSTALL_DIR "share/hedgewars" CACHE STRING "Resource folder path")
    42 endif()
       
    43 
       
    44 
       
    45 #detect Mercurial revision and init rev/hash information
       
    46 find_program(HGCOMMAND hg)
       
    47 if(HGCOMMAND AND (EXISTS ${CMAKE_SOURCE_DIR}/.hg))
       
    48     execute_process(COMMAND ${HGCOMMAND} identify -in
       
    49                     WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
       
    50                     OUTPUT_VARIABLE internal_version
       
    51                     ERROR_QUIET
       
    52                 )
       
    53     #check local repo status
       
    54     string(REGEX REPLACE "[^+]" "" HGCHANGED ${internal_version})
       
    55     string(REGEX REPLACE "[0-9a-zA-Z]+(.*) ([0-9]+)(.*)" "\\2" HEDGEWARS_REVISION ${internal_version})
       
    56     string(REGEX REPLACE "([0-9a-zA-Z]+)(.*) [0-9]+(.*)" "\\1" HEDGEWARS_HASH ${internal_version})
       
    57 
       
    58     if(HGCHANGED)
       
    59         message(${WARNING} "You have uncommitted changes in your repository!")
       
    60     endif()
       
    61     #let's assume that if you have hg you might be interested in debugging
       
    62     set(default_build_type "DEBUG")
       
    63     #write down hash and rev for easy picking should hg be missing
       
    64     file(WRITE "${CMAKE_SOURCE_DIR}/share/version_info.txt" "Hedgewars versioning information, do not modify\nrev ${HEDGEWARS_REVISION}\nhash ${HEDGEWARS_HASH}\n")
       
    65 else()
       
    66     set(default_build_type "RELEASE")
       
    67     # when compiling outside rev control, fetch revision and hash information from version_info.txt
       
    68     find_file(version_info version_info.txt PATH ${CMAKE_SOURCE_DIR}/share)
       
    69     if(version_info)
       
    70         file(STRINGS ${version_info} internal_version REGEX "rev")
       
    71         string(REGEX REPLACE "rev ([0-9]*)" "\\1" HEDGEWARS_REVISION ${internal_version})
       
    72         file(STRINGS ${version_info} internal_version REGEX "hash")
       
    73         string(REGEX REPLACE "hash ([a-zA-Z0-9]*)" "\\1" HEDGEWARS_HASH ${internal_version})
       
    74     else()
       
    75         message(${WARNING} "${CMAKE_SOURCE_DIR}/share/version_info.txt not found, revision information "
       
    76                            "will be incorrect!!! Contact your source provider to fix this!")
       
    77         set(HEDGEWARS_REVISION "0000")
       
    78         set(HEDGEWARS_HASH "unknown")
       
    79     endif()
       
    80 endif()
    42 endif()
    81 
    43 
    82 
    44 
    83 #versioning
    45 #versioning
    84 set(CPACK_PACKAGE_VERSION_MAJOR 0)
    46 set(CPACK_PACKAGE_VERSION_MAJOR 0)
    85 set(CPACK_PACKAGE_VERSION_MINOR 9)
    47 set(CPACK_PACKAGE_VERSION_MINOR 9)
    86 set(CPACK_PACKAGE_VERSION_PATCH 20)
    48 set(CPACK_PACKAGE_VERSION_PATCH 20)
    87 set(HEDGEWARS_PROTO_VER 46)
    49 set(HEDGEWARS_PROTO_VER 46)
    88 set(HEDGEWARS_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
    50 set(HEDGEWARS_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
       
    51 include(${CMAKE_MODULE_PATH}/revinfo.cmake)
    89 
    52 
    90 message(STATUS "Building ${HEDGEWARS_VERSION}-r${HEDGEWARS_REVISION} (${HEDGEWARS_HASH})")
    53 message(STATUS "Building ${HEDGEWARS_VERSION}-r${HEDGEWARS_REVISION} (${HEDGEWARS_HASH})")
    91 
    54 
    92 
    55 
    93 #where to build libs and bins
    56 #where to build libs and bins
   120         set(HEDGEWARS_FULL_DATADIR "${CMAKE_INSTALL_PREFIX}/")
    83         set(HEDGEWARS_FULL_DATADIR "${CMAKE_INSTALL_PREFIX}/")
   121         link_directories("${EXECUTABLE_OUTPUT_PATH}" "${CMAKE_SOURCE_DIR}/misc/winutils/bin")
    84         link_directories("${EXECUTABLE_OUTPUT_PATH}" "${CMAKE_SOURCE_DIR}/misc/winutils/bin")
   122     endif()
    85     endif()
   123 endif()
    86 endif()
   124 
    87 
   125 
    88 #platform specific init code
   126 if(APPLE)
    89 include(${CMAKE_MODULE_PATH}/platform.cmake)
   127     set(CMAKE_FIND_FRAMEWORK "FIRST")
       
   128 
       
   129     #what system are we building for
       
   130     set(minimum_macosx_version $ENV{MACOSX_DEPLOYMENT_TARGET})
       
   131 
       
   132     #detect on which system we are: if sw_vers cannot be found for any reason (re)use minimum_macosx_version
       
   133     find_program(sw_vers sw_vers)
       
   134     if(sw_vers)
       
   135         execute_process(COMMAND ${sw_vers} "-productVersion"
       
   136                         OUTPUT_VARIABLE current_macosx_version
       
   137                         OUTPUT_STRIP_TRAILING_WHITESPACE)
       
   138         string(REGEX REPLACE "([0-9]+.[0-9]+).[0-9]+" "\\1" current_macosx_version ${current_macosx_version})
       
   139     else()
       
   140         if(NOT minimum_macosx_version)
       
   141             message(FATAL_ERROR "sw_vers not found! Need explicit MACOSX_DEPLOYMENT_TARGET variable set")
       
   142         else()
       
   143             message(${WARNING} "sw_vers not found! Fallback to MACOSX_DEPLOYMENT_TARGET variable")
       
   144             set(current_macosx_version ${minimum_macosx_version})
       
   145         endif()
       
   146     endif()
       
   147 
       
   148     #if nothing is set, we deploy only for the current system
       
   149     if(NOT minimum_macosx_version)
       
   150         set(minimum_macosx_version ${current_macosx_version})
       
   151     endif()
       
   152 
       
   153     #lower systems don't have enough processing power anyway
       
   154     if (minimum_macosx_version VERSION_LESS "10.4")
       
   155         message(FATAL_ERROR "Hedgewars is not supported on Mac OS X pre-10.4")
       
   156     endif()
       
   157 
       
   158     #workaround for http://playcontrol.net/ewing/jibberjabber/big_behind-the-scenes_chang.html#SDL_mixer (Update 2)
       
   159     if(current_macosx_version VERSION_EQUAL "10.4")
       
   160         find_package(SDL_mixer REQUIRED)
       
   161         set(DYLIB_SMPEG "-dylib_file @loader_path/Frameworks/smpeg.framework/Versions/A/smpeg:${SDLMIXER_LIBRARY}/Versions/A/Frameworks/smpeg.framework/Versions/A/smpeg")
       
   162         set(DYLIB_MIKMOD "-dylib_file @loader_path/Frameworks/mikmod.framework/Versions/A/mikmod:${SDLMIXER_LIBRARY}/Versions/A/Frameworks/mikmod.framework/Versions/A/mikmod")
       
   163         set(CMAKE_C_FLAGS "${DYLIB_SMPEG} ${DYLIB_MIKMOD}")
       
   164         list(APPEND pascal_flags "-k${DYLIB_SMPEG}" "-k${DYLIB_MIKMOD}")
       
   165     endif()
       
   166 
       
   167     #CMAKE_OSX_ARCHITECTURES and CMAKE_OSX_SYSROOT need to be set for universal binary and correct linking
       
   168     if(NOT CMAKE_OSX_ARCHITECTURES)
       
   169         if(current_macosx_version VERSION_LESS "10.6")
       
   170             if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "powerpc*")
       
   171                 set(CMAKE_OSX_ARCHITECTURES "ppc7400")
       
   172             else()
       
   173                 set(CMAKE_OSX_ARCHITECTURES "i386")
       
   174             endif()
       
   175         else()
       
   176             set(CMAKE_OSX_ARCHITECTURES "x86_64")
       
   177         endif()
       
   178     endif()
       
   179 
       
   180     #CMAKE_OSX_SYSROOT is set at the system version we are supposed to build on
       
   181     #we need to provide the correct one when host and target differ
       
   182     if(NOT ${minimum_macosx_version} VERSION_EQUAL ${current_macosx_version})
       
   183         if(minimum_macosx_version VERSION_EQUAL "10.4")
       
   184             set(CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX10.4u.sdk/")
       
   185             set(CMAKE_C_COMPILER "/Developer/usr/bin/gcc-4.0")
       
   186             set(CMAKE_CXX_COMPILER "/Developer/usr/bin/g++-4.0")
       
   187         else()
       
   188             string(REGEX REPLACE "([0-9]+.[0-9]+).[0-9]+" "\\1" sdk_version ${minimum_macosx_version})
       
   189             set(CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX${sdk_version}.sdk/")
       
   190         endif()
       
   191     endif()
       
   192 
       
   193     #add user framework directory, other paths can be passed via FPFLAGS
       
   194     list(APPEND pascal_flags "-Ff~/Library/Frameworks")
       
   195     #set deployment target
       
   196     list(APPEND pascal_flags "-k-macosx_version_min" "-k${minimum_macosx_version}" "-XR${CMAKE_OSX_SYSROOT}")
       
   197 endif(APPLE)
       
   198 
    90 
   199 
    91 
   200 #when build type is not specified, assume Debug/Release according to build version information
    92 #when build type is not specified, assume Debug/Release according to build version information
   201 if (CMAKE_BUILD_TYPE)
    93 if (CMAKE_BUILD_TYPE)
   202     string (TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE)
    94     string (TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE)
   209 endif (CMAKE_BUILD_TYPE)
   101 endif (CMAKE_BUILD_TYPE)
   210 
   102 
   211 
   103 
   212 #set default flags values for all projects (unless MINIMAL_FLAGS is true)
   104 #set default flags values for all projects (unless MINIMAL_FLAGS is true)
   213 if(NOT ${MINIMAL_FLAGS})
   105 if(NOT ${MINIMAL_FLAGS})
   214     if(WINDOWS)
       
   215         #this flags prevents a few dll hell problems
       
   216         set(CMAKE_C_FLAGS "-static-libgcc ${CMAKE_C_FLAGS}")
       
   217     endif(WINDOWS)
       
   218     set(CMAKE_C_FLAGS "-pipe ${CMAKE_C_FLAGS}")
   106     set(CMAKE_C_FLAGS "-pipe ${CMAKE_C_FLAGS}")
   219     set(CMAKE_C_FLAGS_RELEASE "-w -Os -fomit-frame-pointer ${CMAKE_C_FLAGS_RELEASE}")
   107     set(CMAKE_C_FLAGS_RELEASE "-w -Os -fomit-frame-pointer ${CMAKE_C_FLAGS_RELEASE}")
   220     set(CMAKE_C_FLAGS_DEBUG "-Wall -O0 -g -DDEBUG ${CMAKE_C_FLAGS_DEBUG}")
   108     set(CMAKE_C_FLAGS_DEBUG "-Wall -O0 -g -DDEBUG ${CMAKE_C_FLAGS_DEBUG}")
   221     set(CMAKE_CXX_FLAGS ${CMAKE_C_FLAGS})
   109     set(CMAKE_CXX_FLAGS ${CMAKE_C_FLAGS})
   222     set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
   110     set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})