xref: /OK3568_Linux_fs/external/mpp/CMakeLists.txt (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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