makefiles: Add support for building from source files from a parent directory.
This commit is contained in:
parent
eaef76f041
commit
517d274e3a
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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" );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
################################################################
|
################################################################
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue