diff --git a/.gitignore b/.gitignore index 65ddc50..a0192a0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +.idea bin obj valgrind.log +zig-cache +zig-out \ No newline at end of file diff --git a/build.zig b/build.zig new file mode 100644 index 0000000..c77f70f --- /dev/null +++ b/build.zig @@ -0,0 +1,219 @@ +const std = @import("std"); + +pub fn build(b: *std.Build) void { + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); + + const c_args = [_][]const u8{ + "-std=c99", + "-pedantic", + "-g", + "-Wall", + "-Wextra", + "-Werror=vla", + "-Wno-unused-parameter", + "-D_DEFAULT_SOURCE", + "-D_POSIX_C_SOURCE=200809L", + "-D_XOPEN_SOURCE", + }; + + const exe = b.addExecutable(.{ + .name = "ly", + .target = target, + .optimize = optimize, + }); + + exe.linkSystemLibrary("pam"); + exe.linkSystemLibrary("xcb"); + exe.linkLibC(); + + exe.addIncludePath("src"); + exe.addIncludePath("sub/argoat/src"); + exe.addIncludePath("sub/argoat/sub/testoasterror/src"); + exe.addIncludePath("sub/configator/src"); + exe.addIncludePath("sub/dragonfail/src"); + exe.addIncludePath("sub/termbox_next/src"); + + exe.addCSourceFile("src/config.c", &c_args); + exe.addCSourceFile("src/draw.c", &c_args); + exe.addCSourceFile("src/inputs.c", &c_args); + exe.addCSourceFile("src/login.c", &c_args); + exe.addCSourceFile("src/main.c", &c_args); + exe.addCSourceFile("src/utils.c", &c_args); + exe.addCSourceFile("sub/argoat/src/argoat.c", &c_args); + exe.addCSourceFile("sub/argoat/sub/testoasterror/src/testoasterror.c", &c_args); + exe.addCSourceFile("sub/configator/src/configator.c", &c_args); + exe.addCSourceFile("sub/dragonfail/src/dragonfail.c", &c_args); + exe.addCSourceFile("sub/termbox_next/src/input.c", &c_args); + exe.addCSourceFile("sub/termbox_next/src/memstream.c", &c_args); + exe.addCSourceFile("sub/termbox_next/src/ringbuffer.c", &c_args); + exe.addCSourceFile("sub/termbox_next/src/term.c", &c_args); + exe.addCSourceFile("sub/termbox_next/src/termbox.c", &c_args); + exe.addCSourceFile("sub/termbox_next/src/utf8.c", &c_args); + + b.installArtifact(exe); + + const run_cmd = b.addRunArtifact(exe); + + run_cmd.step.dependOn(b.getInstallStep()); + + if (b.args) |args| { + run_cmd.addArgs(args); + } + + const run_step = b.step("run", "Run the app"); + run_step.dependOn(&run_cmd.step); + + const installexe_step = b.step("installexe", "Install Ly"); + installexe_step.makeFn = installexe; + installexe_step.dependOn(b.getInstallStep()); + + const installnoconf_step = b.step("installnoconf", "Install Ly without its configuration file"); + installnoconf_step.makeFn = installnoconf; + installnoconf_step.dependOn(b.getInstallStep()); + + const installsystemd_step = b.step("installsystemd", "Install the Ly systemd service"); + installsystemd_step.makeFn = installsystemd; + installsystemd_step.dependOn(installexe_step); + + const installopenrc_step = b.step("installopenrc", "Install the Ly openrc service"); + installopenrc_step.makeFn = installopenrc; + installopenrc_step.dependOn(installexe_step); + + const installrunit_step = b.step("installrunit", "Install the Ly runit service"); + installrunit_step.makeFn = installrunit; + installrunit_step.dependOn(installexe_step); + + const uninstallall_step = b.step("uninstallall", "Uninstall Ly and all services"); + uninstallall_step.makeFn = uninstallall; +} + +fn installexe(self: *std.Build.Step, progress: *std.Progress.Node) !void { + _ = progress; + _ = self; + + try install_ly(true); +} + +fn installnoconf(self: *std.Build.Step, progress: *std.Progress.Node) !void { + _ = progress; + _ = self; + + try install_ly(false); +} + +fn installsystemd(self: *std.Build.Step, progress: *std.Progress.Node) !void { + _ = progress; + _ = self; + + var service_dir = std.fs.openDirAbsolute("/usr/lib/systemd/system", .{}) catch unreachable; + defer service_dir.close(); + + try std.fs.cwd().copyFile("res/ly.service", service_dir, "ly.service", .{ .override_mode = 644 }); +} + +fn installopenrc(self: *std.Build.Step, progress: *std.Progress.Node) !void { + _ = progress; + _ = self; + + var service_dir = std.fs.openDirAbsolute("/etc/init.d", .{}) catch unreachable; + defer service_dir.close(); + + try std.fs.cwd().copyFile("res/ly-openrc", service_dir, "ly", .{ .override_mode = 755 }); +} + +fn installrunit(self: *std.Build.Step, progress: *std.Progress.Node) !void { + _ = progress; + _ = self; + + var service_dir = std.fs.openDirAbsolute("/etc/sv", .{}) catch unreachable; + defer service_dir.close(); + + std.fs.makeDirAbsolute("/etc/sv/ly") catch { + std.debug.print("warn: /etc/sv/ly already exists as a directory.\n", .{}); + }; + + var ly_service_dir = std.fs.openDirAbsolute("/etc/sv/ly", .{}) catch unreachable; + defer ly_service_dir.close(); + + try std.fs.cwd().copyFile("res/ly-runit-service/conf", ly_service_dir, "conf", .{}); + try std.fs.cwd().copyFile("res/ly-runit-service/finish", ly_service_dir, "finish", .{}); + try std.fs.cwd().copyFile("res/ly-runit-service/run", ly_service_dir, "run", .{}); +} + +fn uninstallall(self: *std.Build.Step, progress: *std.Progress.Node) !void { + _ = progress; + _ = self; + + try std.fs.deleteTreeAbsolute("/etc/ly"); + try std.fs.deleteFileAbsolute("/usr/bin/ly"); + try std.fs.deleteFileAbsolute("/etc/pam.d/ly"); + std.fs.deleteFileAbsolute("/usr/lib/systemd/system/ly.service") catch { + std.debug.print("warn: systemd service not found.\n", .{}); + }; + std.fs.deleteFileAbsolute("/etc/init.d/ly") catch { + std.debug.print("warn: openrc service not found.\n", .{}); + }; + std.fs.deleteTreeAbsolute("/etc/sv/ly") catch { + std.debug.print("warn: runit service not found.\n", .{}); + }; +} + +fn install_ly(install_config: bool) !void { + std.fs.makeDirAbsolute("/etc/ly") catch { + std.debug.print("warn: /etc/ly already exists as a directory.\n", .{}); + }; + + std.fs.makeDirAbsolute("/etc/ly/lang") catch { + std.debug.print("warn: /etc/ly/lang already exists as a directory.\n", .{}); + }; + + var current_dir = std.fs.cwd(); + + { + var executable_dir = std.fs.openDirAbsolute("/usr/bin", .{}) catch unreachable; + defer executable_dir.close(); + + try current_dir.copyFile("zig-out/bin/ly", executable_dir, "ly", .{}); + } + + { + var config_dir = std.fs.openDirAbsolute("/etc/ly", .{}) catch unreachable; + defer config_dir.close(); + + if (install_config) { + try current_dir.copyFile("res/config.ini", config_dir, "config.ini", .{}); + } + try current_dir.copyFile("res/xsetup.sh", config_dir, "xsetup.sh", .{}); + try current_dir.copyFile("res/wsetup.sh", config_dir, "wsetup.sh", .{}); + } + + { + var lang_dir = std.fs.openDirAbsolute("/etc/ly/lang", .{}) catch unreachable; + defer lang_dir.close(); + + try current_dir.copyFile("res/lang/cat.ini", lang_dir, "cat.ini", .{}); + try current_dir.copyFile("res/lang/cs.ini", lang_dir, "cs.ini", .{}); + try current_dir.copyFile("res/lang/de.ini", lang_dir, "de.ini", .{}); + try current_dir.copyFile("res/lang/en.ini", lang_dir, "en.ini", .{}); + try current_dir.copyFile("res/lang/es.ini", lang_dir, "es.ini", .{}); + try current_dir.copyFile("res/lang/fr.ini", lang_dir, "fr.ini", .{}); + try current_dir.copyFile("res/lang/it.ini", lang_dir, "it.ini", .{}); + try current_dir.copyFile("res/lang/pl.ini", lang_dir, "pl.ini", .{}); + try current_dir.copyFile("res/lang/pt.ini", lang_dir, "pt.ini", .{}); + try current_dir.copyFile("res/lang/pt_BR.ini", lang_dir, "pt_BR.ini", .{}); + try current_dir.copyFile("res/lang/ro.ini", lang_dir, "ro.ini", .{}); + try current_dir.copyFile("res/lang/ru.ini", lang_dir, "ru.ini", .{}); + try current_dir.copyFile("res/lang/sr.ini", lang_dir, "sr.ini", .{}); + try current_dir.copyFile("res/lang/sv.ini", lang_dir, "sv.ini", .{}); + try current_dir.copyFile("res/lang/tr.ini", lang_dir, "tr.ini", .{}); + try current_dir.copyFile("res/lang/uk.ini", lang_dir, "uk.ini", .{}); + } + + { + var pam_dir = std.fs.openDirAbsolute("/etc/pam.d", .{}) catch unreachable; + defer pam_dir.close(); + + try current_dir.copyFile("res/pam.d/ly", pam_dir, "ly", .{ .override_mode = 644 }); + } +} diff --git a/makefile b/makefile deleted file mode 100644 index e5fa5b2..0000000 --- a/makefile +++ /dev/null @@ -1,118 +0,0 @@ -NAME = ly -CC = gcc -FLAGS = -std=c99 -pedantic -g -FLAGS+= -Wall -Wextra -Werror=vla -Wno-unused-parameter -#FLAGS+= -DDEBUG -FLAGS+= -DLY_VERSION=\"$(shell git describe --long --tags | sed 's/\([^-]*-g\)/r\1/;s/-/./g')\" -LINK = -lpam -lxcb -VALGRIND = --show-leak-kinds=all --track-origins=yes --leak-check=full --suppressions=../res/valgrind.supp -CMD = ./$(NAME) - -OS:= $(shell uname -s) -ifeq ($(OS), Linux) - FLAGS+= -D_DEFAULT_SOURCE -endif - -BIND = bin -OBJD = obj -SRCD = src -SUBD = sub -RESD = res -TESTD = tests - -DATADIR ?= ${DESTDIR}/etc/ly -FLAGS+= -DDATADIR=\"$(DATADIR)\" - -INCL = -I$(SRCD) -INCL+= -I$(SUBD)/ctypes -INCL+= -I$(SUBD)/argoat/src -INCL+= -I$(SUBD)/configator/src -INCL+= -I$(SUBD)/dragonfail/src -INCL+= -I$(SUBD)/termbox_next/src - -SRCS = $(SRCD)/main.c -SRCS += $(SRCD)/config.c -SRCS += $(SRCD)/draw.c -SRCS += $(SRCD)/inputs.c -SRCS += $(SRCD)/login.c -SRCS += $(SRCD)/utils.c -SRCS += $(SUBD)/argoat/src/argoat.c -SRCS += $(SUBD)/configator/src/configator.c -SRCS += $(SUBD)/dragonfail/src/dragonfail.c - -SRCS_OBJS:= $(patsubst %.c,$(OBJD)/%.o,$(SRCS)) -SRCS_OBJS+= $(SUBD)/termbox_next/bin/termbox.a - -.PHONY: final -final: $(BIND)/$(NAME) - -$(OBJD)/%.o: %.c - @echo "building object $@" - @mkdir -p $(@D) - @$(CC) $(INCL) $(FLAGS) -c -o $@ $< - -$(SUBD)/termbox_next/bin/termbox.a: - @echo "building static object $@" - @(cd $(SUBD)/termbox_next && $(MAKE)) - -$(BIND)/$(NAME): $(SRCS_OBJS) - @echo "compiling executable $@" - @mkdir -p $(@D) - @$(CC) -o $@ $^ $(LINK) - -run: - @cd $(BIND) && $(CMD) - -leak: leakgrind -leakgrind: $(BIND)/$(NAME) - @rm -f valgrind.log - @cd $(BIND) && valgrind $(VALGRIND) 2> ../valgrind.log $(CMD) - @less valgrind.log - -install: $(BIND)/$(NAME) - @echo "installing ly" - @install -dZ ${DESTDIR}/etc/ly - @install -DZ $(BIND)/$(NAME) -t ${DESTDIR}/usr/bin - @install -DZ $(RESD)/config.ini -t ${DESTDIR}/etc/ly - @install -DZ $(RESD)/xsetup.sh -t $(DATADIR) - @install -DZ $(RESD)/wsetup.sh -t $(DATADIR) - @install -dZ $(DATADIR)/lang - @install -DZ $(RESD)/lang/* -t $(DATADIR)/lang - @install -DZ $(RESD)/pam.d/ly -m 644 -t ${DESTDIR}/etc/pam.d - -installnoconf: $(BIND)/$(NAME) - @echo "installing ly without the configuration file" - @install -dZ ${DESTDIR}/etc/ly - @install -DZ $(BIND)/$(NAME) -t ${DESTDIR}/usr/bin - @install -DZ $(RESD)/xsetup.sh -t $(DATADIR) - @install -DZ $(RESD)/wsetup.sh -t $(DATADIR) - @install -dZ $(DATADIR)/lang - @install -DZ $(RESD)/lang/* -t $(DATADIR)/lang - @install -DZ $(RESD)/pam.d/ly -m 644 -t ${DESTDIR}/etc/pam.d - -installsystemd: - @echo "installing systemd service" - @install -DZ $(RESD)/ly.service -m 644 -t ${DESTDIR}/usr/lib/systemd/system - -installopenrc: - @echo "installing openrc service" - @install -DZ $(RESD)/ly-openrc -m 755 -T ${DESTDIR}/etc/init.d/${NAME} - -installrunit: - @echo "installing runit service" - @install -DZ $(RESD)/ly-runit-service/* -t ${DESTDIR}/etc/sv/ly - -uninstall: - @echo "uninstalling" - @rm -rf ${DESTDIR}/etc/ly - @rm -rf $(DATADIR) - @rm -f ${DESTDIR}/usr/bin/ly - @rm -f ${DESTDIR}/usr/lib/systemd/system/ly.service - @rm -f ${DESTDIR}/etc/pam.d/ly - @rm -f ${DESTDIR}/etc/init.d/${NAME} - @rm -rf ${DESTDIR}/etc/sv/ly - -clean: - @echo "cleaning" - @rm -rf $(BIND) $(OBJD) valgrind.log - @(cd $(SUBD)/termbox_next && $(MAKE) clean) diff --git a/src/config.c b/src/config.c index 1704d9d..506c794 100644 --- a/src/config.c +++ b/src/config.c @@ -11,7 +11,7 @@ #include #ifndef DEBUG - #define INI_LANG DATADIR "/lang/%s.ini" + #define INI_LANG "/etc/ly/lang/%s.ini" #define INI_CONFIG "/etc/ly/config.ini" #else #define INI_LANG "../res/lang/%s.ini" @@ -297,12 +297,12 @@ void config_defaults() config.shutdown_cmd = strdup("/sbin/shutdown -a now"); config.term_reset_cmd = strdup("/usr/bin/tput reset"); config.tty = 2; - config.wayland_cmd = strdup(DATADIR "/wsetup.sh"); + config.wayland_cmd = strdup("/etc/ly/wsetup.sh"); config.wayland_specifier = false; config.waylandsessions = strdup("/usr/share/wayland-sessions"); config.x_cmd = strdup("/usr/bin/X"); config.xinitrc = strdup("~/.xinitrc"); - config.x_cmd_setup = strdup(DATADIR "/xsetup.sh"); + config.x_cmd_setup = strdup("/etc/ly/xsetup.sh"); config.xauth_cmd = strdup("/usr/bin/xauth"); config.xsessions = strdup("/usr/share/xsessions"); } diff --git a/src/main.c b/src/main.c index 8109ccf..34e2d22 100644 --- a/src/main.c +++ b/src/main.c @@ -21,7 +21,7 @@ #define ARG_COUNT 7 #ifndef LY_VERSION -#define LY_VERSION "0.6.0" +#define LY_VERSION "0.7.0" #endif // global