build: add flake.nix and wayland deps (untested)

This commit is contained in:
2025-12-09 11:48:40 +03:00
parent 38318f0205
commit 792aed7439
4 changed files with 227 additions and 44 deletions

View File

@@ -2,10 +2,12 @@ cmake_minimum_required(VERSION 3.25)
project(clrsync VERSION 0.1.3 LANGUAGES CXX) project(clrsync VERSION 0.1.3 LANGUAGES CXX)
include(GNUInstallDirs) include(GNUInstallDirs)
set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
# -----------------------------
# Platform-specific install dirs
# -----------------------------
if(WIN32) if(WIN32)
set(CMAKE_INSTALL_PREFIX "C:/Program Files/clrsync") set(CMAKE_INSTALL_PREFIX "C:/Program Files/clrsync")
set(CMAKE_INSTALL_BINDIR "bin") set(CMAKE_INSTALL_BINDIR "bin")
@@ -14,11 +16,17 @@ if(WIN32)
set(CMAKE_INSTALL_FULL_DATADIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}") set(CMAKE_INSTALL_FULL_DATADIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}")
endif() endif()
# -----------------------------
# RPATH settings
# -----------------------------
set(CMAKE_SKIP_BUILD_RPATH FALSE) set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
set(CMAKE_INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}") set(CMAKE_INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}")
# -----------------------------
# Templates
# -----------------------------
configure_file( configure_file(
${CMAKE_SOURCE_DIR}/src/core/version.hpp.in ${CMAKE_SOURCE_DIR}/src/core/version.hpp.in
${CMAKE_SOURCE_DIR}/src/core/version.hpp ${CMAKE_SOURCE_DIR}/src/core/version.hpp
@@ -31,10 +39,14 @@ configure_file(
@ONLY @ONLY
) )
# -----------------------------
# Find packages
# -----------------------------
find_package(OpenGL REQUIRED) find_package(OpenGL REQUIRED)
if(WIN32) if(WIN32)
include(FetchContent) include(FetchContent)
FetchContent_Declare( FetchContent_Declare(
freetype freetype
URL https://download.savannah.gnu.org/releases/freetype/freetype-2.14.1.tar.gz URL https://download.savannah.gnu.org/releases/freetype/freetype-2.14.1.tar.gz
@@ -46,20 +58,60 @@ if(WIN32)
GIT_REPOSITORY https://github.com/glfw/glfw.git GIT_REPOSITORY https://github.com/glfw/glfw.git
GIT_TAG 3.3.10 GIT_TAG 3.3.10
) )
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(glfw) FetchContent_MakeAvailable(glfw)
else() else()
find_package(Freetype REQUIRED) find_package(Freetype REQUIRED)
find_package(PkgConfig REQUIRED) find_package(PkgConfig REQUIRED)
find_package(Fontconfig REQUIRED) find_package(Fontconfig REQUIRED)
find_package(ZLIB REQUIRED)
find_package(BZip2 REQUIRED)
find_package(PNG REQUIRED)
find_library(BROTLIDEC_LIBRARY NAMES brotlidec)
find_library(BROTLICOMMON_LIBRARY NAMES brotlicommon)
pkg_check_modules(HARFBUZZ harfbuzz)
pkg_check_modules(GLFW REQUIRED glfw3) pkg_check_modules(GLFW REQUIRED glfw3)
pkg_check_modules(WAYLAND_CLIENT wayland-client)
pkg_check_modules(WAYLAND_EGL wayland-egl)
include(CheckSymbolExists)
check_symbol_exists(glfwGetWaylandDisplay "GLFW/glfw3.h" GLFW_HAS_WAYLAND)
endif() endif()
# -----------------------------
# Extra libraries for Freetype
# -----------------------------
set(FREETYPE_EXTRA_LIBS "")
if(BROTLIDEC_LIBRARY AND BROTLICOMMON_LIBRARY)
list(APPEND FREETYPE_EXTRA_LIBS ${BROTLIDEC_LIBRARY} ${BROTLICOMMON_LIBRARY})
message(STATUS "Found Brotli libraries")
endif()
if(HARFBUZZ_FOUND)
list(APPEND FREETYPE_EXTRA_LIBS ${HARFBUZZ_LIBRARIES})
message(STATUS "Found HarfBuzz")
endif()
# -----------------------------
# Wayland
# -----------------------------
set(WAYLAND_LIBS "")
if(WAYLAND_CLIENT_FOUND)
list(APPEND WAYLAND_LIBS ${WAYLAND_CLIENT_LIBRARIES})
message(STATUS "Found Wayland client")
endif()
if(WAYLAND_EGL_FOUND)
list(APPEND WAYLAND_LIBS ${WAYLAND_EGL_LIBRARIES})
message(STATUS "Found Wayland EGL")
endif()
# -----------------------------
# Core
# -----------------------------
set(CORE_SOURCES set(CORE_SOURCES
src/core/palette/color.cpp src/core/palette/color.cpp
src/core/io/toml_file.cpp src/core/io/toml_file.cpp
@@ -76,10 +128,16 @@ target_compile_definitions(clrsync_core PUBLIC
CLRSYNC_DATADIR=\"${CMAKE_INSTALL_FULL_DATADIR}/clrsync\" CLRSYNC_DATADIR=\"${CMAKE_INSTALL_FULL_DATADIR}/clrsync\"
) )
# -----------------------------
# CLI
# -----------------------------
add_executable(clrsync_cli src/cli/main.cpp) add_executable(clrsync_cli src/cli/main.cpp)
target_include_directories(clrsync_cli PRIVATE src SYSTEM lib) target_include_directories(clrsync_cli PRIVATE src SYSTEM lib)
target_link_libraries(clrsync_cli PRIVATE clrsync_core) target_link_libraries(clrsync_cli PRIVATE clrsync_core)
# -----------------------------
# GUI
# -----------------------------
set(GUI_SOURCES set(GUI_SOURCES
src/gui/main.cpp src/gui/main.cpp
src/gui/color_scheme_editor.cpp src/gui/color_scheme_editor.cpp
@@ -93,74 +151,66 @@ set(GUI_SOURCES
src/gui/settings_window.cpp src/gui/settings_window.cpp
src/gui/font_loader.cpp src/gui/font_loader.cpp
) )
add_executable(clrsync_gui ${GUI_SOURCES}) add_executable(clrsync_gui ${GUI_SOURCES})
target_include_directories(clrsync_gui PRIVATE src SYSTEM lib) target_include_directories(clrsync_gui PRIVATE src SYSTEM lib)
# if(WIN32)
# set_target_properties(clrsync_gui PROPERTIES
# LINK_FLAGS "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup"
# )
# endif()
if(WIN32) # imgui
target_link_libraries(clrsync_gui PRIVATE clrsync_core glfw freetype imgui OpenGL::GL) set(IMGUI_SOURCE_DIR lib/imgui)
else()
target_include_directories(clrsync_gui PRIVATE ${FREETYPE_INCLUDE_DIRS} ${GLFW_INCLUDE_DIRS})
target_link_libraries(clrsync_gui PRIVATE clrsync_core imgui ${FREETYPE_LIBRARIES} ${GLFW_LIBRARIES} X11 Xrandr Xi Fontconfig::Fontconfig OpenGL::GL)
endif()
set(imgui_SOURCE_DIR lib/imgui)
add_library(imgui STATIC add_library(imgui STATIC
${imgui_SOURCE_DIR}/imgui.cpp ${IMGUI_SOURCE_DIR}/imgui.cpp
${imgui_SOURCE_DIR}/imgui_draw.cpp ${IMGUI_SOURCE_DIR}/imgui_draw.cpp
${imgui_SOURCE_DIR}/imgui_widgets.cpp ${IMGUI_SOURCE_DIR}/imgui_widgets.cpp
${imgui_SOURCE_DIR}/imgui_tables.cpp ${IMGUI_SOURCE_DIR}/imgui_tables.cpp
${imgui_SOURCE_DIR}/backends/imgui_impl_glfw.cpp ${IMGUI_SOURCE_DIR}/backends/imgui_impl_glfw.cpp
${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp ${IMGUI_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp
${imgui_SOURCE_DIR}/misc/freetype/imgui_freetype.cpp ${IMGUI_SOURCE_DIR}/misc/freetype/imgui_freetype.cpp
) )
target_include_directories(imgui PUBLIC SYSTEM target_include_directories(imgui PUBLIC SYSTEM
${imgui_SOURCE_DIR} ${IMGUI_SOURCE_DIR}
${imgui_SOURCE_DIR}/backends ${IMGUI_SOURCE_DIR}/backends
) )
target_compile_definitions(imgui PUBLIC IMGUI_ENABLE_FREETYPE)
if(WIN32) if(WIN32)
target_include_directories(imgui PUBLIC ${GLFW_INCLUDE_DIRS} ${freetype_SOURCE_DIR}/include) target_include_directories(imgui PUBLIC ${GLFW_INCLUDE_DIRS} ${freetype_SOURCE_DIR}/include)
target_link_libraries(clrsync_gui PRIVATE clrsync_core glfw freetype imgui OpenGL::GL)
else() else()
target_include_directories(imgui PUBLIC ${GLFW_INCLUDE_DIRS} ${FREETYPE_INCLUDE_DIRS}) target_include_directories(imgui PUBLIC ${GLFW_INCLUDE_DIRS} ${FREETYPE_INCLUDE_DIRS})
target_link_libraries(clrsync_gui PRIVATE
clrsync_core imgui Freetype::Freetype ${FREETYPE_EXTRA_LIBS}
ZLIB::ZLIB BZip2::BZip2 PNG::PNG
${GLFW_LIBRARIES} ${WAYLAND_LIBS}
X11 Xrandr Xi Fontconfig::Fontconfig OpenGL::GL
)
endif() endif()
target_link_libraries(imgui PUBLIC glfw OpenGL::GL freetype) # -----------------------------
target_compile_definitions(imgui PUBLIC IMGUI_ENABLE_FREETYPE) # Installation
# -----------------------------
install(TARGETS clrsync_core install(TARGETS clrsync_core
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
COMPONENT Core COMPONENT Core
) )
install(TARGETS clrsync_cli install(TARGETS clrsync_cli
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
COMPONENT CLI COMPONENT CLI
) )
install(TARGETS clrsync_gui install(TARGETS clrsync_gui
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
COMPONENT GUI COMPONENT GUI
) )
install(FILES install(FILES example_config/config.toml
example_config/config.toml
DESTINATION ${CMAKE_INSTALL_DATADIR}/clrsync DESTINATION ${CMAKE_INSTALL_DATADIR}/clrsync
COMPONENT Core COMPONENT Core
) )
install(DIRECTORY example_config/templates install(DIRECTORY example_config/templates
DESTINATION ${CMAKE_INSTALL_DATADIR}/clrsync DESTINATION ${CMAKE_INSTALL_DATADIR}/clrsync
COMPONENT Core COMPONENT Core
FILES_MATCHING PATTERN "*" FILES_MATCHING PATTERN "*"
) )
install(DIRECTORY example_config/palettes install(DIRECTORY example_config/palettes
DESTINATION ${CMAKE_INSTALL_DATADIR}/clrsync DESTINATION ${CMAKE_INSTALL_DATADIR}/clrsync
COMPONENT Core COMPONENT Core
@@ -174,14 +224,17 @@ if(UNIX AND NOT APPLE)
) )
endif() endif()
# -----------------------------
# CPack configuration
# -----------------------------
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt")
set(CPACK_COMPONENTS_ALL Core GUI CLI)
set(CPACK_PACKAGE_NAME "clrsync") set(CPACK_PACKAGE_NAME "clrsync")
set(CPACK_PACKAGE_VENDOR "Daniel Dada") set(CPACK_PACKAGE_VENDOR "Daniel Dada")
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Color scheme manager") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Color scheme manager")
set(CPACK_GENERATOR "NSIS;DEB;RPM")
# Components
set(CPACK_COMPONENTS_ALL Core GUI CLI) set(CPACK_COMPONENTS_ALL Core GUI CLI)
set(CPACK_COMPONENT_CORE_DISPLAY_NAME "Core Library") set(CPACK_COMPONENT_CORE_DISPLAY_NAME "Core Library")
set(CPACK_COMPONENT_CORE_DESCRIPTION "clrsync core library and default configs (required)") set(CPACK_COMPONENT_CORE_DESCRIPTION "clrsync core library and default configs (required)")
@@ -193,30 +246,28 @@ set(CPACK_COMPONENT_CLI_DISPLAY_NAME "Command Line Tool")
set(CPACK_COMPONENT_CLI_DESCRIPTION "clrsync CLI app") set(CPACK_COMPONENT_CLI_DESCRIPTION "clrsync CLI app")
set(CPACK_COMPONENT_CLI_DEPENDS Core) set(CPACK_COMPONENT_CLI_DEPENDS Core)
set(CPACK_GENERATOR "NSIS;DEB;RPM") # NSIS
set(CPACK_NSIS_INSTALLED_NAME "clrsync") set(CPACK_NSIS_INSTALLED_NAME "clrsync")
set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
set(CPACK_NSIS_MODIFY_PATH ON) set(CPACK_NSIS_MODIFY_PATH ON)
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
set(CPACK_NSIS_MENU_LINKS "bin/clrsync_gui.exe" "clrsync") set(CPACK_NSIS_MENU_LINKS "bin/clrsync_gui.exe" "clrsync")
set(CPACK_NSIS_CREATE_DESKTOP_LINKS "bin/clrsync_gui.exe;clrsync") set(CPACK_NSIS_CREATE_DESKTOP_LINKS "bin/clrsync_gui.exe;clrsync")
# Debian
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Daniel Dada <dan@binarygoose.dev>") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Daniel Dada <dan@binarygoose.dev>")
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.31), libglfw3, libfreetype6") set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.31), libglfw3, libfreetype6")
set(CPACK_DEBIAN_PACKAGE_SECTION "utils") set(CPACK_DEBIAN_PACKAGE_SECTION "utils")
set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64") set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
# RPM
set(CPACK_RPM_PACKAGE_LICENSE "MIT") set(CPACK_RPM_PACKAGE_LICENSE "MIT")
set(CPACK_RPM_PACKAGE_GROUP "Applications/System") set(CPACK_RPM_PACKAGE_GROUP "Applications/System")
set(CPACK_RPM_PACKAGE_URL "https://github.com/obsqrbtz/clrsync") set(CPACK_RPM_PACKAGE_URL "https://github.com/obsqrbtz/clrsync")
set(CPACK_RPM_PACKAGE_REQUIRES "freetype, glfw, fontconfig") set(CPACK_RPM_PACKAGE_REQUIRES "freetype, glfw, fontconfig")
include(CPack)
message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}") message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
message(STATUS "CMAKE_INSTALL_FULL_DATADIR: ${CMAKE_INSTALL_FULL_DATADIR}") message(STATUS "CMAKE_INSTALL_FULL_DATADIR: ${CMAKE_INSTALL_FULL_DATADIR}")
include(CPack)

