ppremake 1.1 changes, fix build dependency probs

This commit is contained in:
David Rose 2002-06-03 18:30:17 +00:00
parent 75c6d56ffc
commit 2068d6f1dc
4 changed files with 117 additions and 202 deletions

View File

@ -13,8 +13,8 @@
// files.
// Check the version of ppremake in use.
#if $[< $[PPREMAKE_VERSION],1.00]
#error You need at least ppremake version 1.00 to process this tree.
#if $[< $[PPREMAKE_VERSION],1.1]
#error You need at least ppremake version 1.1 to process this tree.
#endif
// What is the name and version of this source tree?

View File

@ -8,9 +8,36 @@
#if $[or $[eq $[DIR_TYPE], src], $[eq $[DIR_TYPE], metalib]]
#if $[eq $[DEPEND_DIRS],]
// DEPENDABLE_HEADERS is supposed to be the primary purpose of this
// file: here we generate the list of source files that might be
// included in some other source file, and hence is relevant to the
// automatically-generated dependency chain.
// We generate this variable by walking through all of the targets
// and building it up.
#define DEPENDABLE_HEADERS
#forscopes metalib_target static_lib_target ss_lib_target lib_target noinst_lib_target bin_target noinst_bin_target
// We will also need to sort out the types files we will actually
// compile within each directory, as well as the lists of files that
// go into each composite.
// We define $[c_sources], $[cxx_sources], $[yxx_sources], and
// $[lxx_sources] within each target, which lists original files as
// well as synthetic composite files. There's also
// $[compile_sources], which is the union of all the others: any
// source files that are actually compiled and result in a generated
// .o (or .obj) file.
// Finally, we build up $[composite_list] out here to list all of
// the composite files generated for all targets.
// This is done at this point, within Depends.pp, so that the
// various Template.*.pp files will be able to reliably access
// $[compile_sources] from the different directories.
#define composite_list
#forscopes metalib_target lib_target noinst_lib_target static_lib_target ss_lib_target bin_target noinst_bin_target test_bin_target
// We can optimize quite a bit by evaluating now several of the key
// deferred variables defined in Globals.pp. This way they won't need
// to get repeatedly reevaluated as each directory examines each
@ -25,15 +52,43 @@
// Report a warning for nonexisting dependencies.
#define nonexisting $[unmapped all_libs,$[LOCAL_LIBS]]
#if $[ne $[nonexisting],]
Warning: Lib(s) $[nonexisting], referenced in $[DIRNAME]/$[TARGET], not found.
#print Warning: Lib(s) $[nonexisting], referenced in $[DIRNAME]/$[TARGET], not found.
#endif
#set DEPENDABLE_HEADERS $[DEPENDABLE_HEADERS] $[filter %.h %.I %.T %_src.cxx,$[get_sources]] $[included_sources]
#end metalib_target static_lib_target ss_lib_target lib_target noinst_lib_target bin_target noinst_bin_target
#forscopes test_bin_target
#set DEPENDABLE_HEADERS $[DEPENDABLE_HEADERS] $[filter %.h %.I %.T %_src.cxx,$[get_sources]] $[included_sources]
#end test_bin_target
// Now compute the source files.
#define c_sources $[filter %.c,$[get_sources]]
#define cxx_sources $[filter-out %_src.cxx,$[filter %.cxx,$[get_sources]]]
#define yxx_sources $[filter %.yxx,$[get_sources]]
#define lxx_sources $[filter %.lxx,$[get_sources]]
#if $[USE_SINGLE_COMPOSITE_SOURCEFILE]
#if $[> $[words $[cxx_sources]], 1]
// If we have multiple C++ files, put them together into one
// composite file.
#define composite_file $[TARGET]_composite.cxx
#set composite_list $[composite_list] $[composite_file]
#define $[composite_file]_sources $[cxx_sources]
#push 1 $[composite_file]_sources
#set cxx_sources $[composite_file]
#endif
#if $[> $[words $[c_sources]], 1]
// If we have multiple C files, put them together into one
// composite file also.
#define composite_file $[TARGET]_composite_c.c
#set composite_list $[composite_list] $[composite_file]
#define $[composite_file]_sources $[c_sources]
#push 1 $[composite_file]_sources
#set c_sources $[composite_file]
#endif
#endif
// Add the bison- and flex-generated .cxx files to the compile
// list, too. These never get added to composite files, though,
// mainly because they tend to be very large files themselves.
#set cxx_sources $[cxx_sources] $[patsubst %.yxx,%.cxx,$[yxx_sources]] $[patsubst %.lxx,%.cxx,$[lxx_sources]]
#define compile_sources $[c_sources] $[cxx_sources] $[yxx_sources] $[lxx_sources]
#end metalib_target lib_target noinst_lib_target static_lib_target ss_lib_target bin_target noinst_bin_target test_bin_target
// Allow the user to define additional EXTRA_DEPENDS targets in each
// Sources.pp.

