diff --git a/CMakeLists.txt b/CMakeLists.txt index 0680c118d..bb2e2ea7e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,11 @@ option(ENABLE_RTLSDR "Enable the use of RTL dongles as signal source (experiment option(ENABLE_OPENCL "Enable building of processing blocks implemented with OpenCL (experimental)" OFF) option(ENABLE_GPERFTOOLS "Enable linking to Gperftools libraries (tcmalloc and profiler)" OFF) option(ENABLE_GENERIC_ARCH "Builds a portable binary" OFF) +option(ENABLE_PACKAGING "Enable software packaging" OFF) + +if(${ENABLE_PACKAGING}) + set(ENABLE_GENERIC_ARCH ON) +endif(${ENABLE_PACKAGING}) ############################### @@ -458,7 +463,7 @@ endif(NOT GFlags_FOUND) ################################################################################ find_package(GLOG) set(glog_RELEASE 0.3.3) -if (NOT GLOG_FOUND OR LOCAL_GFLAGS) +if (NOT GLOG_FOUND OR ${LOCAL_GFLAGS}) message (STATUS " glog library has not been found") if(NOT GFlags_FOUND) message(STATUS " or it is likely not linked to gflags.") @@ -473,6 +478,7 @@ if (NOT GLOG_FOUND OR LOCAL_GFLAGS) set(glog_MD5 "a6fd2c22f8996846e34c763422717c18") if(${LOCAL_GFLAGS}) + set(TARGET_GFLAGS ${gflags}) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/tmp/configure_with_gflags "#!/bin/sh @@ -501,7 +507,8 @@ export LIBS=${GFlags_SHARED_LIBS} endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") else(${LOCAL_GFLAGS}) - if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set(TARGET_GFLAGS gflags-${gflags_RELEASE}) + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/tmp/configure_with_gflags "#!/bin/sh export CPPFLAGS=-I${GFlags_INCLUDE_DIRS} @@ -515,36 +522,25 @@ export CXX=clang++ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE} FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) - else("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/tmp/configure_with_gflags + else("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/tmp/configure_with_gflags "#!/bin/sh export CPPFLAGS=-I${GFlags_INCLUDE_DIRS} export LDFLAGS=-L${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE}/.libs export LIBS=${GFlags_SHARED_LIBS} ../../thirdparty/glog/glog-${glog_RELEASE}/configure") - file(COPY ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/tmp/configure_with_gflags - DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE} - FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ - GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) - endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - else(LOCAL_GFLAGS) - file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/tmp/configure_with_gflags - "#!/bin/sh - export CPPFLAGS=-I${GFlags_INCLUDE_DIRS} - export LDFLAGS=-L${GFlags_LIBRARY_DIRS} - export LIBS=${GFlags_LIBS} - ../../thirdparty/glog/glog-${glog_RELEASE}/configure") - file(COPY ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/tmp/configure_with_gflags - DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE} - FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ + file(COPY ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/tmp/configure_with_gflags + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE} + FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) + endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") endif(${LOCAL_GFLAGS}) set(GLOG_CONFIGURE ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/configure_with_gflags) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") ExternalProject_Add( glog-${glog_RELEASE} - DEPENDS gflags-${gflags_RELEASE} + DEPENDS ${TARGET_GFLAGS} PREFIX ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE} SVN_REPOSITORY http://google-glog.googlecode.com/svn/trunk SVN_REVISION -r "142" @@ -560,7 +556,7 @@ export LIBS=${GFlags_SHARED_LIBS} else("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") ExternalProject_Add( glog-${glog_RELEASE} - DEPENDS gflags-${gflags_RELEASE} + DEPENDS ${TARGET_GFLAGS} PREFIX ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE} URL http://google-glog.googlecode.com/files/glog-${glog_RELEASE}.tar.gz DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/download/glog-${glog_RELEASE} @@ -583,10 +579,10 @@ export LIBS=${GFlags_SHARED_LIBS} ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/.libs/${CMAKE_FIND_LIBRARY_PREFIXES}glog.a ) set(LOCAL_GLOG true CACHE STRING "Glog downloaded and built automatically" FORCE) -else(NOT GLOG_FOUND OR LOCAL_GFLAGS) +else(NOT GLOG_FOUND OR ${LOCAL_GFLAGS}) add_library(glog-${glog_RELEASE} UNKNOWN IMPORTED) set_property(TARGET glog-${glog_RELEASE} PROPERTY IMPORTED_LOCATION "${GLOG_LIBRARIES}") -endif(NOT GLOG_FOUND OR LOCAL_GFLAGS) +endif(NOT GLOG_FOUND OR ${LOCAL_GFLAGS}) @@ -1044,4 +1040,8 @@ add_custom_target(uninstall ######################################################################## add_subdirectory(src) -include(GnssSdrPackaging) +if(${ENABLE_PACKAGING}) + include(GnssSdrPackaging) +endif(${ENABLE_PACKAGING}) + + diff --git a/cmake/Modules/FindGFlags.cmake b/cmake/Modules/FindGFlags.cmake index 0c29bf55d..76d937df6 100644 --- a/cmake/Modules/FindGFlags.cmake +++ b/cmake/Modules/FindGFlags.cmake @@ -8,8 +8,17 @@ # GFlags_INCLUDE_DIRS # GFlags_LIBS # GFlags_LIBRARY_DIRS + +# - Try to find GFlags +# +# +# The following are set after configuration is done: +# GFlags_FOUND +# GFlags_INCLUDE_DIRS +# GFlags_LIBS +# GFlags_LIBRARY_DIRS cmake_minimum_required(VERSION 2.6) -cmake_policy(SET CMP0011 OLD) +#cmake_policy(SET CMP0011 OLD) set(GFlags_ROOT_DIR) if (WIN32) @@ -17,14 +26,15 @@ if (WIN32) src/gflags.cc HINTS $ENV{GFLAGS_ROOT}) -else (WIN32) +endif (WIN32) +if (APPLE) FIND_PATH(GFlags_ROOT_DIR libgflags.dylib HINTS /opt/local/lib /usr/local/lib ) -endif (WIN32) +endif (APPLE) if (UNIX) FIND_PATH(GFlags_ROOT_DIR @@ -91,6 +101,7 @@ IF(GFlags_ROOT_DIR) ELSE(GFlags_ROOT_DIR) FIND_PATH(GFlags_ROOT_DIR src) MARK_AS_ADVANCED(GFlags_ROOT_DIR) - MESSAGE(STATUS "Cannot find Root directory of gflags") + MESSAGE(STATUS "Cannot find gflags") SET(GFlags_FOUND false) ENDIF(GFlags_ROOT_DIR) + diff --git a/cmake/Modules/GnssSdrPackaging.cmake b/cmake/Modules/GnssSdrPackaging.cmake index 495e40f29..f5dbf7501 100644 --- a/cmake/Modules/GnssSdrPackaging.cmake +++ b/cmake/Modules/GnssSdrPackaging.cmake @@ -27,17 +27,25 @@ set( __INCLUDED_GNSS_SDR_PACKAGE_CMAKE TRUE) if(CPACK_GENERATOR) #already set by user elseif(APPLE) - set(CPACK_GENERATOR PackageMaker) -elseif(WIN32) - set(CPACK_GENERATOR NSIS) -elseif(DEBIAN) - set(CPACK_GENERATOR DEB) -elseif(REDHAT) - set(CPACK_GENERATOR RPM) + set(PACKAGE_GENERATOR "TGZ") + set(PACKAGE_SOURCE_GENERATOR "TGZ;ZIP") +elseif(UNIX) + if(${LINUX_DISTRIBUTION} MATCHES "Debian" OR ${LINUX_DISTRIBUTION} MATCHES "Ubuntu") + set (PACKAGE_GENERATOR "DEB") + endif(${LINUX_DISTRIBUTION} MATCHES "Debian" OR ${LINUX_DISTRIBUTION} MATCHES "Ubuntu") + if(${LINUX_DISTRIBUTION} MATCHES "Red Hat" OR +${LINUX_DISTRIBUTION} MATCHES "Fedora") + set (PACKAGE_GENERATOR "DEB") + endif(${LINUX_DISTRIBUTION} MATCHES "Red Hat" OR ${LINUX_DISTRIBUTION} MATCHES "Fedora") + set (PACKAGE_SOURCE_GENERATOR "TGZ;ZIP") else() - set(CPACK_GENERATOR TGZ) + set(PACKAGE_GENERATOR "TGZ") + set(PACKAGE_SOURCE_GENERATOR "TGZ") endif() +# used package generators +set (CPACK_GENERATOR "${PACKAGE_GENERATOR}" CACHE STRING "List of binary package generators (CPack).") +set (CPACK_SOURCE_GENERATOR "${PACKAGE_SOURCE_GENERATOR}" CACHE STRING "List of source package generators (CPack).") ######################################################################## @@ -45,6 +53,8 @@ endif() ######################################################################## set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "GNSS-SDR - An Open Source GNSS Software Defined Receiver") set(CPACK_PACKAGE_VENDOR "Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)") +set(CPACK_PACKAGE_NAME "gnss-sdr") +set(CPACK_PACKAGE_VERSION "${VERSION}") set(CPACK_PACKAGE_CONTACT "Carles Fernandez-Prades ") set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/docs/doxygen/images/gnss-sdr_logo_round.png") set(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_INFO_MAJOR_VERSION}") @@ -53,7 +63,8 @@ set(CPACK_PACKAGE_VERSION_PATCH "${VERSION_INFO_MINOR_VERSION}") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING") set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md") set(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_SOURCE_DIR}/README.md") -set(CPACK_SOURCE_GENERATOR "TGZ;TZ") + +# Debian-specific settings set(CPACK_DEBIAN_PACKAGE_SECTION "Science") set(CPACK_DEBIAN_PACKAGE_DEPENDS "libboost-dev (>= 1.45), libstdc++6 (>= 4.7), @@ -66,29 +77,169 @@ set(CPACK_DEBIAN_PACKAGE_DEPENDS "libboost-dev (>= 1.45), libssl-dev (>= 1.0), libgflags-dev (>= 2.0) ") -#find_program(LSB_RELEASE_EXECUTABLE lsb_release) -#if((DEBIAN OR REDHAT) AND LSB_RELEASE_EXECUTABLE) - #extract system information by executing the commands -# execute_process( -# COMMAND ${LSB_RELEASE_EXECUTABLE} --short --id -# OUTPUT_VARIABLE LSB_ID OUTPUT_STRIP_TRAILING_WHITESPACE -# ) - -# execute_process( -# COMMAND ${LSB_RELEASE_EXECUTABLE} --short --release -# OUTPUT_VARIABLE LSB_RELEASE OUTPUT_STRIP_TRAILING_WHITESPACE -# ) - - #set a more sensible package name for this system -# SET(CPACK_PACKAGE_FILE_NAME "gnss-sdr_${CPACK_PACKAGE_VERSION}_${LSB_ID}-${LSB_RELEASE}-${CMAKE_SYSTEM_PROCESSOR}") - - #now try to include the component based dependencies -# set(package_deps_file "${CMAKE_SOURCE_DIR}/cmake/Packaging/${LSB_ID}-${LSB_RELEASE}.cmake") -# if (EXISTS ${package_deps_file}) -# include(${package_deps_file}) -# endif() -#endif() +# system/architecture +if (APPLE) + set (CPACK_PACKAGE_ARCHITECTURE darwin) +else(APPLE) + string (TOLOWER "${CMAKE_SYSTEM_NAME}" CPACK_SYSTEM_NAME) + if(CMAKE_CXX_FLAGS MATCHES "-m32") + set (CPACK_PACKAGE_ARCHITECTURE i386) + else(CMAKE_CXX_FLAGS MATCHES "-m32") + execute_process ( + COMMAND dpkg --print-architecture + RESULT_VARIABLE RV + OUTPUT_VARIABLE CPACK_PACKAGE_ARCHITECTURE + ) + if(RV EQUAL 0) + string (STRIP "${CPACK_PACKAGE_ARCHITECTURE}" CPACK_PACKAGE_ARCHITECTURE) + else(RV EQUAL 0) + execute_process (COMMAND uname -m OUTPUT_VARIABLE CPACK_PACKAGE_ARCHITECTURE) + if(CPACK_PACKAGE_ARCHITECTURE MATCHES "x86_64") + set (CPACK_PACKAGE_ARCHITECTURE amd64) + endif(CPACK_PACKAGE_ARCHITECTURE MATCHES "x86_64") + if(CPACK_PACKAGE_ARCHITECTURE MATCHES "i386") + set (CPACK_PACKAGE_ARCHITECTURE i386) + endif(CPACK_PACKAGE_ARCHITECTURE MATCHES "i386") + endif(RV EQUAL 0) + endif(CMAKE_CXX_FLAGS MATCHES "-m32") +endif(APPLE) -include(CPack) \ No newline at end of file +if(NOT CPACK_PACKAGE_ARCHITECTURE) +# Code from https://qt.gitorious.org/qt/qtbase/source/src/corelib/global/qprocessordetection.h +set(archdetect_c_code " +#if defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM) || defined(__arm64__) + #if defined(__arm64__) + #error cmake_ARCH arm64 + #endif + + #if defined(__arm__) || defined(__TARGET_ARCH_ARM) + #if defined(__ARM_ARCH_8__) \\ + || defined(__ARM_ARCH_8A__) \\ + || defined(__ARM_ARCH_8R__) \\ + || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 8) + #error cmake_ARCH armv8 + #elif defined(__ARM_ARCH_7__) \\ + || defined(__ARM_ARCH_7A__) \\ + || defined(__ARM_ARCH_7R__) \\ + || defined(__ARM_ARCH_7M__) \\ + || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 7) + #error cmake_ARCH armv7 + #elif defined(__ARM_ARCH_6__) \\ + || defined(__ARM_ARCH_6J__) \\ + || defined(__ARM_ARCH_6T2__) \\ + || defined(__ARM_ARCH_6Z__) \\ + || defined(__ARM_ARCH_6K__) \\ + || defined(__ARM_ARCH_6ZK__) \\ + || defined(__ARM_ARCH_6M__) \\ + || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 6) + #error cmake_ARCH armv6 + #elif defined(__ARM_ARCH_5TEJ__) \\ + || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 5) + #error cmake_ARCH armv5 + #else + #error cmake_ARCH arm + #endif +#elif defined(__i386) || defined(__i386__) || defined(_M_IX86) + #error cmake_ARCH i386 +#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64) + #error cmake_ARCH x86_64 +#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64) + #error cmake_ARCH ia64 +#elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \\ + || defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \\ + || defined(_M_MPPC) || defined(_M_PPC) + #if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__) + #error cmake_ARCH ppc64 + #else + #error cmake_ARCH ppc + #endif +#endif +#error cmake_ARCH unknown +") + + + +function(target_architecture output_var) + if(APPLE AND CMAKE_OSX_ARCHITECTURES) + # On OS X we use CMAKE_OSX_ARCHITECTURES *if* it was set + # On OS X 10.6+ the default is x86_64 if the CPU supports it, i386 otherwise. + foreach(osx_arch ${CMAKE_OSX_ARCHITECTURES}) + if("${osx_arch}" STREQUAL "i386") + set(osx_arch_i386 TRUE) + elseif("${osx_arch}" STREQUAL "x86_64") + set(osx_arch_x86_64 TRUE) + else() + message(FATAL_ERROR "Invalid OS X arch name: ${osx_arch}") + endif() + endforeach() + # Now add all the architectures in our normalized order + if(osx_arch_i386) + list(APPEND ARCH i386) + endif() + if(osx_arch_x86_64) + list(APPEND ARCH x86_64) + endif() + else() + file(WRITE "${CMAKE_BINARY_DIR}/arch.c" "${archdetect_c_code}") + enable_language(C) + # Detect the architecture in a rather creative way... + # This compiles a small C program which is a series of ifdefs that selects a + # particular #error preprocessor directive whose message string contains the + # target architecture. The program will always fail to compile (both because + # file is not a valid C program, and obviously because of the presence of the + # #error preprocessor directives... but by exploiting the preprocessor in this + # way, we can detect the correct target architecture even when cross-compiling, + # since the program itself never needs to be run (only the compiler/preprocessor) + try_run( + run_result_unused + compile_result_unused + "${CMAKE_BINARY_DIR}" + "${CMAKE_BINARY_DIR}/arch.c" + COMPILE_OUTPUT_VARIABLE ARCH + CMAKE_FLAGS CMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} + ) + # Parse the architecture name from the compiler output + string(REGEX MATCH "cmake_ARCH ([a-zA-Z0-9_]+)" ARCH "${ARCH}") + # Get rid of the value marker leaving just the architecture name + string(REPLACE "cmake_ARCH " "" ARCH "${ARCH}") + # If we are compiling with an unknown architecture this variable should + # already be set to "unknown" but in the case that it's empty (i.e. due + # to a typo in the code), then set it to unknown + if (NOT ARCH) + set(ARCH unknown) + endif() + endif() +set(${output_var} "${ARCH}" PARENT_SCOPE) +endfunction() + +# Set target architectures +target_architecture(CMAKE_TARGET_ARCHITECTURES) +endif(NOT CPACK_PACKAGE_ARCHITECTURE) + +if(APPLE) +list(LENGTH CMAKE_TARGET_ARCHITECTURES cmake_target_arch_len) + if(NOT "${cmake_target_arch_len}" STREQUAL "1") + set(CMAKE_TARGET_ARCHITECTURE_UNIVERSAL TRUE) + set(CMAKE_TARGET_ARCHITECTURE_CODE "universal") + else() + set(CMAKE_TARGET_ARCHITECTURE_UNIVERSAL FALSE) + set(CMAKE_TARGET_ARCHITECTURE_CODE "${CMAKE_TARGET_ARCHITECTURES}") + endif() +endif(APPLE) + +# source package settings +#set (CPACK_SOURCE_TOPLEVEL_TAG "source") +set (CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}") +set (CPACK_SOURCE_IGNORE_FILES "/\\\\.git/;\\\\.swp$;\\\\.#;/#;\\\\.*~;cscope\\\\.*;/[Bb]uild[.+-_a-zA-Z0-9]*/") + +# default binary package settings +set (CPACK_INCLUDE_TOPLEVEL_DIRECTORY TRUE) +set (CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}") +if (CPACK_PACKAGE_ARCHITECTURE) + set (CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}_${CPACK_PACKAGE_ARCHITECTURE}") +endif () + + +include(CPack)