Skip to content

Commit cdbc802

Browse files
author
Clement Champetier
committed
CMake: add cmake directory to have custom utilities
* Custom utilities are: * AvTranscoderMacros.cmake: macros, included in all cmake files. * FindFFmpeg.cmake: to get FFmpeg package (by specify a list of components, check the FFmpeg version, get FFmpeg from command line if there are parameters, etc...).
1 parent 5595b56 commit cdbc802

File tree

10 files changed

+167
-11
lines changed

10 files changed

+167
-11
lines changed

app/cpp/avInfo/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
### cpp/avInfo
22

3+
# Load custom cmake utilities
4+
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
5+
include(AvTranscoderMacros)
6+
7+
# Build app
38
include_directories(${AVTRANSCODER_SRC_PATH})
49
add_executable(avinfo avInfo.cpp)
510
target_link_libraries(avinfo avtranscoder-shared)
611

12+
# Install app
713
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/avinfo DESTINATION "bin/")
814
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/avinfo.man DESTINATION "share/man/man1/")

app/cpp/avMeta/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
### cpp/avMeta
22

3+
# Load custom cmake utilities
4+
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
5+
include(AvTranscoderMacros)
6+
7+
# Build app
38
include_directories(${AVTRANSCODER_SRC_PATH} ${FFMPEG_INCLUDE_DIR})
49
add_executable(avmeta avMeta.cpp)
510
target_link_libraries(avmeta avtranscoder-shared)
611

12+
# Install app
713
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/avmeta DESTINATION "bin/")
814
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/avmeta.man DESTINATION "share/man/man1/")

app/cpp/avTranscoder/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
### cpp/avTranscoder
22

3+
# Load custom cmake utilities
4+
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
5+
include(AvTranscoderMacros)
6+
7+
# Build app
38
include_directories(${AVTRANSCODER_SRC_PATH} ${FFMPEG_INCLUDE_DIR})
49
add_executable(avtranscoder avTranscoder.cpp)
510
target_link_libraries(avtranscoder avtranscoder-shared)
611

12+
# Install app
713
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/avtranscoder DESTINATION "bin/")
814
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/av++.man DESTINATION "share/man/man1/")

app/cpp/avplay/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
### cpp/avplay
22

3+
# Load custom cmake utilities
4+
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
5+
include(AvTranscoderMacros)
6+
7+
# Build app
38
find_package(OpenGL REQUIRED)
49
find_package(GLUT REQUIRED)
510

@@ -10,5 +15,6 @@ file(GLOB AVPLAY_SRC_FILES "*.cpp" "*.hpp")
1015
add_executable(avplay ${AVPLAY_SRC_FILES})
1116
target_link_libraries(avplay avtranscoder-shared ${OPENGL_LIBRARIES} ${GLUT_LIBRARY})
1217

18+
# Install app
1319
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/avplay DESTINATION "bin/")
1420
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/avplayer.man DESTINATION "share/man/man1/")
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
### cpp/avProcessor
22

3+
# Load custom cmake utilities
4+
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
5+
include(AvTranscoderMacros)
6+
7+
# Build app
38
include_directories(${AVTRANSCODER_SRC_PATH} ${FFMPEG_INCLUDE_DIR})
49
add_executable(avprocessor genericProcessor.cpp)
510
target_link_libraries(avprocessor avtranscoder-shared)
611

12+
# Install app
713
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/avprocessor DESTINATION "bin/")
814
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/avprocessor.man DESTINATION "share/man/man1/")

app/cpp/optionChecker/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
### cpp/avOptionChecker
22

3+
# Load custom cmake utilities
4+
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
5+
include(AvTranscoderMacros)
6+
7+
# Build app
38
include_directories(${AVTRANSCODER_SRC_PATH} ${FFMPEG_INCLUDE_DIR})
49
# Add C++11 flag
510
set(CMAKE_CXX_FLAGS "-std=c++0x")
611
add_executable(avoptionchecker optionChecker.cpp)
712
target_link_libraries(avoptionchecker avtranscoder-shared)
813

14+
# Install app
915
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/avoptionchecker DESTINATION "bin/")

app/cpp/presetChecker/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
### cpp/avPresetChecker
22

3+
# Load custom cmake utilities
4+
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
5+
include(AvTranscoderMacros)
6+
7+
# Build app
38
include_directories(${AVTRANSCODER_SRC_PATH} ${FFMPEG_INCLUDE_DIR})
49
# Add C++11 flag
510
set(CMAKE_CXX_FLAGS "-std=c++0x")
611
add_executable(avpresetchecker presetChecker.cpp)
712
target_link_libraries(avpresetchecker avtranscoder-shared)
813

