cmake_minimum_required(VERSION 2.8.5) # Make sure the user doesn't play dirty with symlinks get_filename_component(srcdir "${CMAKE_SOURCE_DIR}" REALPATH) get_filename_component(bindir "${CMAKE_BINARY_DIR}" REALPATH) # Disallow in-source builds if(${srcdir} STREQUAL ${bindir}) message(FATAL_ERROR "In-source builds are not allowed." " Please create a directory and run cmake from there, passing the path" " to this source directory as the last argument. This process created" " the file `CMakeCache.txt' and the directory `CMakeFiles' in ${srcdir}." " Please remove them.") endif() project(gmt_makemap CXX) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel" FORCE) endif() set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/" CACHE INTERNAL "Location of our custom CMake modules." FORCE) include_directories(include) # Checking compiler options set(default_options -Wall) set(linker_options -Wall) include(CheckCXXCompilerFlag) set(saved_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) # C++11 is required CHECK_CXX_COMPILER_FLAG(-std=c++11 COMPILER_SUPPORTS_CXX11) CHECK_CXX_COMPILER_FLAG(-std=c++0x COMPILER_SUPPORTS_CXX0X) if(COMPILER_SUPPORTS_CXX11) set(default_options ${default_options} -std=c++11) elseif(COMPILER_SUPPORTS_CXX0X) set(default_options ${default_options} -std=c++0x) else() message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") endif() # Link time optimization check set(CMAKE_REQUIRED_FLAGS -flto) CHECK_CXX_COMPILER_FLAG(-flto COMPILER_SUPPORTS_FLTO) if(COMPILER_SUPPORTS_FLTO AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug") set(default_options ${default_options} -flto) set(linker_options ${linker_options} -flto) endif() unset(CMAKE_REQUIRED_FLAGS) # Clang can use lto only with gold linker if(NOT COMPILER_SUPPORTS_FLTO) set(CMAKE_REQUIRED_FLAGS -flto\ -fuse-ld=gold) CHECK_CXX_COMPILER_FLAG(-flto\ -fuse-ld=gold COMPILER_SUPPORTS_FLTO_GOLD) if(COMPILER_SUPPORTS_FLTO_GOLD AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug") set(default_options ${default_options} -flto) set(linker_options ${linker_options} -flto\ -fuse-ld=gold) endif() unset(CMAKE_REQUIRED_FLAGS) endif() # Dwarf-4 support check set(CMAKE_REQUIRED_FLAGS -gdwarf-4) CHECK_CXX_COMPILER_FLAG(-gdwarf-4 COMPILER_SUPPORTS_DWARF4) if(COMPILER_SUPPORTS_DWARF4 AND (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")) set(default_options ${default_options} -gdwarf-4) set(linker_options ${linker_options} -gdwarf-4) endif() unset(CMAKE_REQUIRED_FLAGS) # -ipo flag check (Intel compiler link time optimization) set(CMAKE_REQUIRED_FLAGS -ipo) CHECK_CXX_COMPILER_FLAG(-ipo COMPILER_SUPPORTS_IPO) if(COMPILER_SUPPORTS_IPO AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug") set(default_options ${default_options} -ipo) set(linker_options ${linker_options} -ipo) endif() unset(CMAKE_REQUIRED_FLAGS) # Default hidden visibility check set(CMAKE_REQUIRED_FLAGS -fvisibility=hidden) CHECK_CXX_COMPILER_FLAG(-fvisibility=hidden COMPILER_SUPPORTS_HIDDEN) if(COMPILER_SUPPORTS_HIDDEN) set(default_options ${default_options} -fvisibility=hidden) set(linker_options ${linker_options} -fvisibility=hidden) endif() unset(CMAKE_REQUIRED_FLAGS) # Export dynamic. Required as modules mast call functions from main programm set(CMAKE_REQUIRED_FLAGS -Wl,--export-dynamic) CHECK_CXX_COMPILER_FLAG(-Wl,--export-dynamic COMPILER_SUPPORTS_EXPORTDYNAMIC) if(COMPILER_SUPPORTS_EXPORTDYNAMIC) set(linker_options ${linker_options} -Wl,--export-dynamic) else() message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no support of --export-dynamic. Please use a different C++ compiler.") endif() unset(CMAKE_REQUIRED_FLAGS) add_compile_options(${default_options}) set(CMAKE_REQUIRED_FLAGS ${saved_CMAKE_REQUIRED_FLAGS}) file(GLOB modules modules/*) file(GLOB extramodules extramodules/*) set(STATIC_MODULES "") foreach(ext ${modules}) if(EXISTS ${ext}/CMakeLists.txt) string(REGEX REPLACE .*/ "" modname ${ext}) option(MODULE_${modname}_BUILD "Build module ${modname}" ON) option(MODULE_${modname}_STATIC "Link module ${modname} statically in gmt_makemap" ON) mark_as_advanced(FORCE MODULE_${modname}_STATIC) if(MODULE_${modname}_BUILD) add_subdirectory(modules/${modname}) endif() endif() endforeach(ext) foreach(ext ${extramodules}) if(EXISTS ${ext}/CMakeLists.txt) string(REGEX REPLACE .*/ "" modname ${ext}) option(MODULE_${modname}_BUILD "Build module ${modname}" ON) option(MODULE_${modname}_STATIC "Link module ${modname} statically in gmt_makemap" ON) mark_as_advanced(FORCE MODULE_${modname}_STATIC) if(MODULE_${modname}_BUILD) add_subdirectory(extramodules/${modname}) endif() endif() endforeach(ext) add_subdirectory(src)