Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
137 changes: 80 additions & 57 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
cmake_minimum_required(VERSION 2.6)
project(PictureIt CXX)
cmake_minimum_required(VERSION 3.0)
project(PictureIt VERSION 0.1)

set(GENERIC_LIB_VERSION "0.0.0")
set(GENERIC_LIB_SOVERSION "0")
include(UseMultiArch.cmake)

list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
include_directories(${CMAKE_MODULE_PATH})
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" ${PROJECT_SOURCE_DIR})

# Enable pic
if(NOT WIN32)
Expand All @@ -14,74 +12,99 @@ endif()

# Find and use C++11
find_package(CXX11 REQUIRED)

# Find and include OpenGL
find_package(OpenGL REQUIRED)
# Find and include asplib
find_package(KissFFT 1.30 REQUIRED)
find_package(asplib 1.0 REQUIRED)

# add definitions and include directories
add_definitions(${OpenGL_DEFINITIONS})
include_directories(${OpenGL_INCLUDE_DIRS})

# Find and include asplib
find_package(asplib REQUIRED)
include_directories(${ASPLIB_INCLUDE_DIR} ${ASPLIB_INCLUDE_DIRS})

# Define PictureIt includes
list(APPEND PI_INCLUDES "${PROJECT_SOURCE_DIR}/src")
list(APPEND PI_INCLUDES "${PROJECT_SOURCE_DIR}/deps")
set(SOURCES src/pictureit.cpp
src/spectrum.cpp
src/utils.cpp
src/effects/effects.cpp
src/effects/crossfade.cpp
src/effects/slide.cpp)

set(HEADERS src/pictureit.h
src/spectrum.h
src/utils.h
src/effects/effects.h
src/effects/crossfade.h
src/effects/slide.h)

# add library and configure it's include directories
add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS})
add_library(PI::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
target_include_directories(${PROJECT_NAME} INTERFACE
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/deps
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/deps>
$<INSTALL_INTERFACE:include>
$<INSTALL_INTERFACE:include/PictureIt>)

if(WIN32)
list(APPEND PI_INCLUDES "${PROJECT_SOURCE_DIR}/deps/win32")
target_include_directories(${PROJECT_NAME} INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/deps/win32>)
endif()

# Include PictureIt direcotires
include_directories(${PI_INCLUDES})
# set target properties
target_link_libraries(${PROJECT_NAME} PRIVATE asplib::SpectrumVisProcessor)
set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE CXX)

set(PI_SOURCES src/pictureit.cpp
src/spectrum.cpp
src/utils.cpp
src/effects/effects.cpp
src/effects/crossfade.cpp
src/effects/slide.cpp)
install(TARGETS ${PROJECT_NAME} EXPORT ${CMAKE_PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)

set(PI_HEADERS src/pictureit.h
src/spectrum.h
src/utils.h
src/effects/effects.h
src/effects/crossfade.h
src/effects/slide.h)

# Configure PictureItConfig.cmake.in
set(PICTUREIT_LIBRARY_DIR "${CMAKE_INSTALL_PREFIX}/lib")
set(PICTUREIT_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include/PictureIt")
list(APPEND PICTUREIT_INCLUDE_DIRS "${ASPLIB_INCLUDE_DIR}"
"${ASPLIB_INCLUDE_DIRS}")
list(APPEND PICTUREIT_LIBRARIES "${ASPLIB_LIBRARY}"
"${ASPLIB_LIBRARIES}")
configure_file(PictureItConfig.cmake.in "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PictureItConfig.cmake" @ONLY)
# Install all header files
foreach (HEADER ${HEADERS})
get_filename_component(HEADERDIR ${HEADER} DIRECTORY)
string(REGEX REPLACE "src" "" HEADERDIR ${HEADERDIR})
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${HEADER} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}/${HEADERDIR})
endforeach()

