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