]> git.llucax.com Git - software/makeit.git/commitdiff
Improve include directory handling
authorLeandro Lucarella <llucarella@integratech.com.ar>
Thu, 17 Sep 2009 17:07:25 +0000 (14:07 -0300)
committerLeandro Lucarella <llucarella@integratech.com.ar>
Fri, 18 Sep 2009 03:00:36 +0000 (00:00 -0300)
Remove the $J variable, it was useless for now. Rename $I to the more
verbose $(INCLUDE_DIR) since it won't be used very often by the user
(makefile writer nor makefile user).

The include directory symlink is now handled per-project, allowing the
inclusion of sub-project headers more naturally (without requiring to
prefix the parent project name and allowing the sub-project to keep its
original include directory name). The $P variable is not needed anymore
because of this.

The makefiles functions changed a little to allow per-project include
directory making Lib.mak not include any other files; because of that the
"all" rule now uses the "secondary expansion" to calculate the
prerequisites (the $(all) variable has not been populated yet when the
"all" rule is defined).

The Toplevel.mak files are now guarded to avoid multiple inclusions. This
should be not a problem since now the Toplevel.mak should not be changed,
is like an extension to Lib.mak that the user shouldn't mdify unless
he is hacking the build system.

The subproj is now renamed to otherproj to illustrate how the sub-directory
where it is stored doesn't have to match the name of the sub-project.

The pre-compiled headers feature is a little broken for now because the
system includes detection is too weak to differentiate things real system
includes from things included from $(INCLUDE_DIR).

Build.mak
Lib.mak
Toplevel.mak
lib2/Build.mak
lib2/lib2.cpp
subproj/Build.mak
subproj/Config.mak
subproj/Toplevel.mak
subproj/otherproj.c [new file with mode: 0644]
subproj/otherproj.h [moved from subproj/subproj.h with 76% similarity]
subproj/subproj.c [deleted file]

index 0f18c0b2a410aa58452ea62e0bfd82bca2233bbb..45a47409d3cbd76cff4fc349514021af99b5c10b 100644 (file)
--- a/Build.mak
+++ b/Build.mak
@@ -1,4 +1,6 @@
 
+setup_include_dir__ := $(call symlink_include_dir,remake)
+
 # Include sub-directories makefiles
 
 C := subproj
@@ -12,4 +14,3 @@ include $T/lib2/Build.mak
 
 C := prog
 include $T/prog/Build.mak
-
diff --git a/Lib.mak b/Lib.mak
index ce5449914729d8b53a51f7e9cc0a005a5cd4095a..106c208fb5871121ecc9dbcbeeff5b76532320e3 100644 (file)
--- a/Lib.mak
+++ b/Lib.mak
@@ -1,4 +1,3 @@
-
 ifndef Lib.mak.included
 Lib.mak.included := 1
 
@@ -51,11 +50,9 @@ B ?= $G/bin
 # Libraries directory
 L ?= $G/lib
 
-# Includes directory
-I ?= $G/include
 
-# Generated includes directory
-J ?= $G/geninc
+# Includes directory
+INCLUDE_DIR ?= $G/include
 
 
 # Functions
@@ -124,6 +121,13 @@ link = $(call exec,$(LINKER) $(LDFLAGS) $(TARGET_ARCH) -o $@ $1 \
                $(patsubst $L/lib%.so,-l%,$(filter %.so,$^)) \
                $(foreach obj,$(filter %.o,$^),$(obj)))
 
+# Create a symbolic link to the project under the $(INCLUDE_DIR). The first
+# argument is the name of symlink to create.  The link is only created if it
+# doesn't already exist.
+symlink_include_dir = $(shell \
+               test -L $(INCLUDE_DIR)/$1 \
+                       || ln -s $T/$C $(INCLUDE_DIR)/$1 )
+
 
 # Overrided flags
 ##################
