forked from team-charls/charls
-
Notifications
You must be signed in to change notification settings - Fork 1
/
CMakeLists.txt
148 lines (125 loc) · 4.98 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
# Copyright (c) Team CharLS.
# SPDX-License-Identifier: BSD-3-Clause
cmake_minimum_required(VERSION 3.9...3.16)
# Extract the version info from version.h
file(READ "include/charls/version.h" version)
string(REGEX MATCH "CHARLS_VERSION_MAJOR ([0-9]*)" _ ${version})
set(version_major ${CMAKE_MATCH_1})
string(REGEX MATCH "CHARLS_VERSION_MINOR ([0-9]*)" _ ${version})
set(version_minor ${CMAKE_MATCH_1})
string(REGEX MATCH "CHARLS_VERSION_PATCH ([0-9]*)" _ ${version})
set(version_patch ${CMAKE_MATCH_1})
message(STATUS "CharLS version: ${version_major}.${version_minor}.${version_patch}")
project(charls VERSION ${version_major}.${version_minor}.${version_patch} LANGUAGES C CXX)
# Determine if project is built as a subproject (using add_subdirectory) or if it is the master project.
set(MASTER_PROJECT OFF)
if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
set(MASTER_PROJECT ON)
message(STATUS "Building as master project, CMake version: ${CMAKE_VERSION}")
endif ()
# The basic options to control what is build extra.
option(CHARLS_BUILD_TESTS "Build test application" ${MASTER_PROJECT})
option(CHARLS_BUILD_FUZZ_TEST "Build AFL fuzzer application" ${MASTER_PROJECT})
option(CHARLS_BUILD_SAMPLES "Build sample applications" ${MASTER_PROJECT})
option(CHARLS_INSTALL "Generate the install target." ${MASTER_PROJECT})
# The options used by the CI builds to ensure the source remains warning free.
# Not enabled by default to make CharLS package and end-user friendly.
option(CHARLS_PEDANTIC_WARNINGS "Enable extra warnings and static analysis." OFF)
option(CHARLS_THREAT_WARNINGS_AS_ERRORS "Treat Warnings as Errors." OFF)
# CharLS requires C++14 or newer.
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Configure the supported C++ compilers: gcc, clang and MSVC
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
set(PEDANTIC_CXX_COMPILE_FLAGS
-pedantic-errors
-Wall
-Wextra
-pedantic
-Wold-style-cast
-Wfloat-equal
-Wlogical-op
-Wundef
-Wredundant-decls
-Wshadow
-Wwrite-strings
-Wpointer-arith
-Wcast-qual
-Wformat=2
-Wmissing-include-dirs
-Wcast-align
-Wctor-dtor-privacy
-Wdisabled-optimization
-Winvalid-pch
-Woverloaded-virtual
-Wnon-virtual-dtor
-Wnoexcept
-Wdouble-promotion
-Wtrampolines
-Wzero-as-null-pointer-constant
-Wuseless-cast
-Wvector-operation-performance
-Wsized-deallocation
)
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.0)
set(PEDANTIC_CXX_COMPILE_FLAGS ${PEDANTIC_CXX_COMPILE_FLAGS}
-Wshift-overflow=2
-Wnull-dereference
-Wduplicated-cond
)
endif()
set(WERROR_FLAG -Werror)
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(PEDANTIC_CXX_COMPILE_FLAGS
-Weverything
-Wpedantic
-Wno-weak-vtables # Ignore, linker will remove the couple of extra vtables.
-Wno-padded # Ignore, padding optimization is not needed.
-Wno-c++98-compat # Ignore, CharLS 2.x targets C++14, ignore C++98 compatibility.
-Wno-c++98-compat-pedantic # Ignore, CharLS 2.x targets C++14, ignore C++98 compatibility.
-Wno-global-constructors # Ignore, by design CharLS uses types created at startup.
-Wno-switch-enum # Ignore, cases are handled by default.
-Wno-sign-conversion # Ignore, would just introduce ugly static_asserts.
-Wno-exit-time-destructors # Ignore, by design exit-time destructors are used.
-Wno-missing-braces # Ignore, False warning in clang 5.0, fixed in 6.0.
)
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0.2)
set(PEDANTIC_CXX_COMPILE_FLAGS ${PEDANTIC_CXX_COMPILE_FLAGS}
-Wno-undefined-func-template # Ignore, linker will complain if final template code is not available.
)
endif()
set(WERROR_FLAG -Werror)
endif()
if(MSVC)
set(PEDANTIC_CXX_COMPILE_FLAGS /W4)
set(WERROR_FLAG /WX)
# Exception settings are not set for ARM(64) when building for Ninja
string(TOLOWER ${CMAKE_CXX_COMPILER} CXX_COMPILER_LOWER)
string(FIND ${CXX_COMPILER_LOWER} "arm" ARM_DETECTED)
if(${ARM_DETECTED} GREATER 0)
add_compile_options("/EHsc")
endif()
endif()
# When enabled apply the pedantic warnings options and warnings as errors to globally.
if(CHARLS_PEDANTIC_WARNINGS)
if(MSVC)
# Remove existing warning level (W3 is added by default by CMake), duplicate level will generate cmd-line warnings.
string(REGEX REPLACE " /W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endif()
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:${PEDANTIC_CXX_COMPILE_FLAGS}>")
endif()
if(CHARLS_THREAT_WARNINGS_AS_ERRORS)
add_compile_options(${WERROR_FLAG})
endif()
include(src/CMakeLists.txt)
if(CHARLS_BUILD_TESTS)
add_subdirectory(test)
endif()
if(CHARLS_BUILD_FUZZ_TEST)
add_subdirectory(fuzztest)
endif()
if(CHARLS_BUILD_SAMPLES)
add_subdirectory(samples)
endif()