347 lines
13 KiB
CMake
347 lines
13 KiB
CMake
##############################################################################
|
|
# SvxLink - A Multi Purpose Voice Services System for Ham Radio Use
|
|
# Copyright (C) 2003-2013 Tobias Blomberg / SM0SVX
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
##############################################################################
|
|
|
|
##############################################################################
|
|
# Project setup
|
|
##############################################################################
|
|
cmake_minimum_required(VERSION 2.8)
|
|
project(svxlink C CXX)
|
|
#enable_testing()
|
|
|
|
# The path to the project global include directory
|
|
set(PROJECT_INCLUDE_DIR ${PROJECT_BINARY_DIR}/include)
|
|
|
|
# Where to put library files
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
|
|
|
|
# Where to put executable files
|
|
set(RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
|
|
|
|
# Add project local CMake module directory
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules/")
|
|
|
|
# Optional parts
|
|
option(USE_QT "Build Qt applications and libs" ON)
|
|
option(BUILD_STATIC_LIBS "Build static libraries in addition to dynamic" OFF)
|
|
|
|
# The sample rate used internally in SvxLink
|
|
if(NOT DEFINED INTERNAL_SAMPLE_RATE)
|
|
set(INTERNAL_SAMPLE_RATE 16000)
|
|
endif(NOT DEFINED INTERNAL_SAMPLE_RATE)
|
|
add_definitions(-DINTERNAL_SAMPLE_RATE=${INTERNAL_SAMPLE_RATE})
|
|
|
|
# Set up include directories
|
|
include_directories(
|
|
${PROJECT_INCLUDE_DIR}
|
|
${CMAKE_BINARY_DIR}
|
|
)
|
|
|
|
# Warnings should be enabled for GCC. Also turning off the NDEBUG flag
|
|
# since that remove asserts.
|
|
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
|
|
set(CMAKE_C_FLAGS
|
|
"${CMAKE_C_FLAGS} -Wall -Wstrict-prototypes -Wpointer-arith")
|
|
set(CMAKE_C_FLAGS_RELEASE "-O3")
|
|
set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
|
|
|
|
set(CMAKE_CXX_FLAGS
|
|
"${CMAKE_CXX_FLAGS} -Wall -Wpointer-arith")
|
|
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
|
|
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
|
|
|
|
option(USE_GPROF "Enable profiling" OFF)
|
|
if(USE_GPROF)
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
|
|
endif(USE_GPROF)
|
|
endif()
|
|
|
|
# Set the default build type to Release
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
set(CMAKE_BUILD_TYPE "Release" CACHE STRING
|
|
"Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel."
|
|
FORCE)
|
|
endif(NOT CMAKE_BUILD_TYPE)
|
|
|
|
|
|
##############################################################################
|
|
# Install targets properties setup
|
|
##############################################################################
|
|
|
|
# Set up standard GNU installation directories
|
|
include(GNUInstallDirs)
|
|
|
|
# Where to install include files
|
|
if(NOT DEFINED INCLUDE_INSTALL_DIR)
|
|
#set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include)
|
|
set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_FULL_INCLUDEDIR})
|
|
endif(NOT DEFINED INCLUDE_INSTALL_DIR)
|
|
|
|
# Where to install libraries
|
|
if(NOT DEFINED LIB_INSTALL_DIR)
|
|
#set(LIB_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX})
|
|
set(LIB_INSTALL_DIR ${CMAKE_INSTALL_FULL_LIBDIR})
|
|
endif(NOT DEFINED LIB_INSTALL_DIR)
|
|
|
|
# The config directory (normally /etc)
|
|
if(NOT DEFINED SYSCONF_INSTALL_DIR)
|
|
#set(SYSCONF_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/etc)
|
|
set(SYSCONF_INSTALL_DIR ${CMAKE_INSTALL_FULL_SYSCONFDIR})
|
|
endif(NOT DEFINED SYSCONF_INSTALL_DIR)
|
|
|
|
# Architecture independent files directory (normally /usr/share)
|
|
if(NOT DEFINED SHARE_INSTALL_PREFIX)
|
|
#set(SHARE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}/share)
|
|
set(SHARE_INSTALL_PREFIX ${CMAKE_INSTALL_FULL_DATADIR})
|
|
endif(NOT DEFINED SHARE_INSTALL_PREFIX)
|
|
|
|
# Local state directory (normally /var)
|
|
if(NOT DEFINED LOCAL_STATE_DIR)
|
|
#set(LOCAL_STATE_DIR ${CMAKE_INSTALL_PREFIX}/var)
|
|
set(LOCAL_STATE_DIR ${CMAKE_INSTALL_FULL_LOCALSTATEDIR})
|
|
endif(NOT DEFINED LOCAL_STATE_DIR)
|
|
|
|
# Where to install executables
|
|
if(NOT DEFINED BIN_INSTALL_DIR)
|
|
#set(BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/bin)
|
|
set(BIN_INSTALL_DIR ${CMAKE_INSTALL_FULL_BINDIR})
|
|
endif(NOT DEFINED BIN_INSTALL_DIR)
|
|
|
|
# Where to install system executables
|
|
if(NOT DEFINED SBIN_INSTALL_DIR)
|
|
#set(BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/bin)
|
|
set(SBIN_INSTALL_DIR ${CMAKE_INSTALL_FULL_SBINDIR})
|
|
endif(NOT DEFINED SBIN_INSTALL_DIR)
|
|
|
|
# Where to install manual pages
|
|
if(NOT DEFINED MAN_INSTALL_DIR)
|
|
#set(MAN_INSTALL_DIR ${SHARE_INSTALL_PREFIX}/man)
|
|
set(MAN_INSTALL_DIR ${CMAKE_INSTALL_FULL_MANDIR})
|
|
endif(NOT DEFINED MAN_INSTALL_DIR)
|
|
|
|
# Where to install documentation
|
|
if(NOT DEFINED DOC_INSTALL_DIR)
|
|
#set(DOC_INSTALL_DIR ${SHARE_INSTALL_PREFIX}/doc/svxlink)
|
|
set(DOC_INSTALL_DIR ${CMAKE_INSTALL_FULL_DOCDIR})
|
|
endif(NOT DEFINED DOC_INSTALL_DIR)
|
|
|
|
# Where to install startup scripts
|
|
if(NOT DEFINED INIT_D_INSTALL_DIR)
|
|
set(INIT_D_INSTALL_DIR ${SYSCONF_INSTALL_DIR}/init.d)
|
|
endif(NOT DEFINED INIT_D_INSTALL_DIR)
|
|
|
|
# Where to install SvxLink config files
|
|
if(NOT DEFINED SVX_SYSCONF_INSTALL_DIR)
|
|
set(SVX_SYSCONF_INSTALL_DIR ${SYSCONF_INSTALL_DIR}/svxlink)
|
|
endif(NOT DEFINED SVX_SYSCONF_INSTALL_DIR)
|
|
|
|
# Where to install SvxLink spool files
|
|
if(NOT DEFINED SVX_SPOOL_INSTALL_DIR)
|
|
set(SVX_SPOOL_INSTALL_DIR ${LOCAL_STATE_DIR}/spool/svxlink)
|
|
endif(NOT DEFINED SVX_SPOOL_INSTALL_DIR)
|
|
|
|
# Where to install SvxLink architecture independent files
|
|
if(NOT DEFINED SVX_SHARE_INSTALL_DIR)
|
|
set(SVX_SHARE_INSTALL_DIR ${SHARE_INSTALL_PREFIX}/svxlink)
|
|
endif(NOT DEFINED SVX_SHARE_INSTALL_DIR)
|
|
|
|
# Where to install include files
|
|
if(NOT DEFINED SVX_INCLUDE_INSTALL_DIR)
|
|
set(SVX_INCLUDE_INSTALL_DIR ${INCLUDE_INSTALL_DIR}/svxlink)
|
|
endif(NOT DEFINED SVX_INCLUDE_INSTALL_DIR)
|
|
|
|
# Where to install SvxLink modules
|
|
if(NOT DEFINED SVX_MODULE_INSTALL_DIR)
|
|
set(SVX_MODULE_INSTALL_DIR ${LIB_INSTALL_DIR}/svxlink)
|
|
endif(NOT DEFINED SVX_MODULE_INSTALL_DIR)
|
|
|
|
# Clear global variables implemented using internal cache
|
|
set(CONFIG_FILES "" CACHE INTERNAL "CONFIG_FILES")
|
|
set(FILE_OWNER "" CACHE INTERNAL "FILE_OWNER")
|
|
|
|
##############################################################################
|
|
# Functions
|
|
##############################################################################
|
|
|
|
# Create an include file under the global include directory
|
|
function(expinc filename)
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${filename}
|
|
${PROJECT_INCLUDE_DIR}/${filename}
|
|
COPYONLY
|
|
)
|
|
endfunction(expinc)
|
|
|
|
# Create a post install target to change the owner of an installed file.
|
|
# If DO_INSTALL_CHOWN is set to YES, the owner will be changed during
|
|
# installation.
|
|
# If DO_INSTALL_CHOWN is unset, the DESTDIR environment variable will be
|
|
# examined. If it is set, no chown operations will be performed since we are
|
|
# probably not running as a user with administrative rights. If DESTDIR is
|
|
# unset, chown operations are performed.
|
|
function(install_chown filename owner)
|
|
if(owner)
|
|
set(FILE_OWNER "${FILE_OWNER}${owner} ${filename};"
|
|
CACHE INTERNAL "FILE_OWNER")
|
|
set(chown_commands "
|
|
set(CHOWN_TOOL ${CHOWN_TOOL})
|
|
if(NOT CHOWN_TOOL)
|
|
MESSAGE(FATAL_ERROR \"Unable to find the 'chown' utility\")
|
|
endif(NOT CHOWN_TOOL)
|
|
set(full_filename \"\$ENV{DESTDIR}${filename}\")
|
|
message(STATUS \"Setting owner of \${full_filename} to ${owner}...\")
|
|
execute_process(
|
|
COMMAND ${CHOWN_TOOL} ${owner} \"\${full_filename}\"
|
|
RESULT_VARIABLE cmd_result
|
|
)
|
|
if(NOT \${cmd_result} EQUAL 0)
|
|
MESSAGE(FATAL_ERROR
|
|
\"Error while changing owner of file \${full_filename}\"
|
|
)
|
|
endif(NOT \${cmd_result} EQUAL 0)
|
|
")
|
|
if(DEFINED DO_INSTALL_CHOWN)
|
|
if(DO_INSTALL_CHOWN)
|
|
install(CODE "${chown_commands}")
|
|
endif(DO_INSTALL_CHOWN)
|
|
else(DEFINED DO_INSTALL_CHOWN)
|
|
install(CODE "
|
|
if(\"\$ENV{DESTDIR}\" STREQUAL \"\")
|
|
${chown_commands}
|
|
endif(\"\$ENV{DESTDIR}\" STREQUAL \"\")
|
|
")
|
|
endif(DEFINED DO_INSTALL_CHOWN)
|
|
endif(owner)
|
|
endfunction(install_chown)
|
|
|
|
# Create the given directory during installation
|
|
# install_mkdir(directory [owner])
|
|
function(install_mkdir dir)
|
|
set(owner ${ARGV1})
|
|
get_filename_component(parent ${dir} PATH)
|
|
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}${dir})
|
|
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}${dir} DESTINATION ${parent})
|
|
install_chown(${dir} "${owner}")
|
|
endfunction(install_mkdir)
|
|
|
|
# Before installing the file, check if it exists. If it does, don't
|
|
# overwrite it.
|
|
# install_if_not_exists(source_file destination_directory)
|
|
function(install_if_not_exists src dest)
|
|
if(NOT IS_ABSOLUTE "${src}")
|
|
set(src "${CMAKE_CURRENT_SOURCE_DIR}/${src}")
|
|
endif()
|
|
get_filename_component(src_name "${src}" NAME)
|
|
if (NOT IS_ABSOLUTE "${dest}")
|
|
set(dest "${CMAKE_INSTALL_PREFIX}/${dest}")
|
|
endif()
|
|
set(CONFIG_FILES "${CONFIG_FILES}${dest}/${src_name} "
|
|
CACHE INTERNAL "CONFIG_FILES")
|
|
install(CODE "
|
|
if(NOT EXISTS \"\$ENV{DESTDIR}${dest}/${src_name}\")
|
|
#file(INSTALL \"${src}\" DESTINATION \"${dest}\")
|
|
message(STATUS \"Installing: \$ENV{DESTDIR}${dest}/${src_name}\")
|
|
execute_process(COMMAND \${CMAKE_COMMAND} -E copy \"${src}\"
|
|
\"\$ENV{DESTDIR}${dest}/${src_name}\"
|
|
RESULT_VARIABLE copy_result
|
|
ERROR_VARIABLE error_output)
|
|
if(copy_result)
|
|
message(FATAL_ERROR \${error_output})
|
|
endif()
|
|
else()
|
|
message(STATUS \"Skipping : \$ENV{DESTDIR}${dest}/${src_name}\")
|
|
endif()
|
|
")
|
|
endfunction(install_if_not_exists)
|
|
|
|
##############################################################################
|
|
# Main execution starts here
|
|
##############################################################################
|
|
|
|
configure_file(${CMAKE_SOURCE_DIR}/config.h.in
|
|
${CMAKE_BINARY_DIR}/config.h
|
|
@ONLY
|
|
)
|
|
|
|
# Find the Sigc++ library
|
|
find_package(SIGC2 REQUIRED)
|
|
include_directories(${SIGC2_INCLUDE_DIRS})
|
|
add_definitions(${SIGC2_DEFINITIONS})
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SIGC2_CXX_FLAGS}")
|
|
set(LIBS ${LIBS} ${SIGC2_LIBRARIES})
|
|
|
|
# Find the chown utility
|
|
include(FindCHOWN)
|
|
|
|
set(SVXLINK_USER "svxlink" CACHE STRING "Set SvxLink system user")
|
|
set(SVXLINK_GROUP "svxlink" CACHE STRING "Set SvxLink system group")
|
|
message(STATUS "SvxLink user = ${SVXLINK_USER}")
|
|
message(STATUS "SvxLink group = ${SVXLINK_GROUP}")
|
|
|
|
# Add directories to build
|
|
add_subdirectory(include)
|
|
add_subdirectory(async)
|
|
add_subdirectory(misc)
|
|
add_subdirectory(echolib)
|
|
add_subdirectory(locationinfo)
|
|
add_subdirectory(svxlink)
|
|
if(USE_QT)
|
|
add_subdirectory(qtel)
|
|
endif(USE_QT)
|
|
add_subdirectory(doc)
|
|
|
|
# Experimental CPack package building
|
|
set(CPACK_SET_DESTDIR "ON")
|
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
|
|
"Advanced voice services system for ham radio use")
|
|
execute_process(
|
|
COMMAND git describe --tags
|
|
COMMAND tr - .
|
|
COMMAND tr -d '\n'
|
|
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
|
OUTPUT_VARIABLE CPACK_PACKAGE_VERSION
|
|
ERROR_QUIET)
|
|
if (NOT CPACK_PACKAGE_VERSION)
|
|
set(CPACK_PACKAGE_VERSION "${VER_PROJECT}")
|
|
endif()
|
|
message(STATUS "Package Version = ${CPACK_PACKAGE_VERSION}")
|
|
set(CPACK_PACKAGE_DESCRIPTION
|
|
"The SvxLink project develops an advanced voice services system for ham radio use. It can be run on a simplex frequency or act as a repeater controller.")
|
|
set(CPACK_PACKAGE_VENDOR "SM0SVX")
|
|
set(CPACK_PACKAGE_CONTACT
|
|
"SvxLink Community <svxlink-devel@lists.sourceforge.net>")
|
|
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/../COPYRIGHT")
|
|
set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/../README.adoc")
|
|
|
|
#set(CPACK_GENERATOR "DEB")
|
|
if (CPACK_GENERATOR STREQUAL "DEB")
|
|
#set(CPACK_DEBIAN_PACKAGE_DEPENDS "libsigc++-2.0-0v5, libgsm1, libpopt0, tcl, libgcrypt20, libspeex1, libasound2, libopus0, alsa-utils, vorbis-tools, libcurl4, rtl-sdr, libjsoncpp1")
|
|
string(REPLACE " " "\n" CONFIG_FILES_NL "${CONFIG_FILES}")
|
|
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/conffiles" "${CONFIG_FILES_NL}")
|
|
foreach(file ${FILE_OWNER})
|
|
set(chown_file_commands "${chown_file_commands}${CHOWN_TOOL} ${file}\n")
|
|
endforeach()
|
|
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/postinst"
|
|
"getent group ${SVXLINK_GROUP} >/dev/null || groupadd -r ${SVXLINK_GROUP}\n"
|
|
"getent passwd ${SVXLINK_USER} >/dev/null || useradd -r -g ${SVXLINK_GROUP} ${SVXLINK_USER}\n"
|
|
"${chown_file_commands}")
|
|
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_BINARY_DIR}/conffiles;${CMAKE_CURRENT_BINARY_DIR}/postinst")
|
|
endif(CPACK_GENERATOR STREQUAL "DEB")
|
|
|
|
include(CPack)
|