Alexandre Julliard : makefiles: Add support for building from source files from a parent directory.

Alexandre Julliard julliard at winehq.org
Tue Nov 12 14:26:36 CST 2013


Module: wine
Branch: master
Commit: 517d274e3a259974fbf51275b5da8963262ffc73
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=517d274e3a259974fbf51275b5da8963262ffc73

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Nov 12 11:03:09 2013 +0100

makefiles: Add support for building from source files from a parent directory.

---

 Make.rules.in        |    4 ++--
 tools/make_makefiles |   45 ++++++++++++++++++++++++++++++++++++++++++++-
 tools/makedep.c      |   26 ++++++++++++++++++++++++++
 3 files changed, 72 insertions(+), 3 deletions(-)

diff --git a/Make.rules.in b/Make.rules.in
index a853afe..ed2d8cf 100644
--- a/Make.rules.in
+++ b/Make.rules.in
@@ -11,7 +11,7 @@
 
 # First some useful definitions
 
-INCLUDES     = -I$(srcdir) -I. -I$(top_srcdir)/include -I$(top_builddir)/include $(EXTRAINCL)
+INCLUDES     = -I$(srcdir) $(PARENTSRC:%=-I at srcdir@/%) -I. -I$(top_srcdir)/include -I$(top_builddir)/include $(EXTRAINCL)
 DEFS         = -D__WINESRC__ $(EXTRADEFS)
 ALLCFLAGS    = $(INCLUDES) $(DEFS) $(DLLFLAGS) $(EXTRACFLAGS) $(CPPFLAGS) $(CFLAGS) $(MODCFLAGS)
 IDLFLAGS     = $(INCLUDES) $(DEFS) $(EXTRAIDLFLAGS)
@@ -88,7 +88,7 @@ DEPEND_SRCS = $(C_SRCS) $(OBJC_SRCS) $(RC_SRCS) $(MC_SRCS) \
               $(BISON_SRCS) $(LEX_SRCS) $(EXTRA_OBJS)
 
 depend: dummy
-	$(MAKEDEP) $(MAKEDEPFLAGS) -C$(srcdir) -S$(top_srcdir) -T$(top_builddir) $(EXTRAINCL) $(DEPEND_SRCS)
+	$(MAKEDEP) $(MAKEDEPFLAGS) -C$(srcdir) -S$(top_srcdir) -T$(top_builddir) $(PARENTSRC:%=-P%) $(EXTRAINCL) $(DEPEND_SRCS)
 
 .PHONY: depend
 
diff --git a/tools/make_makefiles b/tools/make_makefiles
index b61d403..72c2254 100755
--- a/tools/make_makefiles
+++ b/tools/make_makefiles
@@ -322,7 +322,7 @@ sub parse_makefile($)
             $make{"=rules"} = $makerules{$var} || $var;
             next;
         }
-        if (/^\s*(MODULE|IMPORTLIB|TESTDLL|MANPAGE)\s*=\s*(.*)/)
+        if (/^\s*(MODULE|IMPORTLIB|TESTDLL|MANPAGE|PARENTSRC)\s*=\s*(.*)/)
         {
             my $var = $1;
             $make{$var} = $2;
@@ -386,6 +386,38 @@ sub get_makedep_flags($)
     return %flags;
 }
 
