• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1cmake_minimum_required (VERSION 3.12)
2
3########################################
4# Project versioning
5########################################
6
7# Set project version from git tag or version.txt file
8function(get_versions versionstring VERSION_MAJOR VERSION_MINOR VERSION_PATCH)
9    string(REGEX REPLACE "^([vV])([0-9]*)([.][0-9]*[.][0-9]*-?.*)$" "\\2" numbers ${versionstring} )
10    set(VERSION_MAJOR ${numbers} PARENT_SCOPE)
11    string(REGEX REPLACE "^([vV][0-9]*[.])([0-9]*)([.][0-9]*-?.*)$" "\\2" numbers ${versionstring} )
12    set(VERSION_MINOR ${numbers} PARENT_SCOPE)
13    string(REGEX REPLACE "^([vV][0-9]*[.][0-9]*[.])([0-9]*)(-?.*)$" "\\2" numbers ${versionstring} )
14    set(VERSION_PATCH ${numbers} PARENT_SCOPE)
15endfunction()
16
17execute_process(
18    COMMAND git describe --match "v[0-9]*.[0-9]*.[0-9]*" --abbrev=0 --tags
19    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
20    RESULT_VARIABLE RESULT
21    OUTPUT_VARIABLE OUTPUT)
22
23if(NOT RESULT EQUAL 0)
24  find_program(GIT_COMMAND "git")
25  if(GIT_COMMAND)
26    message(WARNING "There is no valid git repository in your working directory \"${CMAKE_SOURCE_DIR}\" .")
27  else()
28    message(WARNING "You have no git tool installed.")
29  endif()
30
31  if(NOT EXISTS "${CMAKE_SOURCE_DIR}/version.txt")
32    message(FATAL_ERROR
33        "version.txt file doesn't exist!\n"
34        "Since your working directory doesn't contain a git repository you must provide \"${CMAKE_SOURCE_DIR}/version.txt\" file containing a valid version string.\n"
35        "The version string provided to version.txt must match the following format:\n\tv[VERSION_MAJOR].[VERSION_MINOR].[VERSION_PATCH]\n"
36        "To get the information on version of the downloaded library please follow the link below:\n\t https://github.com/AcademySoftwareFoundation/openapv"
37        )
38  endif()
39
40  message("Version string has been taken from version.txt file.")
41  file(STRINGS "version.txt" VERSION_STRING)
42
43else()
44  message("Version string has been taken from git tag.")
45  set(VERSION_STRING ${OUTPUT})
46  string(REGEX REPLACE "\n$" "" VERSION_STRING "${VERSION_STRING}")
47endif()
48
49if(NOT ${VERSION_STRING} MATCHES "^([vV])([0-9]*)([.][0-9]*[.][0-9]*-?.*)$")
50  message(FATAL_ERROR "Version string ${VERSION_STRING} doesn't match required format v[VERSION_MAJOR].[VERSION_MINOR].[VERSION_PATCH]")
51endif()
52
53get_versions(${VERSION_STRING} VERSION_MAJOR VERSION_MINOR VERSION_PATCH)
54if(VERSION_MAJOR STREQUAL ${VERSION_STRING})
55  message(FATAL_ERROR "Version string parsing error")
56endif()
57message("OAPV VERSION=${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
58
59project (OAPV VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH} LANGUAGES C)
60
61########################################
62# Input arguments.
63########################################
64
65# Check input arguments.
66option(OAPV_APP_STATIC_BUILD "oapv_app will be statically linked against static oapv library" ON)
67if(OAPV_APP_STATIC_BUILD)
68    add_definitions(-DOAPV_STATIC_DEFINE)
69endif(OAPV_APP_STATIC_BUILD)
70
71# To build for arm provide in command line: -DARM=TRUE
72if(NOT ARM)
73  set(ARM "FALSE")
74else()
75  add_definitions(-DARM=1)
76  set(ARM "TRUE")
77endif()
78
79########################################
80# Compilation flags
81########################################
82
83# Set compiler flags and options.
84if( MSVC )
85  message("Not supported yet!")
86elseif( UNIX OR MINGW )
87    if(NOT CMAKE_BUILD_TYPE)
88        set(CMAKE_BUILD_TYPE "Release")
89    endif()
90    message("CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")
91
92    if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
93        set(OPT_LV "O0")
94        set(OPT_DBG "-g")
95    else()
96        set(OPT_LV "O3")
97        set(OPT_DBG "-DNDEBUG") # disable assert
98    endif()
99
100    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OPT_DBG} -${OPT_LV} -fomit-frame-pointer -pthread -std=c99")
101    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-unused-function -Wno-pointer-sign -Wno-pointer-to-int-cast")
102    set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lm")
103else()
104    message("Unknown compiler")
105endif()
106
107# Command to output information to the console
108message ("c Flags: " ${CMAKE_C_FLAGS})
109message ("linker Flags: " ${CMAKE_EXE_LINKER_FLAGS})
110
111########################################
112# Configuration
113########################################
114
115set(CMAKE_C_STANDARD 99)
116cmake_policy(SET CMP0048 NEW)
117set_property(GLOBAL PROPERTY USE_FOLDERS ON)
118
119# Sub-directories where more CMakeLists.txt exist
120add_subdirectory(src)
121add_subdirectory(app)
122
123########################################
124# Targets
125########################################
126
127# uninstall target
128if(NOT TARGET uninstall)
129  configure_file(
130    "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
131    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
132    IMMEDIATE @ONLY)
133
134  add_custom_target(uninstall
135    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
136endif()
137
138########################################
139# CPack project packaging
140########################################
141# Check the operating system
142if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
143    message(STATUS "Linux system")
144    # Read the /etc/os-release file to determine the distribution
145    file(READ "/etc/os-release" OS_RELEASE_CONTENT)
146
147    if(OS_RELEASE_CONTENT MATCHES "ID=debian" OR OS_RELEASE_CONTENT MATCHES "ID=ubuntu")
148        message(STATUS "Debian-based system detected")
149        message(STATUS "Use DEB generator while generating installation package using CPack")
150        set(CPACK_GENERATOR "DEB")
151    elseif(OS_RELEASE_CONTENT MATCHES "ID=rhel" OR OS_RELEASE_CONTENT MATCHES "ID=fedora" OR OS_RELEASE_CONTENT MATCHES "ID=centos")
152        message(STATUS "Red Hat-based system detected")
153        message(STATUS "Use RPM generator while generating installation package using CPack")
154        set(CPACK_GENERATOR "RPM")
155    elseif(OS_RELEASE_CONTENT MATCHES "ID=opensuse")
156        message(STATUS "SUSE-based system detected")
157        message(STATUS "Use RPM generator while generating installation package using CPack")
158        set(CPACK_GENERATOR "RPM")
159    else()
160        message(STATUS "Other Linux distribution detected")
161        message(STATUS "Use TGZ generator while generating installation package using CPack")
162        set(CPACK_GENERATOR "TGZ")
163    endif()
164
165elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
166    message(STATUS "Windows system")
167
168    if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
169        # Check if the compiler path contains 'ucrt64'
170        if(CMAKE_C_COMPILER MATCHES "ucrt64")
171            message(STATUS "UCRT64 environment detected")
172            message(STATUS "Use NSIS generator while generating installation package using CPack")
173            set(CPACK_GENERATOR "NSIS")
174        else()
175            message(STATUS "Not using UCRT64 compiler. Compiler ID: ${CMAKE_C_COMPILER}")
176            message(STATUS "Use TGZ generator while generating installation package using CPack")
177            set(CPACK_GENERATOR "TGZ")
178        endif()
179    # Check if the compiler is MSVC
180    elseif(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
181        message(STATUS "Using Microsoft Visual Studio (MSVC) compiler")
182        message(STATUS "Use NSIS generator while generating installation package using CPack")
183        set(CPACK_GENERATOR "NSIS")
184    else()
185        message(STATUS "Not using MSVC compiler. Compiler ID: ${CMAKE_C_COMPILER_ID}.")
186        message(STATUS "Use ZIP generator while generating installation package using CPack")
187        set(CPACK_GENERATOR "ZIP")
188    endif()
189else()
190    message(STATUS "Other OS: ${CMAKE_SYSTEM_NAME}")
191    message(STATUS "Use ZIP generator while generating installation package using CPack")
192    set(CPACK_GENERATOR "ZIP")
193endif()
194
195# Packaging
196include(InstallRequiredSystemLibraries)
197set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
198set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
199
200set(CPACK_PACKAGE_NAME "OpenAPV")
201set(CPACK_PACKAGE_VENDOR "AcademySoftwareFoundation")
202set(CPACK_PACKAGE_CONTACT "https://github.com/AcademySoftwareFoundation")
203set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.com/AcademySoftwareFoundation/openapv/releases")
204set(CMAKE_PROJECT_HOMEPAGE_URL "https://github.com/AcademySoftwareFoundation/openapv")
205set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Open Advanced Professional Video Codec")
206set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
207set(CPACK_PACKAGE_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}")
208set(CPACK_PACKAGE_VERSION_MINOR "${PROJECT_VERSION_MINOR}")
209set(CPACK_PACKAGE_VERSION_PATCH "${PROJECT_VERSION_PATCH}")
210set(CPACK_PACKAGE_CHECKSUM MD5)
211
212set(CPACK_DEBIAN_PACKAGE_MAINTAINER "AcademySoftwareFoundation")
213set(CPACK_DEBIAN_PACKAGE_SECTION "video")
214set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT")
215
216include(CPack)
217
218########################################
219# Testing
220########################################
221
222option(ENABLE_TESTS "Enable tests" ON)
223if (${ENABLE_TESTS})
224    enable_testing()
225endif()
226
227# Test - Check if encoder starts
228add_test(NAME Encoder_runs COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_enc)
229
230# Test - Check if decoder starts
231add_test(NAME Decoder_runs COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec)
232
233# Test - encode
234add_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)
235set_tests_properties(encode PROPERTIES
236    TIMEOUT 20
237    FAIL_REGULAR_EXPRESSION "Encoded frame count               = 0"
238    PASS_REGULAR_EXPRESSION "Encoded frame count               = 125"
239    RUN_SERIAL TRUE
240)
241
242# Test - decode
243add_test(NAME decode COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec -i out.oapv)
244set_tests_properties(decode PROPERTIES
245    TIMEOUT 10
246    DEPENDS encode
247    FAIL_REGULAR_EXPRESSION "Decoded frame count               = 0"
248    PASS_REGULAR_EXPRESSION "Decoded frame count               = 125"
249    RUN_SERIAL TRUE
250)
251