mirror of
https://github.com/rockchip-linux/mpp.git
synced 2024-11-23 01:53:59 +08:00
9f9986752f
Signed-off-by: MarcA711 <40744649+MarcA711@users.noreply.github.com> Signed-off-by: Herman Chen <herman.chen@rock-chips.com> Change-Id: I4bd4a7543584685b20089d3953e700f5612523e7
368 lines
14 KiB
CMake
368 lines
14 KiB
CMake
# ----------------------------------------------------------------------------
|
|
# Root CMake file for Rockchip Media Process Platform (MPP)
|
|
#
|
|
# - 10:34 2015/7/27: Initial version <herman.chen@rock-chips.com>
|
|
#
|
|
# ----------------------------------------------------------------------------
|
|
|
|
# vim: syntax=cmake
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
# default to Release build for GCC builds
|
|
set(CMAKE_BUILD_TYPE Debug CACHE STRING
|
|
"Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel."
|
|
FORCE)
|
|
endif()
|
|
message(STATUS "cmake version ${CMAKE_VERSION}")
|
|
|
|
# Search packages for host system instead of packages for target system
|
|
# in case of cross compilation these macro should be defined by toolchain file
|
|
if(NOT COMMAND find_host_package)
|
|
macro(find_host_package)
|
|
find_package(${ARGN})
|
|
endmacro()
|
|
endif()
|
|
if(NOT COMMAND find_host_program)
|
|
macro(find_host_program)
|
|
find_program(${ARGN})
|
|
endmacro()
|
|
endif()
|
|
|
|
project (rk_mpp)
|
|
|
|
cmake_minimum_required (VERSION 2.8.8) # OBJECT libraries require 2.8.8
|
|
include(CheckIncludeFiles)
|
|
include(CheckFunctionExists)
|
|
include(CheckSymbolExists)
|
|
include(CheckCXXCompilerFlag)
|
|
|
|
# setup output library name
|
|
# Linux default name - rockchip_mpp and rockchip_vpu
|
|
# Android default name - mpp and vpu
|
|
# For historical reason libraries on Android is named as mpp and vpu. But for
|
|
# better naming rule on Linux it should add vendor prefix.
|
|
# So we use this ugly method to avoid massive maintain issue.
|
|
if (NOT MPP_PROJECT_NAME)
|
|
set(MPP_PROJECT_NAME rockchip_mpp)
|
|
endif()
|
|
set(MPP_STATIC ${MPP_PROJECT_NAME}_static)
|
|
set(MPP_SHARED ${MPP_PROJECT_NAME})
|
|
|
|
if (NOT VPU_PROJECT_NAME)
|
|
set(VPU_PROJECT_NAME rockchip_vpu)
|
|
endif()
|
|
set(VPU_STATIC ${VPU_PROJECT_NAME}_static)
|
|
set(VPU_SHARED ${VPU_PROJECT_NAME})
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# set property to classify library kinds
|
|
# ----------------------------------------------------------------------------
|
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
|
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMakeTargets")
|
|
# ----------------------------------------------------------------------------
|
|
# enable test in this project
|
|
# ----------------------------------------------------------------------------
|
|
option(BUILD_TEST "enable test binary building)" ON)
|
|
# ----------------------------------------------------------------------------
|
|
# export json compile commands
|
|
# ----------------------------------------------------------------------------
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS true)
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# System architecture detection
|
|
# ----------------------------------------------------------------------------
|
|
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" SYSPROC)
|
|
set(X86_ALIASES x86 i386 i686 x86_64 amd64)
|
|
list(FIND X86_ALIASES "${SYSPROC}" X86MATCH)
|
|
if("${CMAKE_C_COMPILER}" MATCHES "-buildroot-[^/]+$")
|
|
message(STATUS "Detected Buildroot toolchain")
|
|
# Use buildroot toolchain's default architecture settings
|
|
elseif("${SYSPROC}" STREQUAL "" OR X86MATCH GREATER "-1")
|
|
message(STATUS "Detected x86 system processor")
|
|
set(X86 true)
|
|
add_definitions(-DARCH_X86=1)
|
|
if("${CMAKE_SIZEOF_VOID_P}" MATCHES 8)
|
|
set(X64 true)
|
|
add_definitions(-DARCH_X64=1)
|
|
message(STATUS "Define X86_64 to 1")
|
|
endif()
|
|
elseif(${SYSPROC} STREQUAL "armv6l")
|
|
message(STATUS "Detected ARMv6 system processor")
|
|
set(ARM true)
|
|
set(ARMEABI_V6 true)
|
|
elseif(${SYSPROC} STREQUAL "armv7-a")
|
|
message(STATUS "Detected ARMv7 system processor")
|
|
set(ARM true)
|
|
set(ARMEABI_V7A true)
|
|
elseif(${SYSPROC} STREQUAL "armv7-a_hardfp" OR ${SYSPROC} STREQUAL "armv7l")
|
|
message(STATUS "Detected ARMv7 system processor")
|
|
set(ARM true)
|
|
set(ARMEABI_V7A_HARDFP true)
|
|
elseif(${SYSPROC} STREQUAL "aarch64" OR ${SYSPROC} STREQUAL "armv8-a")
|
|
message(STATUS "Detected ARMv8 system processor")
|
|
set(ARM true)
|
|
set(ARMEABI_V8 true)
|
|
else()
|
|
message(STATUS "CMAKE_SYSTEM_PROCESSOR value `${CMAKE_SYSTEM_PROCESSOR}` is unknown")
|
|
message(STATUS "Please add this value near ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE}")
|
|
endif()
|
|
|
|
if(UNIX)
|
|
SET(PLATFORM_LIBS pthread)
|
|
if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|
SET(PLATFORM_LIBS ${PLATFORM_LIBS} rt)
|
|
endif()
|
|
endif(UNIX)
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# Compiler detection
|
|
# ----------------------------------------------------------------------------
|
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
|
set(CLANG true)
|
|
endif()
|
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
|
|
set(INTEL_CXX true)
|
|
endif()
|
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|
set(GCC true)
|
|
endif()
|
|
|
|
if(INTEL_CXX AND UNIX)
|
|
# treat icpc roughly like gcc
|
|
set(GCC true)
|
|
add_definitions(-Wall -Wextra -Wshadow)
|
|
elseif(CLANG)
|
|
# treat clang roughly like gcc
|
|
set(GCC true)
|
|
add_definitions(-Wall -Wextra -Wshadow -ffast-math)
|
|
elseif(CMAKE_COMPILER_IS_GNUCXX)
|
|
add_definitions(-Wall -Wextra -Wshadow -ffast-math)
|
|
check_cxx_compiler_flag(-Wno-narrowing GCC_HAS_NO_NARROWING)
|
|
check_cxx_compiler_flag(-mstackrealign GCC_HAS_STACK_REALIGN)
|
|
if (GCC_HAS_STACK_REALIGN)
|
|
add_definitions(-mstackrealign)
|
|
endif()
|
|
execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
|
|
endif()
|
|
|
|
if(GCC)
|
|
if(ARM)
|
|
if(ARMEABI_V6)
|
|
add_definitions(-march=armv6 -mfloat-abi=hard -mfpu=vfp)
|
|
elseif(ARMEABI_V7A)
|
|
add_definitions(-march=armv7-a -mfloat-abi=softfp -mfpu=neon)
|
|
elseif(ARMEABI_V7A_HARDFP)
|
|
add_definitions(-march=armv7-a -mfloat-abi=hard -mfpu=neon)
|
|
elseif(ARMEABI_V8)
|
|
add_definitions(-march=armv8-a)
|
|
endif()
|
|
else()
|
|
if(X86 AND NOT X64)
|
|
add_definitions(-march=i686)
|
|
endif()
|
|
endif()
|
|
|
|
if(NOT ${CMAKE_BUILD_TYPE} MATCHES "Release")
|
|
add_definitions(-g)
|
|
endif()
|
|
|
|
# disable multichar warning
|
|
add_definitions(-Wno-multichar)
|
|
# add PIC flag
|
|
add_definitions(-fPIC)
|
|
# disable exception for C++
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -fno-rtti")
|
|
# save intermediate files
|
|
# add_definitions(-save-temps)
|
|
|
|
# for libary linking
|
|
set(BEGIN_WHOLE_ARCHIVE -Wl,--whole-archive)
|
|
set(END_WHOLE_ARCHIVE -Wl,--no-whole-archive)
|
|
|
|
option(ASAN_CHECK "enable Address Sanitizer (Asan)" OFF)
|
|
if(ASAN_CHECK)
|
|
add_definitions(-fsanitize=address -static-libasan -g)
|
|
set(ASAN_LIB libasan.a dl rt m)
|
|
set(ASAN_BIN dl rt m)
|
|
endif(ASAN_CHECK)
|
|
endif(GCC)
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# Create git version information
|
|
# ----------------------------------------------------------------------------
|
|
set(VERSION_CNT 0)
|
|
set(VERSION_MAX_CNT 9)
|
|
set(VERSION_INFO "\"unknown mpp version for missing VCS info\"")
|
|
foreach (CNT RANGE ${VERSION_MAX_CNT})
|
|
set(VERSION_HISTORY_${CNT} "NULL")
|
|
endforeach(CNT)
|
|
|
|
if(EXISTS "${PROJECT_SOURCE_DIR}/.git")
|
|
find_host_package(Git)
|
|
if(GIT_FOUND)
|
|
# get current version info
|
|
set(GIT_LOG_FORMAT "%h author: %<|(30)%an %cd %s")
|
|
|
|
execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --oneline --date=short --pretty=format:${GIT_LOG_FORMAT}
|
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
|
OUTPUT_VARIABLE EXEC_OUT
|
|
ERROR_VARIABLE EXEC_ERROR
|
|
RESULT_VARIABLE EXEC_RET
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
ERROR_STRIP_TRAILING_WHITESPACE)
|
|
|
|
if (NOT EXEC_RET)
|
|
set(VERSION_INFO ${EXEC_OUT})
|
|
message(STATUS "current version:")
|
|
message(STATUS "${VERSION_INFO}")
|
|
string(REPLACE "\"" "\\\"" VERSION_INFO ${VERSION_INFO})
|
|
set(VERSION_INFO "\"${VERSION_INFO}\"")
|
|
else()
|
|
message(STATUS "git ret ${EXEC_RET}")
|
|
message(STATUS "${EXEC_ERROR}")
|
|
endif()
|
|
|
|
set(GIT_LOG_FORMAT "%h author: %<|(30)%an %cd %s %d")
|
|
|
|
# get history version information
|
|
# setup logs
|
|
message(STATUS "git version history:")
|
|
foreach (CNT RANGE ${VERSION_MAX_CNT})
|
|
execute_process(COMMAND ${GIT_EXECUTABLE} log HEAD~${CNT} -1 --oneline --date=short --pretty=format:${GIT_LOG_FORMAT}
|
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
|
OUTPUT_VARIABLE EXEC_OUT
|
|
ERROR_VARIABLE EXEC_ERROR
|
|
RESULT_VARIABLE EXEC_RET
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
ERROR_STRIP_TRAILING_WHITESPACE)
|
|
|
|
if (NOT EXEC_RET)
|
|
set(VERSION_LOG ${EXEC_OUT})
|
|
string(REPLACE "\"" "\\\"" VERSION_LOG ${VERSION_LOG})
|
|
message(STATUS ${VERSION_LOG})
|
|
set(VERSION_HISTORY_${CNT} "\"${VERSION_LOG}\"")
|
|
math(EXPR VERSION_CNT "${VERSION_CNT}+1")
|
|
endif()
|
|
endforeach(CNT)
|
|
message(STATUS "total ${VERSION_CNT} git version recorded")
|
|
endif()
|
|
|
|
# add git hooks
|
|
if (EXISTS "${PROJECT_SOURCE_DIR}/tools/hooks/")
|
|
set(GIT_HOOK_SRC "${PROJECT_SOURCE_DIR}/tools/hooks/")
|
|
if(EXISTS "${PROJECT_SOURCE_DIR}/.git/hooks")
|
|
set(GIT_HOOK_DST "${PROJECT_SOURCE_DIR}/.git/hooks/")
|
|
file(COPY ${GIT_HOOK_SRC} DESTINATION ${GIT_HOOK_DST})
|
|
message(STATUS "Install git hooks done")
|
|
endif(EXISTS "${PROJECT_SOURCE_DIR}/.git/hooks")
|
|
endif(EXISTS "${PROJECT_SOURCE_DIR}/tools/hooks/")
|
|
endif(EXISTS "${PROJECT_SOURCE_DIR}/.git")
|
|
|
|
configure_file(
|
|
"${PROJECT_SOURCE_DIR}/build/cmake/version.in"
|
|
"${PROJECT_SOURCE_DIR}/mpp/version.h"
|
|
)
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# Build options
|
|
# ----------------------------------------------------------------------------
|
|
find_package(PkgConfig)
|
|
INCLUDE(GNUInstallDirs)
|
|
pkg_search_module(PTHREAD pthread)
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# Set Warning as Error
|
|
# ----------------------------------------------------------------------------
|
|
option(WARNINGS_AS_ERRORS "Stop compiles on first warning" OFF)
|
|
if(WARNINGS_AS_ERRORS)
|
|
if(GCC)
|
|
add_definitions(-Werror)
|
|
elseif(MSVC)
|
|
add_definitions(/WX)
|
|
endif()
|
|
endif(WARNINGS_AS_ERRORS)
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# look for stdint.h
|
|
# ----------------------------------------------------------------------------
|
|
if(MSVC)
|
|
check_include_files(stdint.h HAVE_STDINT_H)
|
|
if(NOT HAVE_STDINT_H)
|
|
include_directories(osal/windows)
|
|
endif(NOT HAVE_STDINT_H)
|
|
endif(MSVC)
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# Share library option
|
|
# ----------------------------------------------------------------------------
|
|
option(BUILD_SHARED_LIBS "Build shared library" ON)
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# scan all LOG_TAG for log information and generate module header file
|
|
# ----------------------------------------------------------------------------
|
|
set( module_list "" )
|
|
file ( GLOB_RECURSE ALL_SRC . *.c;*.cpp )
|
|
foreach( files ${ALL_SRC} )
|
|
file( STRINGS ${files} module_tag_line REGEX "MODULE_TAG( )+\".+\"" )
|
|
if(module_tag_line)
|
|
string( REGEX REPLACE "^(.)* MODULE_TAG( )+\"(.*)\"" \\3 module_tag ${module_tag_line} )
|
|
list( APPEND module_list ${module_tag} )
|
|
endif()
|
|
endforeach()
|
|
list( SORT module_list )
|
|
list( LENGTH module_list module_size )
|
|
#message(STATUS "module_list: ${module_list}")
|
|
#message(STATUS "module_size: ${module_size}")
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# Start module definition
|
|
# ----------------------------------------------------------------------------
|
|
# project overall include file
|
|
include_directories(inc)
|
|
# small utile functions for test case
|
|
include_directories(utils)
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# osal library
|
|
# ----------------------------------------------------------------------------
|
|
# Operation System Abstract Layer (OSAL) include
|
|
include_directories(osal/inc)
|
|
# OSAL is needed on all platform, do not need option
|
|
add_subdirectory(osal)
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# utils for test case
|
|
# ----------------------------------------------------------------------------
|
|
add_subdirectory(utils)
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# Media Process Platform library
|
|
# ----------------------------------------------------------------------------
|
|
# Media Process Platform include
|
|
include_directories(mpp/inc)
|
|
add_subdirectory(mpp)
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# test / demo
|
|
# ----------------------------------------------------------------------------
|
|
add_subdirectory(test)
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# install headers
|
|
# ----------------------------------------------------------------------------
|
|
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/inc/
|
|
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/rockchip"
|
|
FILES_MATCHING PATTERN "*.h"
|
|
)
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# pkgconfig
|
|
# ----------------------------------------------------------------------------
|
|
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/pkgconfig/rockchip_mpp.pc.cmake"
|
|
"${CMAKE_BINARY_DIR}/rockchip_mpp.pc" @ONLY)
|
|
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/pkgconfig/rockchip_vpu.pc.cmake"
|
|
"${CMAKE_BINARY_DIR}/rockchip_vpu.pc" @ONLY)
|
|
install(FILES "${CMAKE_BINARY_DIR}/rockchip_mpp.pc"
|
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig/")
|
|
install(FILES "${CMAKE_BINARY_DIR}/rockchip_vpu.pc"
|
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig/")
|