project (widelands) cmake_minimum_required (VERSION 2.8.7) include("${CMAKE_SOURCE_DIR}/cmake/WlFunctions.cmake") option(OPTION_USE_GLBINDING "Use glbinding instead of GLEW" OFF) option(OPTION_GLEW_STATIC "Use static GLEW Library" OFF) if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) message(FATAL_ERROR "Build directory and source directory must not be the same.") endif (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) # Define the directory structure for installation - will be hardcoded in WL bin # (through config.h). If not specified, we are going to use the directory where # the executable is in. Also on Linux. # Packagers (or people using make install) have to set this variable to an absolute path. wl_set_if_unset(WL_INSTALL_DATADIR ".") if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7) message(FATAL_ERROR "Widelands needs GCC >= 4.7 to compile.") endif() elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.2) message(FATAL_ERROR "Clang version must be at least 3.2!") endif() else() message(WARNING "You are using an unsupported compiler! Supported are Clang and GCC.") endif() SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules) set (Boost_USE_STATIC_LIBS OFF) set (Boost_USE_MULTITHREADED ON) set (Boost_DETAILED_FAILURE_MSG ON) find_package(Boost 1.48 COMPONENTS unit_test_framework regex REQUIRED) find_package (PythonInterp REQUIRED) find_package(Gettext REQUIRED) find_package(OpenGL REQUIRED) find_package(PNG REQUIRED) find_package(SDL2 REQUIRED) find_package(SDL2_image REQUIRED) find_package(SDL2_mixer REQUIRED) find_package(SDL2_net REQUIRED) find_package(SDL2_ttf REQUIRED) find_package(ZLIB REQUIRED) find_package(ICU REQUIRED) if(OPTION_USE_GLBINDING) find_package(glbinding REQUIRED) else() find_package(GLEW REQUIRED) endif() if (APPLE OR WIN32 OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD") if (NOT CMAKE_SYSTEM_NAME MATCHES "kFreeBSD") find_package(intl REQUIRED) endif() endif() # TODO(sirver): One day, this should be enabled. Then we have no more cycles in our dependencies.... # set_property(GLOBAL PROPERTY GLOBAL_DEPENDS_NO_CYCLES ON) if (NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "") find_path(FILE_WL_RELEASE "WL_RELEASE" ${CMAKE_CURRENT_SOURCE_DIR}) if(${FILE_WL_RELEASE} STREQUAL "FILE_WL_RELEASE-NOTFOUND") set(CMAKE_BUILD_TYPE Debug) else() set(CMAKE_BUILD_TYPE Release) endif() endif (NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "") if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(WL_DEBUG_FLAGS "-g -DDEBUG") elseif(CMAKE_BUILD_TYPE STREQUAL "Release") set(WL_OPTIMIZE_FLAGS "-O3") set(WL_DEBUG_FLAGS "-DNDEBUG -DNOPARACHUTE") elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") set(WL_OPTIMIZE_FLAGS "-O3") set(WL_DEBUG_FLAGS "-g -DNDEBUG -DNOPARACHUTE") else() message(FATAL_ERROR "Unknown CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") endif() wl_add_flag(WL_GENERIC_CXX_FLAGS "-std=c++11") if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Weverything") # Disabled warnings that are overly verbose right now or just do not make sense. wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-c++98-compat") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-c++98-compat-pedantic") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-conversion") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-exit-time-destructors") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-global-constructors") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-padded") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-sign-conversion") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-switch-enum") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-missing-noreturn") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-implicit-fallthrough") # TODO(sirver): weak-vtables should be enabled, but leads to lot of errors right now. wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-weak-vtables") # This warning warns when a default case is at a switch that handles all # cases. While this is super nice, silencing this warning for clang will add # a warning for GCC (which is not as clever and does not figure out that all # cases are handled). Therefore we disable the warning and the unreachable as # they always come in pairs in these cases. wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-covered-switch-default") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-unreachable-code") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Werror=non-pod-varargs") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Qunused-arguments") else() # Assuming GCC 4.7 or higher. if(WIN32) # This is needed for getenv(). wl_add_flag(WL_GENERIC_CXX_FLAGS "-std=gnu++11") endif() if (NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8)) # Because of: https://svn.boost.org/trac/boost/ticket/9240. wl_add_flag(WL_GENERIC_CXX_FLAGS "-fext-numeric-literals") endif() wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wall") if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8) wl_add_flag(WL_COMPILE_DIAGNOSTICS "-pedantic") else() wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wpedantic") endif() wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wdeprecated-declarations") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wextra") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wformat") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wformat-nonliteral") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wformat-security") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wformat-y2k") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Winit-self") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Winvalid-pch") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wlogical-op") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wmissing-include-dirs") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-undef") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wold-style-cast") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Woverlength-strings") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wpacked") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wpointer-arith") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wredundant-decls") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wshadow") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wsign-promo") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wswitch-default") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wsync-nand") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wtrampolines") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wundef") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wunused") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wunused-macros") endif() # Turn some warnings into errors. wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Werror=uninitialized") wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Werror=return-type") IF (WIN32) add_definitions(-DMINGW_HAS_SECURE_API) if (CMAKE_SIZEOF_VOID_P EQUAL 4) set (CMAKE_EXE_LINKER_FLAGS "-Wl,--large-address-aware" CACHE STRING "Set by widelands CMakeLists.txt" FORCE) message (STATUS "Enabled large address awareness on mingw32") else (CMAKE_SIZEOF_VOID_P EQUAL 4) message (STATUS "Detected mingw32-w64") endif (CMAKE_SIZEOF_VOID_P EQUAL 4) endif (WIN32) # on BSD this must be explicitly linked if (CMAKE_SYSTEM_NAME MATCHES "FreeBSD" OR CMAKE_SYSTEM_NAME MATCHES "OpenBSD") # Not needed on Debian GNU/kFreeBSD.. if (NOT CMAKE_SYSTEM_NAME MATCHES "kFreeBSD") find_library(EXECINFO_LIBRARY NAMES execinfo) endif (NOT CMAKE_SYSTEM_NAME MATCHES "kFreeBSD") endif (CMAKE_SYSTEM_NAME MATCHES "FreeBSD" OR CMAKE_SYSTEM_NAME MATCHES "OpenBSD") if (NOT DEFINED WL_VERSION) add_custom_target ( BzrRevision ALL COMMAND ${CMAKE_COMMAND} -DWL_INSTALL_DATADIR=${WL_INSTALL_DATADIR} -DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/BzrRevision.cmake ) # Detect version now execute_process ( COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/utils/detect_revision.py OUTPUT_VARIABLE WL_VERSION WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_STRIP_TRAILING_WHITESPACE ) file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/VERSION "${WL_VERSION}") configure_file (${CMAKE_CURRENT_SOURCE_DIR}/src/build_info.cc.cmake ${CMAKE_CURRENT_BINARY_DIR}/src/build_info.cc) message (STATUS "Version of Widelands Build is ${WL_VERSION}(${CMAKE_BUILD_TYPE})") else (NOT DEFINED WL_VERSION) add_custom_target ( InputRevision ALL COMMAND ${CMAKE_COMMAND} -DWL_INSTALL_DATADIR=${WL_INSTALL_DATADIR} -DWL_VERSION=${WL_VERSION} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/InputRevision.cmake ) endif (NOT DEFINED WL_VERSION) # Enable testing. include(CTest) enable_testing() # Run a test after a normal compile. This magic is needed as 'make test' will # not rebuild tests: # http://stackoverflow.com/questions/733475/cmake-ctest-make-test-doesnt-build-tests add_custom_target(_run_all_tests ALL COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure WORKING_DIRECTORY ${CMAKE_BINARY_DIR} DEPENDS wl_tests ) install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/VERSION DESTINATION ${WL_INSTALL_DATADIR} CONFIGURATIONS Debug;Release COMPONENT CoreVersionFile ) # Installation. add_subdirectory(doc) add_subdirectory(po) add_subdirectory(src) # install files to the correct locations here install( DIRECTORY campaigns i18n tribes txts world pics scripting DESTINATION ${WL_INSTALL_DATADIR} CONFIGURATIONS Debug;Release COMPONENT CoreDataFiles ) install( DIRECTORY maps DESTINATION ${WL_INSTALL_DATADIR} CONFIGURATIONS Debug;Release COMPONENT MapFiles ) install( DIRECTORY music sound DESTINATION ${WL_INSTALL_DATADIR} CONFIGURATIONS Debug;Release COMPONENT MusicFiles ) install( FILES COPYING CREDITS ChangeLog DESTINATION ${WL_INSTALL_DATADIR} CONFIGURATIONS Debug;Release COMPONENT CoreLicenseFiles ) install( DIRECTORY doc DESTINATION ${WL_INSTALL_DATADIR} CONFIGURATIONS Debug COMPONENT DocFiles PATTERN "CMakeLists.txt" EXCLUDE ) set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES locale) install( DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/locale/ DESTINATION ${WL_INSTALL_DATADIR}/locale CONFIGURATIONS Debug;Release COMPONENT CoreLanguageFiles )