This repository was archived by the owner on Feb 5, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
111 lines (83 loc) · 3.26 KB
/
Makefile
File metadata and controls
111 lines (83 loc) · 3.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# --- Toolchain & defaults (portable) --- #
UNAME_S := $(shell uname -s)
CC ?= clang
CFLAGS ?= -Wall -g
LDFLAGS :=
LIBS := -lcmdline
SRC_DIR := src
EXEC_DIR := execs
OBJ_DIR := $(EXEC_DIR)/obj
DOC_DIR := docs
DOC_BUILD_DIR := $(DOC_DIR)/builds
EXECS := $(EXEC_DIR)/fish $(EXEC_DIR)/cmdline_test
SOURCES := $(SRC_DIR)/cmdline.c $(SRC_DIR)/fish.c $(SRC_DIR)/cmdline_test.c $(SRC_DIR)/utils.c
OBJECTS := $(OBJ_DIR)/cmdline.o $(OBJ_DIR)/fish.o $(OBJ_DIR)/cmdline_test.o $(OBJ_DIR)/utils.o
# --- Platform specifics --- #
ifeq ($(UNAME_S),Darwin) # macOS
SO_EXT := dylib
SHARED_FLAG := -dynamiclib
RPATH_FLAG := -Wl,-rpath,@executable_path
LIB_ID_FLAG := -Wl,-install_name,@rpath/libcmdline.$(SO_EXT)
else # Linux
SO_EXT := so
SHARED_FLAG := -shared
RPATH_FLAG := -Wl,-rpath,'$$ORIGIN'
LIB_ID_FLAG :=
CC ?= gcc
endif
PERMANENT_FISH_EXEC := /usr/local/bin/fish
PERMANENT_LIB_CMDLINE := /usr/local/lib/libcmdline.$(SO_EXT)
all: install
install: dirs libs $(EXECS)
# --- Compilation Rules --- #
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(SRC_DIR)/%.h
$(CC) $(CFLAGS) -c $< -o $@
$(OBJ_DIR)/cmdline.o: $(SRC_DIR)/cmdline.c $(SRC_DIR)/cmdline.h
$(CC) $(CFLAGS) -fPIC -c $< -o $@
$(EXEC_DIR)/fish: $(OBJ_DIR)/fish.o $(OBJ_DIR)/utils.o
$(CC) $(CFLAGS) $^ -o $@ $(LIBS) -L$(EXEC_DIR) $(RPATH_FLAG)
$(EXEC_DIR)/cmdline_test: $(OBJ_DIR)/cmdline_test.o
$(CC) $(CFLAGS) $^ -o $@ $(LIBS) -L$(EXEC_DIR) $(RPATH_FLAG)
libs: $(OBJ_DIR)/cmdline.o
$(CC) $(CFLAGS) $(SHARED_FLAG) $(OBJ_DIR)/cmdline.o -o $(EXEC_DIR)/libcmdline.$(SO_EXT) $(LIB_ID_FLAG)
# --- Clean Up / Prepare --- #
clean:
rm -rf $(EXEC_DIR) $(DOC_BUILD_DIR)
dirs:
mkdir -p $(OBJ_DIR) $(EXEC_DIR) $(DOC_BUILD_DIR)
# --- Documentation --- #
# Use doxygen (cf. https://www.doxygen.nl/) to generate documentation
full-docs: docs docs-pdf
docs: check-doxygen
@doxygen $(DOC_DIR)/Doxyfile > /dev/null
open-docs: docs
@open $(DOC_BUILD_DIR)/html/index.html
docs-pdf: docs
@$(MAKE) -C $(DOC_BUILD_DIR)/latex/ > /dev/null
open-pdf: docs-pdf
@open $(DOC_BUILD_DIR)/latex/refman.pdf
# --- Helpers --- #
check-doxygen:
@command -v doxygen >/dev/null 2>&1 || (echo "Doxygen not found. Install it (e.g. 'brew install doxygen' on macOS)." && exit 1)
permanent-install: install
@echo "Installing fish to $(PERMANENT_FISH_EXEC) and lib to $(PERMANENT_LIB_CMDLINE)"
sudo rm -f $(PERMANENT_FISH_EXEC) $(PERMANENT_LIB_CMDLINE)
sudo cp $(EXEC_DIR)/fish $(PERMANENT_FISH_EXEC)
sudo cp $(EXEC_DIR)/libcmdline.$(SO_EXT) $(PERMANENT_LIB_CMDLINE)
ifeq ($(UNAME_S),Darwin)
sudo install_name_tool -id $(PERMANENT_LIB_CMDLINE) $(PERMANENT_LIB_CMDLINE)
sudo install_name_tool -change @rpath/libcmdline.$(SO_EXT) $(PERMANENT_LIB_CMDLINE) $(PERMANENT_FISH_EXEC)
else
@sudo ldconfig || true
endif
@echo "\n\033[1;34mFish installed successfully! Try 'fish'.\033[0m"
help:
@echo "Usage: make [target]"
@echo "Targets:"
@echo " all / install Build libs & execs"
@echo " permanent-install Copy fish and lib to /usr/local"
@echo " clean Remove builds"
@echo " docs / full-docs Generate docs (needs doxygen)"
@echo " open-docs Open HTML docs"
@echo " open-pdf Open PDF docs"
.PHONY: all clean libs dirs docs docs-pdf open-docs open-pdf check-doxygen install permanent-install help