1cmake_minimum_required (VERSION 3.12) 2 3# Set project version from git tag or version.txt file 4function(get_versions versionstring VERSION_MAJOR VERSION_MINOR VERSION_PATCH) 5 string(REGEX REPLACE "^([vV])([0-9]*)([.][0-9]*[.][0-9]*-?.*)$" "\\2" numbers ${versionstring} ) 6 set(VERSION_MAJOR ${numbers} PARENT_SCOPE) 7 string(REGEX REPLACE "^([vV][0-9]*[.])([0-9]*)([.][0-9]*-?.*)$" "\\2" numbers ${versionstring} ) 8 set(VERSION_MINOR ${numbers} PARENT_SCOPE) 9 string(REGEX REPLACE "^([vV][0-9]*[.][0-9]*[.])([0-9]*)(-?.*)$" "\\2" numbers ${versionstring} ) 10 set(VERSION_PATCH ${numbers} PARENT_SCOPE) 11endfunction() 12 13execute_process( 14 COMMAND git describe --match "v[0-9]*.[0-9]*.[0-9]*" --abbrev=0 --tags 15 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} 16 RESULT_VARIABLE RESULT 17 OUTPUT_VARIABLE OUTPUT) 18 19if(NOT RESULT EQUAL 0) 20 find_program(GIT_COMMAND "git") 21 if(GIT_COMMAND) 22 message(WARNING "There is no valid git repository in your working directory \"${CMAKE_SOURCE_DIR}\" .") 23 else() 24 message(WARNING "You have no git tool installed.") 25 endif() 26 27 if(NOT EXISTS "${CMAKE_SOURCE_DIR}/version.txt") 28 message(FATAL_ERROR 29 "version.txt file doesn't exist!\n" 30 "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" 31 "The version string provided to version.txt must match the following format:\n\tv[VERSION_MAJOR].[VERSION_MINOR].[VERSION_PATCH]\n" 32 "To get the information on version of the downloaded library please follow the link below:\n\t https://github.com/openapv/openapv" 33 ) 34 endif() 35 36 message("Version string has been taken from version.txt file.") 37 file(STRINGS "version.txt" VERSION_STRING) 38 39else() 40 message("Version string has been taken from git tag.") 41 set(VERSION_STRING ${OUTPUT}) 42 string(REGEX REPLACE "\n$" "" VERSION_STRING "${VERSION_STRING}") 43endif() 44 45if(NOT ${VERSION_STRING} MATCHES "^([vV])([0-9]*)([.][0-9]*[.][0-9]*-?.*)$") 46 message(FATAL_ERROR "Version string ${VERSION_STRING} doesn't match required format v[VERSION_MAJOR].[VERSION_MINOR].[VERSION_PATCH]") 47endif() 48 49get_versions(${VERSION_STRING} VERSION_MAJOR VERSION_MINOR VERSION_PATCH) 50if(VERSION_MAJOR STREQUAL ${VERSION_STRING}) 51 message(FATAL_ERROR "Version string parsing error") 52endif() 53message("OAPV VERSION=${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") 54 55# Check input arguments. 56option(OAPV_APP_STATIC_BUILD "oapv_app will be statically linked against static oapv library" ON) 57if(OAPV_APP_STATIC_BUILD) 58 add_definitions(-DOAPV_STATIC_DEFINE) 59endif(OAPV_APP_STATIC_BUILD) 60 61cmake_policy(SET CMP0048 NEW) 62set(CMAKE_C_STANDARD 99) 63 64# Maps to a solution file (OAPV.sln). 65project (OAPV VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) 66set_property(GLOBAL PROPERTY USE_FOLDERS ON) 67 68# Set compiler flags and options. 69if( MSVC ) 70elseif( UNIX OR MINGW ) 71 if(NOT CMAKE_BUILD_TYPE) 72 set(CMAKE_BUILD_TYPE "Release") 73 endif() 74 message("CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}") 75 76 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") 77 set(OPT_LV "O0") 78 set(OPT_DBG "-g") 79 else() 80 set(OPT_LV "O3") 81 set(OPT_DBG "-DNDEBUG") # disable assert 82 endif() 83 84 #set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OPT_DBG} -${OPT_LV} -fomit-frame-pointer -Wall -Wno-unused-function -Wno-unused-but-set-variable -Wno-unused-variable -Wno-attributes -Werror -Wno-strict-overflow -Wno-unknown-pragmas -Wno-stringop-overflow -std=c99") 85 set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OPT_DBG} -${OPT_LV} -fomit-frame-pointer -Wall -Wno-unused-function -std=c99") 86 set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-pointer-sign -pthread -Wno-pointer-to-int-cast") 87 set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lm") 88endif() 89 90# Command to output information to the console 91message ("c Flags: " ${CMAKE_C_FLAGS}) 92message ("linker Flags: " ${CMAKE_EXE_LINKER_FLAGS}) 93 94# Sub-directories where more CMakeLists.txt exist 95add_subdirectory(src) 96add_subdirectory(app) 97 98# uninstall target 99if(NOT TARGET uninstall) 100 configure_file( 101 "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" 102 "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" 103 IMMEDIATE @ONLY) 104 105 add_custom_target(uninstall 106 COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) 107endif() 108 109# Packaging 110include(InstallRequiredSystemLibraries) 111set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") 112set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md") 113 114set(CPACK_PACKAGE_NAME "OpenAPV") 115set(CPACK_PACKAGE_VENDOR "OpenAPV") 116set(CPACK_PACKAGE_CONTACT "https://github.com/openapv/oapv") 117set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Open Advanced Professional Video Codec") 118set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}") 119set(CPACK_PACKAGE_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}") 120set(CPACK_PACKAGE_VERSION_MINOR "${PROJECT_VERSION_MINOR}") 121set(CPACK_PACKAGE_VERSION_PATCH "${PROJECT_VERSION_PATCH}") 122set(CPACK_PACKAGE_CHECKSUM MD5) 123 124set(CPACK_DEBIAN_PACKAGE_MAINTAINER "CPNCF") 125 126set(CPACK_GENERATOR "DEB") 127 128include(CPack) 129 130# Testing 131option(ENABLE_TESTS "Enable tests" ON) 132if (${ENABLE_TESTS}) 133 enable_testing() 134endif() 135 136# Test - Check if encoder starts 137add_test(NAME Encoder_runs COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_enc) 138 139# Test - Check if decoder starts 140add_test(NAME Decoder_runs COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec) 141 142# Test - encode 143add_test(NAME encode COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_enc -i ${CMAKE_CURRENT_SOURCE_DIR}/test/sequence/pattern1_yuv422p10le_320x240_25fps.y4m -o out.oapv) 144set_tests_properties(encode PROPERTIES FAIL_REGULAR_EXPRESSION "Encoded frame count = 0") 145set_tests_properties(encode PROPERTIES PASS_REGULAR_EXPRESSION "Encoded frame count = 125") 146 147# Test - decode 148add_test(NAME decode COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/oapv_app_dec -i out.oapv) 149set_tests_properties(decode PROPERTIES FAIL_REGULAR_EXPRESSION "Decoded frame count = 0") 150set_tests_properties(decode PROPERTIES PASS_REGULAR_EXPRESSION "Decoded frame count = 125") 151 152