util/sockroot

Makefile in master
Repositories | Summary | Log | Files

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