aboutsummaryrefslogtreecommitdiffstats
path: root/GNUmakefile/GNUmakefile
blob: 8c3d2ef44677941642228d7297af345b8a197237 (plain) (blame)
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
INC := inc
SRC := src
OBJ := obj
BIN := bin
DEP := dep

LIB_INCS  := 
CXX       := g++
CXXFLAGS  := -O2 -Wall -I$(INC) $(LIB_INCS)
CXX_OBJ   := $(CXX) -c
CXX_DEP   := $(CXX) -MM

DEPENDENCY_CREATER := ./GNUmakefile.dependency.bash

OBJECTS     := $(patsubst $(SRC)/%.cpp,$(OBJ)/%.o,$(wildcard $(SRC)/*.cpp))
DEPENDENCYS := $(patsubst $(SRC)/%.cpp,$(DEP)/%.d,$(wildcard $(SRC)/*.cpp))

TARGET_FILE := GNUmakefile.targets
TARGETS     := 

NAME := empty

.PHONY: all dep clean init new del add sub

-include $(TARGET_FILE)

all: $(TARGETS);

init:
    -@mkdir -p $(BIN)
    -@mkdir -p $(SRC)
    -@mkdir -p $(INC)
    -@mkdir -p $(OBJ)
    -@mkdir -p $(DEP)
    -@echo '' > $(TARGET_FILE)

new:
    @set -e; echo "Add target '$(NAME)'"; \
    echo 'TARGETS := $$(TARGETS) $$(BIN)/$(NAME)'                                  >> $(TARGET_FILE); \
    echo '$(NAME)_OBJS := $(foreach n,$(OBJS),$$(OBJ)/$(n).o)'                     >> $(TARGET_FILE); \
    echo '$(NAME)_LIBS := $(LIBS)'                                                 >> $(TARGET_FILE); \
    echo '$$(BIN)/$(NAME): $$(OBJ)/$(NAME).o $$($(NAME)_OBJS)'                     >> $(TARGET_FILE); \
    echo '\t@echo Target: $$@...'                                                  >> $(TARGET_FILE); \
    echo '\t@$$(CXX) $$^ $$(CXXFLAGS) `pkg-config --cflags --libs $$($(NAME)_LIBS) 2>/dev/null` -o $$@' >> $(TARGET_FILE); \
    echo ''                                                                        >> $(TARGET_FILE)

add:
    @set -e; echo "Add Objects $(OBJS) to Target '$(NAME)'"; \
    sed '/^$(NAME)_OBJS :=/s/$$/& $(foreach n,$(OBJS),\$$(OBJ)\/$(n).o)/' $(TARGET_FILE) >$(TARGET_FILE).$$$$; \
    mv -f $(TARGET_FILE).$$$$ $(TARGET_FILE)
    @set -e; echo "Add Libraries $(LIBS) to Target '$(NAME)'"; \
    sed '/^$(NAME)_LIBS :=/s/$$/& $(subst /,\/,$(LIBS))/' $(TARGET_FILE) >$(TARGET_FILE).$$$$; \
    mv -f $(TARGET_FILE).$$$$ $(TARGET_FILE)

sub:
    @set -e; echo "Remove Objects $(OBJS) from Target '$(NAME)'"; \
    sed '/^$(NAME)_OBJS :=/s/$(subst \ ,|,$(foreach n,$(OBJS),\$$(OBJ)\/$(n).o))//' $(TARGET_FILE) >$(TARGET_FILE).$$$$; \
    mv -f $(TARGET_FILE).$$$$ $(TARGET_FILE)
    @set -e; echo "Remove Libraries $(LIBS) from Target '$(NAME)'"; \
    sed '/^$(NAME)_OBJS :=/s/$(subst \ ,|,$(foreach n,$(LIBS),\$$(OBJ)\/$(n).o))//' $(TARGET_FILE) >$(TARGET_FILE).$$$$; \
    mv -f $(TARGET_FILE).$$$$ $(TARGET_FILE)

clean:
    -rm -f $(BIN)/*
    -rm -f $(OBJ)/* 2>/dev/null
    -rm -f $(DEP)/*

dep: $(DEPENDENCY);

-include $(DEPENDENCYS)

$(DEPENDENCYS):: $(DEP)/%.d: $(SRC)/%.cpp
    $(DEPENDENCY_CREATER) "`$(CXX_DEP) $(CXXFLAGS) $<`" $@

$(OBJECTS): $(OBJ)/%.o: $(SRC)/%.cpp $(DEP)/%.d $(DEP)/%.d
    @echo 'Objects: $@...'
    @$(CXX_OBJ) $(CXXFLAGS) -o $@ $<