Module: wine Branch: master Commit: 517d274e3a259974fbf51275b5da8963262ffc73 URL: http://source.winehq.org/git/wine.git/?a=commit;h=517d274e3a259974fbf51275b5...
Author: Alexandre Julliard julliard@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@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;