diff -r 404ddce27b23 -r c13ebed437cb CMakeLists.txt --- a/CMakeLists.txt Wed Feb 20 02:21:58 2013 +0100 +++ b/CMakeLists.txt Tue Apr 02 21:00:57 2013 +0200 @@ -2,77 +2,97 @@ #initialise cmake environment cmake_minimum_required(VERSION 2.6.0) +if(CMAKE_VERSION VERSION_LESS "2.8") + set(WARNING "WARNING: ") + set(allow_parse_args FALSE) +else() + set(WARNING WARNING) + set(allow_parse_args TRUE) +endif() foreach(hwpolicy CMP0003 CMP0012 CMP0017) if(POLICY ${hwpolicy}) cmake_policy(SET ${hwpolicy} NEW) endif() endforeach() -#use available modules, fallback to ours if not present (CMP0017 helps) -set(CMAKE_MODULE_PATH "${CMAKE_ROOT}/Modules" "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules") + +set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules") -#usually this is set at release time -option(NOREVISION "Build Hedgewars without revision information [default: off]" OFF) +#possible cmake configuration +option(NOSERVER "Disable gameServer build (off)]" OFF) +option(NOPNG "Disable screenshoot compression (off)" OFF) +option(NOVIDEOREC "Disable video recording (off)" OFF) + +#set this to ON when 2.1.0 becomes more widespread (and only for linux) +option(SYSTEM_PHYSFS "Use system physfs (off)" OFF) -#set other default values -option(NOSERVER "Disable gameServer build [default: auto]" OFF) -option(NOPNG "Disable screenshoot compression [default: auto]" OFF) -option(NOVIDEOREC "Disable video recording [default: auto]" OFF) +option(LIBENGINE "Enable hwengine library (off)" OFF) +option(ANDROID "Enable Android build (off)" OFF) +if(UNIX AND NOT APPLE) + option(MINIMAL_FLAGS "Respect system flags as much as possible (off)" OFF) +else() + option(NOAUTOUPDATE "Disable OS X Sparkle update checking" OFF) +endif() option(WEBGL "Enable WebGL build (implies NOPASCAL) [default: off]" OFF) option(NOPASCAL "Compile hwengine as native C [default: off]" ${WEBGL}) -option(LIBENGINE "Enable hwengine library [default: off]" OFF) +option(GL2 "Enable OpenGL 2 rendering [default: off]" OFF) -option(ANDROID "Enable Android build [default: off]" OFF) -option(NOAUTOUPDATE "Disable OS X Sparkle update checking" OFF) -option(MINIMAL_FLAGS "Respect system flags as much as possible [default: off]" OFF) -option(GL2 "Enable OpenGL 2 rendering [default: off]" OFF) set(FPFLAGS "" CACHE STRING "Additional Freepascal flags") set(GHFLAGS "" CACHE STRING "Additional Haskell flags") if(UNIX AND NOT APPLE) set(DATA_INSTALL_DIR "share/hedgewars" CACHE STRING "Resource folder path") endif() -#detect Mercurial revision (if present) -if(NOT ${NOREVISION}) - set(default_build_type "DEBUG") - set(version_suffix "-development_version") - set(HW_DEV true) - find_program(HGCOMMAND hg) - if(HGCOMMAND AND (EXISTS ${CMAKE_SOURCE_DIR}/.hg)) - execute_process(COMMAND ${HGCOMMAND} identify -in - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE internal_version - ERROR_QUIET - ) - #check local repo status - string(REGEX REPLACE "[^+]" "" HGCHANGED ${internal_version}) + +#detect Mercurial revision and init rev/hash information +find_program(HGCOMMAND hg) +if(HGCOMMAND AND (EXISTS ${CMAKE_SOURCE_DIR}/.hg)) + execute_process(COMMAND ${HGCOMMAND} identify -in + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE internal_version + ERROR_QUIET + ) + #check local repo status + string(REGEX REPLACE "[^+]" "" HGCHANGED ${internal_version}) + string(REGEX REPLACE "[0-9a-zA-Z]+(.*) ([0-9]+)(.*)" "\\2" HEDGEWARS_REVISION ${internal_version}) + string(REGEX REPLACE "([0-9a-zA-Z]+)(.*) [0-9]+(.*)" "\\1" HEDGEWARS_HASH ${internal_version}) - string(REGEX REPLACE "[0-9a-zA-Z]+(.*) ([0-9]+)(.*)" "\\2" revision_number ${internal_version}) - string(REGEX REPLACE "([0-9a-zA-Z]+)(.*) [0-9]+(.*)" "\\1" revision_hash ${internal_version}) - - message(STATUS "Building revision ${revision_number} from hash ${revision_hash} ${HGCHANGED}") - if(HGCHANGED) - MESSAGE(WARNING "Notice: you have uncommitted changes in your repository") - endif() - set(version_suffix "-${revision_number}${HGCHANGED}") + if(HGCHANGED) + message(${WARNING} "You have uncommitted changes in your repository!") endif() -else(NOT ${NOREVISION}) + #let's assume that if you have hg you might be interested in debugging + set(default_build_type "DEBUG") + #write down hash and rev for easy picking should hg be missing + file(WRITE "${CMAKE_SOURCE_DIR}/share/version_info.txt" "Hedgewars versioning information, do not modify\nrev ${HEDGEWARS_REVISION}\nhash ${HEDGEWARS_HASH}\n") +else() set(default_build_type "RELEASE") - set(HWDEV false) - message(STATUS "Building distributable version") -endif(NOT ${NOREVISION}) + # when compiling outside rev control, fetch revision and hash information from version_info.txt + find_file(version_info version_info.txt PATH ${CMAKE_SOURCE_DIR}/share) + if(version_info) + file(STRINGS ${version_info} internal_version REGEX "rev") + string(REGEX REPLACE "rev ([0-9]*)" "\\1" HEDGEWARS_REVISION ${internal_version}) + file(STRINGS ${version_info} internal_version REGEX "hash") + string(REGEX REPLACE "hash ([a-zA-Z0-9]*)" "\\1" HEDGEWARS_HASH ${internal_version}) + else() + message(${WARNING} "${CMAKE_SOURCE_DIR}/share/version_info.txt not found, revision information " + "will be incorrect!!! Contact your source provider to fix this!") + set(HEDGEWARS_REVISION "0000") + set(HEDGEWARS_HASH "unknown") + endif() +endif() #versioning set(CPACK_PACKAGE_VERSION_MAJOR 0) set(CPACK_PACKAGE_VERSION_MINOR 9) -set(CPACK_PACKAGE_VERSION_PATCH 19${version_suffix}) +set(CPACK_PACKAGE_VERSION_PATCH 19) set(HEDGEWARS_PROTO_VER 44) set(HEDGEWARS_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") set(required_clang_version 3.0) +message(STATUS "Building ${HEDGEWARS_VERSION}-r${HEDGEWARS_REVISION} (${HEDGEWARS_HASH})") if (${NOPASCAL}) find_package(Clang) @@ -85,27 +105,36 @@ endif(${NOPASCAL}) + +#where to build libs and bins set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) +#resource paths if(UNIX AND NOT APPLE) set(target_binary_install_dir "bin") set(target_library_install_dir "lib") - set(SHAREPATH "${DATA_INSTALL_DIR}/") + + string(SUBSTRING "${DATA_INSTALL_DIR}" 0 1 sharepath_start) + if (NOT (${sharepath_start} MATCHES "/")) + set(HEDGEWARS_DATADIR "${CMAKE_INSTALL_PREFIX}/${DATA_INSTALL_DIR}/") + else() + set(HEDGEWARS_DATADIR "${DATA_INSTALL_DIR}/") + endif() + set(HEDGEWARS_FULL_DATADIR "${HEDGEWARS_DATADIR}") else() set(target_binary_install_dir "./") if(APPLE) + set(target_library_install_dir "../Frameworks/") set(CMAKE_INSTALL_PREFIX "Hedgewars.app/Contents/MacOS/") - set(SHAREPATH "../Resources/") - set(target_library_install_dir "../Frameworks/") - else() - if(WIN32) - set(target_library_install_dir "./") - set(SHAREPATH "./") - set(CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/misc/winutils/") - link_directories("${EXECUTABLE_OUTPUT_PATH}" "${CMAKE_SOURCE_DIR}/misc/winutils/bin") - endif(WIN32) + set(HEDGEWARS_DATADIR "../Resources/") + set(HEDGEWARS_FULL_DATADIR "/Applications/${CMAKE_INSTALL_PREFIX}/${HEDGEWARS_DATADIR}") + elseif(WIN32) + set(target_library_install_dir "./") + set(HEDGEWARS_DATADIR "./") + set(HEDGEWARS_FULL_DATADIR "${CMAKE_INSTALL_PREFIX}/") + link_directories("${EXECUTABLE_OUTPUT_PATH}" "${CMAKE_SOURCE_DIR}/misc/winutils/bin") endif() endif() @@ -127,7 +156,7 @@ if(NOT minimum_macosx_version) message(FATAL_ERROR "sw_vers not found! Need explicit MACOSX_DEPLOYMENT_TARGET variable set") else() - message(WARNING "sw_vers not found! Fallback to MACOSX_DEPLOYMENT_TARGET variable") + message(${WARNING} "sw_vers not found! Fallback to MACOSX_DEPLOYMENT_TARGET variable") set(current_macosx_version ${minimum_macosx_version}) endif() endif() @@ -181,11 +210,6 @@ list(APPEND pascal_flags "-Ff~/Library/Frameworks") #set deployment target list(APPEND pascal_flags "-k-macosx_version_min" "-k${minimum_macosx_version}" "-XR${CMAKE_OSX_SYSROOT}") - - #silly libav that always brings in VideoDecoderAcceleration, avaible only from 10.6.3 - if(NOT NOVIDEOREC AND ${minimum_macosx_version} VERSION_LESS "10.6") - set(WARNING "Video recording support before OS X 10.6 is experimental") - endif() endif(APPLE) @@ -193,13 +217,14 @@ if (CMAKE_BUILD_TYPE) string (TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE) if ( NOT( (CMAKE_BUILD_TYPE MATCHES "RELEASE") OR (CMAKE_BUILD_TYPE MATCHES "DEBUG") ) ) - set (CMAKE_BUILD_TYPE ${default_build_type} CACHE STRING "Choose the build type, options are: Debug Release." FORCE) + set (CMAKE_BUILD_TYPE ${default_build_type} CACHE STRING "Build type (Debug/Release)" FORCE) message (STATUS "Unknown build type, using default (${default_build_type})") endif () else (CMAKE_BUILD_TYPE) - set (CMAKE_BUILD_TYPE ${default_build_type} CACHE STRING "Choose the build type, options are: Debug Release." FORCE) + set (CMAKE_BUILD_TYPE ${default_build_type} CACHE STRING "Build type (Debug/Release)" FORCE) endif (CMAKE_BUILD_TYPE) + #set default flags values for all projects (unless MINIMAL_FLAGS is true) if(NOT ${MINIMAL_FLAGS}) set(CMAKE_C_FLAGS "-pipe ${CMAKE_C_FLAGS}") @@ -216,39 +241,67 @@ set(CMAKE_CXX_FLAGS_DEBUG "-Wall -DDEBUG") endif() +#TODO: find out why we need this... +include(CheckCCompilerFlag) +set(CMAKE_REQUIRED_FLAGS "-Wl,-z -Wl,noexecstack") +check_c_compiler_flag("" HAVE_NOEXECSTACK) #empty because we are testing a linker flag +if(HAVE_NOEXECSTACK) + list(APPEND pascal_flags "-k-z" "-knoexecstack") + if(NOT ${MINIMAL_FLAGS}) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_REQUIRED_FLAGS}") + endif() +endif() +unset(CMAKE_REQUIRED_FLAGS) + #parse additional parameters if(FPFLAGS OR GHFLAGS) - set(cmake_version "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}") - if(cmake_version VERSION_LESS "2.8") - message(WARNING "FPFLAGS and GHFLAGS are available only when using CMake >= 2.8") + if(${allow_parse_args}) + message(${WARNING} "FPFLAGS and GHFLAGS are available only when using CMake >= 2.8") else() separate_arguments(fpflags_parsed UNIX_COMMAND ${FPFLAGS}) separate_arguments(ghflags_parsed UNIX_COMMAND ${GHFLAGS}) endif() endif() -list(APPEND pascal_flags ${fpflags_parsed} # user flags - "-vm4079,4080,4081" # fpc output format - "-B" # compile all units - "-FE${PROJECT_BINARY_DIR}/bin" # fpc output directory - "-Fl${PROJECT_BINARY_DIR}/bin" # fpc linking directory - "-Cs2000000" # stack size - "-vewnq" # fpc output verbosity - "-dDEBUGFILE" # macro for engine output +list(APPEND pascal_flags ${fpflags_parsed} # user flags + "-B" # compile all units + "-vm4079,4080,4081" # fpc verbosity output format + "-FE${PROJECT_BINARY_DIR}/bin" # fpc binaries output directory + "-FU${PROJECT_BINARY_DIR}/hedgewars" # fpc units output directory + "-Fl${PROJECT_BINARY_DIR}/bin" # fpc linking directory (win/unix) + "-Fi${PROJECT_BINARY_DIR}/hedgewars" # fpc .inc path (for out of source builds) + "-k-L${PROJECT_BINARY_DIR}/bin" # ld linking directory (unix/osx) + "-Cs2000000" # stack size + "-vewnq" # fpc output verbosity + "-dDEBUGFILE" # macro for engine output ) -list(APPEND haskell_flags "-O2" ${ghflags_parsed}) +list(APPEND haskell_flags ${ghflags_parsed} # user flags + "-O2" # optimise for faster code + ) + #get BUILD_TYPE and enable/disable optimisation message(STATUS "Using ${CMAKE_BUILD_TYPE} configuration") if(CMAKE_BUILD_TYPE MATCHES "DEBUG") - list(APPEND pascal_flags "-O-" "-g" "-gl" "-gv") - list(APPEND haskell_flags "-Wall" "-debug" "-dcore-lint" "-fno-warn-unused-do-bind") + list(APPEND pascal_flags "-O-" # disable all optimisations + "-g" # enable debug symbols + "-gl" # add line info to bt + "-gv" # allow valgrind + ) + list(APPEND haskell_flags "-Wall" # all warnings + "-debug" # debug mode + "-dcore-lint" # internal sanity check + ) else() -# set(pascal_flags "-O3" "-OpPENTIUM4" "-CfSSE3" "-Xs" "-Si" ${pascal_flags}) - list(APPEND pascal_flags "-Os" "-Xs" "-Si") - list(APPEND haskell_flags "-w" "-fno-warn-unused-do-bind") + list(APPEND pascal_flags "-Os" # optimise for size + "-Xs" # strip binary + "-Si" # turn on inlining + ) + list(APPEND haskell_flags "-w" # no warnings + ) endif() +include(${CMAKE_MODULE_PATH}/utils.cmake) #Haskell compiler discovery (for server and engine in c) if((NOT NOSERVER) OR NOPASCAL) @@ -290,16 +343,45 @@ endif() -#physfs library (static on unix, dll on win32) -add_subdirectory(misc/physfs) -if(NOT WIN32) - list(APPEND pascal_flags "-k${LIBRARY_OUTPUT_PATH}/libphysfs.a") +#physfs discovery +if (${SYSTEM_PHYSFS}) + if (NOT PHYSFS_LIBRARY OR NOT PHYSFS_INCLUDE_DIR) + find_package(PhysFS) + endif() + + find_file(physfs_h physfs.h ${PHYSFS_INCLUDE_DIR}) + if(physfs_h) + file(STRINGS ${physfs_h} physfs_majorversion REGEX "PHYSFS_VER_MAJOR[\t' ']+[0-9]+") + file(STRINGS ${physfs_h} physfs_minorversion REGEX "PHYSFS_VER_MINOR[\t' ']+[0-9]+") + file(STRINGS ${physfs_h} physfs_patchversion REGEX "PHYSFS_VER_PATCH[\t' ']+[0-9]+") + string(REGEX MATCH "([0-9]+)" physfs_majorversion "${physfs_majorversion}") + string(REGEX MATCH "([0-9]+)" physfs_minorversion "${physfs_minorversion}") + string(REGEX MATCH "([0-9]+)" physfs_patchversion "${physfs_patchversion}") + set(physfs_detected_ver "${physfs_majorversion}.${physfs_minorversion}.${physfs_patchversion}") + + if (physfs_detected_ver VERSION_LESS "2.1.0") + message(FATAL_ERROR "PhysFS version is too old (dected ${physfs_detected_ver}, required 2.1.0)") + set(physfs_too_old true) + endif() + endif() + + if (NOT PHYSFS_LIBRARY OR NOT PHYSFS_INCLUDE_DIR) + message(FATAL_ERROR "Missing PhysFS! Rerun cmake with -DPHYSFS_SYSTEM=off to build the internal version") + endif() +else() + message(STATUS "PhysFS will be provided by the bundled sources") + set(physfs_output_name "hw_physfs") + add_subdirectory(misc/libphysfs) + #-XLA is a beta fpc flag that renames libraries before passing them to the linker + #we also have to pass PHYSFS_INTERNAL to satisfy windows runtime requirements + #(should be harmless on other platforms) + list(APPEND pascal_flags "-XLAphysfs=${physfs_output_name}" "-dPHYSFS_INTERNAL") endif() +find_package_or_disable_msg(FFMPEG NOVIDEOREC "Video recording will not be built") -#frontend library -add_subdirectory(project_files/frontlib) - +#physfs helper library +add_subdirectory(misc/libphyslayer) if(NOPASCAL) if (NOT ghc_executable) @@ -317,102 +399,16 @@ #WEBGL deps else(WEBGL) #Android related build scripts + #TODO: when ANDROID, LIBENGINE should be set if(ANDROID) add_subdirectory(project_files/Android-build) - endif() - - #TODO: when ANDROID, LIBENGINE should be set - if(NOT ANDROID) + else(ANDROID) add_subdirectory(bin) add_subdirectory(QTfrontend) add_subdirectory(share) add_subdirectory(tools) - endif() + endif(ANDROID) endif(WEBGL) - - -# CPack variables -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Hedgewars, a free turn-based strategy") -set(CPACK_PACKAGE_VENDOR "Hedgewars Project") -set(CPACK_PACKAGE_FILE_NAME "hedgewars-${HEDGEWARS_VERSION}") -set(CPACK_SOURCE_PACKAGE_FILE_NAME "hedgewars-src-${HEDGEWARS_VERSION}") -set(CPACK_SOURCE_GENERATOR "TBZ2") -set(CPACK_PACKAGE_EXECUTABLES "hedgewars" "hedgewars") -set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING") -set(CPACK_PACKAGE_INSTALL_DIRECTORY "Hedgewars ${HEDGEWARS_VERSION}") - -if(WIN32 AND NOT UNIX) - set(CPACK_NSIS_DISPLAY_NAME "Hedgewars") - set(CPACK_NSIS_HELP_LINK "http://www.hedgewars.org/") - set(CPACK_NSIS_URL_INFO_ABOUT "http://www.hedgewars.org/") - set(CPACK_NSIS_CONTACT "unC0Rr@gmail.com") - set(CPACK_NSIS_MODIFY_PATH OFF) - set(CPACK_NSIS_EXECUTABLES_DIRECTORY "${target_binary_install_dir}") - set(CPACK_GENERATOR "ZIP;NSIS") - set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "hedgewars") -else(WIN32 AND NOT UNIX) - set(CPACK_STRIP_FILES "bin/hedgewars;bin/hwengine") -endif(WIN32 AND NOT UNIX) +include(${CMAKE_MODULE_PATH}/CPackConfig.cmake) -set(CPACK_SOURCE_IGNORE_FILES - "~" - "\\\\.hg" - "\\\\.svn" - "\\\\.exe$" - "\\\\.a$" - "\\\\.dll$" - "\\\\.xcf$" - "\\\\.cxx$" - "\\\\.db$" - "\\\\.dof$" - "\\\\.layout$" - "\\\\.zip$" - "\\\\.gz$" - "\\\\.bz2$" - "\\\\.tmp$" - "\\\\.core$" - "\\\\.sh$" - "\\\\.sifz$" - "\\\\.svg$" - "\\\\.svgz$" - "\\\\.ppu$" - "\\\\.psd$" - "\\\\.o$" - "Makefile" - "Doxyfile" - "CMakeFiles" - "debug" - "release$" - "Debug$" - "Release$" - "proto\\\\.inc$" - "hwconsts\\\\.cpp$" - "playlist\\\\.inc$" - "CPack" - "cmake_install\\\\.cmake$" - "config\\\\.inc$" - "hwengine\\\\.desktop$" - "CMakeCache\\\\.txt$" -# "^${CMAKE_CURRENT_SOURCE_DIR}/misc/libopenalbridge" -# "^${CMAKE_CURRENT_SOURCE_DIR}/misc/libfreetype" - "^${CMAKE_CURRENT_SOURCE_DIR}/misc/liblua" -# "^${CMAKE_CURRENT_SOURCE_DIR}/misc/libtremor" - "^${CMAKE_CURRENT_SOURCE_DIR}/project_files/HedgewarsMobile/" - "^${CMAKE_CURRENT_SOURCE_DIR}/bin/[a-z]" - "^${CMAKE_CURRENT_SOURCE_DIR}/tools/templates" - "^${CMAKE_CURRENT_SOURCE_DIR}/doc" - "^${CMAKE_CURRENT_SOURCE_DIR}/templates" - "^${CMAKE_CURRENT_SOURCE_DIR}/Graphics" - "^${CMAKE_CURRENT_SOURCE_DIR}/realtest" - "^${CMAKE_CURRENT_SOURCE_DIR}/tmp" - "^${CMAKE_CURRENT_SOURCE_DIR}/utils" - "^${CMAKE_CURRENT_SOURCE_DIR}/share/hedgewars/Data/Maps/test" - "^${CMAKE_CURRENT_SOURCE_DIR}/share/hedgewars/Data/Themes/ethereal" - "^${CMAKE_CURRENT_SOURCE_DIR}/install_manifest.txt" - "^${CMAKE_CURRENT_SOURCE_DIR}/CMakeCache.txt" - "^${CMAKE_CURRENT_SOURCE_DIR}/hedgewars\\\\." -) - -include(CPack) -