2020-05-01 13:33:20 +00:00
# @author Lukas Heiligenbrunner
2020-05-01 10:33:51 +00:00
# main CMake file
#
2020-05-01 13:33:20 +00:00
# Build lib dependencies:
## libcurl (with sources)
## libconfig (with sources)
#
# documenation build needs doxygen to be installed.
2019-10-23 20:05:10 +00:00
cmake_minimum_required ( VERSION 3.13 )
2019-10-26 12:41:43 +00:00
project ( iprefresher DESCRIPTION "Dynu ip refresher" )
2019-05-01 09:14:52 +00:00
2020-05-01 14:47:22 +00:00
SET ( CMAKE_CXX_STANDARD 17 )
2019-05-01 09:14:52 +00:00
2020-05-01 14:47:22 +00:00
SET ( CMAKE_BUILD_TYPE Release ) # manually SET build type (Release / Debug)
SET ( LIB_METHOD STATIC ) #SHARED / STATIC
2020-05-02 12:59:56 +00:00
SET ( PROJECT_VERSION 1.3.2 )
2020-05-05 12:20:02 +00:00
option ( BUILD_DOC "Build documentation" OFF )
2020-05-04 19:17:10 +00:00
set ( WinBuild true )
2019-10-26 08:57:32 +00:00
2020-05-01 14:47:22 +00:00
SET ( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${ CMAKE_BINARY_DIR } /bin )
SET ( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${ CMAKE_BINARY_DIR } /bin )
SET ( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ CMAKE_BINARY_DIR } /bin )
2019-08-01 20:31:58 +00:00
2020-05-05 12:20:02 +00:00
# setup winbuild compilers
2020-05-04 19:17:10 +00:00
if ( ${ WinBuild } )
set ( LIBSUFFIX .dll )
set ( SUFFIX .exe )
set ( CMAKE_SYSTEM_NAME WindowsStore )
set ( CMAKE_SYSTEM_VERSION 10.0 )
set ( TOOLCHAIN_PREFIX x86_64-w64-mingw32 ) # x64 build toolchain
#set(TOOLCHAIN_PREFIX i686-w64-mingw32)
# cross compilers to use for C and C++
set ( CMAKE_C_COMPILER ${ TOOLCHAIN_PREFIX } -gcc )
set ( CMAKE_CXX_COMPILER ${ TOOLCHAIN_PREFIX } -g++ )
set ( CMAKE_RC_COMPILER ${ TOOLCHAIN_PREFIX } -windres )
# target environment on the build host system
set ( CMAKE_FIND_ROOT_PATH /usr/ ${ TOOLCHAIN_PREFIX } )
# modify default behavior of FIND_XXX() commands to
# search for headers/libs in the target environment and
# search for programs in the build host environment
set ( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
set ( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set ( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
set ( CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY )
2020-05-05 12:20:02 +00:00
set ( CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CSS_STANDARD_LIBRARIES}" )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}" )
# currently libs are dynamically linked eg. dlls have to be copied to same folder
# todo link dynamically.
# maybe so: set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++ -static")
# or set(CMAKE_CXX_STANDARD_LIBRARIES -lcurl -lpthread -static-libgcc -static-libstdc++ -lcrypto -lssl -lws2_32 -static -DCURL_STATICLIB)
# or add_definitions(-DCURL_STATICLIB)
2020-05-05 15:02:39 +00:00
# windows config path is same as executable
set ( CONFIG_PATH "./iprefresher.cfg" )
2020-05-04 19:17:10 +00:00
else ( )
set ( LIBSUFFIX .so )
set ( SUFFIX "" )
2020-05-05 15:02:39 +00:00
# set /etc/ config path
set ( CONFIG_PATH "/etc/iprefresher.cfg" )
2020-05-04 19:17:10 +00:00
endif ( )
2020-04-30 08:47:32 +00:00
# config libs
2019-10-27 13:14:03 +00:00
message ( STATUS "Config of Libraries" )
2020-04-30 08:47:32 +00:00
# libcurl
2020-05-04 19:17:10 +00:00
if ( ${ WinBuild } )
2020-05-05 12:20:02 +00:00
SET ( CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".dll" )
2020-05-04 19:17:10 +00:00
# configure libcurl
FIND_PATH ( CURL_INCLUDE_DIRS curl/curl.h /usr/ ${ TOOLCHAIN_PREFIX } /sys-root/mingw/include/ ) # search for libconfig include headers
2020-05-05 12:20:02 +00:00
FIND_LIBRARY ( CURL_LIBRARIES NAMES libcurl.dll.a HINTS /usr/ ${ TOOLCHAIN_PREFIX } /sys-root/mingw/lib ) # search for actual lib
2020-05-04 19:17:10 +00:00
2019-10-24 20:00:58 +00:00
message ( STATUS "Using CURL include dir(s): ${CURL_INCLUDE_DIRS}" )
message ( STATUS "Using CURL lib(s): ${CURL_LIBRARIES}" )
2020-05-05 15:02:39 +00:00
message ( STATUS "" )
2019-05-01 09:14:52 +00:00
2020-05-04 19:17:10 +00:00
include_directories ( ${ CURL_INCLUDE_DIRS } inc )
2020-04-29 18:06:27 +00:00
2020-05-04 19:17:10 +00:00
# configure libconfig
FIND_PATH ( LIBCONFIG++_INCLUDE_DIRS libconfig.h++ /usr/ ${ TOOLCHAIN_PREFIX } /sys-root/mingw/include/ ) # search for libconfig include headers
2020-05-05 12:20:02 +00:00
FIND_LIBRARY ( LIBCONFIG++_LIBRARIES NAMES libconfig++.dll.a HINTS /usr/ ${ TOOLCHAIN_PREFIX } /sys-root/mingw/lib ) # search for actual lib
2020-04-29 18:06:27 +00:00
2020-05-04 19:17:10 +00:00
message ( STATUS "Using LIBCONFIG++ include dir(s): ${LIBCONFIG++_INCLUDE_DIRS}" )
message ( STATUS "Using LIBCONFIG++ lib(s): ${LIBCONFIG++_LIBRARIES}" )
2020-04-30 08:47:32 +00:00
2020-05-04 19:17:10 +00:00
include_directories ( ${ LIBCONFIG++_INCLUDE_DIRS } inc )
else ( )
find_package ( CURL REQUIRED )
if ( CURL_INCLUDE_DIRS AND CURL_LIBRARIES )
message ( STATUS "Found CURL version: ${CURL_VERSION_STRING}" )
message ( STATUS "Using CURL include dir(s): ${CURL_INCLUDE_DIRS}" )
message ( STATUS "Using CURL lib(s): ${CURL_LIBRARIES}" )
else ( )
message ( FATAL_ERROR "Could not find CURL" )
endif ( )
include_directories ( ${ CURL_INCLUDE_DIR } inc )
message ( "" )
# libconfig
FIND_PACKAGE ( libconfig++ REQUIRED )
if ( LIBCONFIG++_INCLUDE_DIRS AND LIBCONFIG++_LIBRARY_DIRS )
message ( STATUS "Found libconfig version: ${LIBCONFIG++_VERSION}" )
message ( STATUS "Using libconfig include dir(s): ${LIBCONFIG++_INCLUDE_DIRS}" )
message ( STATUS "Using libconfig lib(s): ${LIBCONFIG++_LIBRARY_DIRS}" )
else ( )
message ( FATAL_ERROR "Could not find CURL" )
endif ( )
include_directories ( ${ LIBCONFIG++_INCLUDE_DIRS } inc )
endif ( )
2020-04-29 18:06:27 +00:00
message ( "" )
2020-05-01 14:56:37 +00:00
#read sample config
FILE ( READ ${ CMAKE_SOURCE_DIR } /config/iprefresher.cfg SAMPLECONFIG )
2019-10-26 12:41:43 +00:00
#add version header
FILE ( WRITE ${ CMAKE_SOURCE_DIR } /inc/Version.h
2020-05-01 14:56:37 +00:00
" \ #pragma once
#include <string>
n a m e s p a c e V e r s i o n {
c o n s t s t d : : s t r i n g V E R S I O N = \ " $ { P R O J E C T _ V E R S I O N } \ " ;
2020-05-05 15:02:39 +00:00
c o n s t s t d : : s t r i n g C o n f i g D i r = \ " $ { C O N F I G _ P A T H } \ " ;
2020-05-01 14:56:37 +00:00
c o n s t s t d : : s t r i n g S A M P L E C O N F I G = R \ " ( $ { S A M P L E C O N F I G } ) \ " ;
} "
2019-10-26 12:41:43 +00:00
)
2019-10-27 12:41:40 +00:00
add_library ( api ${ LIB_METHOD }
2019-05-08 17:19:42 +00:00
s r c / a p i / A P I . c p p
s r c / a p i / T e l e g r a m A P I . c p p
2019-06-18 09:23:24 +00:00
s r c / a p i / D y n u A P I . c p p
2020-05-01 14:56:37 +00:00
s r c / a p i / I P A P I . c p p )
2019-08-01 18:18:39 +00:00
2019-10-27 12:41:40 +00:00
add_library ( logger ${ LIB_METHOD }
2019-10-26 12:41:43 +00:00
s r c / F i l e L o g g e r . c p p
2020-05-01 14:56:37 +00:00
s r c / L o g g e r . c p p )
2019-08-01 18:18:39 +00:00
2020-05-01 14:47:22 +00:00
SET ( SOURCE
2019-08-01 18:18:39 +00:00
s r c / m a i n . c p p
2019-10-26 12:41:43 +00:00
s r c / I P R e f r e s h e r . c p p
2020-04-30 17:37:11 +00:00
s r c / C o n f i g . c p p )
2019-05-05 13:38:48 +00:00
2019-10-23 19:55:45 +00:00
add_executable ( iprefresher ${ SOURCE } )
2019-08-01 19:19:02 +00:00
# LINK generated LIBS #
2020-05-04 19:17:10 +00:00
target_link_libraries ( iprefresher api logger ${ CURL_LIBRARIES } ${ LIBCONFIG++_LIBRARIES } )
2019-05-01 09:14:52 +00:00
2020-05-05 12:20:02 +00:00
# General Packaging options:
message ( STATUS "config of Package build" )
set ( CPACK_PACKAGE_NAME "DynuIpRefresher" )
SET ( CPACK_PACKAGE_DESCRIPTION "IPrefresher to refresh Dynu ip address and notify user via Telegram" )
SET ( CPACK_PACKAGE_DESCRIPTION_SUMMARY "IPrefresher to refresh Dynu ip address and notify user via Telegram" )
SET ( CPACK_PACKAGE_VENDOR "Lukas Heilgienbrunner" )
SET ( CPACK_PACKAGE_VERSION "${PROJECT_VERSION}" )
SET ( CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${PROJECT_VERSION}" )
SET ( CPACK_PACKAGE_CONTACT "Lukas Heiligenbrunner <lukas.heiligenbrunner@gmail.com>" )
2020-05-01 14:47:22 +00:00
SET ( CMAKE_INSTALL_PREFIX "/" )
2020-05-05 12:20:02 +00:00
IF ( NOT ${ WinBuild } )
# INSTALL to Linux SYSTEM #
# install binaries
install ( TARGETS iprefresher DESTINATION usr/bin )
# install systemd service and enable it
install ( FILES service/iprefresher.service DESTINATION lib/systemd/system )
2019-10-23 07:24:35 +00:00
2020-05-05 15:02:39 +00:00
# generate post script for checking if configuration already exists
FILE ( WRITE ${ CMAKE_SOURCE_DIR } /postinst
" #!/bin/bash
i f [ ! - f $ { C O N F I G _ P A T H } ] ; t h e n
c a t > $ { C O N F I G _ P A T H } < < - E O M
$ { S A M P L E C O N F I G } E O M
f i \ n "
)
2019-10-23 07:24:35 +00:00
2019-10-25 10:24:19 +00:00
SET ( CPACK_DEB_COMPONENT_INSTALL 1 )
2019-10-26 08:57:32 +00:00
SET ( CPACK_OUTPUT_FILE_PREFIX packages )
2020-05-01 14:47:22 +00:00
SET ( CPACK_PACKAGING_INSTALL_PREFIX "/" ) # no prefix for package structure
2019-10-25 10:24:19 +00:00
2019-10-23 19:47:54 +00:00
FIND_PROGRAM ( RPMBUILD_EXECUTABLE rpmbuild )
2019-10-23 19:55:45 +00:00
FIND_PROGRAM ( DEB_EXECUTABLE dpkg )
2019-10-23 19:47:54 +00:00
2019-10-23 19:55:45 +00:00
SET ( CPACK_GENERATOR "TGZ;TBZ2" )
2019-10-23 19:47:54 +00:00
#check if rpm build is possible
2019-10-23 19:55:45 +00:00
if ( NOT ${ RPMBUILD_EXECUTABLE } STREQUAL "RPMBUILD_EXECUTABLE-NOTFOUND" )
2019-10-23 19:47:54 +00:00
message ( STATUS "found rpm build executeable --> able to build rpm" )
2020-05-01 14:47:22 +00:00
SET ( CPACK_GENERATOR "${CPACK_GENERATOR};RPM" )
2020-05-01 15:11:59 +00:00
SET ( CPACK_RPM_POST_INSTALL_SCRIPT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/postinst" )
2020-05-01 14:47:22 +00:00
SET ( CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/lib/systemd/system" "/lib/systemd" "/lib" "/usr/local/bin" "/usr/local" ) # --> needed to not override existing folders
2020-05-02 12:59:08 +00:00
set ( CPACK_RPM_PACKAGE_REQUIRES "libcurl,libconfig" )
2019-10-23 19:55:45 +00:00
else ( NOT ${ RPMBUILD_EXECUTABLE } STREQUAL "RPMBUILD_EXECUTABLE-NOTFOUND" )
message ( STATUS "not found rpm build tools --> not building rpm" )
endif ( NOT ${ RPMBUILD_EXECUTABLE } STREQUAL "RPMBUILD_EXECUTABLE-NOTFOUND" )
2019-10-23 19:47:54 +00:00
2019-10-23 19:55:45 +00:00
#check if deb build is possible
if ( NOT ${ DEB_EXECUTABLE } STREQUAL "DEB_EXECUTABLE-NOTFOUND" )
message ( STATUS "found deb build tools --> able to build deb" )
2020-05-02 12:59:08 +00:00
SET ( CPACK_GENERATOR "${CPACK_GENERATOR};DEB" ) # add deb generator
set ( CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_SOURCE_DIR}/postinst" ) # set post inst file
set ( CPACK_DEBIAN_PACKAGE_DEPENDS "libcurl4,libconfig++9v5" ) # add debian dependencies
2019-10-23 19:55:45 +00:00
else ( NOT ${ DEB_EXECUTABLE } STREQUAL "DEB_EXECUTABLE-NOTFOUND" )
message ( STATUS "not found deb build tools --> not building deb" )
endif ( NOT ${ DEB_EXECUTABLE } STREQUAL "DEB_EXECUTABLE-NOTFOUND" )
2019-10-23 19:47:54 +00:00
2019-10-23 07:24:35 +00:00
SET ( CPACK_CMAKE_GENERATOR "Unix Makefiles" )
SET ( CPACK_SOURCE_GENERATOR "TGZ;TBZ2" )
2019-10-23 19:47:54 +00:00
2019-10-23 07:24:35 +00:00
SET ( CPACK_PACKAGE_SECTION "games" )
2020-05-05 12:20:02 +00:00
ELSE ( )
2020-05-05 15:02:39 +00:00
# INSTALL to Windows SYSTEM #
# install binary to current folder
set_target_properties ( iprefresher PROPERTIES SUFFIX ".exe" )
install ( TARGETS iprefresher DESTINATION . )
# install .dll dependencies
# todo check if files exist...
install ( FILES /usr/ ${ TOOLCHAIN_PREFIX } /sys-root/mingw/bin/libcurl-4.dll
/ u s r / $ { T O O L C H A I N _ P R E F I X } / s y s - r o o t / m i n g w / b i n / l i b s s h 2 - 1 . d l l
/ u s r / $ { T O O L C H A I N _ P R E F I X } / s y s - r o o t / m i n g w / b i n / l i b s t d c + + - 6 . d l l
/ u s r / $ { T O O L C H A I N _ P R E F I X } / s y s - r o o t / m i n g w / b i n / l i b g c c _ s _ s e h - 1 . d l l
/ u s r / $ { T O O L C H A I N _ P R E F I X } / s y s - r o o t / m i n g w / b i n / l i b c r y p t o - 1 _ 1 - x 6 4 . d l l
/ u s r / $ { T O O L C H A I N _ P R E F I X } / s y s - r o o t / m i n g w / b i n / l i b s s l - 1 _ 1 - x 6 4 . d l l
/ u s r / $ { T O O L C H A I N _ P R E F I X } / s y s - r o o t / m i n g w / b i n / l i b w i n p t h r e a d - 1 . d l l
/ u s r / $ { T O O L C H A I N _ P R E F I X } / s y s - r o o t / m i n g w / b i n / z l i b 1 . d l l
/ u s r / $ { T O O L C H A I N _ P R E F I X } / s y s - r o o t / m i n g w / b i n / l i b i d n 2 - 0 . d l l
/ u s r / $ { T O O L C H A I N _ P R E F I X } / s y s - r o o t / m i n g w / b i n / l i b c o n f i g + + - 1 1 . d l l
D E S T I N A T I O N . )
2020-05-05 12:20:02 +00:00
# Pack a NSIS intaller
set ( CPACK_GENERATOR NSIS )
2020-05-05 15:02:39 +00:00
message ( STATUS "Using NSIS Package build." )
2020-05-05 12:20:02 +00:00
set ( CPACK_NSIS_testcomp_INSTALL_DIRECTORY / )
set ( CPACK_PACKAGE_INSTALL_DIRECTORY "DynuIpRefresher" )
SET ( CPACK_NSIS_MODIFY_PATH ON )
ENDIF ( )
INCLUDE ( CPack )
add_custom_target ( build-packages
" $ { C M A K E _ C O M M A N D } " - - b u i l d " $ { C M A K E _ B I N A R Y _ D I R } " - - t a r g e t p a c k a g e
D E P E N D S $ { P R O J E C T _ N A M E }
C O M M E N T " I n s t a l l i n g $ { P R O J E C T _ N A M E } " )
message ( "" )
2019-10-27 12:41:40 +00:00
# check if Doxygen is installed
2019-10-27 13:14:03 +00:00
if ( BUILD_DOC )
message ( STATUS "config of DOxygen build" )
find_package ( Doxygen )
if ( DOXYGEN_FOUND )
2020-05-01 14:47:22 +00:00
# SET input and output files
SET ( DOXYGEN_IN ${ CMAKE_CURRENT_SOURCE_DIR } /docs/Doxyfile.in )
SET ( DOXYGEN_OUT ${ CMAKE_CURRENT_BINARY_DIR } /Doxyfile )
2019-10-27 12:41:40 +00:00
# request to configure the file
configure_file ( ${ DOXYGEN_IN } ${ DOXYGEN_OUT } @ONLY )
# note the option ALL which allows to build the docs together with the application
add_custom_target ( doc_doxygen ALL
C O M M A N D $ { D O X Y G E N _ E X E C U T A B L E } $ { D O X Y G E N _ O U T }
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R }
C O M M E N T " G e n e r a t i n g A P I d o c u m e n t a t i o n w i t h D o x y g e n "
V E R B A T I M )
2019-10-27 13:14:03 +00:00
message ( STATUS "Successfully configured doxygen" )
else ( DOXYGEN_FOUND )
message ( STATUS "Doxygen need to be installed to generate the doxygen documentation" )
endif ( DOXYGEN_FOUND )
message ( "" )
2020-04-30 09:30:41 +00:00
endif ( BUILD_DOC )