On Feb 16, 2007, at 5:39 PM, Pete Wyckoff wrote:

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?

I think a while back we changed the make dist process to not include .c files, but still generate the sources for statecomp from the lex/yacc files. So if necessary, we should still be able to generate the statecomp sources from one machine, and not require flex/ bison elsewhere on the deployment machine. I'm not sure this is the BGL issue you're describing though...


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.

Reducing the number of targets in the Makefile seems appropriate if it clarifies things.


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.

The few times I've ever changed statecomp it was to change the generated as well, so I would have always wanted to have this dependency. Though doing make clean for the few cases where statecomp gets changed isn't a big deal either. What are you changing in statecomp that doesn't result in changes to the generated files? Just restructuring and cleanup?

What happens if I don't compile everything first, including statecomp, and try to modify a .sm and then try to get the .c generated by trying to make that one .c target? Won't the thing barf because the statecomp binary doesn't exist? Honestly, I can't imagine this ever happening in practice, and since its the only counter-example I could think of, I guess this change is ok.

-sam


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


_______________________________________________
Pvfs2-developers mailing list
[email protected]
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers

Reply via email to