From 83d5ba42f8a98fc0df177efef4333f74a0481f61 Mon Sep 17 00:00:00 2001 From: pants Date: Mon, 21 Sep 2026 14:18:06 -0700 Subject: init --- CMakeLists.txt | 280 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 CMakeLists.txt (limited to 'CMakeLists.txt') diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..4f0e54e --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,280 @@ +# 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.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 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) -- cgit v1.2.3