478 lines
14 KiB
CMake
478 lines
14 KiB
CMake
#
|
|
# Copyright (C) 2021 Saturneric
|
|
#
|
|
# This file is part of GpgFrontend.
|
|
#
|
|
# GpgFrontend 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 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>.
|
|
#
|
|
# The initial version of the source code is inherited from
|
|
# the gpg4usb project, which is under GPL-3.0-or-later.
|
|
#
|
|
# All the source code of GpgFrontend was modified and released by
|
|
# Saturneric<eric@bktus.com> starting on May 12, 2021.
|
|
#
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
cmake_minimum_required(VERSION 3.16)
|
|
|
|
# define project
|
|
project(GpgFrontend VERSION 2.0.8 LANGUAGES CXX)
|
|
|
|
# show cmake version
|
|
message(STATUS "GpgFrontend Build Configuration Started CMAKE Version ${CMAKE_VERSION}")
|
|
|
|
INCLUDE(CheckIncludeFiles)
|
|
INCLUDE(CheckIncludeFileCXX)
|
|
INCLUDE(CheckFunctionExists)
|
|
INCLUDE(CheckSymbolExists)
|
|
INCLUDE(CheckTypeSize)
|
|
INCLUDE(CheckLibraryExists)
|
|
INCLUDE(CheckCXXSourceCompiles)
|
|
|
|
# generate compile_commands.json
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
|
|
# options
|
|
option(GPGFRONTEND_BUILD_TYPE_TEST_CORE
|
|
"Only compile the core and generate the unit test program" OFF)
|
|
option(GPGFRONTEND_BUILD_TYPE_TEST_CORE_AND_COVERAGE
|
|
"Compile only the core and generate unit test programs that can evaluate test coverage" OFF)
|
|
option(GPGFRONTEND_BUILD_TYPE_TEST_UI
|
|
"Only generate a graphical interface with basic functions" OFF)
|
|
option(GPGFRONTEND_BUILD_TYPE_TEST_ALL
|
|
"Generate a graphical interface with all functions" OFF)
|
|
option(GPGFRONTEND_BUILD_TYPE_STABLE
|
|
"Generate release version" ON)
|
|
option(GPGFRONTEND_GENERATE_LINUX_INSTALL_SOFTWARE "Generate an installable version" OFF)
|
|
option(GPGFRONTEND_GENERATE_APP_PACKAGE_DEB "Generate DEB package" OFF)
|
|
option(GPGFRONTEND_CONFIGURE_FOR_XCODE_BUILD "Generate a version that can be successfully compiled and packaged in Xcode" OFF)
|
|
option(GPGFRONTEND_XCODE_TEAM_ID "GpgFrontend Apple Team ID" "NONE")
|
|
option(GPGFRONTEND_XOCDE_CODE_SIGN_IDENTITY "GpgFrontend Signing Certificate" "NONE")
|
|
option(GPGFRONTEND_XOCDE_APPID "GpgFrontend Apple AppID" "NONE")
|
|
option(GPGFRONTEND_XOCDE_PROVISIONING_PROFILE_UUID "GpgFrontend ProvisioningProfile UUID" "NONE")
|
|
|
|
# analyse options
|
|
if (GPGFRONTEND_BUILD_TYPE_TEST_CORE)
|
|
set(CMAKE_BUILD_TYPE "Debug")
|
|
set(GPGFRONTEND_BUILD_CONFIG "test_core")
|
|
endif ()
|
|
|
|
if (GPGFRONTEND_BUILD_TYPE_TEST_CORE_AND_COVERAGE)
|
|
set(CMAKE_BUILD_TYPE "Debug")
|
|
set(GPGFRONTEND_BUILD_CONFIG "test_core_coverage")
|
|
endif ()
|
|
|
|
if (GPGFRONTEND_BUILD_TYPE_TEST_UI)
|
|
set(CMAKE_BUILD_TYPE "Debug")
|
|
set(GPGFRONTEND_BUILD_CONFIG "test_ui")
|
|
endif ()
|
|
|
|
if (GPGFRONTEND_BUILD_TYPE_TEST_ALL)
|
|
set(CMAKE_BUILD_TYPE "Debug")
|
|
set(GPGFRONTEND_BUILD_CONFIG "test_all")
|
|
endif ()
|
|
|
|
# stable features
|
|
if (GPGFRONTEND_BUILD_TYPE_STABLE)
|
|
|
|
set(GPGFRONTEND_BUILD_TYPE_TEST_CORE 0)
|
|
set(GPGFRONTEND_BUILD_TYPE_TEST_CORE_AND_COVERAGE 0)
|
|
set(GPGFRONTEND_BUILD_TYPE_TEST_UI 0)
|
|
set(GPGFRONTEND_BUILD_TYPE_TEST_ALL 0)
|
|
unset(GPGFRONTEND_BUILD_CONFIG)
|
|
|
|
set(STABLE_APPLICATION_BUILD 1)
|
|
endif ()
|
|
|
|
# linux package build
|
|
if (GPGFRONTEND_GENERATE_LINUX_INSTALL_SOFTWARE)
|
|
|
|
set(GPGFRONTEND_BUILD_TYPE_TEST_CORE 0)
|
|
set(GPGFRONTEND_BUILD_TYPE_TEST_CORE_AND_COVERAGE 0)
|
|
set(GPGFRONTEND_BUILD_TYPE_TEST_UI 0)
|
|
set(GPGFRONTEND_BUILD_TYPE_TEST_ALL 0)
|
|
unset(GPGFRONTEND_BUILD_CONFIG)
|
|
|
|
set(LINUX_INSTALL_SOFTWARE 1)
|
|
set(GPGFRONTEND_GENERATE_APP_PACKAGE_DEB 1)
|
|
endif ()
|
|
|
|
# linux package build
|
|
if (GPGFRONTEND_GENERATE_LINUX_INSTALL_SOFTWARE AND GPGFRONTEND_GENERATE_APP_PACKAGE_DEB)
|
|
set(APP_PACKAGE_DEB 1)
|
|
endif ()
|
|
|
|
# xcode archive build
|
|
if (GPGFRONTEND_CONFIGURE_FOR_XCODE_BUILD)
|
|
set(GPGFRONTEND_GENERATE_LINUX_INSTALL_SOFTWARE 0)
|
|
set(GPGFRONTEND_GENERATE_APP_PACKAGE_DEB 0)
|
|
set(LINUX_INSTALL_SOFTWARE 0)
|
|
set(APP_PACKAGE_DEB 0)
|
|
set(XCODE_BUILD 1)
|
|
|
|
set(GPGFRONTEND_BUILD_TYPE_TEST_CORE 0)
|
|
set(GPGFRONTEND_BUILD_TYPE_TEST_CORE_AND_COVERAGE 0)
|
|
set(GPGFRONTEND_BUILD_TYPE_TEST_UI 0)
|
|
set(GPGFRONTEND_BUILD_TYPE_TEST_ALL 0)
|
|
|
|
unset(GPGFRONTEND_BUILD_CONFIG)
|
|
set(STABLE_APPLICATION_BUILD 1)
|
|
endif ()
|
|
|
|
# C++
|
|
|
|
# options for ccache
|
|
find_program(CCACHE_FOUND ccache)
|
|
if(CCACHE_FOUND)
|
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
|
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
|
|
endif(CCACHE_FOUND)
|
|
|
|
# detect compiler
|
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
|
# using clang
|
|
message(STATUS "Using Compiler clang")
|
|
message(STATUS "clang version ${CMAKE_CXX_COMPILER_VERSION}")
|
|
set(USING_COMPILER_CLANG 1)
|
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|
# using gcc
|
|
message(STATUS "Using Compiler gcc")
|
|
message(STATUS "gcc version ${CMAKE_CXX_COMPILER_VERSION}")
|
|
set(USING_COMPILER_GCC 1)
|
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
|
|
# using Intel C++
|
|
message(STATUS "Using Compiler Intel")
|
|
message(WARNING "Compilation with this compiler is untested, which may create some problems that need to be solved by the user.")
|
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
|
|
# using Visual Studio C++
|
|
message(STATUS "Using Compiler MSVC")
|
|
message(WARNING "Compilation with this compiler is untested, which may create some problems that need to be solved by the user.")
|
|
endif ()
|
|
|
|
# Using Standard C++-17 (Consider compatibility)
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|
|
|
# CMake
|
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
|
|
# Check Env Variables Before Configuring
|
|
|
|
if (NOT CMAKE_BUILD_TYPE)
|
|
set(CMAKE_BUILD_TYPE "Release")
|
|
endif ()
|
|
|
|
# Specify different compilation modes
|
|
if (GPGFRONTEND_BUILD_CONFIG)
|
|
# Test Build
|
|
if (${GPGFRONTEND_BUILD_CONFIG} STREQUAL "test_core")
|
|
message(STATUS "Switch Build Configure TEST_CORE_BUILD")
|
|
set(TEST_CORE_BUILD 1)
|
|
set(AppName GpgFrontendCoreTest)
|
|
# Test Build With Coverage Test
|
|
elseif (${GPGFRONTEND_BUILD_CONFIG} STREQUAL "test_core_coverage")
|
|
message(STATUS "Switch Build Configure TEST_COVERAGE_BUILD")
|
|
set(TEST_CORE_BUILD 1)
|
|
if (USING_COMPILER_CLANG OR USING_COMPILER_GCC)
|
|
set(TEST_COVERAGE_BUILD 1)
|
|
set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE 1)
|
|
else ()
|
|
message(WARNING "Branch testing is disabled")
|
|
message(WARNING "Please use gcc or clang for branch coverage test.")
|
|
endif ()
|
|
set(AppName GpgFrontendTest)
|
|
# Test Build with minimum UI
|
|
elseif (${GPGFRONTEND_BUILD_CONFIG} STREQUAL "test_ui")
|
|
message(STATUS "Switch Build Configure TEST_MINIMUM_UI_BUILD")
|
|
set(MINIMUM_APPLICATION_BUILD 1)
|
|
set(AppName GpgFrontend)
|
|
elseif (${GPGFRONTEND_BUILD_CONFIG} STREQUAL "test_all")
|
|
message(STATUS "Switch Build Configure FULL_APPLICATION_BUILD")
|
|
set(FULL_APPLICATION_BUILD 1)
|
|
set(AppName GpgFrontend)
|
|
endif ()
|
|
else ()
|
|
message(STATUS "Switch Build Configure STABLE_APPLICATION_BUILD")
|
|
set(STABLE_APPLICATION_BUILD 1)
|
|
set(AppName GpgFrontend)
|
|
endif ()
|
|
|
|
# Output Env Variables
|
|
message(STATUS "Define CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE}")
|
|
|
|
if (${CMAKE_BUILD_TYPE} STREQUAL "Release")
|
|
set(BUILD_FLAG 0)
|
|
ADD_DEFINITIONS(-DRELEASE)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
|
|
# Release Version force to build using option STABLE_APPLICATION_BUILD
|
|
set(FULL_APPLICATION_BUILD 0)
|
|
set(STABLE_APPLICATION_BUILD 1)
|
|
else ()
|
|
set(BUILD_FLAG 1)
|
|
ADD_DEFINITIONS(-DDEBUG)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
|
|
# Generate branch coverage information using gcc
|
|
if (TEST_COVERAGE_BUILD)
|
|
if (USING_COMPILER_GCC)
|
|
message(STATUS "Set branch coverage test parameters for Gcc")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
|
|
elseif (USING_COMPILER_CLANG)
|
|
message(STATUS "Set branch coverage test parameters for Clang")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-instr-generate -fcoverage-mapping")
|
|
endif ()
|
|
endif ()
|
|
endif ()
|
|
|
|
message(STATUS "Build Flags " ${CMAKE_CXX_FLAGS})
|
|
|
|
# Get Git Information
|
|
|
|
set(GIT_COMMIT_HASH "")
|
|
set(GIT_BRANCH_NAME "")
|
|
find_package(Git QUIET)
|
|
if (GIT_FOUND)
|
|
execute_process(
|
|
COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%H
|
|
OUTPUT_VARIABLE GIT_COMMIT_HASH
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
ERROR_QUIET
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
)
|
|
execute_process(
|
|
COMMAND ${GIT_EXECUTABLE} symbolic-ref --short -q HEAD
|
|
OUTPUT_VARIABLE GIT_BRANCH_NAME
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
ERROR_QUIET
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
)
|
|
endif ()
|
|
|
|
set(BUILD_VERSION ${PROJECT_VERSION}_${CMAKE_SYSTEM}_${CMAKE_SYSTEM_PROCESSOR}_${CMAKE_BUILD_TYPE})
|
|
set(GIT_VERSION ${GIT_BRANCH_NAME}_${GIT_COMMIT_HASH})
|
|
string(TIMESTAMP BUILD_TIMESTAMP "%Y-%m-%d %H:%M:%S")
|
|
|
|
message(STATUS "GpgFrontend Build Timestamp ${BUILD_TIMESTAMP}")
|
|
message(STATUS "GpgFrontend Build Version ${BUILD_VERSION}")
|
|
message(STATUS "GpgFrontend Git Repo Version ${GIT_VERSION}")
|
|
|
|
# support for dymatic libraries
|
|
include (GenerateExportHeader)
|
|
|
|
# Windows
|
|
IF (MINGW)
|
|
message(STATUS "GpgFrontend Configuration For OS Platform Microsoft Windows")
|
|
message(STATUS "Build Environment MINGW")
|
|
|
|
set(OS_PLATFORM 0)
|
|
add_definitions(-DWINDOWS)
|
|
|
|
set(Boost_USE_STATIC_LIBS OFF)
|
|
set(Boost_USE_MULTITHREADED ON)
|
|
set(Boost_USE_STATIC_RUNTIME OFF)
|
|
|
|
include_directories(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
${CMAKE_CURRENT_SOURCE_DIR}/third_party
|
|
/mingw64/include
|
|
)
|
|
link_directories(
|
|
${CMAKE_SOURCE_DIR}/lib/mingw
|
|
/mingw64/lib
|
|
)
|
|
endif ()
|
|
|
|
# macOS
|
|
if (APPLE)
|
|
message(STATUS "GpgFrontend Configuration For OS Platform MacOS")
|
|
|
|
set(OS_PLATFORM 1)
|
|
ADD_DEFINITIONS(-DMACOS)
|
|
|
|
set(ENV{Qt5_DIR} /usr/local/opt/qt5/lib/cmake)
|
|
|
|
if (XCODE_BUILD)
|
|
set(XCODE_CODE_SIGN_IDENTITY "\"${XCODE_CODE_SIGN_IDENTITY}\"")
|
|
message(STATUS "XCODE_CODE_SIGN_IDENTITY ${XCODE_CODE_SIGN_IDENTITY}")
|
|
if (APPLE_SANDBOX)
|
|
add_compile_definitions(APPLE_SANDBOX)
|
|
endif ()
|
|
endif ()
|
|
|
|
include_directories(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
${CMAKE_CURRENT_SOURCE_DIR}/third_party
|
|
/usr/local/include
|
|
)
|
|
link_directories(
|
|
/usr/local/lib
|
|
)
|
|
endif ()
|
|
|
|
if (UNIX AND NOT APPLE)
|
|
set(LINUX TRUE)
|
|
endif ()
|
|
|
|
if (LINUX)
|
|
|
|
message(STATUS "GpgFrontend Configuration For OS Platform LINUX")
|
|
|
|
set(OS_PLATFORM 2)
|
|
ADD_DEFINITIONS(-DLINUX)
|
|
|
|
message(STATUS "GCC Version ${CMAKE_CXX_COMPILER_VERSION}")
|
|
if (CMAKE_CXX_COMPILER_VERSION LESS 9)
|
|
message(STATUS "GCC CXX_FLAGS add filesystem support manually")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++17 -lstdc++fs")
|
|
endif ()
|
|
|
|
include_directories(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
${CMAKE_CURRENT_SOURCE_DIR}/third_party
|
|
/usr/include
|
|
/usr/local/include
|
|
)
|
|
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib/)
|
|
link_directories(
|
|
/lib/
|
|
/usr/lib/
|
|
/usr/local/lib/
|
|
)
|
|
|
|
endif ()
|
|
|
|
if (GPG_STANDALONE_MODE)
|
|
add_compile_definitions(GPG_STANDALONE_MODE)
|
|
endif ()
|
|
|
|
|
|
if (LINUX_INSTALL_SOFTWARE)
|
|
message(STATUS "Configure Linux Install ON")
|
|
include(GNUInstallDirs)
|
|
set(INSTALL_GPGFRONTEND_APP 1)
|
|
set(APP_INSTALL_FLAG LINUX_INSTALL)
|
|
add_compile_definitions(LINUX_INSTALL_BUILD)
|
|
set(Boost_USE_STATIC_LIBS ON)
|
|
else ()
|
|
set(APP_INSTALL_FLAG BUNDLE)
|
|
add_compile_definitions(BUNDLE_BUILD)
|
|
endif ()
|
|
|
|
# Basic ENV Configure
|
|
set(BASIC_ENV_CONFIG 1)
|
|
set(QT_MOC_CONFIG 1)
|
|
|
|
if (FULL_APPLICATION_BUILD)
|
|
message(STATUS "Build Full Application")
|
|
set(QT5_ENV_SUPPORT 1)
|
|
set(GPG_CORE 1)
|
|
set(UI_CORE 1)
|
|
set(SMTP_SUPPORT 1)
|
|
set(SERVER_SUPPORT 1)
|
|
set(ADVANCE_SUPPORT 1)
|
|
set(APPLICATION_BUILD 1)
|
|
set(BASIC_ENV_CONFIG 1)
|
|
set(MULTI_LANG_SUPPORT 1)
|
|
elseif (MINIMUM_APPLICATION_BUILD)
|
|
message(STATUS "Build Minimum Application")
|
|
set(QT5_ENV_SUPPORT 1)
|
|
set(GPG_CORE 1)
|
|
set(UI_CORE 1)
|
|
set(APPLICATION_BUILD 1)
|
|
set(BASIC_ENV_CONFIG 1)
|
|
# Disable APP_IMAGE_UPDATE because of too many issues
|
|
# if (LINUX)
|
|
# set(APP_IMAGE_UPDATE 1)
|
|
# endif ()
|
|
elseif (STABLE_APPLICATION_BUILD)
|
|
message(STATUS "Build Stable Application")
|
|
set(QT5_ENV_SUPPORT 1)
|
|
set(GPG_CORE 1)
|
|
set(UI_CORE 1)
|
|
set(APPLICATION_BUILD 1)
|
|
set(BASIC_ENV_CONFIG 1)
|
|
set(SMTP_SUPPORT 1)
|
|
set(MULTI_LANG_SUPPORT 1)
|
|
elseif (TEST_CORE_BUILD)
|
|
message(STATUS "Build Test Cases")
|
|
|
|
if (MODULES)
|
|
else ()
|
|
message(STATUS "Build Default Modules")
|
|
set(GPG_CORE 1)
|
|
endif ()
|
|
|
|
endif ()
|
|
|
|
# For instance in order to select the highest version one
|
|
SET(CMAKE_FIND_PACKAGE_SORT_ORDER NATURAL)
|
|
SET(CMAKE_FIND_PACKAGE_SORT_DIRECTION DEC)
|
|
|
|
# Introduce boost
|
|
find_package(Boost COMPONENTS date_time system REQUIRED)
|
|
|
|
# Introduce OpenSSL
|
|
if(APPLE)
|
|
set(OPENSSL_ROOT_DIR /usr/local/opt/openssl@1.1)
|
|
endif()
|
|
find_package(OpenSSL REQUIRED)
|
|
|
|
# Introduce Qt
|
|
if (QT5_ENV_SUPPORT)
|
|
# Support Qt version Both 5.12.x and 5.15.x
|
|
find_package(Qt5 5.12 COMPONENTS Core Test Widgets PrintSupport Network REQUIRED)
|
|
|
|
# Qt configuration
|
|
set(CMAKE_AUTOMOC ON)
|
|
set(CMAKE_AUTORCC ON)
|
|
set(CMAKE_AUTOUIC ON)
|
|
|
|
set(CMAKE_AUTORCC_OPTIONS "--compress;9")
|
|
set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_AUTOUIC_SEARCH_PATHS} ${CMAKE_SOURCE_DIR}/ui)
|
|
|
|
endif ()
|
|
|
|
|
|
if (SMTP_SUPPORT)
|
|
add_compile_definitions(SMTP_SUPPORT)
|
|
endif ()
|
|
|
|
if (SERVER_SUPPORT)
|
|
add_compile_definitions(SERVER_SUPPORT)
|
|
endif ()
|
|
|
|
if (ADVANCE_SUPPORT)
|
|
add_compile_definitions(ADVANCE_SUPPORT)
|
|
endif ()
|
|
|
|
|
|
if (MULTI_LANG_SUPPORT)
|
|
add_compile_definitions(MULTI_LANG_SUPPORT)
|
|
endif ()
|
|
|
|
# third_party
|
|
add_subdirectory(third_party)
|
|
|
|
# source code
|
|
add_subdirectory(src)
|
|
|
|
# build to test gpgfrontend core
|
|
if (TEST_CORE_BUILD)
|
|
include(CTest)
|
|
enable_testing()
|
|
add_subdirectory(test)
|
|
endif ()
|