fixed source-to-source language bug introduced in last modification
[henge/webcc.git] / src / Makefile
index 83fb20f..1f9950f 100644 (file)
@@ -6,14 +6,14 @@
 # This makefile manages a build environment targeting native platforms with gcc
 # and web platforms with either emscripten or binaryen (js or wasm).
 ################################################################################
-# Each .c file is automatically compiled into an environment-dependent object
+# Each .c file is autopresidential debate california timematically compiled into an environment-dependent object
 # file of compiler-specific format (.o for gcc, .bc for llvm/emcc/em++).  
 ################################################################################
 default: all
 # Source languages handled by this build system
 LANGS      := c cpp go
 # Source-to-source languages handled by this build system
-SLANGS     := y
+SLANGS     := y rl
 # Language-specific compilers and flags passed in from environment
 c_C        := $(strip $(notdir $(CC)))
 c_FLAGS    := $(strip $(CFLAGS)) -I.
@@ -25,10 +25,15 @@ cpp_LIBS   := $(c_LIBS)
 go_C       := gccgo
 go_FLAGS   := $(c_FLAGS)
 # Source to source languages
+# Bison
 y_C        := bison
 y_FLAGS    := -d
 y_STEM     := tab
 y_TRG      := c h
+# Ragel
+rl_C        := ragel
+rl_FLAGS    := -C
+rl_TRG      := c
 # Compiler-specific associations.  Each compiler has a binary object suffix
 # (OBJ), an archiver (AR), and an archiver object suffix (AROBJ).  Each compiler
 # may optionally have defined a linker (LD), and a binary output suffix (OUT).
@@ -81,10 +86,11 @@ c_OBJ      := $($(c_C)_OBJ)
 # binaries.
 MODULES    := $(filter-out $(DRIVER_DIR),$(subst /,,$(shell ls -d */)))
 
+#AWK_REVERSE_SQUASH##############################################################
 # The following awk program reverses the order of a list while also removing
 # duplicate entries.  The effect of this when run on the dependency tree is that
 # it will remove duplicates occurring in reverse order, allowing the most deeply
-# nested libraries to be built, and linked, first.
+# nested libraries to be built, and linked, first. ##############################
 define AWK_REVERSE_SQUASH =
 awk \
 '
@@ -94,17 +100,21 @@ awk \
   print ""
 }
 '
+#/AWK_REVERSE_SQUASH#############################################################
 endef
 
-# Compile any source-to-source languages before executing the majority of make
+#PREMAKE_SOURCE_COMPILER#########################################################
+# Compile any source-to-source languages before executing the majority of make ##
+#################################################################################
 define PREMAKE_SOURCE_COMPILER =
 # Find the sources for each source-to-source language
 $(foreach slang,$(SLANGS),
-$(eval SLANG_SRC := $(patsubst ./%,%,$(shell find -name "*.$(slang)")))
+$(eval SLANG_SRC := $(patsubst  ./%, %,$(shell find -name "*.$(slang)")))
 # Foreach target type in the source-to-source language, add this source's
 # targets to the list of the current source-to-source language targets
-$(foreach trg,$($(slang)_TRG),
-$(eval SLANG_TRG += $(SLANG_SRC:%.$(slang)=%.$($(slang)_STEM:%=%.)$(trg))))
+$(eval undefine SLANG_TRG)
+$(eval $(foreach trg,$($(slang)_TRG),
+$(eval SLANG_TRG += $(SLANG_SRC:%.$(slang)=%.$(if $($(slang)_STEM),$($(slang)_STEM).)$(trg)))))
 # Stat the source file's last-modified time to the var SRC_TIME
 $(foreach src,$(SLANG_SRC),
 $(eval SRC_TIME := $(shell stat -c %Y $(src)))
@@ -129,11 +139,11 @@ $(eval BUILDGOALS := all))
 $(if $(and $(BUILDGOALS),$(filter $(OLDER_TIME),$(NEWEST_TRG_TIME))),
 $(eval SHELL_CMD := cd $(dir $(src)) && $($(slang)_C) $($(slang)_FLAGS) $(notdir $(src)))
 $(info $(SHELL_CMD) $(shell $(SHELL_CMD)))
-)
+)))
 # Put these targets on the MAKE_TARGETS list to be removed during "clean",
 # regardless of whether or not they were built just now.
 $(eval MAKE_TARGETS += $(SLANG_TRG))
-))
+#/PREMAKE_SOURCE_COMPILER########################################################
 endef
 # Compile a source language to a language that compiles to binary, but only if
 # our build rule intends to build some kind of target
@@ -152,17 +162,18 @@ define SRC_LANG_FLAGS_OPT_DEPS =
 $(filter-out \ %:,$(shell $($2_C) $3 $4 -MG $1 2> /dev/null))
 endef
 
+#SRC_LANG_RULE###################################################################
 # Given a source and a language, generate a rule to make the object.  The second
 # invocation of gcc per file lists only its local includes, and filters out
 # anything already caught.  Anything remaining should be considered to be
 # available in the current working directory of the source file(i.e. if you
 # '#include "something.h"' in 'mymodule/horseradish.c', you would expect to
 # include 'mymodule/something.h'.  this check lets that happen), otherwise it is
