Skip to content

Commit

Permalink
Add FetchContent fallback for CImg
Browse files Browse the repository at this point in the history
  • Loading branch information
TheAssassin committed Dec 3, 2021
1 parent fb5cd4d commit d2e9567
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 24 deletions.
2 changes: 0 additions & 2 deletions CMakeLists.txt
Expand Up @@ -7,8 +7,6 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake/Modules/")

set(USE_SYSTEM_CIMG ON CACHE BOOL "Set to OFF to use CImg library bundled in lib directory")

# support for ccache
# call CMake with -DUSE_CCACHE=ON to make use of it
set(USE_CCACHE ON CACHE BOOL "")
Expand Down
105 changes: 84 additions & 21 deletions cmake/Modules/FindCImg.cmake
@@ -1,34 +1,97 @@
# required for PNG imported target
cmake_minimum_required(VERSION 3.6)
#[=======================================================================[.rst:
FindCImg
-------

find_package(PkgConfig)
pkg_check_modules(libpng REQUIRED IMPORTED_TARGET libpng)
pkg_check_modules(libjpeg REQUIRED IMPORTED_TARGET libjpeg)
Finds the CImg library.

message(STATUS "Searching for CImg")
Imported Targets
^^^^^^^^^^^^^^^^

This module provides the following imported targets, if found:

``CImg``
The CImg library

Result Variables
^^^^^^^^^^^^^^^^

This will define the following variables:

``CImg_FOUND``
True if the system has the CImg library.
``CImg_VERSION``
The version of the CImg library which was found.
``CImg_INCLUDE_DIRS``
Include directories needed to use CImg.
``CImg_LIBRARIES``
Libraries needed to link to CImg.

Cache Variables
^^^^^^^^^^^^^^^

The following cache variables may also be set:

``CImg_INCLUDE_DIR``
The directory containing ``CImg.h``.

#]=======================================================================]

# 3.6 required for PNG imported target
# 3.9 required for CMAKE_MATCH_<n>
cmake_minimum_required(VERSION 3.9)

find_path(CIMG_H_DIR
NAMES CImg.h
HINTS ${CMAKE_INSTALL_PREFIX}
HINTS ${CMAKE_INSTALL_PREFIX} ${CIMG_DIR}
PATH_SUFFIXES include include/linux
)

if(NOT CIMG_H_DIR)
message(FATAL_ERROR "CImg.h not found")
endif()
set(CImg_FOUND FALSE)
else()
set(CImg_FOUND TRUE)

set(PNG_INCLUDE_DIR ${libpng_INCLUDE_DIRS})
set(PNG_INCLUDE_DIR ${libjpeg_INCLUDE_DIRS})
find_package(PkgConfig)

if(NOT STATIC_BUILD)
set(PNG_LIBRARY ${libpng_LIBRARIES})
set(JPEG_LIBRARIES ${libjpeg_LIBRARIES})
else()
set(PNG_LIBRARY ${libpng_STATIC_LIBRARIES})
set(JPEG_LIBRARIES ${libjpeg_STATIC_LIBRARIES})
pkg_check_modules(libpng REQUIRED libpng)
pkg_check_modules(libjpeg REQUIRED libjpeg)

set(PNG_INCLUDE_DIR ${libpng_INCLUDE_DIRS})
set(JPEG_INCLUDE_DIR ${libjpeg_INCLUDE_DIRS})

if(STATIC_BUILD)
set(PNG_LIBRARY ${libpng_STATIC_LIBRARIES})
set(JPEG_LIBRARIES ${libjpeg_STATIC_LIBRARIES})
else()
set(PNG_LIBRARY ${libpng_LIBRARIES})
set(JPEG_LIBRARIES ${libjpeg_LIBRARIES})
endif()

set(CImg_INCLUDE_DIR ${CIMG_H_DIR} CACHE STRING "")
set(CImg_INCLUDE_DIRS ${CImg_INCLUDE_DIR})
set(CImg_LIBRARIES "${PNG_LIBRARY};${JPEG_LIBRARIES}")
set(CImg_DEFINITIONS "cimg_display=0;cimg_use_png=1;cimg_use_jpeg=1")

file(READ "${CIMG_H_DIR}/CImg.h" header)
string(REGEX MATCH "#define cimg_version ([0-9a-zA-Z\.]+)" _ "${header}")
set(CImg_VERSION "${CMAKE_MATCH_1}")

# CImg_VERSION

if(NOT TARGET CImg)
add_library(CImg INTERFACE)
set_property(TARGET CImg PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CIMG_H_DIR};${PNG_INCLUDE_DIR};${JPEG_INCLUDE_DIR}")
set_property(TARGET CImg PROPERTY INTERFACE_LINK_LIBRARIES "${CImg_LIBRARIES}")
set_property(TARGET CImg PROPERTY INTERFACE_COMPILE_DEFINITIONS "${CImg_DEFINITIONS}")
endif()
endif()

add_library(CImg INTERFACE)
set_property(TARGET CImg PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CIMG_H_DIR};${PNG_INCLUDE_DIR};${JPEG_INCLUDE_DIR}")
set_property(TARGET CImg PROPERTY INTERFACE_LINK_LIBRARIES "${PNG_LIBRARY};${JPEG_LIBRARIES}")
set_property(TARGET CImg PROPERTY INTERFACE_COMPILE_DEFINITIONS "cimg_display=0;cimg_use_png=1;cimg_use_jpeg=1")
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(CImg
FOUND_VAR CImg_FOUND
REQUIRED_VARS
CImg_INCLUDE_DIRS
CImg_LIBRARIES
CImg_DEFINITIONS
VERSION_VAR CImg_VERSION
)
23 changes: 22 additions & 1 deletion src/core/CMakeLists.txt
Expand Up @@ -5,7 +5,28 @@ file(GLOB HEADERS ${PROJECT_SOURCE_DIR}/include/linuxdeploy/core/*.h)

find_package(Threads)

find_package(CImg REQUIRED)
find_package(CImg)

if(NOT CImg_FOUND)
message(STATUS "CImg not found, fetching from GitHub")

cmake_minimum_required(VERSION 3.14)

FetchContent_Declare(
CImg
GIT_REPOSITORY https://github.com/dtschump/CImg
GIT_TAG v.2.9.9
)

FetchContent_MakeAvailable(CImg)

# unfortunately there is no easy way to fetch the source dir with MakeAvailable
# FETCHCONTENT_SOURCE_DIR_CIMG is not set
# we can apparently predict the path from the base dir, though
# we'll have to see how reliable this is going to be
set(CIMG_DIR "${FETCHCONTENT_BASE_DIR}/cimg-src")
find_package(CImg REQUIRED)
endif()

message(STATUS "Generating excludelist")
execute_process(
Expand Down

0 comments on commit d2e9567

Please sign in to comment.