14+
# Install app
915
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/avpresetchecker DESTINATION "bin/")
1016
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/avprofiles.man DESTINATION "share/man/man1/")

cmake/AvTranscoderMacros.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Get useful variables
2+
set(AVTRANSCODER_APP_PATH "${PROJECT_SOURCE_DIR}/app")
3+
set(AVTRANSCODER_SRC_PATH "${PROJECT_SOURCE_DIR}/src")
4+
file(GLOB_RECURSE AVTRANSCODER_SRC_FILES "AvTranscoder/*.cpp" "AvTranscoder/*.hpp")

cmake/FindFFmpeg.cmake

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
# - Find FFmpeg library
2+
# Find the native FFmpeg includes and library.
3+
#
4+
# This module defines:
5+
# FFMPEG_FOUND
6+
# FFMPEG_INCLUDE_DIR - The FFmpeg include directory.
7+
# FFMPEG_LIBRARIES - The FFmpeg libraries.
8+
#
9+
# For each component:
10+
# ${COMPONENT}_FOUND
11+
# ${COMPONENT}_INCLUDE_DIR
12+
# ${COMPONENT}_LIBRARIES
13+
# ${COMPONENT}_DEFINITIONS
14+
# ${COMPONENT}_VERSION
15+
#
16+
# If any component is specified, default components are avcodec avformat avutil.
17+
#
18+
19+
### Macro: check_ffmpeg_version
20+
#
21+
# Check FFmpeg version.
22+
# @todo: clean how to get current FFmpeg version.
23+
#
24+
macro(check_ffmpeg_version)
25+
exec_program("ffmpeg -version 2>&1 | grep 'ffmpeg version' | sed -e 's/ffmpeg\ version\ //'"
26+
OUTPUT_VARIABLE FFmpeg_CURRENT_VERSION)
27+
if(${FFmpeg_CURRENT_VERSION} LESS ${FFmpeg_FIND_VERSION})
28+
message(SEND_ERROR "Your FFmpeg version is too old (${FFmpeg_CURRENT_VERSION} < ${FFmpeg_FIND_VERSION}).")
29+
endif()
30+
endmacro()
31+
32+
33+
### Macro: find_component
34+
#
35+
# Check the given component by invoking pkgconfig and
36+
# then looking up the libraries and include directories.
37+
# @todo: WIN and MAC OSX.
38+
#
39+
macro(find_component COMPONENT PKGCONFIG PKGOPTION LIBRARY HEADER)
40+
if(NOT WIN32)
41+
# use pkg-config to get the directories and then use these values
42+
# in the FIND_PATH() and FIND_LIBRARY() calls
43+
find_package(PkgConfig)
44+
if(PKG_CONFIG_FOUND)
45+
pkg_check_modules(PC_${COMPONENT} ${PKGCONFIG} ${PKGOPTION})
46+
endif()
47+
endif()
48+
49+
find_path(${COMPONENT}_INCLUDE_DIR
50+
${HEADER}
51+
PATH ${PC_LIB${COMPONENT}_INCLUDEDIR} ${PC_LIB${COMPONENT}_INCLUDE_DIR}
52+
PATH_SUFFIXES ffmpeg libav
53+
)
54+
55+
find_library(${COMPONENT}_LIBRARIES
56+
NAMES ${LIBRARY}
57+
PATH ${PC_LIB${COMPONENT}_LIBDIR} ${PC_LIB${COMPONENT}_LIBRARY_DIRS}
58+
)
59+
60+
set(${COMPONENT}_DEFINITIONS ${PC_${COMPONENT}_CFLAGS_OTHER} CACHE STRING "The ${COMPONENT} CFLAGS.")
61+
set(${COMPONENT}_VERSION ${PC_${COMPONENT}_VERSION} CACHE STRING "The ${COMPONENT} version number.")
62+
63+
# Marks the given component as found if both *_LIBRARIES AND *_INCLUDE_DIR is present.
64+
if(${COMPONENT}_LIBRARIES AND ${COMPONENT}_INCLUDE_DIR)
65+
set(${COMPONENT}_FOUND TRUE)
66+
else()
67+
set(${COMPONENT}_FOUND FALSE)
68+
endif()
69+
70+
mark_as_advanced(
71+
${COMPONENT}_INCLUDE_DIR
72+
${COMPONENT}_LIBRARIES
73+
${COMPONENT}_DEFINITIONS
74+
${COMPONENT}_VERSION
75+
)
76+
endmacro()
77+
78+
# Get FFmpeg from custom install
79+
if(FFMPEG_LIBRARIES AND FFMPEG_INCLUDE_DIR)
80+
set(FFMPEG_FOUND TRUE)
81+
# Get FFmpeg from system install
82+
else()
83+
# Check FFmpeg version
84+
if(DEFINED FFmpeg_FIND_VERSION)
85+
check_ffmpeg_version()
86+
endif()
87+
88+
if(NOT FFmpeg_FIND_COMPONENTS)
89+
set(FFmpeg_FIND_COMPONENTS avcodec avformat avutil)
90+
endif()
91+
92+
# Check components and add their stuff to the FFMPEG_* vars.
93+
foreach(COMPONENT ${FFmpeg_FIND_COMPONENTS})
94+
# Get component name is lower cases.
95+
string(TOLOWER ${COMPONENT} LOWERCOMPONENT)
96+
find_component(${COMPONENT} lib${LOWERCOMPONENT} REQUIRED ${LOWERCOMPONENT} lib${LOWERCOMPONENT}/${LOWERCOMPONENT}.h)
97+
# If the component is found.
98+
if(${COMPONENT}_FOUND)
99+
message(STATUS "Required component ${COMPONENT} present.")
100+
set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} ${${COMPONENT}_LIBRARIES})
101+
set(FFMPEG_DEFINITIONS ${FFMPEG_DEFINITIONS} ${${COMPONENT}_DEFINITIONS})
102+
list(APPEND FFMPEG_INCLUDE_DIR ${${COMPONENT}_INCLUDE_DIR})
103+
else()
104+
message(SEND_ERROR "Required component ${COMPONENT} missing.")
105+
endif()
106+
endforeach()
107+
108+
# Build the include path with duplicates removed.
109+
if(FFMPEG_INCLUDE_DIR)
110+
list(REMOVE_DUPLICATES FFMPEG_INCLUDE_DIR)
111+
endif()
112+
endif()