View File

@ -277,13 +277,7 @@
// string if the target is not to be built, or the target name if it
// is.
#defer active_target $[if $[build_target],$[TARGET]]
#if $[USE_SINGLE_COMPOSITE_SOURCEFILE]
// for non-composite dirs, want to avoid returning the composite default name
#defer get_combined_sources $[if $[ne $[COMBINED_SOURCES],], $[TARGET]_composite.cxx,]
#else
#defer get_combined_sources $[COMBINED_SOURCES]
#endif
// This subroutine will set up the sources variable to reflect the
// complete set of sources for this target, and also set the
@ -295,7 +289,6 @@
#defer get_sources \
$[SOURCES] \
$[PRECOMPILED_HEADER] \
$[if $[ne $[NO_COMBINED_SOURCES],], $[INCLUDED_SOURCES], $[get_combined_sources]]
#defer included_sources $[INCLUDED_SOURCES]
@ -322,15 +315,6 @@
$[if $[and $[run_interrogate],$[IGATESCAN]], \
lib$[TARGET]_igate.cxx]
#defer get_precompiled_header $[PRECOMPILED_HEADER]
// This variable returns the name of the fake precompiled header cxx
// that will be used to force linking of the generated pch .obj into libs
#defer get_pch_outputcxx \
$[if $[and $[DO_PCH], $[PRECOMPILED_HEADER]], \
$[patsubst %.h,%.cxx, $[PRECOMPILED_HEADER]]]
// This variable returns the name of the interrogate module, if the
// current metalib target should include one, or empty string if it
// should not.

View File

