xref: /rockchip-linux_mpp/CMakeLists.txt (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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