src/CMakeLists.txt

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
1-
# Load project cmake
1+
# Load custom cmake utilities
22
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
3+
include(AvTranscoderMacros)
34

4-
# Get useful variables
5-
set(AVTRANSCODER_APP_PATH "${PROJECT_SOURCE_DIR}/app" PARENT_SCOPE)
6-
set(AVTRANSCODER_SRC_PATH "${PROJECT_SOURCE_DIR}/src" PARENT_SCOPE)
7-
file(GLOB_RECURSE AVTRANSCODER_SRC_FILES "AvTranscoder/*.cpp" "AvTranscoder/*.hpp")
5+
##find_package(FFmpeg)
6+
find_package(FFmpeg
7+
COMPONENTS REQUIRED avcodec avformat avutil swscale swresample)
88

9-
# Get FFMPEG from parameters
10-
set(FFMPEG_INCLUDE_DIR "/path/to/ffmpeg/include/" CACHE STRING "")
11-
set(FFMPEG_LIBRARY_DIR "/path/to/ffmpeg/lib/" CACHE STRING "")
12-
file(GLOB_RECURSE FFMPEG_LIBS "${FFMPEG_LIBRARY_DIR}/*.so")
9+
# get FFmpeg / libav libraries from path
10+
file(GLOB FFMPEG_LIBRARIES "${FFMPEG_LIBRARIES}/*.so")
1311

1412
# Check if FFmpeg or libav dependency
1513
if(EXISTS "${FFMPEG_INCLUDE_DIR}/libavresample/avresample.h")
@@ -25,14 +23,14 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${FFMPEG_INCLUDE_DIR})
2523
add_library(avtranscoder-static STATIC ${AVTRANSCODER_SRC_FILES})
2624
set_target_properties(avtranscoder-static PROPERTIES LINKER_LANGUAGE CXX)
2725
set_target_properties(avtranscoder-static PROPERTIES OUTPUT_NAME avtranscoder)
28-
target_link_libraries(avtranscoder-static ${FFMPEG_LIBS})
26+
target_link_libraries(avtranscoder-static ${FFMPEG_LIBRARIES})
2927

3028
# Create 'avtranscoder' shared lib
3129
add_library(avtranscoder-shared SHARED ${AVTRANSCODER_SRC_FILES})
3230
set_target_properties(avtranscoder-shared PROPERTIES LINKER_LANGUAGE CXX)
3331
set_target_properties(avtranscoder-shared PROPERTIES OUTPUT_NAME avtranscoder)
3432
set_target_properties(avtranscoder-shared PROPERTIES SOVERSION ${AVTRANSCODER_VERSION})
35-
target_link_libraries(avtranscoder-shared ${FFMPEG_LIBS})
33+
target_link_libraries(avtranscoder-shared ${FFMPEG_LIBRARIES})
3634

3735
### Install AvTranscoder libs and include
3836
install(

0 commit comments

Comments
 (0)