Makefile (1996B) download
1# Directories
2SRC_DIR := src
3BUILD_DIR := build
4INCLUDE_DIR := include
5BIN_DIR := bin
6EXEC_DIR := $(SRC_DIR)/exec
7MAN_DIR := src/man
8ROFF_DIR := man
9
10# Compiler Options
11CC ?= clang
12CFLAGS += -g -std=gnu99 -Wpedantic -Wunused-result -Wno-gnu-zero-variadic-macro-arguments
13LDFLAGS += -fPIE
14
15# Executable-specific flags
16# finit_FLAGS := -static
17
18# File lists
19SOURCE_FILES := $(wildcard $(SRC_DIR)/*.c)
20EXEC_FILES := $(wildcard $(EXEC_DIR)/*)
21OBJ_FILES := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SOURCE_FILES))
22BIN_FILES := $(patsubst $(EXEC_DIR)/%.c,$(BIN_DIR)/%,$(EXEC_FILES)) \
23 $(patsubst $(EXEC_DIR)/%.sh,$(BIN_DIR)/%,$(EXEC_FILES)) \
24 $(patsubst $(EXEC_DIR)/%.lnk,$(BIN_DIR)/%,$(EXEC_FILES))
25INCLUDE_FILES := $(wildcard $(INCLUDE_DIR)/*.h)
26
27MAN_FILES := $(wildcard $(MAN_DIR)/*)
28ROFF_FILES := $(patsubst $(MAN_DIR)/%.md,$(ROFF_DIR)/%,$(MAN_FILES)) \
29 $(patsubst $(MAN_DIR)/%.roff,$(ROFF_DIR)/%,$(MAN_FILES))
30
31# Intermediate directories
32INTERMED_DIRS := $(BIN_DIR) $(BUILD_DIR) $(ROFF_DIR)
33
34# Magic targets
35.PHONY: all clean manual binary
36
37.PRECIOUS: $(OBJ_FILES)
38
39
40# Default target
41all: compile_flags.txt binary manual
42
43# Clean target
44clean:
45 rm -rf $(INTERMED_DIRS)
46
47binary: $(BIN_FILES)
48
49manual: $(ROFF_FILES)
50
51# Directory rules
52$(INTERMED_DIRS):
53 mkdir -p $@
54
55# Object rules
56$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c $(INCLUDE_FILES) | $(BUILD_DIR)
57 $(CC) -o $@ -c -I$(INCLUDE_DIR) $(CFLAGS) $<
58
59# Executables
60$(BIN_DIR)/%: $(EXEC_DIR)/%.c $(INCLUDE_FILES) $(OBJ_FILES) | $(BIN_DIR)
61 $(CC) -o $@ -I$(INCLUDE_DIR) $(CFLAGS) $< $(OBJ_FILES) $($(notdir $@)_FLAGS) $(LDFLAGS)
62
63$(BIN_DIR)/%: $(EXEC_DIR)/%.sh | $(BIN_DIR)
64 cp $< $@
65 chmod +x $@
66
67$(BIN_DIR)/%: $(EXEC_DIR)/%.lnk | $(BIN_DIR)
68 ln -sf $(shell cat $<) $@
69
70
71# Manual targets
72
73$(ROFF_DIR)/%: $(MAN_DIR)/%.md | $(ROFF_DIR)
74 md2man-roff $< > $@
75
76$(ROFF_DIR)/%: $(MAN_DIR)/%.roff | $(ROFF_DIR)
77 cp $< $@
78
79# Debug
80compile_flags.txt:
81 echo $(CFLAGS) | tr " " "\n" > compile_flags.txt