CMakeLists.txt 14 KB

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