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