@@ -132,7 +136,7 @@ link = $(call exec,$(LINKER) $(LDFLAGS) $(TARGET_ARCH) -o $@ $1 \
 override CPPFLAGS += -Wall
 
 # Use the includes directories to search for includes
-override CPPFLAGS += -I$I -I$J
+override CPPFLAGS += -I$(INCLUDE_DIR)
 
 # Be standard compilant
 override CFLAGS += -std=c99 -pedantic
@@ -175,6 +179,13 @@ COMPILE.cpp.FLAGS := $(CXX) ~ $(CPPFLAGS) ~ $(CXXFLAGS) ~ $(TARGET_ARCH)
 LINK.o.FLAGS := $(LD) ~ $(LDFLAGS) ~ $(TARGET_ARCH)
 
 
+# Automatic dependency handling
+################################
+
+# These files are created during compilation.
+sinclude $(shell test -d $O && find $O -name '*.d')
+
+
 # Default rules
 ################
 
@@ -196,11 +207,15 @@ $L/%.so: $G/link-o-flags
 clean:
        $(call exec,$(RM) -r $D,$D)
 
-
-# Automatic dependency handling
-################################
-
-sinclude $(shell test -d $O && find $O -name '*.d')
+# These rules use the "Secondary Expansion" GNU Make feature, to allow
+# sub-makes to add values to the special variables $(all), after this makefile
+# was read.
+.SECONDEXPANSION:
+  
+# Phony rule to make all the targets (sub-makefiles can append targets to build
+# to the $(all) variable).
+.PHONY: all
+all: $$(all)
 
 
 # Create build directory structure
@@ -215,16 +230,16 @@ gen_rebuild_flags = if test x"$2" != x"`cat $1 2>/dev/null`"; then \
                test -f $1 && echo "$3"; \
                echo "$2" > $1 ; fi
 
-# Create $O, $B, $L, $I and $J directories and replicate the directory
+# Create $O, $B, $L and $(INCLUDE_DIR) directories and replicate the directory
 # structure of the project into $O. Create one symlink "last" to the current
-# build directory and another to use as include directory.  It update the flags
-# files to detect flag and/or compiler changes to force a rebuild.
+# build directory.  It update the flags files to detect flag and/or compiler
+# changes to force a rebuild.
 #
 # NOTE: the second mkdir can yield no arguments if the project don't have any
 #       subdirectories, that's why the current directory "." is included, so it
 #       won't show an error message in case of no subdirectories.
 setup_build_dir__ := $(shell \
-       mkdir -p $O $B $L $I $J; \
+       mkdir -p $O $B $L $(INCLUDE_DIR); \
        mkdir -p . $(addprefix $O,$(patsubst $T%,%,\
                        $(shell find $T -type d -not -path '$D*'))); \
        $(call gen_rebuild_flags,$G/compile-c-flags, \
@@ -233,7 +248,6 @@ setup_build_dir__ := $(shell \
                        $(COMPILE.cpp.FLAGS),C++ compiler or flags;); \
        $(call gen_rebuild_flags,$G/link-o-flags, \
                        $(LINK.o.FLAGS),linker or link flags;); \
-       test -L $I/$P || ln -s $T $I/$P; \
        test -L $D/last || ln -s $F $D/last )
 
 # Print any generated message (if verbose)
@@ -241,12 +255,4 @@ $(if $V,$(if $(setup_build_dir__), \
        $(info !! Something changed: $(setup_build_dir__) \
                        re-building affected files...)))
 
-# Include the Build.mak for this directory
-include $T/Build.mak
-
-# Phony rule to make all the targets (sub-makefiles can append targets to build
-# to the $(all) variable).
-.PHONY: all
-all: $(all)
-
 endif
index 299722dd4766a22a1f95e36784d1f2d622289ec8..f66fec0622f1acac9ada2753af9720e611533114 100644 (file)
@@ -1,6 +1,5 @@
-
-# Project name
-P := remake
+ifndef Toplevel.mak.included
+Toplevel.mak.included := 1
 
 # Load top-level directory local configuration
 sinclude $T/Config.mak
@@ -8,3 +7,7 @@ sinclude $T/Config.mak
 # Include the build system library
 include $T/Lib.mak
 
+# Include the Build.mak for this directory
+include $T/Build.mak
+
+endif
index 02841c5085e838c5f31318d9cef8e14a60fe3d5d..0d8e02eff75d07e0d7d9e79c2925f0ef5469c877 100644 (file)
@@ -1,5 +1,5 @@
 
-$L/liblib2.so: $(call find_objects,cpp) $L/liblib1.so $L/libsubproj.so
+$L/liblib2.so: $(call find_objects,cpp) $L/liblib1.so $L/libotherproj.so
 
 .PHONY: lib2
 lib2: $L/liblib2.so
index d5c07c4ddcfee06b07feef4b23d70109f75658c8..7555392fb9a55e319b5f4d17718cbece72e92796 100644 (file)
@@ -1,7 +1,7 @@
 
 #include "lib2.h"
 
-#include <remake/subproj/subproj.h>
+#include <otherproj/otherproj.h>
 #include <remake/lib1/lib1.h>
 
 #include <stdio.h>
@@ -10,6 +10,6 @@ void lib2(void)
 {
        printf("lib2()\n");
        lib1();
-       subproj();
+       otherproj();
 }
 
index 01d8779d0f6e1f6061fd6c2c1dd803c73991e624..353fe836b5b1deda7ce731befbe389900fc71f0b 100644 (file)
@@ -1,9 +1,11 @@
 
-$L/libsubproj.so: LINKER := $(CC)
-$L/libsubproj.so: $(call find_objects,c)
+setup_include_dir__ := $(call symlink_include_dir,otherproj)
 
-.PHONY: subproj
-subproj: $L/libsubproj.so
+$L/libotherproj.so: LINKER := $(CC)
+$L/libotherproj.so: $(call find_objects,c)
 
-all += subproj
+.PHONY: otherproj
+otherproj: $L/libotherproj.so
+
+all += otherproj
 
index d7624aa31993ac2dec455e4ce4576373318c923a..b02cae7ffa607acae94fa959dbef6f1d8a14952b 100644 (file)
@@ -3,8 +3,8 @@
 T := ..
 
 # Include the "parent" project config
-sinclude $T/Toplevel.mak
+sinclude $T/Config.mak
 
 # Include the "parent" project config
-.DEFAULT_GOAL := subproj
+.DEFAULT_GOAL := otherproj
 
index 6109188af8b2a589cecbd0a9dba41a50fe1a8bc7..f66fec0622f1acac9ada2753af9720e611533114 100644 (file)
@@ -1,6 +1,5 @@
-
-# Project name
-P := subproj
+ifndef Toplevel.mak.included
+Toplevel.mak.included := 1
 
 # Load top-level directory local configuration
 sinclude $T/Config.mak
@@ -8,3 +7,7 @@ sinclude $T/Config.mak
 # Include the build system library
 include $T/Lib.mak
 
+# Include the Build.mak for this directory
+include $T/Build.mak
+
+endif
diff --git a/subproj/otherproj.c b/subproj/otherproj.c
new file mode 100644 (file)
index 0000000..868f072
--- /dev/null
@@ -0,0 +1,9 @@
+
+#include "otherproj.h"
+#include <stdio.h>
+
+void otherproj(void)
+{
+       printf("otherproj()\n");
+}
+
similarity index 76%
rename from subproj/subproj.h
rename to subproj/otherproj.h
index d29126ce4de2cd9e51ea40bf8b4117c5d9560ffb..5b2d04fc943adb4ebebf35548651360412c28ce1 100644 (file)
@@ -3,7 +3,7 @@
 extern "C" {
 #endif
 
-void subproj(void);
+void otherproj(void);
 
 #ifdef __cplusplus
 }
diff --git a/subproj/subproj.c b/subproj/subproj.c
deleted file mode 100644 (file)
index 2188e52..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-
-#include "subproj.h"
-#include <stdio.h>
-
-void subproj(void)
-{
-       printf("subproj()\n");
-}
-