From d2e9567029538c24cd4750510d999a9383b866a1 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 3 Dec 2021 18:28:41 +0100 Subject: [PATCH] Add FetchContent fallback for CImg --- CMakeLists.txt | 2 - cmake/Modules/FindCImg.cmake | 105 ++++++++++++++++++++++++++++------- src/core/CMakeLists.txt | 23 +++++++- 3 files changed, 106 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c73ce23f..03b97f47 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 "") diff --git a/cmake/Modules/FindCImg.cmake b/cmake/Modules/FindCImg.cmake index ca4192b1..343a1ae7 100644 --- a/cmake/Modules/FindCImg.cmake +++ b/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_ +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 +) diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 6a7d90b4..b2d0f105 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -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(