From 4699fef4ff6cd5481f237ed2358c06408c5bf380 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Thu, 10 Mar 2011 13:23:36 +0100 Subject: [PATCH] Clean up CMakeFiles and make most libs optional This will disable building various tools when the libraries that they require are missing. The only absolutely mandatory dependencies now are JACK and pthreads (both required for libol). --- CMakeLists.txt | 10 ++- Modules/FindFFmpeg.cmake | 116 ++++++++++++++++++++++++++++ examples/27c3_slides/CMakeLists.txt | 66 ++++++++++------ examples/CMakeLists.txt | 9 ++- libol/CMakeLists.txt | 2 - output/CMakeLists.txt | 17 ++-- tools/CMakeLists.txt | 25 +++--- 7 files changed, 195 insertions(+), 50 deletions(-) create mode 100644 Modules/FindFFmpeg.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b2fc33..53d22e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,14 +16,20 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # -PROJECT(openlase) +project(openlase) cmake_minimum_required(VERSION 2.6) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/Modules/") -find_package(Qt4 REQUIRED) +find_package(Threads REQUIRED) find_package(JACK REQUIRED) +find_package(Qt4) +find_package(FFmpeg) +find_package(OpenGL) +find_package(GLUT) +find_package(ALSA) +find_package(Curses) set(CMAKE_C_FLAGS "-Wall -O3 -g") diff --git a/Modules/FindFFmpeg.cmake b/Modules/FindFFmpeg.cmake new file mode 100644 index 0000000..d6259b0 --- /dev/null +++ b/Modules/FindFFmpeg.cmake @@ -0,0 +1,116 @@ +# - Try to find ffmpeg +# Once done this will define +# +# FFMPEG_FOUND - system has ffmpeg +# FFMPEG_INCLUDE_DIR - Include directory necessary for using the ffmpeg headers +# FFMPEG_LIBRARIES - Link these to use ffmpeg +# FFMPEG_DEFINITIONS - Compiler switches required for using ffmpeg + +# Copyright (c) 2006, Matthias Kretz, +# Copyright (c) 2008, Alexander Neundorf, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +if (FFMPEG_LIBRARIES) + + # in cache already + set(FFMPEG_FOUND TRUE) + +else (FFMPEG_LIBRARIES) + +if (NOT WIN32) + # use pkg-config to get the directories and then use these values + # in the FIND_PATH() and FIND_LIBRARY() calls + find_package(PkgConfig) + pkg_check_modules(PC_LIBAVCODEC libavcodec) + set(FFMPEG_DEFINITIONS ${PC_LIBAVCODEC_CFLAGS_OTHER}) + +endif (NOT WIN32) + + # + # #include is the new style for FFMPEG headers + # This has been verified at least since 0.4.9 + # Please do not change to the old format, since this will break for + # people who are using newer versions. Instead, upgrade your ffmpeg + # installation. + # + find_path(FFMPEG_INCLUDE_DIR libavcodec/avcodec.h + HINTS + ${PC_LIBAVCODEC_INCLUDEDIR} + ${PC_LIBAVCODEC_INCLUDE_DIRS} + ) + + # also search for the old style include dir, just for the purpose + # of giving a useful error message if an old libavcodec is installed + # and the user might wonder why it is not found + find_path(FFMPEG_INCLUDE_DIR_OLD_STYLE ffmpeg/avcodec.h + HINTS + ${PC_LIBAVCODEC_INCLUDEDIR} + ${PC_LIBAVCODEC_INCLUDE_DIRS} + ) + + find_library(AVCODEC_LIBRARIES NAMES avcodec + HINTS + ${PC_LIBAVCODEC_LIBDIR} + ${PC_LIBAVCODEC_LIBRARY_DIRS} + ) + + find_library(AVFORMAT_LIBRARIES NAMES avformat + HINTS + ${PC_LIBAVCODEC_LIBDIR} + ${PC_LIBAVCODEC_LIBRARY_DIRS} + ) + + find_library(AVUTIL_LIBRARIES NAMES avutil + HINTS + ${PC_LIBAVCODEC_LIBDIR} + ${PC_LIBAVCODEC_LIBRARY_DIRS} + ) + + + + set(FFMPEG_LIBRARIES ) + if (AVCODEC_LIBRARIES) + set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} ${AVCODEC_LIBRARIES}) + endif (AVCODEC_LIBRARIES) + + if (AVFORMAT_LIBRARIES) + set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} ${AVFORMAT_LIBRARIES}) + endif (AVFORMAT_LIBRARIES) + + if (AVUTIL_LIBRARIES) + set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} ${AVUTIL_LIBRARIES}) + endif (AVUTIL_LIBRARIES) + + if (FFMPEG_LIBRARIES AND FFMPEG_INCLUDE_DIR) + set(FFMPEG_FOUND TRUE) + endif (FFMPEG_LIBRARIES AND FFMPEG_INCLUDE_DIR) + + if (FFMPEG_FOUND) + if (NOT FFmpeg_FIND_QUIETLY) + message(STATUS "Found FFMPEG: ${FFMPEG_LIBRARIES} ${FFMPEG_INCLUDE_DIR}") + endif (NOT FFmpeg_FIND_QUIETLY) + else (FFMPEG_FOUND) + # only an old libavcodec was found ? + if (FFMPEG_INCLUDE_DIR_OLD_STYLE AND NOT FFMPEG_INCLUDE_DIR AND NOT FFmpeg_FIND_QUIETLY) + message(STATUS "Found old version of libavcodec, but a newer version is required.") + endif (FFMPEG_INCLUDE_DIR_OLD_STYLE AND NOT FFMPEG_INCLUDE_DIR AND NOT FFmpeg_FIND_QUIETLY) + + if (FFmpeg_FIND_REQUIRED) + message(FATAL_ERROR "Could NOT find FFMPEG") + else (FFmpeg_FIND_REQUIRED) + if (NOT FFmpeg_FIND_QUIETLY) + message(STATUS "Could NOT find FFMPEG") + endif (NOT FFmpeg_FIND_QUIETLY) + endif (FFmpeg_FIND_REQUIRED) + endif (FFMPEG_FOUND) + + mark_as_advanced(AVCODEC_LIBRARIES + AVFORMAT_LIBRARIES + AVUTIL_LIBRARIES + FFMPEG_INCLUDE_DIR + FFMPEG_INCLUDE_DIR_OLD_STYLE) + +endif (FFMPEG_LIBRARIES)# AND FFMPEG_DEFINITIONS) diff --git a/examples/27c3_slides/CMakeLists.txt b/examples/27c3_slides/CMakeLists.txt index 1960214..4ea1626 100644 --- a/examples/27c3_slides/CMakeLists.txt +++ b/examples/27c3_slides/CMakeLists.txt @@ -1,30 +1,48 @@ +# OpenLase - a realtime laser graphics toolkit +# +# Copyright (C) 2009-2011 Hector Martin "marcan" +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 or version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +if(CURSES_FOUND AND FFMPEG_FOUND) + include_directories(${CMAKE_SOURCE_DIR}/tools ${CURSES_INCLUDE_DIR}) -find_package(Curses REQUIRED) + add_executable(slides + main.c 3ddemos.c static.c metaballs.c circlescope.c avstream.c video.c pong.c + ${CMAKE_SOURCE_DIR}/tools/trace.c -include_directories(${CMAKE_SOURCE_DIR}/tools ${CURSES_INCLUDE_DIR}) + ${CMAKE_CURRENT_BINARY_DIR}/openlase-logo.ild + ${CMAKE_CURRENT_BINARY_DIR}/27c3-logo.ild + ${CMAKE_CURRENT_BINARY_DIR}/jack-logo.ild + ${CMAKE_CURRENT_BINARY_DIR}/output.ild + ) -add_executable(slides - main.c 3ddemos.c static.c metaballs.c circlescope.c avstream.c video.c pong.c - ${CMAKE_SOURCE_DIR}/tools/trace.c + target_link_libraries(slides openlase ${FFMPEG_LIBRARIES} ${CURSES_LIBRARIES}) - ${CMAKE_CURRENT_BINARY_DIR}/openlase-logo.ild - ${CMAKE_CURRENT_BINARY_DIR}/27c3-logo.ild - ${CMAKE_CURRENT_BINARY_DIR}/jack-logo.ild - ${CMAKE_CURRENT_BINARY_DIR}/output.ild -) + function(svg2ild NAME) + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.ild + DEPENDS ${CMAKE_SOURCE_DIR}/tools/svg2ild.py + MAIN_DEPENDENCY ${NAME}.svg + DEPENDS ${NAME}.svg ${NAME}.cfg + COMMAND python ${CMAKE_SOURCE_DIR}/tools/svg2ild.py -q ${ARGN} -cfg ${CMAKE_CURRENT_SOURCE_DIR}/${NAME}.cfg ${CMAKE_CURRENT_SOURCE_DIR}/${NAME}.svg ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.ild) + endfunction() -target_link_libraries(slides openlase avformat avcodec ${CURSES_LIBRARIES}) - -function(svg2ild NAME) - add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.ild - DEPENDS ${CMAKE_SOURCE_DIR}/tools/svg2ild.py - MAIN_DEPENDENCY ${NAME}.svg - DEPENDS ${NAME}.svg ${NAME}.cfg - COMMAND python ${CMAKE_SOURCE_DIR}/tools/svg2ild.py -q ${ARGN} -cfg ${CMAKE_CURRENT_SOURCE_DIR}/${NAME}.cfg ${CMAKE_CURRENT_SOURCE_DIR}/${NAME}.svg ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.ild) -endfunction() - -svg2ild(openlase-logo -noopt) -svg2ild(27c3-logo) -svg2ild(jack-logo) -svg2ild(output) + svg2ild(openlase-logo -noopt) + svg2ild(27c3-logo) + svg2ild(jack-logo) + svg2ild(output) +else() + message(STATUS "Will NOT build 27c3_slides (curses or FFmpeg missing)") +endif() diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 5995a62..0fe680d 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -28,9 +28,12 @@ target_link_libraries(simple openlase) add_executable(pong pong.c) target_link_libraries(pong openlase) -find_package(ALSA REQUIRED) -add_executable(midiview midiview.c) -target_link_libraries(midiview openlase ${ALSA_LIBRARIES}) +if(ALSA_FOUND) + add_executable(midiview midiview.c) + target_link_libraries(midiview openlase ${ALSA_LIBRARIES}) +else() + message(STATUS "Will NOT build midiview (ALSA missing)") +endif() add_executable(harp harp.c) target_link_libraries(harp openlase) diff --git a/libol/CMakeLists.txt b/libol/CMakeLists.txt index 53b6806..c537e35 100644 --- a/libol/CMakeLists.txt +++ b/libol/CMakeLists.txt @@ -17,10 +17,8 @@ # include_directories (${CMAKE_SOURCE_DIR}/include) -find_package(Threads) add_library (openlase libol.c text.c ilda.c ${CMAKE_CURRENT_BINARY_DIR}/fontdef.c) -find_library (PTHREAD pthread) target_link_libraries (openlase ${CMAKE_THREAD_LIBS_INIT} m jack) add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/fontdef.c diff --git a/output/CMakeLists.txt b/output/CMakeLists.txt index a18622d..5ca4472 100644 --- a/output/CMakeLists.txt +++ b/output/CMakeLists.txt @@ -16,13 +16,16 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # -include(${QT_USE_FILE}) +if(QT4_FOUND) + include(${QT_USE_FILE}) -QT4_WRAP_UI(output_UIS_H output_settings.ui) -QT4_AUTOMOC(output_settings.cpp output.cpp) + QT4_WRAP_UI(output_UIS_H output_settings.ui) + QT4_AUTOMOC(output_settings.cpp output.cpp) -include_directories(${CMAKE_CURRENT_BINARY_DIR}) - -add_executable(output output.cpp output_settings.cpp ${output_UIS_H}) -target_link_libraries(output ${JACK_LIBRARIES} ${QT_LIBRARIES}) + include_directories(${CMAKE_CURRENT_BINARY_DIR}) + add_executable(output output.cpp output_settings.cpp ${output_UIS_H}) + target_link_libraries(output ${JACK_LIBRARIES} ${QT_LIBRARIES}) +else() + message(STATUS "Will NOT build output (Qt4 missing)") +endif() diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 7643ab3..c88cf76 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -22,16 +22,17 @@ link_directories (${CMAKE_BINARY_DIR}/libol) add_executable(playilda playilda.c) target_link_libraries(playilda ${JACK_LIBRARIES}) -add_executable(playvid playvid.c trace.c) -target_link_libraries(playvid openlase avformat avcodec) +if(FFMPEG_FOUND) + add_executable(playvid playvid.c trace.c) + target_link_libraries(playvid openlase ${FFMPEG_LIBRARIES}) +else() + message(STATUS "Will NOT build playvid (FFmpeg missing)") +endif() -include_directories (${CMAKE_SOURCE_DIR}/include) -link_directories (${CMAKE_BINARY_DIR}/libol) - -find_package(OpenGL REQUIRED) -find_package(GLUT REQUIRED) - -add_executable(simulator simulator.c) - -include_directories(${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS}) -target_link_libraries(simulator ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} ${JACK_LIBRARIES}) +if(OPENGL_FOUND AND GLUT_FOUND) + add_executable(simulator simulator.c) + include_directories(${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS}) + target_link_libraries(simulator m ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} ${JACK_LIBRARIES}) +else() + message(STATUS "Will NOT build simulator (OpenGL or GLUT missing)") +endif()