# 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 .
cmake_minimum_required(VERSION 3.21...3.28 FATAL_ERROR)
set(UEBERZUGPP_VERSION 2.9.7)
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 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 $<$:
$<$:${PROJECT_WARNINGS_CXX}> >)
target_compile_definitions(ueberzug PRIVATE $<$: 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)