27
flake.lock generated Normal file
View File

@@ -0,0 +1,27 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1764950072,
"narHash": "sha256-BmPWzogsG2GsXZtlT+MTcAWeDK5hkbGRZTeZNW42fwA=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "f61125a668a320878494449750330ca58b78c557",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

99
flake.nix Normal file
View File

@@ -0,0 +1,99 @@
{
description = "clrsync - Color scheme manager";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
};
outputs = { self, nixpkgs, ... }: let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
in {
packages.${system} = rec {
clrsync-git = pkgs.stdenv.mkDerivation rec {
pname = "clrsync-git";
version = "unstable";
src = pkgs.fetchgit {
url = "https://github.com/obsqrbtz/clrsync.git";
rev = "HEAD";
sha256 = "sha256-znRtdLfdEmfdSGeiQA0v6hcZBFsQzgQtPY5uN98lwjo=";
};
nativeBuildInputs = [
pkgs.cmake
pkgs.git
pkgs.pkg-config
pkgs.makeWrapper
];
buildInputs = [
pkgs.glfw
pkgs.freetype
pkgs.fontconfig
pkgs.xorg.libXcursor
pkgs.mesa
pkgs.xorg.libX11
pkgs.xorg.libXrandr
pkgs.xorg.libXi
pkgs.xorg.libXinerama
pkgs.xorg.libXcursor
pkgs.wayland
pkgs.wayland-protocols
pkgs.libxkbcommon
pkgs.zlib
pkgs.bzip2
];
cmakeFlags = [
"-DCMAKE_BUILD_TYPE=Release"
];
installPhase = ''
cmake --install . --prefix $out
wrapProgram $out/bin/clrsync_gui \
--prefix LD_LIBRARY_PATH : ${pkgs.lib.makeLibraryPath buildInputs}
wrapProgram $out/bin/clrsync_cli \
--prefix LD_LIBRARY_PATH : ${pkgs.lib.makeLibraryPath buildInputs}
'';
meta = with pkgs.lib; {
description = "Color scheme manager (git version)";
homepage = "https://github.com/obsqrbtz/clrsync";
license = licenses.mit;
platforms = platforms.linux;
mainProgram = "clrsync_gui";
};
};
default = clrsync-git;
};
apps.${system} = {
clrsync-gui = {
type = "app";
program = "${self.packages.${system}.clrsync-git}/bin/clrsync_gui";
};
clrsync-cli = {
type = "app";
program = "${self.packages.${system}.clrsync-git}/bin/clrsync_cli";
};
default = self.apps.${system}.clrsync-gui;
};
devShells.${system}.default = pkgs.mkShell {
buildInputs = with pkgs; [
cmake
git
pkg-config
glfw
freetype
fontconfig
xorg.libXcursor
mesa
];
};
};
}

View File

@@ -1,6 +1,10 @@
#include <memory> #include <memory>
#define GLFW_EXPOSE_NATIVE_X11
#define GLFW_EXPOSE_NATIVE_WAYLAND
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
#include <GLFW/glfw3native.h>
#include "core/config/config.hpp" #include "core/config/config.hpp"
#include "core/io/toml_file.hpp" #include "core/io/toml_file.hpp"
@@ -27,6 +31,8 @@ int main(int, char**)
GLFWwindow* window = init_glfw(); GLFWwindow* window = init_glfw();
if (!window) return 1; if (!window) return 1;
printf("Using backend: %s\n", glfwGetVersionString());
init_imgui(window, ini_path); init_imgui(window, ini_path);
font_loader loader; font_loader loader;