historical/toontown-just-works.git/build/nirai/panda3d/dtool/pptempl/Depends.pp
2024-01-16 11:20:27 -06:00

175 lines
7.5 KiB
Puppet

//
// Depends.pp
//
// This file is loaded and run after each Sources.pp is read. It
// defines the inter-directory dependencies, which is useful for
// determining build order.
//
#if $[eq $[DIR_TYPE], toplevel]
#define DEPENDABLE_HEADERS $[CONFIG_HEADER]
#elif $[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
// 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. We also now add
// $[cxx_interrogate_sources], which are the C++ files generated by
// interrogate. Under OSX, we want to compile these files
// separately.
// Finally, there's $[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
// Tag all the static libraries by defining the "lib_is_static" variable.
#forscopes static_lib_target
#define lib_is_static 1
#end static_lib_target
#if $[WINDOWS_PLATFORM]
#forscopes ss_lib_target
#define lib_is_static 1
#end ss_lib_target
#endif
#if $[LINK_ALL_STATIC]
#forscopes metalib_target ss_lib_target lib_target
#define lib_is_static 1
#end metalib_target ss_lib_target lib_target
#endif
#forscopes metalib_target lib_target noinst_lib_target test_lib_target static_lib_target dynamic_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
// other.
#define build_directory $[build_directory]
#define build_target $[build_target]
#define active_local_libs $[active_local_libs]
#define active_component_libs $[active_component_libs]
#define active_libs $[active_libs]
#define get_sources $[get_sources]
#define get_igatescan $[get_igatescan]
#define get_igateoutput $[get_igateoutput]
#define get_igatedb $[get_igatedb]
#define get_igatemscan $[get_igatemscan]
#define get_igatemout $[get_igatemout]
// Report a warning for nonexisting dependencies.
#define nonexisting $[unmapped all_libs,$[LOCAL_LIBS]]
#if $[ne $[nonexisting],]
#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]
// Now compute the source files.
#define c_sources $[filter-out %_src.c,$[filter %.c,$[get_sources]]]
#define mm_sources $[filter %.mm,$[get_sources]]
#define cxx_sources $[filter-out %_src.cxx,$[filter %.cxx %.cpp,$[get_sources]]]
#define cxx_interrogate_sources
#if $[PYTHON_MODULE_ONLY]
#set cxx_interrogate_sources $[cxx_sources]
#set cxx_sources
#endif
#define yxx_sources $[filter %.yxx,$[get_sources]]
#define lxx_sources $[filter %.lxx,$[get_sources]]
// Define what the object files are.
#foreach file $[c_sources] $[mm_sources] $[cxx_sources] $[cxx_interrogate_sources] $[yxx_sources] $[lxx_sources]
#define $[file]_obj $[patsubst %.c %.cxx %.mm %.cpp %.yxx %.lxx,$[ODIR]/$[obj_prefix]%$[OBJ],$[notdir $[file]]]
#push 1 $[file]_obj
#end file
#if $[and $[not $[DONT_COMBINE]],$[or $[USE_SINGLE_COMPOSITE_SOURCEFILE],$[USE_TAU]]]
#if $[> $[words $[cxx_sources]], 1]
// If we have multiple C++ files, put them together into one
// composite file.
#define composite_file $[ODIR]/$[TARGET]_composite.cxx
#set composite_list $[composite_list] $[composite_file]
#define $[composite_file]_sources $[cxx_sources]
#define $[composite_file]_obj $[ODIR]/$[TARGET]_composite$[OBJ]
#push 1 $[composite_file]_sources
#push 1 $[composite_file]_obj
#if $[PYTHON_MODULE_ONLY]
#set cxx_interrogate_sources $[composite_file]
#else
#set cxx_sources $[composite_file]
#endif
#endif
#if $[> $[words $[c_sources]], 1]
// If we have multiple C files, put them together into one
// composite file also.
#define composite_file $[ODIR]/$[TARGET]_composite_c.c
#set composite_list $[composite_list] $[composite_file]
#define $[composite_file]_sources $[c_sources]
#define $[composite_file]_obj $[ODIR]/$[TARGET]_composite_c$[OBJ]
#push 1 $[composite_file]_sources
#push 1 $[composite_file]_obj
#set c_sources $[composite_file]
#endif
#endif
// Add the bison- and flex-generated .cxx files, as well as the
// interrogate-generated files, to the compile list, too. These
// never get added to composite files, though, mainly because they
// tend to be very large files themselves.
#foreach source_file $[yxx_sources] $[lxx_sources]
#define generated_file $[patsubst %.yxx %.lxx,%.cxx,$[source_file]]
#define $[generated_file]_obj $[patsubst %.yxx %.lxx,$[ODIR]/$[TARGET]_%$[OBJ],$[source_file]]
#define $[generated_file]_sources $[source_file]
#push 1 $[generated_file]_obj
#set cxx_sources $[cxx_sources] $[generated_file]
#end source_file
#if $[and $[build_directory],$[get_igateoutput]]
#define generated_file $[get_igateoutput]
#define $[generated_file]_obj $[get_igateoutput:%.cxx=%$[OBJ]]
// #define $[generated_file]_sources $[get_igatescan]
#push 1 $[generated_file]_obj
// We add this to cxx_sources instead of cxx_interrogate_sources,
// even though it's an interrogate-generated file, because it's
// not a module file--we really only accumulate module files into
// cxx_interrogate_sources.
#set cxx_sources $[cxx_sources] $[generated_file]
#endif
#if $[get_igatemout]
#define generated_file $[get_igatemout]
#define $[generated_file]_obj $[get_igatemout:%.cxx=%$[OBJ]]
#define $[generated_file]_sources none
#push 1 $[generated_file]_obj
#set cxx_interrogate_sources $[cxx_interrogate_sources] $[generated_file]
#endif
#define compile_sources $[c_sources] $[mm_sources] $[cxx_sources] $[cxx_interrogate_sources]
#end metalib_target lib_target noinst_lib_target test_lib_target static_lib_target dynamic_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.
#define DEPEND_DIRS \
$[sort $[EXTRA_DEPENDS] $[all_libs $[DIRNAME],$[get_depend_libs]]]
#set DEPENDABLE_HEADERS $[sort $[DEPENDABLE_HEADERS] $[EXTRA_DEPENDABLE_HEADERS]]
#endif
#endif // DIR_TYPE