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

This commit is contained in:
Alexandre Julliard 2013-11-12 11:03:09 +01:00
parent eaef76f041
commit 517d274e3a
3 changed files with 72 additions and 3 deletions

View File

@ -11,7 +11,7 @@
# First some useful definitions # 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) DEFS = -D__WINESRC__ $(EXTRADEFS)
ALLCFLAGS = $(INCLUDES) $(DEFS) $(DLLFLAGS) $(EXTRACFLAGS) $(CPPFLAGS) $(CFLAGS) $(MODCFLAGS) ALLCFLAGS = $(INCLUDES) $(DEFS) $(DLLFLAGS) $(EXTRACFLAGS) $(CPPFLAGS) $(CFLAGS) $(MODCFLAGS)
IDLFLAGS = $(INCLUDES) $(DEFS) $(EXTRAIDLFLAGS) IDLFLAGS = $(INCLUDES) $(DEFS) $(EXTRAIDLFLAGS)
@ -88,7 +88,7 @@ DEPEND_SRCS = $(C_SRCS) $(OBJC_SRCS) $(RC_SRCS) $(MC_SRCS) \
$(BISON_SRCS) $(LEX_SRCS) $(EXTRA_OBJS) $(BISON_SRCS) $(LEX_SRCS) $(EXTRA_OBJS)
depend: dummy 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 .PHONY: depend

View File

@ -322,7 +322,7 @@ sub parse_makefile($)
$make{"=rules"} = $makerules{$var} || $var; $make{"=rules"} = $makerules{$var} || $var;
next; next;
} }
if (/^\s*(MODULE|IMPORTLIB|TESTDLL|MANPAGE)\s*=\s*(.*)/) if (/^\s*(MODULE|IMPORTLIB|TESTDLL|MANPAGE|PARENTSRC)\s*=\s*(.*)/)
{ {
my $var = $1; my $var = $1;
$make{$var} = $2; $make{$var} = $2;
@ -386,6 +386,38 @@ sub get_makedep_flags($)
return %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 # assign source files to their respective makefile
sub assign_sources_to_makefiles(@) sub assign_sources_to_makefiles(@)
{ {
@ -474,6 +506,17 @@ sub assign_sources_to_makefiles(@)
unshift @{${$make}{"=SRCDIR_INCLUDES"}}, "\$(XTEMPLATE_SRCS)"; unshift @{${$make}{"=SRCDIR_INCLUDES"}}, "\$(XTEMPLATE_SRCS)";
unshift @{${$make}{"=SRCDIR_INCLUDES"}}, "\$(PUBLIC_IDL_H_SRCS)"; unshift @{${$make}{"=SRCDIR_INCLUDES"}}, "\$(PUBLIC_IDL_H_SRCS)";
unshift @{${$make}{"=SRCDIR_INCLUDES"}}, "\$(IDL_TLB_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" );
}
} }
################################################################ ################################################################

View File

@ -107,6 +107,7 @@ struct strarray
static const char *src_dir; static const char *src_dir;
static const char *top_src_dir; static const char *top_src_dir;
static const char *top_obj_dir; static const char *top_obj_dir;
static const char *parent_dir;
static const char *OutputFileName = "Makefile"; static const char *OutputFileName = "Makefile";
static const char *Separator = "### Dependencies"; static const char *Separator = "### Dependencies";
static const char *input_file_name; static const char *input_file_name;
@ -121,6 +122,7 @@ static const char Usage[] =
" -Cdir Search for source files in directory 'dir'\n" " -Cdir Search for source files in directory 'dir'\n"
" -Sdir Set the top source directory\n" " -Sdir Set the top source directory\n"
" -Tdir Set the top object 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" " -R from to Compute the relative path between two directories\n"
" -fxxx Store output in file 'xxx' (default: Makefile)\n" " -fxxx Store output in file 'xxx' (default: Makefile)\n"
" -sxxx Use 'xxx' as separator (default: \"### Dependencies\")\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 ); pFile->filename = strmake( "%s/%s", src_dir, pFile->name );
file = fopen( pFile->filename, "r" ); 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 ); if (!file) fatal_perror( "open %s", pFile->name );
return file; return file;
} }
@ -601,6 +613,17 @@ static FILE *open_include_file( struct incl_file *pFile )
free( filename ); 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 */ /* check for corresponding idl file in global includes */
if (strendswith( pFile->name, ".h" )) if (strendswith( pFile->name, ".h" ))
@ -1410,6 +1433,9 @@ static void parse_option( const char *opt )
case 'T': case 'T':
top_obj_dir = opt + 2; top_obj_dir = opt + 2;
break; break;
case 'P':
parent_dir = opt + 2;
break;
case 'f': case 'f':
if (opt[2]) OutputFileName = opt + 2; if (opt[2]) OutputFileName = opt + 2;
break; break;