+sub get_parent_makefile($)
+{
+    my $file = shift;
+    my %make = %{$makefiles{$file}};
+    my $reldir = $make{"PARENTSRC"} || "";
+    return "" unless $reldir;
+    (my $path = $file) =~ s/\/Makefile$/\//;
+    while ($reldir =~ /^\.\.\//)
+    {
+        $reldir =~ s/^\.\.\///;
+        $path =~ s/[^\/]+\/$//;
+    }
+    return "$path$reldir/Makefile";
+}
+
+# preserve shared source files that are listed in the existing makefile
+sub preserve_shared_source_files($$$)
+{
+    my ($make, $parent, $var) = @_;
+    my %srcs;
+
+    return unless defined ${$parent}{"=$var"};
+    foreach my $file (@{${$parent}{"=$var"}}) { $srcs{$file} = 1; }
+    foreach my $file (@{${$make}{"=$var"}}) { $srcs{$file} = 0; }
+
+    foreach my $file (@{${$make}{$var}})
+    {
+        next unless defined $srcs{$file} && $srcs{$file} == 1;
+        push @{${$make}{"=$var"}}, $file;
+    }
+}
+
 # assign source files to their respective makefile
 sub assign_sources_to_makefiles(@)
 {
@@ -474,6 +506,17 @@ sub assign_sources_to_makefiles(@)
     unshift @{${$make}{"=SRCDIR_INCLUDES"}}, "\$(XTEMPLATE_SRCS)";
     unshift @{${$make}{"=SRCDIR_INCLUDES"}}, "\$(PUBLIC_IDL_H_SRCS)";
     unshift @{${$make}{"=SRCDIR_INCLUDES"}}, "\$(IDL_TLB_SRCS)";
+
+    # preserve shared source files from the parent makefile
+    foreach my $file (@makefiles)
+    {
+        my %make = %{$makefiles{$file}};
+        my $parent = get_parent_makefile( $file );
+        next unless $parent;
+        preserve_shared_source_files( $makefiles{$file}, $makefiles{$parent}, "C_SRCS" );
+        preserve_shared_source_files( $makefiles{$file}, $makefiles{$parent}, "LEX_SRCS" );
+        preserve_shared_source_files( $makefiles{$file}, $makefiles{$parent}, "BISON_SRCS" );
+    }
 }
 
 ################################################################
diff --git a/tools/makedep.c b/tools/makedep.c
index 945ba26..3b441be 100644
--- a/tools/makedep.c
+++ b/tools/makedep.c
@@ -107,6 +107,7 @@ struct strarray
 static const char *src_dir;
 static const char *top_src_dir;
 static const char *top_obj_dir;
+static const char *parent_dir;
 static const char *OutputFileName = "Makefile";
 static const char *Separator = "### Dependencies";
 static const char *input_file_name;
@@ -121,6 +122,7 @@ static const char Usage[] =
     "   -Cdir      Search for source files in directory 'dir'\n"
     "   -Sdir      Set the top source directory\n"
     "   -Tdir      Set the top object directory\n"
+    "   -Pdir      Set the parent source directory\n"
     "   -R from to Compute the relative path between two directories\n"
     "   -fxxx      Store output in file 'xxx' (default: Makefile)\n"
     "   -sxxx      Use 'xxx' as separator (default: \"### Dependencies\")\n";
@@ -536,6 +538,16 @@ static FILE *open_src_file( struct incl_file *pFile )
         pFile->filename = strmake( "%s/%s", src_dir, pFile->name );
         file = fopen( pFile->filename, "r" );
     }
+    /* now try parent dir */
+    if (!file && parent_dir)
+    {
+        if (src_dir)
+            pFile->filename = strmake( "%s/%s/%s", src_dir, parent_dir, pFile->name );
+        else
+            pFile->filename = strmake( "%s/%s", parent_dir, pFile->name );
+        if ((file = fopen( pFile->filename, "r" ))) return file;
+        file = fopen( pFile->filename, "r" );
+    }
     if (!file) fatal_perror( "open %s", pFile->name );
     return file;
 }
@@ -601,6 +613,17 @@ static FILE *open_include_file( struct incl_file *pFile )
         free( filename );
     }
 
+    /* now try in parent source dir */
+    if (parent_dir)
+    {
+        if (src_dir)
+            filename = strmake( "%s/%s/%s", src_dir, parent_dir, pFile->name );
+        else
+            filename = strmake( "%s/%s", parent_dir, pFile->name );
+        if ((file = fopen( filename, "r" ))) goto found;
+        free( filename );
+    }
+
     /* check for corresponding idl file in global includes */
 
     if (strendswith( pFile->name, ".h" ))
@@ -1410,6 +1433,9 @@ static void parse_option( const char *opt )
     case 'T':
         top_obj_dir = opt + 2;
         break;
+    case 'P':
+        parent_dir = opt + 2;
+        break;
     case 'f':
         if (opt[2]) OutputFileName = opt + 2;
         break;




More information about the wine-cvs mailing list