281 lines
8.6 KiB
CMake
281 lines
8.6 KiB
CMake
# Display images inside a terminal Copyright (C) 2023 JustKidding
|
|
#
|
|
# 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 3 of the License, or (at your option) any later
|
|
# version.
|
|
#
|
|
# 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, see <https://www.gnu.org/licenses/>.
|
|
|
|
cmake_minimum_required(VERSION 3.21...3.28 FATAL_ERROR)
|
|
|
|
set(UEBERZUGPP_VERSION 2.9.8)
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
set(CMAKE_BUILD_TYPE
|
|
Debug
|
|
CACHE STRING "Build type.")
|
|
|
|
project(
|
|
ueberzugpp
|
|
LANGUAGES CXX C
|
|
VERSION ${UEBERZUGPP_VERSION})
|
|
add_executable(ueberzug)
|
|
|
|
option(ENABLE_X11 "Enable X11 canvas." ON)
|
|
option(ENABLE_XCB_ERRORS "Enable useful logging of XCB errors." OFF)
|
|
option(ENABLE_WAYLAND "Enable wayland canvas" OFF)
|
|
option(ENABLE_DBUS "Enable dbus support" OFF)
|
|
option(ENABLE_OPENCV "Enable OpenCV image processing." ON)
|
|
option(ENABLE_TURBOBASE64 "Enable Turbo-Base64 for base64 encoding." OFF)
|
|
option(ENABLE_OPENGL "Enable canvas rendering with OpenGL." OFF)
|
|
|
|
include(FetchContent)
|
|
include(GNUInstallDirs)
|
|
include(CheckCXXSymbolExists)
|
|
|
|
find_package(PkgConfig REQUIRED)
|
|
find_package(Threads REQUIRED)
|
|
find_package(OpenSSL REQUIRED)
|
|
find_package(TBB REQUIRED)
|
|
|
|
# check if <execution> is available
|
|
set(CMAKE_REQUIRED_LIBRARIES TBB::tbb)
|
|
check_cxx_symbol_exists(std::execution::par_unseq execution
|
|
HAVE_STD_EXECUTION_H)
|
|
if(HAVE_STD_EXECUTION_H)
|
|
target_compile_definitions(ueberzug PRIVATE HAVE_STD_EXECUTION_H)
|
|
endif()
|
|
|
|
find_package(CLI11 QUIET)
|
|
if(NOT CLI11_FOUND)
|
|
if(FETCHCONTENT_FULLY_DISCONNECTED)
|
|
add_subdirectory("${CMAKE_SOURCE_DIR}/third_party/CLI11")
|
|
else()
|
|
FetchContent_Declare(
|
|
cli11
|
|
URL https://github.com/CLIUtils/CLI11/archive/refs/tags/v2.4.2.tar.gz)
|
|
list(APPEND FC_LIBS cli11)
|
|
endif()
|
|
endif()
|
|
|
|
find_package(nlohmann_json QUIET)
|
|
if(NOT nlohmann_json_FOUND)
|
|
FetchContent_Declare(
|
|
nlohmann_json
|
|
URL https://github.com/nlohmann/json/releases/download/v3.11.3/json.tar.xz)
|
|
list(APPEND FC_LIBS nlohmann_json)
|
|
endif()
|
|
|
|
find_package(fmt QUIET)
|
|
if(NOT fmt_FOUND)
|
|
FetchContent_Declare(
|
|
fmt URL https://github.com/fmtlib/fmt/archive/refs/tags/10.2.1.tar.gz)
|
|
list(APPEND FC_LIBS fmt)
|
|
endif()
|
|
|
|
find_package(spdlog QUIET)
|
|
if(NOT spdlog_FOUND)
|
|
set(SPDLOG_FMT_EXTERNAL ON)
|
|
FetchContent_Declare(
|
|
spdlog
|
|
URL https://github.com/gabime/spdlog/archive/refs/tags/v1.14.1.tar.gz)
|
|
list(APPEND FC_LIBS spdlog)
|
|
endif()
|
|
|
|
if(FC_LIBS)
|
|
FetchContent_MakeAvailable(${FC_LIBS})
|
|
endif()
|
|
|
|
find_package(range-v3 QUIET)
|
|
if(NOT range-v3_FOUND)
|
|
FetchContent_Declare(
|
|
range-v3
|
|
URL https://github.com/ericniebler/range-v3/archive/refs/tags/0.12.0.tar.gz)
|
|
FetchContent_Populate(range-v3)
|
|
add_subdirectory(${range-v3_SOURCE_DIR} ${range-v3_BINARY_DIR}
|
|
EXCLUDE_FROM_ALL)
|
|
endif()
|
|
|
|
if(ENABLE_OPENGL)
|
|
target_compile_definitions(ueberzug PRIVATE ENABLE_OPENGL)
|
|
find_package(OpenGL REQUIRED)
|
|
list(APPEND UEBERZUG_SOURCES "src/util/egl.cpp")
|
|
list(APPEND UEBERZUG_LIBRARIES OpenGL::OpenGL OpenGL::EGL)
|
|
endif()
|
|
|
|
if(ENABLE_X11)
|
|
target_compile_definitions(ueberzug PRIVATE ENABLE_X11)
|
|
pkg_check_modules(XCB REQUIRED IMPORTED_TARGET xcb)
|
|
pkg_check_modules(XCBIMAGE REQUIRED IMPORTED_TARGET xcb-image)
|
|
pkg_check_modules(XCBRES REQUIRED IMPORTED_TARGET xcb-res)
|
|
list(APPEND UEBERZUG_SOURCES "src/util/x11.cpp" "src/canvas/x11/x11.cpp"
|
|
"src/canvas/x11/window/x11.cpp")
|
|
list(APPEND UEBERZUG_LIBRARIES PkgConfig::XCB PkgConfig::XCBIMAGE
|
|
PkgConfig::XCBRES)
|
|
|
|
if(ENABLE_OPENGL)
|
|
list(APPEND UEBERZUG_SOURCES "src/canvas/x11/window/x11egl.cpp")
|
|
endif()
|
|
|
|
if(ENABLE_XCB_ERRORS)
|
|
target_compile_definitions(ueberzug PRIVATE ENABLE_XCB_ERRORS)
|
|
pkg_check_modules(XCBERRORS REQUIRED IMPORTED_TARGET xcb-errors)
|
|
list(APPEND UEBERZUG_LIBRARIES PkgConfig::XCBERRORS)
|
|
endif()
|
|
endif()
|
|
|
|
if(ENABLE_WAYLAND)
|
|
target_compile_definitions(ueberzug PRIVATE ENABLE_WAYLAND)
|
|
find_package(ECM REQUIRED NO_MODULE)
|
|
list(APPEND CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
|
|
|
|
find_library(LIBRT rt REQUIRED)
|
|
if(ENABLE_OPENGL)
|
|
find_package(Wayland REQUIRED COMPONENTS Client Egl)
|
|
list(APPEND UEBERZUG_LIBRARIES Wayland::Egl)
|
|
list(APPEND UEBERZUG_SOURCES "src/canvas/wayland/window/waylandegl.cpp")
|
|
else()
|
|
find_package(Wayland REQUIRED COMPONENTS Client)
|
|
endif()
|
|
find_package(WaylandProtocols REQUIRED)
|
|
find_package(WaylandScanner REQUIRED)
|
|
|
|
ecm_add_wayland_client_protocol(
|
|
UEBERZUG_SOURCES PROTOCOL
|
|
"${WaylandProtocols_DATADIR}/stable/xdg-shell/xdg-shell.xml" BASENAME
|
|
"xdg-shell")
|
|
|
|
list(
|
|
APPEND
|
|
UEBERZUG_SOURCES
|
|
"src/canvas/wayland/wayland.cpp"
|
|
"src/canvas/wayland/config.cpp"
|
|
"src/canvas/wayland/window/shm.cpp"
|
|
"src/canvas/wayland/window/waylandshm.cpp"
|
|
"src/canvas/wayland/config/sway.cpp"
|
|
"src/canvas/wayland/config/hyprland.cpp"
|
|
"src/canvas/wayland/config/wayfire.cpp"
|
|
"src/canvas/wayland/config/dummy.cpp")
|
|
|
|
list(APPEND UEBERZUG_LIBRARIES Wayland::Client ${LIBRT})
|
|
endif()
|
|
|
|
if(ENABLE_OPENCV)
|
|
target_compile_definitions(ueberzug PRIVATE ENABLE_OPENCV)
|
|
find_package(OpenCV REQUIRED COMPONENTS core imgproc imgcodecs videoio)
|
|
|
|
list(APPEND UEBERZUG_SOURCES "src/image/opencv.cpp")
|
|
list(APPEND UEBERZUG_LIBRARIES opencv_core opencv_imgproc opencv_imgcodecs
|
|
opencv_videoio)
|
|
endif()
|
|
|
|
if(ENABLE_TURBOBASE64)
|
|
target_compile_definitions(ueberzug PRIVATE ENABLE_TURBOBASE64)
|
|
find_package(turbobase64 QUIET)
|
|
if(NOT turbobase64_FOUND)
|
|
FetchContent_Declare(
|
|
turbobase64
|
|
URL https://github.com/powturbo/Turbo-Base64/archive/refs/tags/2023.08.tar.gz
|
|
)
|
|
FetchContent_Populate(turbobase64)
|
|
add_subdirectory(${turbobase64_SOURCE_DIR} ${turbobase64_BINARY_DIR}
|
|
EXCLUDE_FROM_ALL)
|
|
list(APPEND UEBERZUG_LIBRARIES base64)
|
|
else()
|
|
target_compile_definitions(ueberzug PRIVATE WITH_SYSTEM_TURBOBASE64)
|
|
list(APPEND UEBERZUG_LIBRARIES turbo::base64)
|
|
endif()
|
|
endif()
|
|
|
|
if(ENABLE_DBUS)
|
|
pkg_check_modules(DBUS REQUIRED IMPORTED_TARGET dbus-1)
|
|
list(APPEND UEBERZUG_LIBRARIES PkgConfig::DBUS)
|
|
list(APPEND UEBERZUG_SOURCES "src/util/dbus.cpp")
|
|
endif()
|
|
|
|
set(PROJECT_WARNINGS_CXX -Wall -Wextra -Wpedantic -Werror)
|
|
|
|
target_compile_options(
|
|
ueberzug PRIVATE $<$<CONFIG:Debug>:
|
|
$<$<COMPILE_LANGUAGE:CXX>:${PROJECT_WARNINGS_CXX}> >)
|
|
|
|
target_compile_definitions(ueberzug PRIVATE $<$<CONFIG:Debug>: DEBUG >)
|
|
|
|
pkg_check_modules(VIPS REQUIRED IMPORTED_TARGET vips-cpp)
|
|
pkg_check_modules(SIXEL REQUIRED IMPORTED_TARGET libsixel)
|
|
pkg_check_modules(CHAFA REQUIRED IMPORTED_TARGET chafa>=1.6)
|
|
|
|
if(CMAKE_HOST_SYSTEM_VERSION MATCHES "^.*microsoft.*$")
|
|
target_compile_definitions(ueberzug PRIVATE WSL)
|
|
endif()
|
|
|
|
if(APPLE)
|
|
list(APPEND UEBERZUG_SOURCES src/process/apple.cpp)
|
|
else()
|
|
list(APPEND UEBERZUG_SOURCES src/process/linux.cpp)
|
|
endif()
|
|
|
|
configure_file("include/version.hpp.in" version.hpp)
|
|
configure_file("docs/ueberzugpp.1.in" ueberzugpp.1)
|
|
|
|
list(
|
|
APPEND
|
|
UEBERZUG_SOURCES
|
|
"src/main.cpp"
|
|
"src/application.cpp"
|
|
"src/os.cpp"
|
|
"src/tmux.cpp"
|
|
"src/terminal.cpp"
|
|
"src/dimensions.cpp"
|
|
"src/flags.cpp"
|
|
"src/util/util.cpp"
|
|
"src/util/socket.cpp"
|
|
"src/canvas.cpp"
|
|
"src/canvas/chafa.cpp"
|
|
"src/canvas/sixel.cpp"
|
|
"src/canvas/kitty/kitty.cpp"
|
|
"src/canvas/kitty/chunk.cpp"
|
|
"src/canvas/iterm2/iterm2.cpp"
|
|
"src/canvas/iterm2/chunk.cpp"
|
|
"src/image.cpp"
|
|
"src/image/libvips.cpp")
|
|
|
|
list(
|
|
APPEND
|
|
UEBERZUG_LIBRARIES
|
|
nlohmann_json::nlohmann_json
|
|
CLI11::CLI11
|
|
Threads::Threads
|
|
fmt::fmt
|
|
spdlog::spdlog
|
|
range-v3
|
|
OpenSSL::Crypto
|
|
TBB::tbb
|
|
PkgConfig::VIPS
|
|
PkgConfig::SIXEL
|
|
PkgConfig::CHAFA)
|
|
|
|
target_include_directories(ueberzug PRIVATE "${CMAKE_SOURCE_DIR}/include"
|
|
"${PROJECT_BINARY_DIR}")
|
|
target_sources(ueberzug PRIVATE ${UEBERZUG_SOURCES})
|
|
target_link_libraries(ueberzug PRIVATE ${UEBERZUG_LIBRARIES})
|
|
file(CREATE_LINK ueberzug "${PROJECT_BINARY_DIR}/ueberzugpp" SYMBOLIC)
|
|
|
|
install(TARGETS ueberzug RUNTIME)
|
|
install(FILES "${PROJECT_BINARY_DIR}/ueberzugpp" TYPE BIN)
|
|
install(FILES "${PROJECT_BINARY_DIR}/ueberzugpp.1"
|
|
DESTINATION "${CMAKE_INSTALL_MANDIR}/man1")
|
|
install(
|
|
FILES "${PROJECT_BINARY_DIR}/ueberzugpp.1"
|
|
DESTINATION "${CMAKE_INSTALL_MANDIR}/man1"
|
|
RENAME ueberzug.1)
|