if(NOT WIN32)
message(STATUS "CMAKE_INSTALL_LIBDIR_NOARCH=${CMAKE_INSTALL_LIBDIR_NOARCH}")
# Pkgconfig
include(PkgConfigHandler.cmake)
configure_pc_file(${PROJECT_NAME} ${PROJECT_NAME}.pc.in
${PROJECT_NAME}.pc
${CMAKE_INSTALL_PREFIX}
${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}
${CMAKE_INSTALL_PREFIX}/include)

install(FILES ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR_NOARCH}/pkgconfig)
endif()

add_library(PictureIt STATIC ${PI_SOURCES} ${PI_HEADERS})
# Generate and install a CMake config, version and target file
include(CMakePackageConfigHelpers)
set(CMAKE_INSTALL_CMAKECONFIGDIR
${CMAKE_INSTALL_LIBDIR_NOARCH}/cmake/${PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR})

write_basic_package_version_file(${PROJECT_NAME}ConfigVersion.cmake COMPATIBILITY SameMajorVersion)
install(FILES ${CMAKE_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
DESTINATION ${CMAKE_INSTALL_CMAKECONFIGDIR})

set_target_properties(PictureIt PROPERTIES LINKER_LANGUAGE CXX)
set_target_properties(PictureIt PROPERTIES OUTPUT_NAME PictureIt)
set_target_properties(PictureIt PROPERTIES
COMPILE_DEFINITONS "PICTUREIT_EXPORT"
VERSION "${GENERIC_LIB_VERSION}"
SOVERSION "${GENERIC_LIB_SOVERSION}")
configure_package_config_file(${PROJECT_NAME}Config.cmake.in ${PROJECT_NAME}Config.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_CMAKECONFIGDIR})
#PATH_VARS INCLUDE_INSTALL_DIR)
install(FILES ${CMAKE_BINARY_DIR}/${PROJECT_NAME}Config.cmake DESTINATION ${CMAKE_INSTALL_CMAKECONFIGDIR})

install(TARGETS PictureIt DESTINATION ${PICTUREIT_LIBRARY_DIR} EXPORT PictureIt)
install(EXPORT ${PROJECT_NAME} FILE ${PROJECT_NAME}-targets.cmake NAMESPACE PI::
DESTINATION ${CMAKE_INSTALL_CMAKECONFIGDIR})

# Install all header files
foreach ( HEADER ${PI_HEADERS} )
get_filename_component( DIR ${HEADER} DIRECTORY )
string(REGEX REPLACE "src" "" DIR ${DIR})
install( FILES ${HEADER} DESTINATION "${PICTUREIT_INCLUDE_DIR}/${DIR}" )
get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
message(STATUS "${_variableName}=${${_variableName}}")
endforeach()

