CMakeLists.txt 12.8 KB
Newer Older
Antenore Gatta's avatar
Antenore Gatta committed
1 2 3 4
# Remmina - The GTK+ Remote Desktop Client
#
# Copyright (C) 2011 Marc-Andre Moreau
# Copyright (C) 2014-2015 Antenore Gatta, Fabio Castelli, Giovanni Panozzo
5
# Copyright (C) 2016-2019 Antenore Gatta, Giovanni Panozzo
Antenore Gatta's avatar
Antenore Gatta committed
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
#
# 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., 51 Franklin Street, Fifth Floor,
# Boston, MA  02110-1301, USA.
#
# In addition, as a special exception, the copyright holders give
# permission to link the code of portions of this program with the
# OpenSSL library under certain conditions as described in each
# individual source file, and distribute linked combinations
# including the two.
# You must obey the GNU General Public License in all respects
# for all of the code used other than OpenSSL. If you modify
# file(s) with this exception, you may extend this exception to your
# version of the file(s), but you are not obligated to do so. If you
# do not wish to do so, delete this exception statement from your
# version. If you delete this exception statement from all source
# files in the program, then also delete it here.

35

36
cmake_minimum_required(VERSION 2.8.2)
37

38
set(CMAKE_COLOR_MAKEFILE ON)
39

40 41
project(Remmina C)

42
include(CheckCCompilerFlag)
43 44
include(CheckIncludeFiles)
include(CheckLibraryExists)
45
include(CheckSymbolExists)
46
include(FindPkgConfig)
47
include(GNUInstallDirs)
48 49 50

set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/)

51
include(FindOptionalPackage)
52
include(ConfigOptions)
53
include(GtkUpdateIconCache)
54

55
if(NOT CMAKE_BUILD_TYPE)
56
    set(CMAKE_BUILD_TYPE "Release")
57 58
endif()

59 60 61 62
if(NOT BUILD_SHARED_LIBS)
    set(BUILD_SHARED_LIBS ON)
endif()

63
if(CMAKE_COMPILER_IS_GNUCC)
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
    if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
        CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
        if(IS_X86_64)
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
        else()
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
        endif()
    else()
        if(CMAKE_POSITION_INDEPENDENT_CODE)
            if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
                set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
            endif()
        endif()
    endif()

79
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
80

81 82 83
    if(WITH_SSE2)
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
    endif()
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 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182

    if(CMAKE_BUILD_TYPE STREQUAL "Debug")
        add_definitions(-DDEBUG)
        CHECK_C_COMPILER_FLAG (-Wunused-result Wunused-result)
        if(Wunused-result)
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused-result")
        endif()
        CHECK_C_COMPILER_FLAG (-Wunused-but-set-variable Wunused-but-set-variable)
        if(Wunused-but-set-variable)
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused-but-set-variable")
        endif()
        CHECK_C_COMPILER_FLAG(-Wdeprecated-declarations Wdeprecated-declarations)
        if(Wdeprecated-declarations)
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wdeprecated-declarations")
        endif()

        CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
        if(Wimplicit-function-declaration)
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
        endif()
        if (NOT OPENBSD)
            CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
            if(Wredundant-decls)
                set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
            endif()
        endif()
    endif()

    if(CMAKE_BUILD_TYPE STREQUAL "Release")
        add_definitions(-DNDEBUG)
        CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
        if(Wno-unused-result)
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
        endif()
        CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
        if(Wno-unused-but-set-variable)
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
        endif()
        CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
        if(Wno-deprecated-declarations)
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
        endif()

        CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
        if(Wimplicit-function-declaration)
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
        endif()
        if (NOT OPENBSD)
            CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
            if(Wredundant-decls)
                set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
            endif()
        endif()
    else()
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
    endif()

endif()

if((TARGET_ARCH MATCHES "x86|x64") AND (NOT DEFINED WITH_SSE2))
    option(WITH_SSE2 "Enable SSE2 optimization." ON)
else()
    option(WITH_SSE2 "Enable SSE2 optimization." OFF)
endif()

if(TARGET_ARCH MATCHES "ARM")
    if (NOT DEFINED WITH_NEON)
        option(WITH_NEON "Enable NEON optimization." ON)
    else()
        option(WITH_NEON "Enable NEON optimization." OFF)
    endif()
else()
    if(NOT APPLE)
        option(WITH_IPP "Use Intel Performance Primitives." OFF)
    endif()
endif()


if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
    if(CMAKE_BUILD_TYPE STREQUAL "Release")
        add_definitions(-DNDEBUG)
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-command-line-argument")
        CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
        if(Wno-deprecated-declarations)
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
        endif()
    else()
        add_definitions(-DDEBUG)
        #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused-parameter")
        #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused-macros -Wpadded")
        #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wc11-extensions -Wgnu")
        #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused-command-line-argument")
        CHECK_C_COMPILER_FLAG(-Wdeprecated-declarations Wdeprecated-declarations)
        if(Wdeprecated-declarations)
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wdeprecated-declarations")
        endif()