@ -57,7 +57,7 @@
// This library is on a metalib, so we can't build it, but we
// should build all the obj's that go into it.
#set deferred_objs $[deferred_objs] \
$[patsubst %_src.cxx,,%.c %.cxx %.yxx %.lxx,$[so_dir]/%.obj,%,,$[get_sources] $[get_igateoutput]]
$[patsubst %.c %.cxx,$[so_dir]/%.obj,%,,$[c_sources] $[cxx_sources] $[get_igateoutput]]
#endif
#end lib_target
@ -84,53 +84,20 @@
#define install_data $[sort $[INSTALL_DATA(metalib_target lib_target static_lib_target ss_lib_target bin_target)] $[INSTALL_DATA]]
#define install_config $[sort $[INSTALL_CONFIG(metalib_target lib_target static_lib_target ss_lib_target bin_target)] $[INSTALL_CONFIG]]
#define install_igatedb $[sort $[get_igatedb(metalib_target lib_target)]]
// $[so_sources] is the set of sources that belong on a shared object,
// and $[st_sources] is the set of sources that belong on a static
// object, like a static library or an executable. In Windows, we
// don't need to make this distinction, but we do anyway in case we
// might in the future for some nutty reason.
#define so_sources $[get_sources(metalib_target lib_target noinst_lib_target)]
#define st_sources $[get_sources(static_lib_target ss_lib_target bin_target noinst_bin_target test_bin_target)]
// Since we don't make a distinction in Windows between building for
// static or dynamic targets, let's eliminate so_sources and just
// use st_sources for simplicity.
#define st_sources $[compile_sources(metalib_target lib_target noinst_lib_target static_lib_target ss_lib_target bin_target noinst_bin_target test_bin_target)]
#define dep_sources_1 $[get_sources(metalib_target lib_target noinst_lib_target static_lib_target ss_lib_target bin_target noinst_bin_target test_bin_target)]
// These are the source files that our dependency cache file will
// depend on. If it's an empty list, we won't bother writing rules to
// freshen the cache file.
#define dep_sources $[sort $[filter %.c %.cxx %.yxx %.lxx %.h %.I %.T,$[so_sources] $[st_sources]]]
#if $[eq $[so_dir],$[st_dir]]
// If the static and shared directories are the same, we have to use the
// same rules to build both shared and static targets.
#set st_sources $[so_sources] $[st_sources]
#set so_sources
#endif
#define dep_sources $[sort $[filter %.c %.cxx %.yxx %.lxx %.h %.I %.T,$[dep_sources_1]]]
#endif // $[build_directory]
// And these are the various source files, extracted out by type.
#define cxx_so_sources $[filter_out %_src.cxx,$[filter %.cxx,$[so_sources]]]
#define cxx_st_sources $[filter_out %_src.cxx,$[filter %.cxx,$[st_sources]]]
#define c_so_sources $[filter %.c,$[so_sources]]
#define c_st_sources $[filter %.c,$[st_sources]]
#define yxx_so_sources $[filter %.yxx,$[so_sources]]
#define yxx_st_sources $[filter %.yxx,$[st_sources]]
#define lxx_so_sources $[filter %.lxx,$[so_sources]]
#define lxx_st_sources $[filter %.lxx,$[st_sources]]
#if $[DO_PCH]
#define pch_header_source $[get_precompiled_header(metalib_target lib_target noinst_lib_target)]
#define st_pch_files $[patsubst %.h,$[st_dir]/%.pch,$[pch_header_source]]
#define st_pch_obj_files $[patsubst %.h,$[st_dir]/%.obj,$[pch_header_source]]
#endif
// This map variable gets us all the various source files from all the
// targets in this directory. We need it to look up the context in
// which to build a particular source file, since some targets may
// have different requirements (e.g. different local_libs, or
// different USE_this or USE_that) than other targets.
#map all_sources get_sources(metalib_target lib_target noinst_lib_target static_lib_target ss_lib_target bin_target noinst_bin_target test_bin_target)
// We define $[complete_local_libs] as the full set of libraries (from
// within this tree) that we must link a particular target with. It
@ -151,18 +118,9 @@
#defer target_ipath $[TOPDIR] $[sort $[complete_ipath]] $[other_trees:%=%\include] $[get_ipath]
// $[file_ipath] is the ipath from the context of a particular source
// file, given in $[file]. It uses the all_sources map to look up
// the target the source file belongs on, to get the proper context.
#defer file_ipath $[all_sources $[target_ipath],$[file]]
// These are the complete set of extra flags the compiler requires,
// from the context of a particular file, given in $[file].
#defer cflags $[all_sources $[get_cflags] $[CFLAGS],$[file]] $[CFLAGS_OPT$[OPTIMIZE]]
#defer c++flags $[all_sources $[get_cflags] $[C++FLAGS],$[file]] $[CFLAGS_OPT$[OPTIMIZE]]
// These are the same flags, sans the compiler optimizations.
#defer noopt_c++flags $[all_sources $[get_cflags] $[C++FLAGS],$[file]] $[CFLAGS_OPT$[OPTIMIZE]]
// These are the complete set of extra flags the compiler requires.
#defer cflags $[get_cflags] $[CFLAGS] $[CFLAGS_OPT$[OPTIMIZE]]
#defer c++flags $[get_cflags] $[C++FLAGS] $[CFLAGS_OPT$[OPTIMIZE]]
// $[complete_lpath] is rather like $[complete_ipath]: the list of
// directories (from within this tree) we should add to our -L list.
@ -177,24 +135,28 @@
// This is the set of files we might copy into *.prebuilt, if we have
// bison and flex (or copy from *.prebuilt if we don't have them).
#define bison_prebuilt $[patsubst %.yxx,%.h,$[yxx_so_sources] $[yxx_st_sources]] $[patsubst %.yxx,%.cxx,$[yxx_so_sources] $[yxx_st_sources]] $[patsubst %.lxx,%.cxx,$[lxx_so_sources] $[lxx_st_sources]]
#define bison_prebuilt $[patsubst %.yxx,%.h,$[yxx_sources]] $[patsubst %.yxx,%.cxx,$[yxx_sources]] $[patsubst %.lxx,%.cxx,$[lxx_sources]]
// for single-processor builds, write out *_composite.cxx files that include all composite
// files into 1 in order to speed the build of our heavily templated source
#forscopes lib_target bin_target static_lib_target ss_lib_target
#if $[and $[<= $[NUMBER_OF_PROCESSORS],2], $[eq $[NO_COMBINED_SOURCES],], $[ne $[COMBINED_SOURCES],]]
#output $[TARGET]_composite.cxx notouch
// Pre-compiled headers are one way to speed the compilation of many
// C++ source files that include similar headers, but it turns out a
// more effective (and more portable) way is simply to compile all the
// similar source files in one pass.
// We do this by generating a *_composite.cxx file that has an
// #include line for each of several actual source files, and then we
// compile the composite file instead of the original files.
#foreach composite_file $[composite_list]
#output $[composite_file] notouch
#format collapse
/* Generated automatically by $[PPREMAKE] $[PPREMAKE_VERSION] from $[SOURCEFILE]. */
/* ################################# DO NOT EDIT ########################### */
#foreach file $[COMBINED_SOURCES]
#foreach file $[$[composite_file]_sources]
##include "$[file]"
#end file
#end $[TARGET]_composite.cxx
#endif
#end lib_target bin_target static_lib_target ss_lib_target
#end $[composite_file]
#end composite_file
// Okay, we're ready. Start outputting the Makefile now.
#output Makefile
@ -227,9 +189,6 @@ test : $[test_bin_targets]
// generated output ends up in one or the other of these. Effective.
// It does assume that the odirs are not '.', however.
clean :
#if $[so_sources]
$[TAB] rm -rf $[so_dir]
#endif
#if $[st_sources]
$[TAB] rm -rf $[st_dir]
#endif
@ -239,14 +198,14 @@ $[TAB] rm -f *.pyc *.pyo // Also scrub out old generated Python code.
// it also cleans up the bison and flex output, as well as the
// dependency cache file.
cleanall : clean
#if $[yxx_so_sources] $[yxx_st_sources] $[lxx_so_sources] $[lxx_st_sources]
$[TAB] rm -f $[patsubst %.yxx %.lxx,%.cxx,$[yxx_so_sources] $[yxx_st_sources] $[lxx_so_sources] $[lxx_st_sources]]
#if $[yxx_sources] $[lxx_sources]
$[TAB] rm -f $[patsubst %.yxx %.lxx,%.cxx,$[yxx_sources] $[lxx_sources]]
#endif
#if $[ne $[DEPENDENCY_CACHE_FILENAME],]
$[TAB] rm -f $[DEPENDENCY_CACHE_FILENAME]
#endif
#if $[<= $[NUMBER_OF_PROCESSORS],2]
$[TAB] rm -f *_composite.cxx // eliminate generated *_composite.cxx files for uniprocessor builds
#if $[composite_list]
$[TAB] rm -f $[composite_list]
#endif
clean-igate :
@ -336,7 +295,6 @@ $[TAB] @test -d $[directory] || mkdir -p $[directory]
// directories directly or we get screwed up by the modification
// times. So we put this phony timestamp file in each directory.
#foreach directory $[sort \
$[if $[so_sources],$[so_dir]] \
$[if $[st_sources],$[st_dir]] \
]
$[directory]/stamp :
@ -399,8 +357,8 @@ igate : $[get_igatedb(metalib_target lib_target ss_lib_target):%=$[so_dir]/%]
// various .obj files.
#define sources \
$[unique $[patsubst %_src.cxx,,%.cxx %.c %.yxx %.lxx,$[so_dir]/%.obj,%,,$[get_sources] $[igateoutput] $[igatemout]]] \
$[components $[unique $[patsubst %_src.cxx,,%.cxx %.c %.yxx %.lxx,$[RELDIR]/$[so_dir]/%.obj,%,,$[get_sources] $[get_igateoutput] $[get_pch_outputcxx]]],$[active_component_libs]]
$[unique $[patsubst %_src.cxx,,%.cxx %.c %.yxx %.lxx,$[so_dir]/%.obj,%,,$[compile_sources] $[igateoutput] $[igatemout]]] \
$[components $[unique $[patsubst %_src.cxx,,%.cxx %.c %.yxx %.lxx,$[RELDIR]/$[so_dir]/%.obj,%,,$[compile_sources] $[get_igateoutput]]],$[active_component_libs]]
#define varname $[subst -,_,lib$[TARGET]_so]
$[varname] = $[sources]
@ -554,7 +512,7 @@ $[TAB] $[COMPILE_C++]
#forscopes noinst_lib_target
#define varname $[subst -,_,lib$[TARGET]_so]
$[varname] = $[unique $[patsubst %_src.cxx,,%.cxx %.c %.yxx %.lxx,$[so_dir]/%.obj,%,,$[get_sources]]]
$[varname] = $[unique $[patsubst %_src.cxx,,%.cxx %.c %.yxx %.lxx,$[so_dir]/%.obj,%,,$[compile_sources]]]
#define target $[so_dir]/lib$[TARGET]$[dllext].$[dlllib]
#define sources $($[varname])
$[target] : $[sources] $[so_dir]/stamp
@ -583,7 +541,7 @@ $[so_dir]/lib$[TARGET]$[dllext].pdb : $[so_dir]/lib$[TARGET]$[dllext].dll
#forscopes static_lib_target ss_lib_target
#define varname $[subst -,_,lib$[TARGET]_a]
$[varname] = $[unique $[patsubst %_src.cxx,,%.cxx %.c %.yxx %.lxx,$[st_dir]/%.obj,%,,$[get_sources]]]
$[varname] = $[unique $[patsubst %_src.cxx,,%.cxx %.c %.yxx %.lxx,$[st_dir]/%.obj,%,,$[compile_sources]]]
#define target $[st_dir]/lib$[TARGET]$[dllext].lib
#define sources $($[varname])
$[target] : $[sources] $[st_dir]/stamp
@ -659,7 +617,7 @@ $[TAB] cp -f $[st_dir]/$[local] $[dest]
$[TARGET] : $[st_dir]/$[TARGET].exe $[st_dir]/stamp
#define varname $[subst -,_,bin_$[TARGET]]
$[varname] = $[unique $[patsubst %_src.cxx,,%.cxx %.c %.yxx %.lxx,$[st_dir]/%.obj,%,,$[get_sources]]]
$[varname] = $[unique $[patsubst %_src.cxx,,%.cxx %.c %.yxx %.lxx,$[st_dir]/%.obj,%,,$[compile_sources]]]
#define target $[st_dir]/$[TARGET].exe
#define sources $($[varname])
#define ld $[get_ld]
@ -720,7 +678,7 @@ $[TAB] cp -f $[st_dir]/$[local] $[dest]
$[TARGET] : $[st_dir]/$[TARGET].exe $[st_dir]/stamp
#define varname $[subst -,_,bin_$[TARGET]]
$[varname] = $[unique $[patsubst %_src.cxx,,%.cxx %.c %.yxx %.lxx,$[st_dir]/%.obj,%,,$[get_sources]]]
$[varname] = $[unique $[patsubst %_src.cxx,,%.cxx %.c %.yxx %.lxx,$[st_dir]/%.obj,%,,$[compile_sources]]]
#define target $[st_dir]/$[TARGET].exe
#define sources $($[varname])
$[target] : $[sources] $[st_dir]/stamp
@ -740,8 +698,10 @@ $[TAB] $[LINK_BIN_C]
// file.
/////////////////////////////////////////////////////////////////////
#forscopes metalib_target lib_target noinst_lib_target static_lib_target ss_lib_target bin_target noinst_bin_target test_bin_target
// Rules to generate a C++ file from a Bison input file.
#foreach file $[sort $[yxx_so_sources] $[yxx_st_sources]]
#foreach file $[sort $[yxx_sources]]
#define target $[patsubst %.yxx,%.cxx,$[file]]
#define target_header $[patsubst %.yxx,%.h,$[file]]
#if $[HAVE_BISON]
@ -767,7 +727,7 @@ $[TAB] cp $[source] $[target_header]
#end file
// Rules to generate a C++ file from a Flex input file.
#foreach file $[sort $[lxx_so_sources] $[lxx_st_sources]]
#foreach file $[sort $[lxx_sources]]
#define target $[patsubst %.lxx,%.cxx,$[file]]
#if $[HAVE_BISON]
#define source $[file]
@ -787,123 +747,39 @@ $[TAB] cp $[source] $[target]
#end file
// Rules to compile ordinary C files that appear on a shared library.
#foreach file $[sort $[c_so_sources]]
#define target $[patsubst %.c,$[so_dir]/%.obj,$[file]]
#define source $[file]
#define ipath $[file_ipath]
#define flags $[cflags] $[CFLAGS_SHARED] $[all_sources $[building_var:%=/D%],$[file]]
$[target] : $[source] $[dependencies $[source]] $[so_dir]/stamp
$[TAB] $[COMPILE_C]
#end file
// Rules to compile ordinary C files that appear on a static library
// or in an executable.
#foreach file $[sort $[c_st_sources]]
// Rules to compile ordinary C files.
#foreach file $[sort $[c_sources]]
#define target $[patsubst %.c,$[st_dir]/%.obj,$[file]]
#define source $[file]
#define ipath $[file_ipath]
#define flags $[cflags] $[all_sources $[building_var:%=/D%],$[file]]
$[target] : $[source] $[dependencies $[source]] $[st_pch_files] $[st_dir]/stamp
#define ipath $[target_ipath]
#define flags $[cflags] $[building_var:%=/D%]
$[target] : $[source] $[dependencies $[source]] $[st_dir]/stamp
$[TAB] $[COMPILE_C]
#end file
// Rules to compile C++ files that appear on a shared library.
#foreach file $[sort $[cxx_so_sources]]
#define target $[patsubst %.cxx,$[so_dir]/%.obj,$[file]]
#define source $[file]
#define ipath $[file_ipath]
#define flags $[c++flags] $[CFLAGS_SHARED] $[all_sources $[building_var:%=/D%],$[file]]
// Rules to compile C++ files.
// Yacc must run before some files can be compiled, so all files
// depend on yacc having run.
$[target] : $[source] $[dependencies $[file]] $[yxx_so_sources:%.yxx=%.h] $[so_dir]/stamp
$[TAB] $[COMPILE_C++]
#end file
// Rules to compile C++ files that appear on a static library or in an
// executable.
#foreach file $[sort $[cxx_st_sources]]
#foreach file $[sort $[cxx_sources]]
#define target $[patsubst %.cxx,$[st_dir]/%.obj,$[file]]
#define source $[file]
#define ipath $[file_ipath]
#if $[DO_PCH]
// best way to find out if file use pch (and needs /Yu) is to check dependencies
// these must be defined before flags (or could defer them)
#define target_pch $[subst /./,/,$[patsubst %.h,$[st_dir]/%.pch,$[filter %_headers.h, $[dependencies $[file]]]]]
#endif
#define flags $[c++flags] $[all_sources $[building_var:%=/D%],$[file]]
#if $[target_pch]
#if $[eq $[NUMBER_OF_PROCESSORS],1]
#define pdb_filename $[osfilename $[st_dir]/$[TARGET(lib_target)]] // assumes pch only occurs in lib_target scope, not metalib_target or in interrogate
#define COMPILE_LINE $[patsubst /Fd%, /Fd"$[pdb_filename].pdb",$[COMPILE_C_WITH_PCH]]
#else
#define COMPILE_LINE $[COMPILE_C_WITH_PCH]
#endif
#define ipath $[target_ipath]
#if $[$[source]_sources]
#define depends $[dependencies $[$[source]_sources]]
#else
#define COMPILE_LINE $[COMPILE_C++]
#define depends $[dependencies $[source]]
#endif
$[target] : $[source] $[dependencies $[file]] $[yxx_st_sources:%.yxx=%.h] $[target_pch] $[st_dir]/stamp
$[TAB] $[COMPILE_LINE]
#end file
#if $[DO_PCH]
// Rules to compile _headers.pch from _header.h in static lib
#foreach file $[pch_header_source]
#define target_pch $[patsubst %.h,$[st_dir]/%.pch,$[file]]
#define target_obj $[patsubst %.h,$[st_dir]/%.obj,$[file]]
#define target $[target_obj]
#define source $[file]
#define ipath $[file_ipath]
#define flags $[c++flags] $[CFLAGS_SHARED] $[all_sources $[building_var:%=/D%],$[file]]
#define pdb_filename $[osfilename $[st_dir]/$[TARGET(lib_target)]] // assumes pch only occurs in lib_target scope, not metalib_target or in interrogate
#define COMPILE_CXXSTYLE_PCH $[patsubst /Fd%, /Fd"$[pdb_filename].pdb",$[COMPILE_CXXSTYLE_PCH]]
#define flags $[c++flags] $[building_var:%=/D%]
// Yacc must run before some files can be compiled, so all files
// depend on yacc having run.
$[target_obj] : $[source] $[dependencies $[file]] $[st_dir]/stamp
$[TAB] $[COMPILE_CXXSTYLE_PCH]
$[target_pch] : $[target_obj]
#end file
#endif
// Rules to compile generated C++ files that appear on a shared library.
#foreach file $[sort $[yxx_so_sources] $[lxx_so_sources]]
#define target $[patsubst %.lxx %.yxx,$[so_dir]/%.obj,$[file]]
#define source $[patsubst %.lxx %.yxx,%.cxx,$[file]]
#define ipath $[file_ipath]
#define flags $[noopt_c++flags] $[CFLAGS_SHARED] $[all_sources $[building_var:%=/D%],$[file]]
// Yacc must run before some files can be compiled, so all files
// depend on yacc having run.
$[target] : $[source] $[dependencies $[file]] $[yxx_so_sources:%.yxx=%.h] $[so_dir]/stamp
$[target] : $[source] $[depends] $[yxx_sources:%.yxx=%.h] $[st_dir]/stamp
$[TAB] $[COMPILE_C++]
#end file
// Rules to compile generated C++ files that appear on a static
// library or in an executable.
#foreach file $[sort $[yxx_st_sources] $[lxx_st_sources]]
#define target $[patsubst %.lxx %.yxx,$[st_dir]/%.obj,$[file]]
#define source $[patsubst %.lxx %.yxx,%.cxx,$[file]]
#define ipath $[file_ipath]
#define flags $[noopt_c++flags] $[all_sources $[building_var:%=/D%],$[file]]
$[target] : $[source] $[dependencies $[file]] $[yxx_st_sources:%.yxx=%.h] $[st_dir]/stamp
$[TAB] $[COMPILE_C++]
#end file
#end metalib_target lib_target noinst_lib_target static_lib_target ss_lib_target bin_target noinst_bin_target test_bin_target
// And now the rules to install the auxiliary files, like headers and
// data files.