forked from AcademySoftwareFoundation/openapv
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
388 lines (328 loc) · 15.9 KB
/
Copy pathCMakeLists.txt
File metadata and controls
388 lines (328 loc) · 15.9 KB
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
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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
cmake_minimum_required (VERSION 3.12)
########################################
# Project versioning
########################################
set(OAPV_H_HEADER_FILE "${CMAKE_SOURCE_DIR}/inc/oapv.h")
if(NOT EXISTS ${OAPV_H_HEADER_FILE})
message(FATAL_ERROR
"${CMAKE_SOURCE_DIR}/inc/oapv.h file doesn't exist!\n"
"File contains OAPV_VER_APISET, OAPV_VER_MAJOR, OAPV_VER_MINOR, OAPV_VER_PATCH definitions that specifie openAPV project version.\n"
"To get the information on version of the downloaded library please follow the link below:\n\t https://github.com/AcademySoftwareFoundation/openapv"
)
endif()
file(READ ${OAPV_H_HEADER_FILE} HEADER_CONTENT)
# Regular expressions for extracting versions
string(REGEX MATCH "(#define)([ ]+)(OAPV_VER_APISET)([ ]+)(\\()([ ]*)([0-9]+)([ ]*)(\\))" APISET_MATCH ${HEADER_CONTENT})
string(REGEX MATCH "(#define)([ ]+)(OAPV_VER_MAJOR)([ ]+)(\\()([ ]*)([0-9]+)([ ]*)(\\))" MAJOR_MATCH ${HEADER_CONTENT})
string(REGEX MATCH "(#define)([ ]+)(OAPV_VER_MINOR)([ ]+)(\\()([ ]*)([0-9]+)([ ]*)(\\))" MINOR_MATCH ${HEADER_CONTENT})
string(REGEX MATCH "(#define)([ ]+)(OAPV_VER_PATCH)([ ]+)(\\()([ ]*)([0-9]+)([ ]*)(\\))" PATCH_MATCH ${HEADER_CONTENT})
# Extract the values OAPV_VER_APISET, OAPV_VER_MAJOR, OAPV_VER_MINOR, OAPV_VER_PATCH from the oapv.h file
if(APISET_MATCH)
string(REGEX REPLACE "(#define)([ ]+)(OAPV_VER_APISET)([ ]+)(\\()([ ]*)([0-9]+)([ ]*)(\\))" "\\7" VERSION_APISET ${APISET_MATCH})
else()
message(WARRNING "In the file oapv.h, no matching string was found for the regular expression (regex) used to match the pattern containing #define OAPV_VER_APISET (number).")
endif()
if(MAJOR_MATCH)
string(REGEX REPLACE "(#define)([ ]+)(OAPV_VER_MAJOR)([ ]+)(\\()([ ]*)([0-9]+)([ ]*)(\\))" "\\7" VERSION_MAJOR ${MAJOR_MATCH})
else()
message(WARRNING "In the file oapv.h, no matching string was found for the regular expression (regex) used to match the pattern containing #define OAPV_VER_MAJOR (number).")
endif()
if(MINOR_MATCH)
string(REGEX REPLACE "(#define)([ ]+)(OAPV_VER_MINOR)([ ]+)(\\()([ ]*)([0-9]+)([ ]*)(\\))" "\\7" VERSION_MINOR ${MINOR_MATCH})
else()
message(WARRNING "In the file oapv.h, no matching string was found for the regular expression (regex) used to match the pattern containing #define OAPV_VER_MINOR (number).")
endif()
if(PATCH_MATCH)
string(REGEX REPLACE "(#define)([ ]+)(OAPV_VER_PATCH)([ ]+)(\\()([ ]*)([0-9]+)([ ]*)(\\))" "\\7" VERSION_PATCH ${PATCH_MATCH})
else()
message(WARRNING "In the file oapv.h, no matching string was found for the regular expression (regex) used to match the pattern containing #define OAPV_VER_PATCH (number).")
endif()
message(DEBUG "OAPV_VER_APISET: ${VERSION_APISET}")
message(DEBUG "OAPV_VER_MAJOR: ${VERSION_MAJOR}")
message(DEBUG "OAPV_VER_MINOR: ${VERSION_MINOR}")
message(DEBUG "OAPV_VER_PATCH: ${VERSION_PATCH}")
message(STATUS "OAPV version has been taken from ${OAPV_H_HEADER_FILE} file.")
message(STATUS "OAPV version: ${VERSION_APISET}.${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
project(OAPV VERSION ${VERSION_APISET}.${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH} LANGUAGES C)
########################################
# Input arguments.
########################################
# Check input arguments.
option(OAPV_APP_STATIC_BUILD "oapv_app will be statically linked against static oapv library" ON)
option(OAPV_BUILD_APPS "Build the included command line apps" ON)
option(OAPV_BUILD_STATIC_LIB "Build oapv static library" ON)
option(OAPV_BUILD_SHARED_LIB "Build oapv shared library" ON)
option(ENABLE_COVERAGE "Enable code coverage measurement" OFF)
if(OAPV_BUILD_APPS AND OAPV_APP_STATIC_BUILD AND NOT OAPV_BUILD_STATIC_LIB)
message(FATAL_ERROR "Cannot build static apps without static lib.")
endif()
if(OAPV_BUILD_APPS AND NOT OAPV_APP_STATIC_BUILD AND NOT OAPV_BUILD_SHARED_LIB)
message(FATAL_ERROR "Cannot build shared apps without shared lib.")
endif()
if(NOT OAPV_BUILD_STATIC_LIB AND NOT OAPV_BUILD_SHARED_LIB)
message(FATAL_ERROR "At least one of static or shared lib build needs to be enabled.")
endif()
# To build for arm provide in command line: -DARM=TRUE
if(NOT ARM)
set(ARM "FALSE")
else()
add_definitions(-DARM=1)
set(ARM "TRUE")
endif()
# To build for universal architectures provide in command line: -DUNIVERSAL=TRUE
if(NOT UNIVERSAL)
set(UNIVERSAL "FALSE")
else()
add_definitions(-DUNIVERSAL=1)
set(UNIVERSAL "TRUE")
endif()
########################################
# Compilation flags
########################################
# Set compiler flags and options.
if(MSVC)
message("Not supported yet!")
elseif(UNIX OR MINGW)
if(ENABLE_COVERAGE)
set(CMAKE_BUILD_TYPE "Debug")
endif()
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release")
endif()
message("CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
set(OPT_LV "O0")
set(OPT_DBG "-g")
else()
set(OPT_LV "O3")
set(OPT_DBG "-DNDEBUG") # disable assert
endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OPT_DBG} -${OPT_LV} -fomit-frame-pointer -pthread -std=c99")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-unused-function")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lm")
if(ENABLE_COVERAGE)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
endif()
else()
message("Unknown compiler")
endif()
# Command to output information to the console
message ("c Flags: " ${CMAKE_C_FLAGS})
message ("linker Flags: " ${CMAKE_EXE_LINKER_FLAGS})
########################################
# Configuration
########################################
set(CMAKE_C_STANDARD 99)
cmake_policy(SET CMP0048 NEW)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# Sub-directories where more CMakeLists.txt exist
add_subdirectory(src)
if(OAPV_BUILD_APPS)
add_subdirectory(app)
endif()
########################################
# Targets
########################################
# uninstall target
if(NOT TARGET uninstall)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE @ONLY)
add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
endif()
########################################
# CPack project packaging
########################################
# Check the operating system
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
message(STATUS "Linux system")
# Read the /etc/os-release file to determine the distribution
file(READ "/etc/os-release" OS_RELEASE_CONTENT)
if(OS_RELEASE_CONTENT MATCHES "ID=debian" OR OS_RELEASE_CONTENT MATCHES "ID=ubuntu")
message(STATUS "Debian-based system detected")
message(STATUS "Use DEB generator while generating installation package using CPack")
set(CPACK_GENERATOR "DEB")
elseif(OS_RELEASE_CONTENT MATCHES "ID=rhel" OR OS_RELEASE_CONTENT MATCHES "ID=fedora" OR OS_RELEASE_CONTENT MATCHES "ID=centos")
message(STATUS "Red Hat-based system detected")
message(STATUS "Use RPM generator while generating installation package using CPack")
set(CPACK_GENERATOR "RPM")
elseif(OS_RELEASE_CONTENT MATCHES "ID=opensuse")
message(STATUS "SUSE-based system detected")
message(STATUS "Use RPM generator while generating installation package using CPack")
set(CPACK_GENERATOR "RPM")
else()
message(STATUS "Other Linux distribution detected")
message(STATUS "Use TGZ generator while generating installation package using CPack")
set(CPACK_GENERATOR "TGZ")
endif()
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
message(STATUS "Windows system")
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
# Check if the compiler path contains 'ucrt64'
if(CMAKE_C_COMPILER MATCHES "ucrt64")
message(STATUS "UCRT64 environment detected")
message(STATUS "Use NSIS generator while generating installation package using CPack")
set(CPACK_GENERATOR "NSIS")
else()
message(STATUS "Not using UCRT64 compiler. Compiler ID: ${CMAKE_C_COMPILER}")
message(STATUS "Use TGZ generator while generating installation package using CPack")
set(CPACK_GENERATOR "TGZ")
endif()
# Check if the compiler is MSVC
elseif(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
message(STATUS "Using Microsoft Visual Studio (MSVC) compiler")
message(STATUS "Use NSIS generator while generating installation package using CPack")
set(CPACK_GENERATOR "NSIS")
else()
message(STATUS "Not using MSVC compiler. Compiler ID: ${CMAKE_C_COMPILER_ID}.")
message(STATUS "Use ZIP generator while generating installation package using CPack")
set(CPACK_GENERATOR "ZIP")
endif()
else()
message(STATUS "Other OS: ${CMAKE_SYSTEM_NAME}")
message(STATUS "Use ZIP generator while generating installation package using CPack")
set(CPACK_GENERATOR "ZIP")
endif()
# Packaging
include(InstallRequiredSystemLibraries)
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
set(CPACK_PACKAGE_NAME "OpenAPV")
set(CPACK_PACKAGE_VENDOR "AcademySoftwareFoundation")
set(CPACK_PACKAGE_CONTACT "https://github.com/AcademySoftwareFoundation")
set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.com/AcademySoftwareFoundation/openapv/releases")
set(CMAKE_PROJECT_HOMEPAGE_URL "https://github.com/AcademySoftwareFoundation/openapv")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Open Advanced Professional Video Codec")
set(CPACK_PACKAGE_VERSION "${VERSION_APISET}.${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
set(CPACK_PACKAGE_CHECKSUM MD5)
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "AcademySoftwareFoundation")
set(CPACK_DEBIAN_PACKAGE_SECTION "video")
set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT")
include(CPack)
########################################
# Testing
########################################
option(ENABLE_TESTS "Enable tests" ON)
if (${ENABLE_TESTS})
enable_testing()
endif()
# Test - Check if encoder starts
add_test(NAME Encoder_runs COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_enc)
# Test - Check if decoder starts
add_test(NAME Decoder_runs COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec)
# Test - encode
add_test(NAME encode COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_enc -i ${CMAKE_CURRENT_SOURCE_DIR}/test/sequence/pattern1_yuv422p10le_320x240_25fps.y4m -w 320 -h 240 -z 25 -o out.oapv)
set_tests_properties(encode PROPERTIES
TIMEOUT 20
FAIL_REGULAR_EXPRESSION "Encoded frame count = 0"
PASS_REGULAR_EXPRESSION "Encoded frame count = 125"
RUN_SERIAL TRUE
)
# Test - decode
add_test(NAME decode COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec -i out.oapv)
set_tests_properties(decode PROPERTIES
TIMEOUT 10
DEPENDS encode
FAIL_REGULAR_EXPRESSION "Decoded frame count = 0"
PASS_REGULAR_EXPRESSION "Decoded frame count = 125"
RUN_SERIAL TRUE
)
# Test - decode qp_A.apv
add_test(NAME decode_qp_A COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec -i ${CMAKE_CURRENT_SOURCE_DIR}/test/bitstream/qp_A.apv -v 3 --hash)
set_tests_properties(decode_qp_A PROPERTIES
TIMEOUT 10
FAIL_REGULAR_EXPRESSION "Decoded frame count = 0"
PASS_REGULAR_EXPRESSION "Decoded frame count = 3"
PASS_REGULAR_EXPRESSION ".*hash:match.*"
)
# Test - decode qp_B.apv
add_test(NAME decode_qp_B COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec -i ${CMAKE_CURRENT_SOURCE_DIR}/test/bitstream/qp_B.apv -v 3 --hash)
set_tests_properties(decode_qp_B PROPERTIES
TIMEOUT 10
FAIL_REGULAR_EXPRESSION "Decoded frame count = 0"
PASS_REGULAR_EXPRESSION "Decoded frame count = 3"
PASS_REGULAR_EXPRESSION ".*hash:match.*"
)
# Test - decode qp_C.apv
add_test(NAME decode_qp_C COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec -i ${CMAKE_CURRENT_SOURCE_DIR}/test/bitstream/qp_C.apv -v 3 --hash)
set_tests_properties(decode_qp_C PROPERTIES
TIMEOUT 10
FAIL_REGULAR_EXPRESSION "Decoded frame count = 0"
PASS_REGULAR_EXPRESSION "Decoded frame count = 3"
PASS_REGULAR_EXPRESSION ".*hash:match.*"
)
# Test - decode qp_D.apv
add_test(NAME decode_qp_D COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec -i ${CMAKE_CURRENT_SOURCE_DIR}/test/bitstream/qp_D.apv -v 3 --hash)
set_tests_properties(decode_qp_D PROPERTIES
TIMEOUT 10
FAIL_REGULAR_EXPRESSION "Decoded frame count = 0"
PASS_REGULAR_EXPRESSION "Decoded frame count = 3"
PASS_REGULAR_EXPRESSION ".*hash:match.*"
)
# Test - decode qp_E.apv
add_test(NAME decode_qp_E COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec -i ${CMAKE_CURRENT_SOURCE_DIR}/test/bitstream/qp_E.apv -v 3 --hash)
set_tests_properties(decode_qp_E PROPERTIES
TIMEOUT 10
FAIL_REGULAR_EXPRESSION "Decoded frame count = 0"
PASS_REGULAR_EXPRESSION "Decoded frame count = 3"
PASS_REGULAR_EXPRESSION ".*hash:match.*"
)
# Test - decode syn_A.apv
add_test(NAME decode_syn_A COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec -i ${CMAKE_CURRENT_SOURCE_DIR}/test/bitstream/syn_A.apv -v 3 --hash)
set_tests_properties(decode_syn_A PROPERTIES
TIMEOUT 10
FAIL_REGULAR_EXPRESSION "Decoded frame count = 0"
PASS_REGULAR_EXPRESSION "Decoded frame count = 3"
PASS_REGULAR_EXPRESSION ".*hash:match.*"
)
# Test - decode syn_B.apv
add_test(NAME decode_syn_B COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec -i ${CMAKE_CURRENT_SOURCE_DIR}/test/bitstream/syn_B.apv -v 3 --hash)
set_tests_properties(decode_syn_B PROPERTIES
TIMEOUT 10
FAIL_REGULAR_EXPRESSION "Decoded frame count = 0"
PASS_REGULAR_EXPRESSION "Decoded frame count = 3"
PASS_REGULAR_EXPRESSION ".*hash:match.*"
)
# Test - decode tile_A.apv
add_test(NAME decode_tile_A COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec -i ${CMAKE_CURRENT_SOURCE_DIR}/test/bitstream/tile_A.apv -v 3 --hash)
set_tests_properties(decode_tile_A PROPERTIES
TIMEOUT 10
FAIL_REGULAR_EXPRESSION "Decoded frame count = 0"
PASS_REGULAR_EXPRESSION "Decoded frame count = 3"
PASS_REGULAR_EXPRESSION ".*hash:match.*"
)
# Test - decode tile_B.apv
add_test(NAME decode_tile_B COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec -i ${CMAKE_CURRENT_SOURCE_DIR}/test/bitstream/tile_B.apv -v 3 --hash)
set_tests_properties(decode_tile_B PROPERTIES
TIMEOUT 10
FAIL_REGULAR_EXPRESSION "Decoded frame count = 0"
PASS_REGULAR_EXPRESSION "Decoded frame count = 3"
PASS_REGULAR_EXPRESSION ".*hash:match.*"
)
# Test - decode tile_C.apv
add_test(NAME decode_tile_C COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec -i ${CMAKE_CURRENT_SOURCE_DIR}/test/bitstream/tile_C.apv -v 3 --hash)
set_tests_properties(decode_tile_C PROPERTIES
TIMEOUT 10
FAIL_REGULAR_EXPRESSION "Decoded frame count = 0"
PASS_REGULAR_EXPRESSION "Decoded frame count = 3"
PASS_REGULAR_EXPRESSION ".*hash:match.*"
)
# Test - decode tile_D.apv
add_test(NAME decode_tile_D COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec -i ${CMAKE_CURRENT_SOURCE_DIR}/test/bitstream/tile_D.apv -v 3 --hash)
set_tests_properties(decode_tile_D PROPERTIES
TIMEOUT 10
FAIL_REGULAR_EXPRESSION "Decoded frame count = 0"
PASS_REGULAR_EXPRESSION "Decoded frame count = 3"
PASS_REGULAR_EXPRESSION ".*hash:match.*"
)
# Test - decode tile_E.apv
add_test(NAME decode_tile_E COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec -i ${CMAKE_CURRENT_SOURCE_DIR}/test/bitstream/tile_E.apv -v 3 --hash)
set_tests_properties(decode_tile_E PROPERTIES
TIMEOUT 10
FAIL_REGULAR_EXPRESSION "Decoded frame count = 0"
PASS_REGULAR_EXPRESSION "Decoded frame count = 3"
PASS_REGULAR_EXPRESSION ".*hash:match.*"
)