I was poking around in statecomp and became frustrated that it's
difficult to compile, and that dependencies don't work properly.
And that the way it is compiled is to lump all the .c files together
to form a single executable in one go. It sort of lives outside our
nice Make infrastructure.
Part of the reason may stem from the BG work in which it was noticed
that statecomp should get built for the bulid machine, not the host
machine, when cross-compiling. But maybe that is fixable if one
uses BUILD_CC and BUILD_LD as defined from configure?
This patch tries to fix things, but needs a look-over. It does:
1. Compile statecomp as part of the top-level build, using BUILD_*.
2. Remove statecomp target, just type "make src/common/statecomp/statecomp"
if you really want to do just that one file, else let the
dependencies do their jobs.
3. Remove dependency of "%.c: %.sm" on statecomp. This causes
massive rebuilds everytime you recompile statecomp, but is kind
of misleading I think. We don't force rebuilds if the Makefile
or module.mk.in change, or if the gcc version changes. Building
statecomp is for the hard-core who know how to test their changes
by rebuilding generated .c files by hand.
Thoughts?
-- Pete
Index: Makefile.in
===================================================================
RCS file: /projects/cvsroot/pvfs2/Makefile.in,v
retrieving revision 1.236
diff -u -p -r1.236 Makefile.in
--- Makefile.in 14 Feb 2007 21:51:57 -0000 1.236
+++ Makefile.in 16 Feb 2007 23:31:07 -0000
@@ -11,7 +11,6 @@
# publish copy over documents to the PVFS.org web pags
# admintools builds admin tools
# kernapps builds userland helper programs for kernel driver
-# statecomp builds only the statecomp component
# cscope generates information for cscope utility
# tags generates tags file for use by editors
# codecheck checks source code for nonconformance to our std.
@@ -107,7 +106,7 @@ build_static = @build_static@
# of a file that has the same name as the target. Listing them
# here keeps make from accidentally doing too much work (see GNU
# make manual).
-.PHONY: all clean dist distclean docs docsclean publish cscope tags codecheck
statecomp admintools kernapps
+.PHONY: all clean dist distclean docs docsclean publish cscope tags codecheck
admintools kernapps
################################################################
# Find project subdirectories
@@ -498,11 +497,10 @@ VISMISCDEPENDS := $(patsubst %.c,%.d, $(
KARMAOBJS := $(patsubst %.c,%.o, $(filter %.c,$(KARMASRC)))
KARMADEPENDS := $(patsubst %.c,%.d, $(filter %.c,$(KARMASRC)))
-# state machine generation tool
-# cannot build statecomp objects with the cross compiler, as we
-# build and run the tool on the build host at compile-time
-#STATECOMPOBJS := $(patsubst %.c,%.o,$(STATECOMPSRC))
-#STATECOMPDEPS := $(patsubst %.c,%.d,$(STATECOMPSRC))
+# state machine generation tool, built for the build machine, not the
+# host machine, in the case of cross-compilation
+STATECOMPOBJS := $(patsubst %.c,%.o,$(STATECOMPSRC))
+STATECOMPDEPS := $(patsubst %.c,%.d,$(STATECOMPSRC))
# DOCSPDF, DOCSPS, and DOCSHTML are lists of documentation files generated
# from latex
@@ -691,11 +689,14 @@ $(ADMINTOOLS_SERVER): %: %.o $(LIBRARIES
$(KERNAPPS): %: %.o $(LIBRARIES)
$(KERNAPPSTHR): %: %.o $(LIBRARIES_THREADED)
-# target for building _just_ the statecomp tool
-#statecomp: $(STATECOMP)
-#$(STATECOMP): $(STATECOMPOBJS)
-# $(Q) " LD $@"
-# $(E)$(LD) -o $@ $(LDFLAGS) $(STATECOMPOBJS)
+# special rules to build state machine compiler using build host compiler
+$(STATECOMPOBJS): %.o: %.c
+ $(Q) " BUILD_CC $@"
+ $(E)$(BUILD_CC) $(CFLAGS) $< -c -o $@ $(call modcflags,$<)
+
+$(STATECOMP): $(STATECOMPOBJS)
+ $(Q) " BUILD_LD $@"
+ $(E)$(BUILD_LD) -o $@ $(LDFLAGS) $(STATECOMPOBJS) $(call modldflags,$<)
# rule for generating cscope information
cscope:
@@ -795,7 +796,7 @@ endif
# NOTE: we wrap this in ifneq's in order to prevent the
# dependencies from being generated for special targets that don't
# require them
-ifeq (,$(filter statecomp clean distclean dist docs cscope tags
nodep,$(MAKECMDGOALS)))
+ifeq (,$(filter clean distclean dist docs cscope tags nodep,$(MAKECMDGOALS)))
-include $(DEPENDS)
endif
# add this as a make goal to disable rebuilding dependencies
@@ -820,8 +821,7 @@ nodep:; @:
$(srcdir)/maint/pvfs2htmlfixup.sh $(@D)/*/$(@F)
# rule for automatically generated source files
-# NOTE: this rule is disabled in release snapshots
-%.c: %.sm src/common/statecomp/statecomp
+%.c: %.sm
$(Q) " SMC $@"
$(E)src/common/statecomp/statecomp $< $@
Index: src/common/statecomp/module.mk.in
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/common/statecomp/module.mk.in,v
retrieving revision 1.12
diff -u -p -r1.12 module.mk.in
--- src/common/statecomp/module.mk.in 9 Apr 2005 19:26:45 -0000 1.12
+++ src/common/statecomp/module.mk.in 16 Feb 2007 23:31:08 -0000
@@ -15,11 +15,6 @@ STATECOMPGEN := \
$(DIR)/parser.c \
$(DIR)/parser.h \
-# Trying to build lots of .c files at once confuses the MODCFLAGS calculation.
-# Point it to the target to get the real dir name.
-statecomp: $(STATECOMP)
-$(STATECOMP): $(STATECOMPSRC)
- $(Q) " CC $@"
- $(E)$(BUILD_CC) $(LIBCFLAGS) $(CFLAGS) $(call modcflags, $@) $^ -o $@
+MODCFLAGS_$(DIR) := -I$(DIR)
.SECONDARY: $(STATECOMPGEN)
_______________________________________________
Pvfs2-developers mailing list
[email protected]
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers