aboutsummaryrefslogtreecommitdiffstats
path: root/cppMakefile/GNUmakefile
blob: 40316239147c1f934779851a8b450826a6c5ed37 (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
78
79
INC := inc
SRC := src
OBJ := obj
BIN := bin
DEP := dep

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

DEPENDENCY_CREATER := ./GNUmakefile.dependency.sh

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 all2 dep clean init new del add sub

all: all2

-include $(TARGET_FILE)

all2: $(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 $@ $<