183
    endif()
184 185
endif()

186
check_include_files(sys/socket.h HAVE_SYS_SOCKET_H)
187 188
check_include_files(arpa/inet.h HAVE_ARPA_INET_H)
check_include_files(netinet/in.h HAVE_NETINET_IN_H)
189
check_include_files(netinet/tcp.h HAVE_NETINET_TCP_H)
190
check_include_files(termios.h HAVE_TERMIOS_H)
191 192 193 194
check_include_files(netdb.h HAVE_NETDB_H)
check_include_files(fcntl.h HAVE_FCNTL_H)
check_include_files(unistd.h HAVE_UNISTD_H)
check_include_files(sys/un.h HAVE_SYS_UN_H)
195
check_include_files(errno.h HAVE_ERRNO_H)
196

197
include_directories(.)
198
include_directories(src/include)
199

Antenore Gatta's avatar
Antenore Gatta committed
200 201 202
# FreeBSD

if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
203 204 205 206
    set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "-rdynamic")
    include_directories(/usr/local/include /usr/include)
    link_directories(/usr/local/lib /usr/lib)
    set(CMAKE_REQUIRED_INCLUDES /usr/local/include)
207
    set(CMAKE_SHARED_LIBRARY_PREFIX ${CMAKE_SHARED_LIBRARY_PREFIX} /usr/local/lib)
Antenore Gatta's avatar
Antenore Gatta committed
208 209
endif()

210 211 212
# Versioning
set(WITH_LIBRARY_VERSIONING "ON")
set(REMMINA_VERSION_MAJOR "1")
Giovanni Panozzo's avatar
Giovanni Panozzo committed
213
set(REMMINA_VERSION_MINOR "2")
214
set(REMMINA_VERSION_REVISION "32")
215 216 217
set(REMMINA_VERSION_SUFFIX "1")
set(REMMINA_VERSION "${REMMINA_VERSION_MAJOR}.${REMMINA_VERSION_MINOR}.${REMMINA_VERSION_REVISION}.${REMMINA_VERSION_SUFFIX}")
#set(REMMINA_VERSION "${REMMINA_VERSION_MAJOR}.${REMMINA_VERSION_MINOR}.${REMMINA_VERSION_REVISION}")
218 219

message(STATUS "Remmina version: ${REMMINA_VERSION}")
220

Antenore Gatta's avatar
Antenore Gatta committed
221 222 223 224
include(GetGitRevisionDescription)
git_get_exact_tag(REMMINA_GIT_REVISION --tags --always)
if(${REMMINA_GIT_REVISION} STREQUAL "n/a")
    git_rev_parse(REMMINA_GIT_REVISION --short)
225 226
endif()

227
message(STATUS "Git Revision: ${REMMINA_GIT_REVISION}")
228

229 230
# REMMINA_APP_ID should follow Gnome Application ID rules
set(REMMINA_APP_ID "org.remmina.Remmina")
231

232 233
if(NOT REMMINA_DATADIR)
    set(REMMINA_DATADIR "${CMAKE_INSTALL_FULL_DATADIR}")
234 235 236
    if(NOT REMMINA_RUNTIME_DATADIR)
        set(REMMINA_RUNTIME_DATADIR "${REMMINA_DATADIR}")
    endif()
237
endif()
Antenore Gatta's avatar
Antenore Gatta committed
238
if(NOT REMMINA_TERM_CS_DIR)
239
    set(REMMINA_TERM_CS_DIR "${REMMINA_DATADIR}/remmina/term_colors")
Antenore Gatta's avatar
Antenore Gatta committed
240
endif()
241 242
if(NOT REMMINA_LOCALEDIR)
    set(REMMINA_LOCALEDIR "${CMAKE_INSTALL_FULL_LOCALEDIR}")
243 244 245
    if(NOT REMMINA_RUNTIME_LOCALEDIR)
        set(REMMINA_RUNTIME_LOCALEDIR "${REMMINA_LOCALEDIR}")
    endif()
246 247 248
endif()
if(NOT REMMINA_PLUGINDIR)
    set(REMMINA_PLUGINDIR "${CMAKE_INSTALL_FULL_LIBDIR}/remmina/plugins")
249 250 251
    if(NOT REMMINA_RUNTIME_PLUGINDIR)
        set(REMMINA_RUNTIME_PLUGINDIR "${REMMINA_PLUGINDIR}")
    endif()
252 253 254
endif()
if(NOT REMMINA_UIDIR)
    set(REMMINA_UIDIR "${REMMINA_DATADIR}/remmina/ui")
255 256 257 258
    if(NOT REMMINA_RUNTIME_UIDIR)
        set(REMMINA_RUNTIME_UIDIR "${REMMINA_UIDIR}")
    endif()
