Repository navigation
Expand file tree
/
Copy pathmakefile
More file actions
146 lines (116 loc) · 3.9 KB
/
Copy pathmakefile
File metadata and controls
146 lines (116 loc) · 3.9 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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# Modified from: https://stackoverflow.com/questions/5178125/how-to-place-object-files-in-separate-subdirectory
#Compiler and Shell
CC := gcc-11
SHELL := /bin/zsh
#Build Targets (Main Program, Unit Tests, Documentation)
TARGET := dei
DEBUGTARGET := debug
TESTTARGET := tests
DOCUMENTS := docs
#Source code directories
APPDIR := ./src/app
DATADIR := ./src/data
GENDIR := ./src/gen
TESTDIR := ./src/tests
#Resource directories
INCDIR := ./inc
BUILDDIR := ./obj
TARGETDIR := ./bin
DOCDIR := ./docs
#Tool files
FLEX_L := lexer.l
BISON_Y := parser.y
FLEXOUT_C := lexer.lex.c
BISONOUT_C := parser.tab.c
BISONOUT_H := $(BISONOUT_C:c=h)
#Flags, Libraries and Includes TODO : separate flags
CFLAGS := -Wall -g -std=c11
FLEXFLAGS :=
BISONFLAGS := -t -v
LIB :=
INC := -I$(INCDIR)
#---------------------------------------------------------------------------------
#Automatic operations
#---------------------------------------------------------------------------------
#Create a debug version of main files
$(DEBUGTARGET): CFLAGS += -D DEBUG
#Create a debug version of test files
$(TESTTARGET): CFLAGS += -D DEITEST
#OS Specific flags
UNAME := $(shell uname)
ifeq ($(UNAME), Linux)
OSS := -D LINUX
else #($(UNAME), Darwin)
OSS := -D OSX
endif
#Create path names of Flex and Bison output
GENFLEX_C := $(addprefix $(GENDIR)/, $(FLEXOUT_C))
GENBISON_C := $(addprefix $(GENDIR)/, $(BISONOUT_C))
GENBISON_H := $(addprefix $(INCDIR)/, $(BISONOUT_H))
#Automatically find all sources within src directory and construct object dependancies
#Main Application Specific Source Files
APPSOURCES := $(shell find $(APPDIR) -type f ! \( -name "*.l" -o -name "*.y" \) )
APPOBJECTS := $(patsubst $(APPDIR)/%, $(BUILDDIR)/%, $(APPSOURCES:.c=.o))
#Support Data Source Files
DATASOURCES := $(shell find $(DATADIR) -type f -name "*.c" )
DATAOBJECTS := $(patsubst $(DATADIR)/%, $(BUILDDIR)/%, $(DATASOURCES:.c=.o))
#Test Source Files
TESTSOURCES := $(shell find $(TESTDIR) -type f -name "*.c" )
TESTOBJECTS := $(patsubst $(TESTDIR)/%, $(BUILDDIR)/%, $(TESTSOURCES:.c=.o))
#Generated Source Files
GENSOURCES := $(GENBISON_C) $(GENFLEX_C)
GENOBJECTS := $(patsubst $(GENDIR)/%, $(BUILDDIR)/%, $(GENSOURCES:.c=.o) )
#Create all artifacts (except debug b/c unsure how...)
all: $(TESTTARGET) $(TARGET) $(DOCUMENTS)
#Remake all artifacts
remake: cleaner all
#Clean Object Directory
clean:
@$(RM) -rf $(BUILDDIR)
#Full Clean (Programs, Generated C Sources, Generated Documentation)
cleaner: clean
@$(RM) -rf $(TARGETDIR)
@$(RM) -rf $(GENDIR)
@$(RM) -rf $(DOCDIR)/html
@$(RM) -rf $(DOCDIR)/latex
#Generate Lexer .c file
$(GENFLEX_C): $(addprefix $(APPDIR)/, $(FLEX_L))
@mkdir -p $(GENDIR)
flex $(FLEXFLAGS) -o $@ $?
#Generate Parser .c and .h files
$(GENBISON_C): $(addprefix $(APPDIR)/, $(BISON_Y))
@mkdir -p $(GENDIR)
bison $(BISONFLAGS) -o $@ --defines=$(GENBISON_H) $?
#Create main target program
$(TARGET): $(GENOBJECTS) $(DATAOBJECTS) $(APPOBJECTS)
@mkdir -p $(TARGETDIR)
$(CC) $(CFLAGS) -o $(TARGETDIR)/$@ $^ $(LIB)
#Create debug target program
$(DEBUGTARGET): $(GENOBJECTS) $(DATAOBJECTS) $(APPOBJECTS)
@mkdir -p $(TARGETDIR)
$(CC) $(CFLAGS) -o $(TARGETDIR)/$@ $^ $(LIB)
#Create test target program
$(TESTTARGET): $(GENOBJECTS) $(DATAOBJECTS) $(TESTOBJECTS)
@mkdir -p $(TARGETDIR)
$(CC) $(CFLAGS) -o $(TARGETDIR)/$@ $^ $(LIB)
#Create Documentation
$(DOCUMENTS):
doxygen Doxyfile
#Compile Application files
$(BUILDDIR)/%.o: $(APPDIR)/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(INC) -c -o $@ $<
#Compile Data files
$(BUILDDIR)/%.o: $(DATADIR)/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(INC) -c -o $@ $<
#Compile Generated files
$(BUILDDIR)/%.o: $(GENDIR)/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(INC) -c -o $@ $<
#Compile Test files
$(BUILDDIR)/%.o: $(TESTDIR)/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(INC) -c -o $@ $<
#Non-File Targets - always fully execute
.PHONY: all remake clean cleaner $(DOCUMENTS)