-# some kind of user error
+# some kind of user error #######################################################
 define SRC_LANG_RULE =
 $(if $($1),,$(eval $1 := t)\
 $(eval MOD  := $(filter $(MODULES),$(firstword $(subst /, ,$(dir $1)))))\
-$(eval FLG  := $($2_FLAGS) $(MOD:%=-I% ))\
+$(eval FLG  := $(MOD:%=-I% ))\
 $(if $(wildcard $1),
 $(eval DEPS := $(filter-out \ %:,$(shell $($2_C) $(FLG) -M -MG $1)))\
 $(eval MDEPS := $(filter $(MODULES:%=%/%),$(DEPS)))\
@@ -172,8 +183,13 @@ $(eval MDEPS := $(shell echo $(MDEPS) | sed -e 's@[a-zA-Z0-9\-\+/]*\.\./include@
 $(eval ALLDEPS := $(MDEPS) $(DEPS)),\
 $(error Cannot generate deps for: $1, file not found))\
 $(eval SRC_OBJ    := $(basename $1).$($2_OBJ))\
-$(eval MAKE_TARGETS += $(SRC_OBJ))\
+$(eval MAKE_TARGETS+= $(SRC_OBJ))
 
+# Find any deps that aren't built yet, which the compiler has flagged
+# as missing, but which we know the expected location of libs for
+# this language should have their includes in 'LIBINC_DIR'
+$(eval BUILDDEPS := $(filter $($2_LIBS:%=%/%),$(ALLDEPS)))
+$(eval ALLDEPS := $(filter-out $(BUILDDEPS),$(ALLDEPS)) $(BUILDDEPS:%=$(LIBINC_DIR)/%))
 # Object for $1
 $(SRC_OBJ): $(ALLDEPS)
        $($2_C) $$($2_FLAGS) $(FLG) -c -o $$@ $1
@@ -185,8 +201,10 @@ $(eval MAKE_DIRS += $(dir $(DBG_OBJ))))
 $(DBG_OBJ): $(ALLDEPS) | $(dir $(DBG_OBJ))
        $($2_C) $$($2_FLAGS) $(FLG) -Og -g$($2_DBG) -c -o $$@ $1
 ))
+#/SRC_LANG_RULE##################################################################
 endef
 
+#SRC_LANG_DRVRULE################################################################
 # establish a build and link rule given a source driver and language ############
 define SRC_LANG_DRVRULE =
 $(eval DRIVER_NAME  := $(basename $(notdir $1)))
@@ -265,32 +283,35 @@ $(DRIVER_TARG): $(DRIVER_DEPS) | $(DRIVER_TARG_DIR)
 $(eval DRIVER_DBGTARG := $(DRIVER_TARG_DIR)$(basename $(notdir $(DRIVER_TARG)))-d$($2_OUT))
 $(eval SCRUB_TARGETS  += $(DRIVER_DBGTARG))
 $(eval MAKE_DIRS += $(DRIVER_TARG_DIR).$($2_DBG)/)
-$(DRIVER_DBGTARG): $(DRIVER_DBGDEPS) | $(DRIVER_TARG_DIR).$($2_DBG)/
+$(DRIVER_DBGTARG): $(DRIVER_DBGDEPS) | $(DRIVER_TARG_DIR)
        $($2_C) $($2_FLAGS) $(DRIVER_DBGSRC) -o $$@
 # Make a rule to run this driver after building
 $(DRIVER_NAME)-run: $(DRIVER_TARG)
        $(DRIVER_TARG)
 $(DRIVER_NAME)-d: $(DRIVER_DBGTARG)
 
-#/SRC_LANG_DRVRULE##############################################################
+#/SRC_LANG_DRVRULE###############################################################
 endef
 
+#MODULE_ARCRULE##################################################################
 # generate rule for turning an entire module's collection of binary objects into
 # a single locally-linked (no external -L libs) object (for simplified linking
-# modules as static libs).
+# modules as static libs).#######################################################
 define MODULE_ARCRULE =
 $(eval ARCDEPS := $(filter $1/%.$(c_OBJ),$(foreach lang,$(LANGS),$($(lang)_MOD_TRG))))\
-$(eval MAKE_TARGETS += $1.$(c_AROBJ))\
+$(eval MAKE_TARGETS+= $1.$(c_AROBJ))\
+
 $1.$(c_AROBJ): $(ARCDEPS)
        $(c_AR) cr $$@ $$^
 $(if $(c_DBG),
 $(eval undefine DBGARCDEPS)
 $(foreach arcdep,$(ARCDEPS),$(eval DBGARCDEPS += $(dir $(arcdep)).$(c_DBG)/$(notdir $(arcdep))))
-$(eval MAKE_TARGETS += .$(c_DBG)/$1.$(c_AROBJ))\
+$(eval MAKE_TARGETS+= .$(c_DBG)/$1.$(c_AROBJ))\
 
 .$(c_DBG)/$1.$(c_AROBJ): $(DBGARCDEPS) | .$(c_DBG)/
        $(c_AR) cr $$@ $$^
 )
+#/MODULE_ARCRULE#################################################################
 endef
 
 # LANG_LIB_PARENT_BUILDRULE######################################################
@@ -514,7 +535,7 @@ all: $(basename $(DRV_FNAMES))
        @echo Build Complete
 
 # Rule to make any dirs that we're in charge of
-$(MAKE_DIRS):
+$(sort $(MAKE_DIRS)):
        @mkdir -p $@
 
 # Cleaning rules.