summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
authorpants <niklasjo2004@gmail.com>2026-09-21 14:18:06 -0700
committerpants <niklasjo2004@gmail.com>2026-09-21 14:18:06 -0700
commit83d5ba42f8a98fc0df177efef4333f74a0481f61 (patch)
tree6f1fcff64ec9adb2fc51a7cfcc451eb22a103fb3 /CMakeLists.txt
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt280
1 files changed, 280 insertions, 0 deletions
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 <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)