1# ---------------------------------------------------------------------------- 2# Root CMake file for Rockchip Media Process Platform (MPP) 3# 4# - 10:34 2015/7/27: Initial version <herman.chen@rock-chips.com> 5# 6# ---------------------------------------------------------------------------- 7 8# vim: syntax=cmake 9set(CMAKE_POLICY_VERSION_MINIMUM 3.5) 10if(NOT CMAKE_BUILD_TYPE) 11 # default to Release build for GCC builds 12 set(CMAKE_BUILD_TYPE Debug CACHE STRING 13 "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." 14 FORCE) 15endif() 16message(STATUS "cmake version ${CMAKE_VERSION}") 17 18# Search packages for host system instead of packages for target system 19# in case of cross compilation these macro should be defined by toolchain file 20if(NOT COMMAND find_host_package) 21 macro(find_host_package) 22 find_package(${ARGN}) 23 endmacro() 24endif() 25if(NOT COMMAND find_host_program) 26 macro(find_host_program) 27 find_program(${ARGN}) 28 endmacro() 29endif() 30 31project (rk_mpp) 32 33cmake_minimum_required (VERSION 2.8.8) # OBJECT libraries require 2.8.8 34include(CheckIncludeFiles) 35include(CheckFunctionExists) 36include(CheckSymbolExists) 37include(CheckCXXCompilerFlag) 38 39# setup output library name 40# Linux default name - rockchip_mpp and rockchip_vpu 41# Android default name - mpp and vpu 42# For historical reason libraries on Android is named as mpp and vpu. But for 43# better naming rule on Linux it should add vendor prefix. 44# So we use this ugly method to avoid massive maintain issue. 45if (NOT MPP_PROJECT_NAME) 46 set(MPP_PROJECT_NAME rockchip_mpp) 47endif() 48set(MPP_STATIC ${MPP_PROJECT_NAME}_static) 49set(MPP_SHARED ${MPP_PROJECT_NAME}) 50 51if (NOT VPU_PROJECT_NAME) 52 set(VPU_PROJECT_NAME rockchip_vpu) 53endif() 54set(VPU_STATIC ${VPU_PROJECT_NAME}_static) 55set(VPU_SHARED ${VPU_PROJECT_NAME}) 56 57# ---------------------------------------------------------------------------- 58# set property to classify library kinds 59# ---------------------------------------------------------------------------- 60set_property(GLOBAL PROPERTY USE_FOLDERS ON) 61set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMakeTargets") 62# ---------------------------------------------------------------------------- 63# enable test in this project 64# ---------------------------------------------------------------------------- 65option(BUILD_TEST "enable test binary building)" ON) 66# ---------------------------------------------------------------------------- 67# export json compile commands 68# ---------------------------------------------------------------------------- 69set(CMAKE_EXPORT_COMPILE_COMMANDS true) 70 71# ---------------------------------------------------------------------------- 72# System architecture detection 73# ---------------------------------------------------------------------------- 74string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" SYSPROC) 75set(X86_ALIASES x86 i386 i686 x86_64 amd64) 76list(FIND X86_ALIASES "${SYSPROC}" X86MATCH) 77if("${CMAKE_C_COMPILER}" MATCHES "-buildroot-[^/]+$") 78 message(STATUS "Detected Buildroot toolchain") 79 # Use buildroot toolchain's default architecture settings 80elseif("${SYSPROC}" STREQUAL "" OR X86MATCH GREATER "-1") 81 message(STATUS "Detected x86 system processor") 82 set(X86 true) 83 add_definitions(-DARCH_X86=1) 84 if("${CMAKE_SIZEOF_VOID_P}" MATCHES 8) 85 set(X64 true) 86 add_definitions(-DARCH_X64=1) 87 message(STATUS "Define X86_64 to 1") 88 endif() 89elseif(${SYSPROC} STREQUAL "armv6l") 90 message(STATUS "Detected ARMv6 system processor") 91 set(ARM true) 92 set(ARMEABI_V6 true) 93elseif(${SYSPROC} STREQUAL "armv7-a") 94 message(STATUS "Detected ARMv7 system processor") 95 set(ARM true) 96 set(ARMEABI_V7A true) 97elseif(${SYSPROC} STREQUAL "armv7-a_hardfp" OR ${SYSPROC} STREQUAL "armv7l") 98 message(STATUS "Detected ARMv7 system processor") 99 set(ARM true) 100 set(ARMEABI_V7A_HARDFP true) 101elseif(${SYSPROC} STREQUAL "aarch64" OR ${SYSPROC} STREQUAL "armv8-a") 102 message(STATUS "Detected ARMv8 system processor") 103 set(ARM true) 104 set(ARMEABI_V8 true) 105else() 106 message(STATUS "CMAKE_SYSTEM_PROCESSOR value `${CMAKE_SYSTEM_PROCESSOR}` is unknown") 107 message(STATUS "Please add this value near ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE}") 108endif() 109 110if(UNIX) 111 SET(PLATFORM_LIBS pthread) 112 if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 113 SET(PLATFORM_LIBS ${PLATFORM_LIBS} rt) 114 endif() 115endif(UNIX) 116 117# ---------------------------------------------------------------------------- 118# Compiler detection 119# ---------------------------------------------------------------------------- 120if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") 121 set(CLANG true) 122endif() 123if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") 124 set(GCC true) 125endif() 126 127if(GCC) 128 if(ARM) 129 if(ARMEABI_V6) 130 add_definitions(-march=armv6 -mfloat-abi=hard -mfpu=vfp) 131 elseif(ARMEABI_V7A) 132 add_definitions(-march=armv7-a -mfloat-abi=softfp -mfpu=neon) 133 elseif(ARMEABI_V7A_HARDFP) 134 add_definitions(-march=armv7-a -mfloat-abi=hard -mfpu=neon) 135 elseif(ARMEABI_V8) 136 add_definitions(-march=armv8-a) 137 endif() 138 else() 139 if(X86 AND NOT X64) 140 add_definitions(-march=i686) 141 endif() 142 endif() 143 144 if(${CMAKE_BUILD_TYPE} MATCHES "Release") 145 # remove -g option for high version ndk 146 string(REGEX REPLACE "-g[^ ]*" "" TMP "${CMAKE_C_FLAGS}") 147 string(REGEX REPLACE "[ ]+" " " CMAKE_C_FLAGS "${TMP}") 148 string(REGEX REPLACE "-g[^ ]*" "" TMP "${CMAKE_CXX_FLAGS}") 149 string(REGEX REPLACE "[ ]+" " " CMAKE_CXX_FLAGS "${TMP}") 150 151 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -DNDEBUG") 152 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -DNDEBUG") 153 else() 154 add_definitions(-g) 155 endif() 156 157 # disable multichar warning 158 add_definitions(-Wno-multichar) 159 # add PIC flag 160 add_definitions(-fPIC) 161 # disable exception for C++ 162 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -fno-rtti") 163 # save intermediate files 164 # add_definitions(-save-temps) 165 166 # check library mvec 167 find_library(LMVEC_LIB mvec) 168 if(LMVEC_LIB) 169 set(LIBM mvec m) 170 set(MPP_PKGCONFIG_DEPENDENT_LIBS "-lmvec -lm") 171 else() 172 set(LIBM m) 173 set(MPP_PKGCONFIG_DEPENDENT_LIBS "-lm") 174 add_definitions(-fno-builtin-pow) 175 endif() 176 177 # for libary linking 178 set(BEGIN_WHOLE_ARCHIVE -Wl,--whole-archive) 179 set(END_WHOLE_ARCHIVE -Wl,--no-whole-archive) 180 181 option(ASAN_CHECK "enable Address Sanitizer (Asan)" OFF) 182 if(ASAN_CHECK) 183 add_definitions(-fsanitize=address -static-libasan -g) 184 set(ASAN_LIB libasan.a dl rt m) 185 set(ASAN_BIN dl rt m) 186 endif(ASAN_CHECK) 187endif(GCC) 188 189# ---------------------------------------------------------------------------- 190# Create git version information 191# ---------------------------------------------------------------------------- 192set(VERSION_CNT 0) 193set(VERSION_MAX_CNT 9) 194set(VERSION_INFO "\"unknown mpp version for missing VCS info\"") 195foreach (CNT RANGE ${VERSION_MAX_CNT}) 196 set(VERSION_HISTORY_${CNT} "NULL") 197endforeach(CNT) 198 199if(EXISTS "${PROJECT_SOURCE_DIR}/.git") 200 find_host_package(Git) 201 if(GIT_FOUND) 202 # get current version info 203 set(GIT_LOG_FORMAT "%h author: %<|(30)%an %cd %s") 204 205 execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --oneline --date=short --pretty=format:${GIT_LOG_FORMAT} 206 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} 207 OUTPUT_VARIABLE EXEC_OUT 208 ERROR_VARIABLE EXEC_ERROR 209 RESULT_VARIABLE EXEC_RET 210 OUTPUT_STRIP_TRAILING_WHITESPACE 211 ERROR_STRIP_TRAILING_WHITESPACE) 212 213 if (NOT EXEC_RET) 214 set(VERSION_INFO ${EXEC_OUT}) 215 message(STATUS "current version:") 216 message(STATUS "${VERSION_INFO}") 217 string(REPLACE "\"" "\\\"" VERSION_INFO ${VERSION_INFO}) 218 set(VERSION_INFO "\"${VERSION_INFO}\"") 219 else() 220 message(STATUS "git ret ${EXEC_RET}") 221 message(STATUS "${EXEC_ERROR}") 222 endif() 223 224 set(GIT_LOG_FORMAT "%h author: %<|(30)%an %cd %s %d") 225 226 # get history version information 227 # setup logs 228 message(STATUS "git version history:") 229 foreach (CNT RANGE ${VERSION_MAX_CNT}) 230 execute_process(COMMAND ${GIT_EXECUTABLE} log HEAD~${CNT} -1 --oneline --date=short --pretty=format:${GIT_LOG_FORMAT} 231 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} 232 OUTPUT_VARIABLE EXEC_OUT 233 ERROR_VARIABLE EXEC_ERROR 234 RESULT_VARIABLE EXEC_RET 235 OUTPUT_STRIP_TRAILING_WHITESPACE 236 ERROR_STRIP_TRAILING_WHITESPACE) 237 238 if (NOT EXEC_RET) 239 set(VERSION_LOG ${EXEC_OUT}) 240 string(REPLACE "\"" "\\\"" VERSION_LOG ${VERSION_LOG}) 241 message(STATUS ${VERSION_LOG}) 242 set(VERSION_HISTORY_${CNT} "\"${VERSION_LOG}\"") 243 math(EXPR VERSION_CNT "${VERSION_CNT}+1") 244 endif() 245 endforeach(CNT) 246 message(STATUS "total ${VERSION_CNT} git version recorded") 247 endif() 248 249 # add git hooks 250 if (EXISTS "${PROJECT_SOURCE_DIR}/tools/hooks/") 251 set(GIT_HOOK_SRC "${PROJECT_SOURCE_DIR}/tools/hooks/") 252 if(EXISTS "${PROJECT_SOURCE_DIR}/.git/hooks") 253 set(GIT_HOOK_DST "${PROJECT_SOURCE_DIR}/.git/hooks/") 254 file(COPY ${GIT_HOOK_SRC} DESTINATION ${GIT_HOOK_DST}) 255 message(STATUS "Install git hooks done") 256 endif(EXISTS "${PROJECT_SOURCE_DIR}/.git/hooks") 257 endif(EXISTS "${PROJECT_SOURCE_DIR}/tools/hooks/") 258endif(EXISTS "${PROJECT_SOURCE_DIR}/.git") 259 260configure_file( 261 "${PROJECT_SOURCE_DIR}/build/cmake/version.in" 262 "${PROJECT_SOURCE_DIR}/mpp/version.h" 263) 264 265# ---------------------------------------------------------------------------- 266# Build options 267# ---------------------------------------------------------------------------- 268find_package(PkgConfig) 269INCLUDE(GNUInstallDirs) 270pkg_search_module(PTHREAD pthread) 271 272# ---------------------------------------------------------------------------- 273# Set Warning as Error 274# ---------------------------------------------------------------------------- 275option(WARNINGS_AS_ERRORS "Stop compiles on first warning" OFF) 276if(WARNINGS_AS_ERRORS) 277 if(GCC) 278 add_definitions(-Werror) 279 elseif(MSVC) 280 add_definitions(/WX) 281 endif() 282endif(WARNINGS_AS_ERRORS) 283 284# ---------------------------------------------------------------------------- 285# look for stdint.h 286# ---------------------------------------------------------------------------- 287if(MSVC) 288 check_include_files(stdint.h HAVE_STDINT_H) 289 if(NOT HAVE_STDINT_H) 290 include_directories(osal/windows) 291 endif(NOT HAVE_STDINT_H) 292endif(MSVC) 293 294# ---------------------------------------------------------------------------- 295# Share library option 296# ---------------------------------------------------------------------------- 297option(BUILD_SHARED_LIBS "Build shared library" ON) 298 299# ---------------------------------------------------------------------------- 300# scan all LOG_TAG for log information and generate module header file 301# ---------------------------------------------------------------------------- 302set( module_list "" ) 303file ( GLOB_RECURSE ALL_SRC . *.c;*.cpp ) 304foreach( files ${ALL_SRC} ) 305 file( STRINGS ${files} module_tag_line REGEX "MODULE_TAG( )+\".+\"" ) 306 if(module_tag_line) 307 string( REGEX REPLACE "^(.)* MODULE_TAG( )+\"(.*)\"" \\3 module_tag ${module_tag_line} ) 308 list( APPEND module_list ${module_tag} ) 309 endif() 310endforeach() 311list( SORT module_list ) 312list( LENGTH module_list module_size ) 313#message(STATUS "module_list: ${module_list}") 314#message(STATUS "module_size: ${module_size}") 315 316# ---------------------------------------------------------------------------- 317# Start module definition 318# ---------------------------------------------------------------------------- 319# project overall include file 320include_directories(inc) 321# small utile functions for test case 322include_directories(utils) 323 324# ---------------------------------------------------------------------------- 325# osal library 326# ---------------------------------------------------------------------------- 327# Operation System Abstract Layer (OSAL) include 328include_directories(osal/inc) 329# OSAL is needed on all platform, do not need option 330add_subdirectory(osal) 331 332# Media Process Platform include 333include_directories(mpp/inc) 334include_directories(mpp/base/inc) 335# Kernel Media Process Platform include 336include_directories(kmpp/inc) 337include_directories(kmpp/base/inc) 338 339# ---------------------------------------------------------------------------- 340# utils for test case 341# ---------------------------------------------------------------------------- 342add_subdirectory(utils) 343 344# ---------------------------------------------------------------------------- 345# Kernel Media Process Platform library 346# ---------------------------------------------------------------------------- 347add_subdirectory(kmpp) 348 349# ---------------------------------------------------------------------------- 350# Media Process Platform library 351# ---------------------------------------------------------------------------- 352add_subdirectory(mpp) 353 354# ---------------------------------------------------------------------------- 355# test / demo 356# ---------------------------------------------------------------------------- 357add_subdirectory(test) 358 359# ---------------------------------------------------------------------------- 360# install headers 361# ---------------------------------------------------------------------------- 362install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/inc/ 363 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/rockchip" 364 FILES_MATCHING PATTERN "*.h" 365 ) 366 367# ---------------------------------------------------------------------------- 368# pkgconfig 369# ---------------------------------------------------------------------------- 370CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/pkgconfig/rockchip_mpp.pc.cmake" 371 "${CMAKE_BINARY_DIR}/rockchip_mpp.pc" @ONLY) 372CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/pkgconfig/rockchip_vpu.pc.cmake" 373 "${CMAKE_BINARY_DIR}/rockchip_vpu.pc" @ONLY) 374install(FILES "${CMAKE_BINARY_DIR}/rockchip_mpp.pc" 375 DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig/") 376install(FILES "${CMAKE_BINARY_DIR}/rockchip_vpu.pc" 377 DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig/") 378