GpgFrontend/CMakeLists.txt
saturneric c1f5b33368 feat: add module controller and continue to work on module system
1.  speed up building by reducing build info sheader including
2. add module controller
3. continue to work on module system
2024-02-29 18:15:57 +08:00

384 lines
12 KiB
CMake

# Copyright (C) 2021 Saturneric <eric@bktus.com>
#
# 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)
message(STATUS "Current Generator: ${CMAKE_GENERATOR}")
if(CMAKE_GENERATOR STREQUAL "Xcode")
set(CMAKE_USER_MAKE_RULES_OVERRIDE "${CMAKE_SOURCE_DIR}/cmake/FlagsOverridesXcode.cmake")
else()
set(CMAKE_USER_MAKE_RULES_OVERRIDE "${CMAKE_SOURCE_DIR}/cmake/FlagsOverrides.cmake")
endif()
# define project
project(GpgFrontend
VERSION 2.1.2
DESCRIPTION "GpgFrontend is a free, open-source, robust yet user-friendly, compact and cross-platform tool for OpenPGP encryption."
HOMEPAGE_URL "https://gpgfrontend.bktus.com"
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_QT5_BUILD "Swith to Qt5 building mode" OFF)
option(GPGFRONTEND_GENERATE_LINUX_INSTALL_SOFTWARE "Generate an installable version" 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")
option(GPGFRONTEND_XOCDE_ENABLE_SANDBOX "Enable SandBox For Xcode Build" OFF)
# 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_BUILD_APPLICATION 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)
endif ()
# xcode archive build
if (GPGFRONTEND_CONFIGURE_FOR_XCODE_BUILD)
set(GPGFRONTEND_GENERATE_LINUX_INSTALL_SOFTWARE 0)
set(LINUX_INSTALL_SOFTWARE 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_BUILD_APPLICATION 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
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0)
message(FATAL_ERROR "Clang version must be at least 9.0!")
endif()
message(STATUS "Build System Using Compiler CLANG, VERSION: ${CMAKE_CXX_COMPILER_VERSION}")
set(USING_COMPILER_CLANG 1)
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
# using gcc
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0)
message(FATAL_ERROR "GCC version must be at least 8.0!")
endif()
message(STATUS "Build System Using Compiler GCC, VERSION: ${CMAKE_CXX_COMPILER_VERSION}")
set(USING_COMPILER_GCC 1)
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
# using Intel C++
message(FATAL_ERROR "Intel C++ is not supported.")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
# using Visual Studio C++
message(FATAL_ERROR "MSVC is not supported.")
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 ()
if (CMAKE_BUILD_TYPE STREQUAL "Release")
add_compile_definitions(RELEASE)
else()
add_compile_definitions(DEBUG)
endif()
# Specify compilation mode
message(STATUS "Switch Build Configure STABLE_BUILD_APPLICATION")
set(STABLE_BUILD_APPLICATION 1)
set(AppName GpgFrontend)
# 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 UTC)
# Convert BUILD_VERSION and GIT_VERSION to lowercase
string(TOLOWER "${BUILD_VERSION}" BUILD_VERSION)
string(TOLOWER "${GIT_VERSION}" GIT_VERSION)
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)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/src
${CMAKE_CURRENT_SOURCE_DIR}/third_party
/mingw64/include
)
link_directories(
${CMAKE_SOURCE_DIR}/lib/mingw
/mingw64/lib
)
# Http Request User Agent
set(HTTP_REQUEST_USER_AGENT "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0")
endif ()
# macOS
if (APPLE)
message(STATUS "GpgFrontend Configuration For OS Platform MacOS")
set(OS_PLATFORM 1)
ADD_DEFINITIONS(-DMACOS)
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
/opt/homebrew/include
)
link_directories(
/usr/local/lib
/opt/homebrew/lib
)
# Http Request User Agent
set(HTTP_REQUEST_USER_AGENT "Mozilla/5.0 (Macintosh; Intel Mac OS X 14.3; rv:123.0) Gecko/20100101 Firefox/123.0")
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_compile_definitions(LINUX)
# Get Env Info
find_program(UNAME_PROGRAM uname)
if(UNAME_PROGRAM)
execute_process(COMMAND ${UNAME_PROGRAM} OUTPUT_VARIABLE SYSTEM_NAME OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
if(USING_COMPILER_CLANG)
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-stdlib=libstdc++>)
endif()
if(SYSTEM_NAME STREQUAL "FreeBSD")
message(STATUS "FreeBSD BOX")
add_compile_definitions(FREEBSD)
set(FREEBSD TRUE)
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/
)
# Http Request User Agent
set(HTTP_REQUEST_USER_AGENT "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:123.0) Gecko/20100101 Firefox/123.0")
endif ()
if (LINUX_INSTALL_SOFTWARE)
message(STATUS "Linux Install Traget ${CMAKE_INSTALL_PREFIX}")
include(GNUInstallDirs)
set(APP_INSTALL_FLAG LINUX_INSTALL)
add_compile_definitions(LINUX_INSTALL_BUILD)
else ()
set(APP_INSTALL_FLAG BUNDLE)
endif ()
if (GPGFRONTEND_QT5_BUILD)
add_compile_definitions(QT5_BUILD)
else()
add_compile_definitions(QT6_BUILD)
endif()
# Basic ENV Configure
set(BASIC_ENV_CONFIG 1)
set(QT_MOC_CONFIG 1)
if (STABLE_BUILD_APPLICATION)
message("[+] Build Stable Application")
set(BUILD_CORE 1)
set(BUILD_UI 1)
set(BUILD_MODULE 1)
set(BUILD_TEST 1)
set(BUILD_APPLICATION 1)
set(BASIC_ENV_CONFIG 1)
set(SUPPORT_MULTI_LANG 1)
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)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
if (SUPPORT_MULTI_LANG)
add_compile_definitions(SUPPORT_MULTI_LANG)
endif ()
# Output Env Variables
message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")
message(STATUS "Build C Flags: ${CMAKE_C_FLAGS}")
message(STATUS "Build C++ Flags: ${CMAKE_CXX_FLAGS}")
# third_party
add_subdirectory(third_party)
# source code
add_subdirectory(src)