endif()
259 260 261 262 263 264
if(NOT REMMINA_THEMEDIR)
    set(REMMINA_THEMEDIR "${REMMINA_DATADIR}/remmina/theme")
    if(NOT REMMINA_RUNTIME_THEMEDIR)
        set(REMMINA_RUNTIME_THEMEDIR "${REMMINA_THEMEDIR}")
    endif()
endif()
265 266 267 268 269
if(NOT REMMINA_EXTERNAL_TOOLS_DIR)
    set(REMMINA_EXTERNAL_TOOLS_DIR "${REMMINA_DATADIR}/remmina/external_tools")
    if(NOT REMMINA_RUNTIME_EXTERNAL_TOOLS_DIR)
        set(REMMINA_RUNTIME_EXTERNAL_TOOLS_DIR "${REMMINA_EXTERNAL_TOOLS_DIR}")
    endif()
270
endif()
271

272
# Snap package generation support
273 274 275
if(DEFINED ENV{SNAPCRAFT_PROJECT_NAME})
    add_subdirectory(snap)
else()
276 277 278 279
    find_program(SNAPCRAFT "snapcraft")
    if(SNAPCRAFT)
        add_subdirectory(snap)
    endif()
280 281
endif()

282
option(SNAP_BUILD_ONLY "SNAP_BUILD_ONLY" OFF)
283
if(SNAP_BUILD_ONLY)
Antenore Gatta's avatar
Antenore Gatta committed
284
    if(NOT SNAPCRAFT)
285
        message(FATAL_ERROR "snapcraft not found, impossible to create only snap target")
286 287 288 289
    endif()
    return()
endif()

290 291 292 293
if(SNAP_BUILD)
    add_definitions(-DSNAP_BUILD)
endif()

294 295
# Uninstall support
configure_file(
296 297 298
    "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
    IMMEDIATE @ONLY)
299
add_custom_target(uninstall
300
    "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
301

302
find_required_package(GTK)
303 304 305 306

set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
find_package(Threads REQUIRED)
if(NOT CMAKE_USE_PTHREADS_INIT)
307
    message(FATAL_ERROR "pthreads thread library not found")
308 309
endif()

310 311 312
# Add GCC sanitizer options, must be done after pthreads detection
# see remmina issue #1276
if(CMAKE_COMPILER_IS_GNUCC AND WITH_GCC_SANITIZE_ADDRESS)
313 314 315
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
endif()

316
# LLVM coverage flags - https://clang.llvm.org/docs/SourceBasedCodeCoverage.html
317 318 319
if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang" AND WITH_CLANG_COVERAGE)
    message(STATUS "Enabling coverage.")
    add_definitions(-DWITH_CLANG_COVERAGE)
320 321
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -fprofile-instr-generate -fcoverage-mapping")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-instr-generate")
322
elseif("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" AND WITH_GCC_PROFILING)
Antenore Gatta's avatar
Antenore Gatta committed
323 324 325
    message(STATUS "Enabling profiling.")
    add_definitions(-DWITH_GCC_PROFILING)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
326 327
endif()

328 329
find_suggested_package(GCRYPT)
find_suggested_package(AVAHI)
Giovanni Panozzo's avatar
Giovanni Panozzo committed
330
find_package(OpenSSL)
331

332
if(WITH_TRACE_CALLS)
333 334
    message(STATUS "Enabling trace calls.")
    add_definitions(-DWITH_TRACE_CALLS)
335 336
endif()

337 338 339 340 341 342 343 344
option(WITH_MANPAGES "Build with MANPAGES" ON)
if(WITH_MANPAGES)
    message(STATUS "Enabling man pages.")
    add_definitions(-DWITH_MANPAGES)
else()
    message(STATUS "Man pages disabled")
endif()

345
if(GCRYPT_FOUND)
346
    add_definitions(-DHAVE_LIBGCRYPT)
347 348
endif()

349
if(AVAHI_FOUND)
350 351
    add_definitions(-DHAVE_LIBAVAHI_UI)
    add_definitions(-DHAVE_LIBAVAHI_CLIENT)
352 353
endif()

354
if(GTK_FOUND)
355
    add_subdirectory(src)
356 357 358
    add_subdirectory(data)
    add_subdirectory(plugins)
    add_subdirectory(plugins/secret)
359
endif()
360

361 362 363 364 365
if(WITH_TRANSLATIONS)
        add_subdirectory(po)
endif()


366 367
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
    ${CMAKE_CURRENT_SOURCE_DIR}/config.h)
368 369 370 371 372 373 374 375 376 377 378

set(REMMINA_BUILD_CONFIG_LIST "")
GET_CMAKE_PROPERTY(res VARIABLES)
FOREACH(var ${res})
    IF (var MATCHES "^WITH_*|^HAVE_*")
        LIST(APPEND REMMINA_BUILD_CONFIG_LIST "${var}=${${var}}")
    ENDIF()
ENDFOREACH()
string(REPLACE ";" " " REMMINA_BUILD_CONFIG "${REMMINA_BUILD_CONFIG_LIST}")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in
    ${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h)