1 ################################################################################
2 # Desc: APC make script
5 ################################################################################
6 # This makefile builds APC, the Asset Package Compiler for Henge, on the system.
7 ################################################################################
14 YCMD
= $(strip $(YACC
) $(YFLAGS
) $(if
$2,$(dir $2))$1)
15 YCMD
+= $(if
$2,&& mv
$(notdir $(1:%.y
=%.tab.
[ch
])) $(dir $2))
20 RLCMD
= $(strip $(RLC
) $(RLFLAGS
) $(if
$2,-o
$2 $(dir $2))$1)
25 CCMD
= $(strip $(CC
) $(CFLAGS
) $(CPPFLAGS
) -c
$(if
$2,-o
$2) $1)
33 LDCMD
= $(strip gcc
$(LDFLAGS
) $(if
$2,-o
$2) $1) $(LDLIBS
) $($1LIBS)
35 # APC is built from Ragel, Bison and C source code only.
36 ySRC
:= $(shell find .
/src
-type f
-name
'*.y')
37 rlSRC
:= $(shell find .
/src
-type f
-name
'*.rl')
38 cSRC
:= $(shell find .
/src
-type f
-name
'*.c')
40 # Generated files from Yacc/Bison and Ragel
41 hGEN
:= $(ySRC
:%.y
=%.tab.h
)
42 cGEN
:= $(strip $(ySRC
:%.y
=%.tab.c
) $(rlSRC
:%.rl
=%.fsm.c
))
44 # Filter all other driver objects out of each driver's link commands.
45 OBJ
:= $(patsubst %.c
,%.o
,$(cSRC
) $(cGEN
))
46 $(foreach drv
,$(DRIVERS
),\
47 $(eval OTHERS
:= $(filter-out $(drv
),$(DRIVERS
)))\
48 $(eval
$(drv
)SRC
:= $(filter-out $(OTHERS
:%=\
%/%.o
),$(OBJ
)))\
49 $(eval
$(drv
)-dSRC
:= $($(drv
)SRC
:%.o
=%-d.o
)))
51 ifeq (,$(filter clean,$(MAKECMDGOALS
)))
52 # Deps should be generated for each source file, when not cleaning
53 cGENDEP
= $(if
$(wildcard $1),$(subst $(dir $1),,$(filter-out $1 \
%:,$(shell $(CC
) -MM
-MG
$1))),\
54 $(info [<$1>: no deps
- file not found
]))
55 # S2S will print the command necessary to create a file when called
56 S2S
= $(info $(call
$1,$2,$3))
57 ifeq (,$(filter n
,$(MAKEFLAGS
)))
58 # Unless we're in -n mode, S2S should also invoke the command on the shell
59 S2S
+= $(shell $(call
$1,$2,$3))
65 $(DRIVERS
:%=%-d
) $(DRIVERS
): $$($$@SRC
) |
$(hGEN
)
66 $(strip $(call LDCMD
,$^
,$@
))
68 %-d.o
: CFLAGS
+= -Og
-ggdb
69 %.o
%-d.o
: %.c
$$(call cGENDEP
,$$(dir $$@
)%.c
)
73 %.tab.c
: %.y
$$(call S2S
,YCMD
,%.y
,$$@
) ;
74 %.fsm.c
: %.rl
$$(call S2S
,RLCMD
,%.rl
,$$@
) ;
76 clean: $(wildcard $(cGEN
) $(hGEN
) $(foreach drv
,$(DRIVERS
),$($(drv
)SRC
) $($(drv
)-dSRC
)))