From 1956e4bee1f5db2a2d6519f23ad99d97cfb48518 Mon Sep 17 00:00:00 2001 From: Matthias Vallentin Date: Thu, 4 Jun 2015 17:48:07 -0700 Subject: [PATCH] Streamline CMake setup --- CMakeLists.txt | 65 +++++---- cmake/ConfigurePackaging.cmake | 237 --------------------------------- 2 files changed, 42 insertions(+), 260 deletions(-) delete mode 100644 cmake/ConfigurePackaging.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 630efd097cc..544098e1106 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,11 @@ +#------------------------------------------------------------------------------ +# Project Setup +#------------------------------------------------------------------------------ + cmake_minimum_required(VERSION 2.6 FATAL_ERROR) project(VAST C CXX) -# Silence warning CMP0042. +# Silence warning CMP0042 if (APPLE AND NOT DEFINED CMAKE_MACOSX_RPATH) set(CMAKE_MACOSX_RPATH true) endif() @@ -10,39 +14,32 @@ set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) include(CTest) include(Helpers) include(MacDependencyPaths) -include(ConfigurePackaging) -# Prohibit in-source builds. +# Prohibit in-source builds if ("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") message(FATAL_ERROR "In-source builds are not allowed. Please use " "./configure to choose a build directory and " "initialize the build configuration.") endif () -# Support for 'make uninstall'. -if ("${PROJECT_SOURCE_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}") - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" - "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" - @ONLY) - add_custom_target(uninstall COMMAND - ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) -endif () - -# Reconfigure the project with 'make configure'. -add_custom_target(configure COMMAND ${CMAKE_CURRENT_BINARY_DIR}/config.status) - +# Keep make output sane set(CMAKE_VERBOSE_MAKEFILE false CACHE STRING "Show all outputs including compiler lines." FORCE) -file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" VERSION LIMIT_COUNT 1) -string(REPLACE "." " " version_numbers ${VERSION}) +# Extract VERSION +file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" VAST_VERSION LIMIT_COUNT 1) +string(REPLACE "." " " version_numbers ${VAST_VERSION}) separate_arguments(version_numbers) list(GET version_numbers 0 VERSION_MAJOR) list(GET version_numbers 1 VERSION_MINOR) set(VERSION_MAJ_MIN "${VERSION_MAJOR}.${VERSION_MINOR}") +#------------------------------------------------------------------------------ +# Compiler Setup +#------------------------------------------------------------------------------ + if (NOT CMAKE_CXX_FLAGS) - # -ftemplate-depth=256 ot make Boost Spirit happy. + # -ftemplate-depth=256 to make Boost Spirit happy set(EXTRA_FLAGS "-Wall -Wextra -pedantic -std=c++1y -ftemplate-depth=256") set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g") set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os") @@ -50,7 +47,7 @@ if (NOT CMAKE_CXX_FLAGS) set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g") endif() -# Perform compiler requirement checks. +# Requirement checks try_run(program_result compilation_succeeded "${CMAKE_BINARY_DIR}" @@ -109,6 +106,10 @@ if (NOT CMAKE_CXX_FLAGS) set(CMAKE_CXX_FLAGS ${EXTRA_FLAGS}) endif () +#------------------------------------------------------------------------------ +# Dependency Configuration +#------------------------------------------------------------------------------ + find_package(Threads) if (NOT Threads_FOUND) message(FATAL_ERROR "Could not find system threading libraries") @@ -165,6 +166,22 @@ endif () find_package(Doxygen QUIET) find_package(Md2man QUIET) +#------------------------------------------------------------------------------ +# Build Setup +#------------------------------------------------------------------------------ + +# make uninstall +if ("${PROJECT_SOURCE_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}") + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" + @ONLY) + add_custom_target(uninstall COMMAND + ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) +endif () + +# make configure +add_custom_target(configure COMMAND ${CMAKE_CURRENT_BINARY_DIR}/config.status) + include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}) include_directories(BEFORE ${CMAKE_SOURCE_DIR}/aux) @@ -179,7 +196,9 @@ add_subdirectory(doc) add_subdirectory(src) add_subdirectory(test) -ConfigurePackaging(${VERSION}) +#------------------------------------------------------------------------------ +# Build Summary +#------------------------------------------------------------------------------ macro(display test desc summary) if (${test}) @@ -189,8 +208,8 @@ macro(display test desc summary) endif() endmacro() -# Prettify build summary. display(SHOW_TIME_REPORT yes time_report_summary) + if (VAST_LOG_LEVEL EQUAL 0) set(log_level_summary quiet) elseif (VAST_LOG_LEVEL EQUAL 1) @@ -208,6 +227,7 @@ elseif (VAST_LOG_LEVEL EQUAL 6) else () message(FATAL "invalid log level") endif () + set(caf_dir ${CAF_LIBRARY_CORE}) get_filename_component(caf_dir ${caf_dir} PATH) if (EXISTS "${caf_dir}/../libcaf_core") @@ -215,6 +235,7 @@ if (EXISTS "${caf_dir}/../libcaf_core") else () set(caf_dir ${CAF_INCLUDE_DIR_CORE}) endif () + display(CAF_FOUND ${caf_dir} caf_summary) display(PCAP_FOUND ${PCAP_INCLUDE_DIR} pcap_summary) display(GPERFTOOLS_FOUND ${GPERFTOOLS_INCLUDE_DIR} perftools_summary) @@ -223,8 +244,6 @@ display(MD2MAN_FOUND yes md2man_summary) display(VAST_USE_TCMALLOC yes tcmalloc_summary) display(VAST_ENABLE_ASSERTIONS yes assertions_summary) display(ASAN_FOUND yes asan_summary) -# Display the right include directory based on wheter we pointed to a CAF build -# directory or to an install prefix. set(build_summary "\n====================| Build Summary |====================" diff --git a/cmake/ConfigurePackaging.cmake b/cmake/ConfigurePackaging.cmake deleted file mode 100644 index 3c7cce8ece8..00000000000 --- a/cmake/ConfigurePackaging.cmake +++ /dev/null @@ -1,237 +0,0 @@ -# A collection of macros to assist in configuring CMake/Cpack -# source and binary packaging - -# Sets CPack version variables by splitting the first macro argument -# using "." as a delimiter. If the length of the split list is -# greater than 2, all remaining elements are tacked on to the patch -# level version. Not that the version set by the macro is internal -# to binary packaging, the file name of our package will reflect the -# exact version number. -macro(SetPackageVersion _version) - string(REPLACE "." " " version_numbers ${_version}) - separate_arguments(version_numbers) - - list(GET version_numbers 0 CPACK_PACKAGE_VERSION_MAJOR) - list(REMOVE_AT version_numbers 0) - list(GET version_numbers 0 CPACK_PACKAGE_VERSION_MINOR) - list(REMOVE_AT version_numbers 0) - list(LENGTH version_numbers version_length) - - while (version_length GREATER 0) - list(GET version_numbers 0 patch_level) - if (CPACK_PACKAGE_VERSION_PATCH) - set(CPACK_PACKAGE_VERSION_PATCH - "${CPACK_PACKAGE_VERSION_PATCH}.${patch_level}") - else () - set(CPACK_PACKAGE_VERSION_PATCH ${patch_level}) - endif () - list(REMOVE_AT version_numbers 0) - list(LENGTH version_numbers version_length) - endwhile () - - if (APPLE) - # Mac PackageMaker package requires only numbers in the versioning - string(REGEX REPLACE "[_a-zA-Z-]" "" CPACK_PACKAGE_VERSION_MAJOR - ${CPACK_PACKAGE_VERSION_MAJOR}) - string(REGEX REPLACE "[_a-zA-Z-]" "" CPACK_PACKAGE_VERSION_MINOR - ${CPACK_PACKAGE_VERSION_MINOR}) - if (CPACK_PACKAGE_VERSION_PATCH) - string(REGEX REPLACE "[_a-zA-Z-]" "" CPACK_PACKAGE_VERSION_PATCH - ${CPACK_PACKAGE_VERSION_PATCH}) - endif () - endif () - - if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - # RPM version accepts letters, but not dashes. - string(REGEX REPLACE "[-]" "" CPACK_PACKAGE_VERSION_MAJOR - ${CPACK_PACKAGE_VERSION_MAJOR}) - string(REGEX REPLACE "[-]" "" CPACK_PACKAGE_VERSION_MINOR - ${CPACK_PACKAGE_VERSION_MINOR}) - if (CPACK_PACKAGE_VERSION_PATCH) - string(REGEX REPLACE "[-]" "" CPACK_PACKAGE_VERSION_PATCH - ${CPACK_PACKAGE_VERSION_PATCH}) - endif () - endif () - - # Minimum supported OS X version - set(CPACK_OSX_PACKAGE_VERSION 10.5) -endmacro(SetPackageVersion) - -# Sets the list of desired package types to be created by the make -# package target. A .tar.gz is only made for source packages, and -# binary pacakage format depends on the operating system: -# -# Darwin - PackageMaker -# Linux - RPM if the platform has rpmbuild installed -# DEB if the platform has dpkg-shlibdeps installed -# -# CPACK_GENERATOR is set by this macro -# CPACK_SOURCE_GENERATOR is set by this macro -macro(SetPackageGenerators) - set(CPACK_SOURCE_GENERATOR TGZ) - #set(CPACK_GENERATOR TGZ) - if (APPLE) - list(APPEND CPACK_GENERATOR PackageMaker) - elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - find_program(RPMBUILD_EXE rpmbuild) - find_program(DPKGSHLIB_EXE dpkg-shlibdeps) - if (RPMBUILD_EXE) - set(CPACK_GENERATOR ${CPACK_GENERATOR} RPM) - endif () - if (DPKGSHLIB_EXE) - set(CPACK_GENERATOR ${CPACK_GENERATOR} DEB) - set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS true) - endif () - endif () -endmacro(SetPackageGenerators) - -# Sets CPACK_PACKAGE_FILE_NAME in the following format: -# -# --- -# -# and CPACK_SOURCE_PACKAGE_FILE_NAME as: -# -# - -macro(SetPackageFileName _version) - if (PACKAGE_NAME_PREFIX) - set(CPACK_PACKAGE_FILE_NAME "${PACKAGE_NAME_PREFIX}-${_version}") - set(CPACK_SOURCE_PACKAGE_FILE_NAME "${PACKAGE_NAME_PREFIX}-${_version}") - else () - set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${_version}") - set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${_version}") - endif () - - set(CPACK_PACKAGE_FILE_NAME - "${CPACK_PACKAGE_FILE_NAME}-${CMAKE_SYSTEM_NAME}") - - if (APPLE) - # Only Intel-based Macs are supported. CMAKE_SYSTEM_PROCESSOR may - # return the confusing 'i386' if running a 32-bit kernel, but chances - # are the binary is x86_64 (or more generally 'Intel') compatible. - set(arch "Intel") - else () - set (arch ${CMAKE_SYSTEM_PROCESSOR}) - endif () - - set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}-${arch}") -endmacro(SetPackageFileName) - -# Sets up binary package metadata -macro(SetPackageMetadata) - set(CPACK_PACKAGE_VENDOR "International Computer Science Institute") - set(CPACK_PACKAGE_CONTACT "vallentin@icir.org") - set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "VAST") - - # CPack may enforce file name extensions for certain package generators - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/README.md - ${CMAKE_CURRENT_BINARY_DIR}/README.txt - COPYONLY) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/COPYING - ${CMAKE_CURRENT_BINARY_DIR}/COPYING.txt - COPYONLY) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/MAC_PACKAGE_INTRO - ${CMAKE_CURRENT_BINARY_DIR}/MAC_PACKAGE_INTRO.txt) - - set(CPACK_PACKAGE_DESCRIPTION_FILE ${CMAKE_CURRENT_BINARY_DIR}/README.txt) - set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_BINARY_DIR}/COPYING.txt) - set(CPACK_RESOURCE_FILE_README ${CMAKE_CURRENT_BINARY_DIR}/README.txt) - set(CPACK_RESOURCE_FILE_WELCOME - ${CMAKE_CURRENT_BINARY_DIR}/MAC_PACKAGE_INTRO.txt) - - set(CPACK_RPM_PACKAGE_LICENSE "BSD") -endmacro(SetPackageMetadata) - -# Sets pre and post install scripts for PackageMaker packages. -# The main functionality that such scripts offer is a way to make backups -# of "configuration" files that a user may have modified. -# Note that RPMs already have a robust mechanism for dealing with -# user-modified files, so we do not need this additional functionality -macro(SetPackageInstallScripts VERSION) - - if (INSTALLED_CONFIG_FILES) - # Remove duplicates from the list of installed config files - separate_arguments(INSTALLED_CONFIG_FILES) - list(REMOVE_DUPLICATES INSTALLED_CONFIG_FILES) - # Space delimit the list again - foreach (_file ${INSTALLED_CONFIG_FILES}) - set(_tmp "${_tmp} ${_file}") - endforeach () - set(INSTALLED_CONFIG_FILES "${_tmp}" CACHE STRING "" FORCE) - endif () - - if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - # DEB packages can automatically handle configuration files - # if provided in a "conffiles" file in the packaging - set(conffiles_file ${CMAKE_CURRENT_BINARY_DIR}/conffiles) - if (INSTALLED_CONFIG_FILES) - string(REPLACE " " ";" conffiles ${INSTALLED_CONFIG_FILES}) - endif () - file(WRITE ${conffiles_file} "") - foreach (_file ${conffiles}) - file(APPEND ${conffiles_file} "${_file}\n") - endforeach () - - list(APPEND CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA - ${CMAKE_CURRENT_BINARY_DIR}/conffiles) - - # RPMs don't need any explicit direction regarding config files. - - # Leaving the set of installed config files empty will just - # bypass the logic in the default pre/post install scripts and let - # the RPMs/DEBs do their own thing (regarding backups, etc.) - # when upgrading packages. - set(INSTALLED_CONFIG_FILES "") - endif () - - if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/cmake/package_preinstall.sh.in) - configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/package_preinstall.sh.in - ${CMAKE_CURRENT_BINARY_DIR}/package_preinstall.sh - @ONLY) - configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/package_preinstall.sh.in - ${CMAKE_CURRENT_BINARY_DIR}/preinst - @ONLY) - set(CPACK_PREFLIGHT_SCRIPT - ${CMAKE_CURRENT_BINARY_DIR}/package_preinstall.sh) - set(CPACK_RPM_PRE_INSTALL_SCRIPT_FILE - ${CMAKE_CURRENT_BINARY_DIR}/package_preinstall.sh) - list(APPEND CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA - ${CMAKE_CURRENT_BINARY_DIR}/preinst) - endif () - - if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/cmake/package_postupgrade.sh.in) - configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/package_postupgrade.sh.in - ${CMAKE_CURRENT_BINARY_DIR}/package_postupgrade.sh - @ONLY) - configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/package_postupgrade.sh.in - ${CMAKE_CURRENT_BINARY_DIR}/postinst - @ONLY) - set(CPACK_POSTUPGRADE_SCRIPT - ${CMAKE_CURRENT_BINARY_DIR}/package_postupgrade.sh) - set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE - ${CMAKE_CURRENT_BINARY_DIR}/package_postupgrade.sh) - list(APPEND CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA - ${CMAKE_CURRENT_BINARY_DIR}/postinst) - endif () -endmacro(SetPackageInstallScripts) - -# Main macro to configure all the packaging options -macro(ConfigurePackaging _version) - SetPackageVersion(${_version}) - SetPackageGenerators() - SetPackageFileName(${_version}) - SetPackageMetadata() - SetPackageInstallScripts(${_version}) - - set(CPACK_SET_DESTDIR true) - set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) - - # add default files/directories to ignore for source package - # user may specify others via configure script - list(APPEND CPACK_SOURCE_IGNORE_FILES ${CMAKE_BINARY_DIR} ".git") - - include(CPack) -endmacro(ConfigurePackaging)