if(WIN32 AND NOT CYGWIN)
set(DEF_INSTALL_CMAKE_DIR PictureIt)
else()
set(DEF_INSTALL_CMAKE_DIR lib/PictureIt)
endif()
set(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files")
install(FILES "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PictureItConfig.cmake" DESTINATION "${INSTALL_CMAKE_DIR}" COMPONENT dev)
# Print project configuration
message(STATUS)
message(STATUS "${CMAKE_PROJECT_NAME} - Configuration:")
message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
message(STATUS)

12 changes: 12 additions & 0 deletions PictureIt.pc.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
prefix=@prefix@
libdir=@libdir@
includedir=@includedir@
CXX=@CMAKE_CXX_COMPILER@ @CXX_STD0X_FLAGS@
CC=@CMAKE_C_COMPILER@ @C_STD99_FLAGS@
DEPENDENCIES=@PictureIt_LIBRARIES@

Name: @name@
Description: @description@ @major@.@minor@
Version: @major@.@minor@
Libs: @target@ @libs@
Cflags: @CMAKE_CXX_FLAGS@
14 changes: 2 additions & 12 deletions PictureItConfig.cmake.in
Original file line number Diff line number Diff line change
@@ -1,13 +1,3 @@
# It defines the following variables
# PICTUREIT_INCLUDE_DIR, the path where PictureIt headers are located
# PICTUREIT_INCLUDE_DIRS, the paths where dependency headers are located
# PICTUREIT_LIBRARY_DIR, folder in which the PictureIt library is located
# PICTUREIT_LIBRARY, library to link against to use PictureIt
# PICTUREIT_LIBRARIES, libraries used by PictureIt to link against
@PACKAGE_INIT@

set(PICTUREIT_INCLUDE_DIR "@PICTUREIT_INCLUDE_DIR@")
set(PICTUREIT_INCLUDE_DIRS "@PICTUREIT_INCLUDE_DIRS@")
set(PICTUREIT_LIBRARY_DIR "@PICTUREIT_LIBRARY_DIR@")
set(PICTUREIT_LIBRARIES "@PICTUREIT_LIBRARIES@")

find_library(PICTUREIT_LIBRARY "@PROJECT_NAME@" HINTS ${PICTUREIT_LIBRARY_DIR})
include(${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake)
97 changes: 97 additions & 0 deletions PkgConfigHandler.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# translate a list of libraries into a command-line that can be passed to the
# compiler/linker. first parameter is the name of the variable that will
# receive this list, the rest is considered the list of libraries
function (linker_cmdline what INTO outvar FROM)
# if we are going to put these in regexps, we must escape period
string (REPLACE "." "\\." esc_dl_pref "${CMAKE_SHARED_LIBRARY_PREFIX}")
string (REPLACE "." "\\." esc_dl_suff "${CMAKE_SHARED_LIBRARY_SUFFIX}")
string (REPLACE "." "\\." esc_ar_pref "${CMAKE_STATIC_LIBRARY_PREFIX}")
string (REPLACE "." "\\." esc_ar_suff "${CMAKE_STATIC_LIBRARY_PREFIX}")

# CMake loves absolute paths, whereas libtool won't have any of it!
# (you get an error message about argument not parsed). translate each
# of the libraries into a linker option
set (deplib_list "")
foreach (deplib IN LISTS ARGN)
# starts with a hyphen already? then just add it
string (SUBSTRING ${deplib} 0 1 dash)
if (${dash} STREQUAL "-")
list (APPEND deplib_list ${deplib})
else (${dash} STREQUAL "-")
# otherwise, parse the name into a directory and a name
get_filename_component (deplib_dir ${deplib} PATH)
get_filename_component (deplib_orig ${deplib} NAME)
string (REGEX REPLACE
"^${esc_dl_pref}(.*)${esc_dl_suff}$"
"\\1"
deplib_name
${deplib_orig}
)
string (REGEX REPLACE
"^${esc_ar_pref}(.*)${esc_ar_suff}$"
"\\1"
deplib_name
${deplib_name}
)
# directory and name each on their own; this is somewhat
# unsatisfactory because it may be that a system dir is specified
# by an earlier directory and you start picking up libraries from
# there instead of the "closest" path here. also, the soversion
# is more or less lost. remove system default path, to lessen the
# chance that we pick the wrong library
if (NOT ((deplib_dir STREQUAL "/usr/lib") OR
(deplib_dir STREQUAL "/usr/${CMAKE_INSTALL_LIBDIR}")))
list (APPEND deplib_list "-L${deplib_dir}")
endif (NOT ((deplib_dir STREQUAL "/usr/lib") OR
(deplib_dir STREQUAL "/usr/${CMAKE_INSTALL_LIBDIR}")))
# if there was no translation of the name, the library is named
# unconventionally (.so.3gf, I'm looking at you), so pass this
# name unmodified to the linker switch
if (deplib_orig STREQUAL deplib_name)
list (APPEND deplib_list "-l:${deplib_orig}")
else (deplib_orig STREQUAL deplib_name)
list (APPEND deplib_list "-l${deplib_name}")
endif (deplib_orig STREQUAL deplib_name)
endif (${dash} STREQUAL "-")
endforeach (deplib)
# caller determines whether we want it returned as a list or a string
if ("${what}" STREQUAL "LIST")
set (${outvar} ${deplib_list})
else ("${what}" STREQUAL "LIST")
set (${outvar} "${deplib_list}")
string (REPLACE ";" " " ${outvar} "${${outvar}}")
endif ("${what}" STREQUAL "LIST")
set (${outvar} "${${outvar}}" PARENT_SCOPE)
endfunction (linker_cmdline what INTO outvar FROM)

# convert a list back to a command-line string
function (unseparate_args var_name prefix value)
separate_arguments (value)
foreach (item IN LISTS value)
set (prefixed_item "${prefix}${item}")
if (${var_name})
set (${var_name} "${${var_name}} ${prefixed_item}")
else (${var_name})
set (${var_name} "${prefixed_item}")
endif (${var_name})
endforeach (item)
set (${var_name} "${${var_name}}" PARENT_SCOPE)
endfunction (unseparate_args var_name prefix value)

# wrapper to set variables in pkg-config file
function (configure_pc_file name source dest prefix libdir includedir)
# escape set of standard strings
unseparate_args (includes "-I" "${${name}_INCLUDE_DIRS}")
unseparate_args (defs "" "${${name}_DEFINITIONS}")
linker_cmdline (STRING INTO libs FROM ${${name}_LIBRARIES})

# necessary to make these variables visible to configure_file
set (name "${${name}_NAME}")
set (description "${${name}_DESCRIPTION}")
set (major "${${name}_VERSION_MAJOR}")
set (minor "${${name}_VERSION_MINOR}")
set (target "${name}")
linker_cmdline (STRING INTO target from ${target})

configure_file (${source} ${dest} @ONLY)
endfunction (configure_pc_file name source dist prefix libdir includedir)
51 changes: 51 additions & 0 deletions UseMultiArch.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#FIXME: You can use https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html instead

# - Multiarch support in object code library directories
#
# This module sets the following variable
# CMAKE_INSTALL_LIBDIR to lib, lib64 or lib/x86_64-linux-gnu
# depending on the platform; use this path
# for platform-specific binaries.
#
# CMAKE_INSTALL_LIBDIR_NOARCH to lib or lib64 depending on the platform;
# use this path for architecture-independent
# files.
#
# Note that it will override the results of GNUInstallDirs if included after
# that module.

# Fedora uses lib64/ for 64-bit systems, Debian uses lib/x86_64-linux-gnu;
# Fedora put module files in lib64/ too, but Debian uses lib/ for that
if ("${CMAKE_SYSTEM_NAME}" MATCHES "Linux" AND
"${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr")
# Debian or Ubuntu?
if (EXISTS "/etc/debian_version")
set (_libdir_def "lib/${CMAKE_LIBRARY_ARCHITECTURE}")
set (_libdir_noarch "lib")
elseif (EXISTS "/etc/fedora-release" OR
EXISTS "/etc/redhat-release" OR
EXISTS "/etc/slackware-version" OR
EXISTS "/etc/gentoo-release")
# 64-bit system?
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
set (_libdir_noarch "lib64")
else (CMAKE_SIZEOF_VOID_P EQUAL 8)
set (_libdir_noarch "lib")
endif (CMAKE_SIZEOF_VOID_P EQUAL 8)
set (_libdir_def "${_libdir_noarch}")
else ()
set (_libdir_def "lib")
set (_libdir_noarch "lib")
endif ()
else ()
set (_libdir_def "lib")
set (_libdir_noarch "lib")
endif ()

# let the user override if somewhere else is desirable
set (CMAKE_INSTALL_LIBDIR "${_libdir_def}" CACHE PATH "Object code libraries")
set (CMAKE_INSTALL_LIBDIR_NOARCH "${_libdir_noarch}" CACHE PATH "Architecture-independent library files")
mark_as_advanced (
CMAKE_INSTALL_LIBDIR
CMAKE_INSTALL_LIBDIR_NOARCH
)
Loading