-
Notifications
You must be signed in to change notification settings - Fork 226
/
CMakeLists.txt
148 lines (122 loc) · 4.62 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
cmake_minimum_required(VERSION 3.2.0)
project(nitroshare)
# Point CMake to the custom modules
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
# It would be nice if CMake offered a constant for Linux
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(LINUX 1)
endif()
set(PROJECT_NAME "NitroShare")
set(PROJECT_DESCRIPTION "Cross-platform network file transfer application")
set(PROJECT_AUTHOR "Nathan Osman")
set(PROJECT_URL "https://nitroshare.net")
set(PROJECT_VERSION_MAJOR 0)
set(PROJECT_VERSION_MINOR 4)
set(PROJECT_VERSION_PATCH 0)
set(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH})
# At the very minimum, Qt 5.4+ is required
find_package(Qt5Network 5.4 REQUIRED)
find_package(Qt5Widgets 5.4)
# CLI and client are always available, UI is available if Qt5Widgets is available
option(BUILD_CLI "Build the NitroShare CLI app" ON)
option(BUILD_NMH "Build native messaging host for Chrome" ON)
option(BUILD_CLIENT "Build the NitroShare client app" ON)
if(Qt5Widgets_FOUND)
option(BUILD_UI "Build the NitroShare UI app" ON)
endif()
if(WIN32)
option(BUILD_NITROSHELL "Build shell extension for Windows Explorer" ON)
endif()
option(ENABLE_TLS "Enable support for TLS" ON)
# Allow file installation directories to be customized
set(INSTALL_BIN_PATH bin CACHE STRING "Application installation directory")
set(INSTALL_LIB_PATH lib CACHE STRING "Shared library installation directory")
set(INSTALL_INCLUDE_PATH include CACHE STRING "Header installation directory")
set(INSTALL_PLUGIN_PATH "${INSTALL_LIB_PATH}/nitroshare/plugins" CACHE STRING "Plugin installation directory")
set(OUTPUT_PREFIX "${CMAKE_BINARY_DIR}/out")
# Ensure the output prefix supports multiple build configurations
if(CMAKE_CONFIGURATION_TYPES)
set(OUTPUT_PREFIX "${OUTPUT_PREFIX}/$<CONFIG>")
endif()
# For macOS, the output directories form the app bundle; for all other
# platforms, the output paths mirror the installation paths
if(APPLE)
set(CONTENTS_DIRECTORY "${OUTPUT_PREFIX}/NitroShare.app/Contents")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CONTENTS_DIRECTORY}/MacOS")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CONTENTS_DIRECTORY}/Frameworks")
set(PLUGIN_OUTPUT_DIRECTORY "${CONTENTS_DIRECTORY}/PlugIns/nitroshare")
else()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${OUTPUT_PREFIX}/${INSTALL_BIN_PATH}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${OUTPUT_PREFIX}/${INSTALL_LIB_PATH}")
set(PLUGIN_OUTPUT_DIRECTORY "${OUTPUT_PREFIX}/${INSTALL_PLUGIN_PATH}")
endif()
# Set appropriate compiler flags, etc. (MSVC is already set to W3 and Clang
# issues enough warnings as it is)
if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
endif()
# Documentation is disabled by default
option(BUILD_DOC "Build Doxygen documentation" OFF)
if(BUILD_DOC)
find_package(Doxygen REQUIRED)
option(DOWNLOAD_TAGFILES "Download tagfiles for documentation" ON)
endif()
# Test suite is always disabled by default
option(BUILD_TESTS "Build test suite" OFF)
if(BUILD_TESTS)
enable_testing()
find_package(Qt5Test 5.4 REQUIRED)
endif()
# Add a dependency with a builtin fallback
function(add_dependency name title version)
find_package(${name} ${version} QUIET)
if(${name}_FOUND)
message(STATUS "Found ${title} ${${name}_VERSION}")
else()
message(STATUS "${title} ${version}+ not found - using bundled version")
set(_old_BUILD_DOC ${BUILD_DOC})
set(BUILD_DOC OFF)
add_subdirectory(deps/${name})
set(BUILD_DOC ${_old_BUILD_DOC})
endif()
endfunction()
# Attempt to find QHttpEngine on the system; use bundled version if missing
option(BUILD_API "Build local API plugin" ON)
if(BUILD_API)
add_dependency(qhttpengine QHttpEngine 1.0.0)
endif()
# Attempt to find QMdnsEngine on the system; use bundled version if missing
option(BUILD_MDNS "Build mDNS discovery plugin" ON)
if(BUILD_MDNS)
add_dependency(qmdnsengine QMdnsEngine 0.1.0)
endif()
# Enable libnotify support if GTK and libnotify are present
if(LINUX)
find_package(PkgConfig)
if(PKG_CONFIG_FOUND)
pkg_check_modules(libnotify gtk+-2.0 libnotify)
endif()
endif()
# Ensure that binaries are built with the RPATH set correctly
set(CMAKE_MACOSX_RPATH ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
# The library and plugins are always built
add_subdirectory(dist)
add_subdirectory(libnitroshare)
add_subdirectory(plugins)
if(BUILD_CLI)
add_subdirectory(cli)
endif()
if(BUILD_CLIENT)
add_subdirectory(client)
endif()
if(BUILD_NMH)
add_subdirectory(nmh)
endif()
if(BUILD_UI)
add_subdirectory(ui)
endif()
if(WIN32 AND BUILD_NITROSHELL)
add_subdirectory(shell)
endif()