diff --git a/dtool/Config.pp b/dtool/Config.pp index 2f49b58c07..f5105ba5a0 100644 --- a/dtool/Config.pp +++ b/dtool/Config.pp @@ -60,6 +60,9 @@ // files, to ease transition to the new system. // unix - Generate makefiles suitable for most Unix platforms, // without using autoconf. +// msvc - Generate makefiles suitable for building on Windows platforms +// (e.g. Windows NT, Windows 2000) using the Microsoft Visual C++ +// command-line compiler. // #define BUILD_TYPE stopgap diff --git a/dtool/pptempl/Global.msvc.pp b/dtool/pptempl/Global.msvc.pp new file mode 100644 index 0000000000..e754f1ef6a --- /dev/null +++ b/dtool/pptempl/Global.msvc.pp @@ -0,0 +1,7 @@ +// +// Global.msvc.pp +// +// This file is read in before any of the individual Sources.pp files +// are read. It defines a few global variables to assist +// Template.msvc.pp. +// diff --git a/dtool/pptempl/Global.pp b/dtool/pptempl/Global.pp index a50326f37c..44dc39c2d1 100644 --- a/dtool/pptempl/Global.pp +++ b/dtool/pptempl/Global.pp @@ -399,6 +399,51 @@ #end get_ld +// Define a few directories that will be useful. + +#define so_dir $[ODIR_SHARED] +#define st_dir $[ODIR_STATIC] + +#define install_dir $[$[upcase $[PACKAGE]]_INSTALL] +#if $[eq $[install_dir],] + #error Variable $[upcase $[PACKAGE]]_INSTALL is not set! Cannot install! +#endif + +#define other_trees +#foreach tree $[NEEDS_TREES] + #define tree_install $[$[upcase $[tree]]_INSTALL] + #if $[eq $[tree_install],] +Warning: Variable $[upcase $[tree]]_INSTALL is not set! + #else + #set other_trees $[other_trees] $[tree_install] + #endif +#end tree + +#define install_lib_dir $[install_dir]/lib +#define install_bin_dir $[install_dir]/bin +#define install_headers_dir $[install_dir]/include +#define install_data_dir $[install_dir]/shared +#define install_igatedb_dir $[install_dir]/etc +#define install_config_dir $[install_dir]/etc + +#if $[ne $[DTOOL_INSTALL],] + #define install_parser_inc_dir $[DTOOL_INSTALL]/include/parser-inc +#else + #define install_parser_inc_dir $[install_headers_dir]/parser-inc +#endif + + +// Set up the correct interrogate options. +#defer interrogate_options \ + -DCPPPARSER -D__cplusplus $[SYSTEM_IGATE_FLAGS] \ + -S$[install_parser_inc_dir] $[target_ipath:%=-I%] \ + $[filter -D%,$[get_cflags] $[C++FLAGS]] \ + $[INTERROGATE_OPTIONS] \ + $[if $[INTERROGATE_PYTHON_INTERFACE],-python] \ + $[if $[INTERROGATE_C_INTERFACE],-c] + + + // Include the global definitions for this particular build_type, if // the file is there. #sinclude $[GLOBAL_TYPE_FILE] diff --git a/dtool/pptempl/Global.unix.pp b/dtool/pptempl/Global.unix.pp index 68baf05747..8136618944 100644 --- a/dtool/pptempl/Global.unix.pp +++ b/dtool/pptempl/Global.unix.pp @@ -5,42 +5,3 @@ // are read. It defines a few global variables to assist // Template.unix.pp. // - -#define so_dir $[ODIR_SHARED] -#define st_dir $[ODIR_STATIC] - -#define install_dir $[$[upcase $[PACKAGE]]_INSTALL] -#if $[eq $[install_dir],] - #error Variable $[upcase $[PACKAGE]]_INSTALL is not set! Cannot install! -#endif - -#define other_trees -#foreach tree $[NEEDS_TREES] - #define tree_install $[$[upcase $[tree]]_INSTALL] - #if $[eq $[tree_install],] -Warning: Variable $[upcase $[tree]]_INSTALL is not set! - #else - #set other_trees $[other_trees] $[tree_install] - #endif -#end tree - -#define install_lib_dir $[install_dir]/lib -#define install_bin_dir $[install_dir]/bin -#define install_headers_dir $[install_dir]/include -#define install_data_dir $[install_dir]/shared -#define install_igatedb_dir $[install_dir]/etc -#define install_config_dir $[install_dir]/etc - -#if $[ne $[DTOOL_INSTALL],] - #define install_parser_inc_dir $[DTOOL_INSTALL]/include/parser-inc -#else - #define install_parser_inc_dir $[install_headers_dir]/parser-inc -#endif - -#defer interrogate_options \ - -DCPPPARSER -D__cplusplus $[SYSTEM_IGATE_FLAGS] \ - -S$[install_parser_inc_dir] $[target_ipath:%=-I%] \ - $[filter -D%,$[get_cflags] $[C++FLAGS]] \ - $[INTERROGATE_OPTIONS] \ - $[if $[INTERROGATE_PYTHON_INTERFACE],-python] \ - $[if $[INTERROGATE_C_INTERFACE],-c] diff --git a/dtool/pptempl/Template.msvc.pp b/dtool/pptempl/Template.msvc.pp new file mode 100644 index 0000000000..e8a85b6a5d --- /dev/null +++ b/dtool/pptempl/Template.msvc.pp @@ -0,0 +1,740 @@ +// +// Template.msvc.pp +// +// This file defines the set of output files that will be generated to +// support a generic Unix-style build system. It generates a number +// of shared libraries named libtarget.so for each lib_target, assumes +// object files are named file.o, and makes other Unix-like +// assumptions. +// + +// Before this file is processed, the following files are read and +// processed (in order): + +// The Package.pp file in the root of the current source hierarchy +// (e.g. $PANDA/Package.pp) +// $DTOOL/Package.pp +// $DTOOL/Config.pp +// $DTOOL/Config.Platform.pp +// $DTOOL/pptempl/System.pp +// The user's PPREMAKE_CONFIG file. +// $DTOOL/pptempl/Global.pp +// $DTOOL/pptempl/Global.msvc.pp +// All of the Sources.pp files in the current source hierarchy +// $DTOOL/Depends.pp, once for each Sources.pp file +// Template.msvc.pp (this file), once for each Sources.pp file + + +////////////////////////////////////////////////////////////////////// +#if $[or $[eq $[DIR_TYPE], src],$[eq $[DIR_TYPE], metalib]] +////////////////////////////////////////////////////////////////////// + +// For a source directory, build a single Makefile with rules to build +// each target. + +// We need to know the various targets we'll be building. On Windows, +// we don't build any shared libraries except for the metalibs, but we +// do compile all of the source files into .o files. And we do still +// generate static libraries and executables. + +// $[lib_targets] will be the list of dynamic libraries (in this case, +// just the metalibs), $[static_lib_targets] the list of static +// libraries, and $[bin_targets] the list of binaries. +// $[test_bin_targets] is the list of binaries that are to be built +// only when specifically asked for. +#define lib_targets $[TARGET(metalib_target):%=$[so_dir]/lib%.so] +#define static_lib_targets $[TARGET(static_lib_target):%=$[st_dir]/lib%.a] +#define bin_targets $[TARGET(bin_target noinst_bin_target sed_bin_target):%=$[st_dir]/%] +#define test_bin_targets $[TARGET(test_bin_target):%=$[st_dir]/%] + +// And these variables will define the various things we need to +// install. +#define install_lib $[TARGET(metalib_target)] +#define install_bin $[TARGET(bin_target)] +#define install_scripts $[TARGET(sed_bin_target)] $[sort $[INSTALL_SCRIPTS(metalib_target lib_target static_lib_target bin_target)] $[INSTALL_SCRIPTS]] +#define install_headers $[sort $[INSTALL_HEADERS(metalib_target lib_target static_lib_target bin_target)] $[INSTALL_HEADERS]] +#define install_parser_inc $[sort $[INSTALL_PARSER_INC]] +#define install_data $[sort $[INSTALL_DATA(metalib_target lib_target static_lib_target bin_target)] $[INSTALL_DATA]] +#define install_config $[sort $[INSTALL_CONFIG(metalib_target lib_target static_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. We make the +// distinction because some architectures require a special parameter +// to the compiler when we're compiling something to be put in a +// shared object (to make the code relocatable). +#define so_sources $[get_sources(metalib_target lib_target noinst_lib_target)] +#define st_sources $[get_sources(static_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,$[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 + +// And these are the various source files, extracted out by type. +#define cxx_so_sources $[filter %.cxx,$[so_sources]] +#define cxx_st_sources $[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]] + +// 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 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 +// is the transitive closure of our dependent libs: the libraries we +// depend on, plus the libraries *those* libraries depend on, and so +// on. +#defer complete_local_libs $[unique $[closure all_libs,$[active_libs]]] + +// And $[complete_ipath] is the list of directories (from within this +// tree) we should add to our -I list. It's basically just one for +// each directory named in the $[complete_local_libs], above, plus +// whatever else the user might have explicitly named in +// $[LOCAL_INCS]. +#defer complete_ipath $[all_libs $[RELDIR],$[complete_local_libs]] $[RELDIR($[LOCAL_INCS:%=%/])] + +// $[target_ipath] is the proper ipath to put on the command line, +// from the context of a particular target. +#defer target_ipath $[other_trees:%=%/include] $[TOPDIR] $[sort $[complete_ipath]] $[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]] + +// $[complete_lpath] is rather like $[complete_ipath]: the list of +// directories (from within this tree) we should add to our -L list. +#defer complete_lpath $[static_libs $[RELDIR:%=%/$[st_dir]],$[complete_local_libs]] $[dynamic_libs $[RELDIR:%=%/$[so_dir]],$[complete_local_libs]] + +// $[lpath] is like $[target_ipath]: it's the list of directories we +// should add to our -L list, from the context of a particular target. +#defer lpath $[other_trees:%=%/lib] $[sort $[complete_lpath]] $[get_lpath] + +// And $[libs] is the set of libraries we will link with. +#defer libs $[unique $[complete_local_libs] $[patsubst %:m,,%:c %,%,$[OTHER_LIBS]] $[get_libs]] + + +// Okay, we're ready. Start outputting the Makefile now. +#output Makefile +#format makefile +#### Generated automatically by $[PPREMAKE] $[PPREMAKE_VERSION] from $[SOURCEFILE]. +################################# DO NOT EDIT ########################### + + +// The 'all' rule makes all the stuff in the directory except for the +// test_bin_targets. It doesn't do any installation, however. +#define all_targets \ + Makefile \ + $[if $[dep_sources],$[DEPENDENCY_CACHE_FILENAME]] \ + $[if $[so_sources],$[so_dir]] \ + $[if $[st_sources],$[st_dir]] \ + $[sort $[lib_targets] $[static_lib_targets] $[bin_targets]] +all : $[all_targets] + +// The 'test' rule makes all the test_bin_targets. +test : $[test_bin_targets] + +// We implement 'clean' simply by removing the odirs, since all of our +// 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] + rm -rf $[so_dir] +#endif +#if $[st_sources] + rm -rf $[st_dir] +#endif + +// 'cleanall' is not much more thorough than 'clean': At the moment, +// 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] + rm -f $[patsubst %.yxx %.lxx,%.cxx,$[yxx_so_sources] $[yxx_st_sources] $[lxx_so_sources] $[lxx_st_sources]] +#endif +#if $[ne $[DEPENDENCY_CACHE_FILENAME],] + rm -f $[DEPENDENCY_CACHE_FILENAME] +#endif + +// Now, 'install' and 'uninstall'. These simply copy files into the +// install directory (or remove them). The 'install' rule also makes +// the directories if necessary. +#define installed_files \ + $[INSTALL_SCRIPTS:%=$[install_bin_dir]/%] \ + $[INSTALL_HEADERS:%=$[install_headers_dir]/%] \ + $[INSTALL_PARSER_INC:%=$[install_parser_inc_dir]/%] \ + $[INSTALL_DATA:%=$[install_data_dir]/%] \ + $[INSTALL_CONFIG:%=$[install_config_dir]/%] + +#define install_targets \ + $[sort \ + $[if $[install_lib],$[install_lib_dir]] \ + $[if $[install_bin] $[install_scripts],$[install_bin_dir]] \ + $[if $[install_headers],$[install_headers_dir]] \ + $[if $[install_parser_inc],$[install_parser_inc_dir]] \ + $[if $[install_data],$[install_data_dir]] \ + $[if $[install_config],$[install_config_dir]] \ + $[if $[install_igatedb],$[install_igatedb_dir]] \ + ] \ + $[TARGET(metalib_target lib_target static_lib_target):%=install-lib%] $[TARGET(bin_target):%=install-%] \ + $[installed_files] +install : all $[install_targets] + +uninstall : $[TARGET(metalib_target lib_target static_lib_target):%=uninstall-lib%] $[TARGET(bin_target):%=uninstall-%] +#if $[installed_files] + rm -f $[sort $[installed_files]] +#endif + + +// We need a rule for each directory we might need to make. This +// loops through the full set of directories and creates a rule to +// make each one, as needed. +#foreach directory $[sort \ + $[if $[so_sources],$[so_dir]] \ + $[if $[st_sources],$[st_dir]] \ + $[if $[install_lib],$[install_lib_dir]] \ + $[if $[install_bin] $[install_scripts],$[install_bin_dir]] \ + $[if $[install_headers],$[install_headers_dir]] \ + $[if $[install_parser_inc],$[install_parser_inc_dir]] \ + $[if $[install_data],$[install_data_dir]] \ + $[if $[install_config],$[install_config_dir]] \ + $[if $[install_igatedb],$[install_igatedb_dir]] \ + ] +$[directory] : + @test -d $[directory] || echo mkdir -p $[directory] + @test -d $[directory] || mkdir -p $[directory] +#end directory + + +// Now it's time to start generating the rules to make our actual +// targets. + + +///////////////////////////////////////////////////////////////////// +// First, the dynamic libraries. Each lib_target and metalib_target +// is a dynamic library. +///////////////////////////////////////////////////////////////////// + +#forscopes metalib_target lib_target + +// $[igatescan] is the set of C++ headers and source files that we +// need to scan for interrogate. $[igateoutput] is the name of the +// generated .cxx file that interrogate will produce (and which we +// should compile into the library). $[igatedb] is the name of the +// generated .in file that interrogate will produce (and which should +// be installed into the /etc directory). +#define igatescan $[get_igatescan] +#define igateoutput $[if $[igatescan],lib$[TARGET]_igate.cxx] +#define igatedb $[get_igatedb] + +// If this is a metalib, it may have a number of components that +// include interrogated interfaces. If so, we need to generate a +// 'module' file within this library. This is mainly necessary for +// Python; it contains a table of all of the interrogated functions, +// so we can load the library as a Python module and have access to +// the interrogated functions. + +// $[igatemscan] is the set of .in files generated by all of our +// component libraries. If it is nonempty, then we do need to +// generate a module, and $[igatemout] is the name of the .cxx file +// that interrogate will produce to make this module. +#define igatemscan $[components $[get_igatedb:%=$[RELDIR]/$[so_dir]/%],$[active_component_libs]] +#define igatemout $[if $[igatemscan],lib$[TARGET]_module.cxx] + +// Now output the rule to actually link the library from all of its +// various .o files. +lib_$[TARGET]_so = $[unique $[patsubst %.cxx %.c %.yxx %.lxx,$[so_dir]/%.o,%,,$[get_sources] $[igateoutput] $[igatemout]]] +$[so_dir]/lib$[TARGET].so : $(lib_$[TARGET]_so) +#define target $@ +#define sources $(lib_$[TARGET]_so) +#if $[filter %.cxx %.yxx %.lxx,$[get_sources]] + $[SHARED_LIB_C++] +#else + $[SHARED_LIB_C] +#endif + +// Here are the rules to install and uninstall the library and +// everything that goes along with it. +#define installed_files \ + $[install_lib_dir]/lib$[TARGET].so \ + $[INSTALL_SCRIPTS:%=$[install_bin_dir]/%] \ + $[INSTALL_HEADERS:%=$[install_headers_dir]/%] \ + $[INSTALL_DATA:%=$[install_data_dir]/%] \ + $[INSTALL_CONFIG:%=$[install_config_dir]/%] \ + $[igatedb:%=$[install_igatedb_dir]/%] + +install-lib$[TARGET] : $[installed_files] + +uninstall-lib$[TARGET] : +#if $[installed_files] + rm -f $[sort $[installed_files]] +#endif + +$[install_lib_dir]/lib$[TARGET].so : $[so_dir]/lib$[TARGET].so +#define local lib$[TARGET].so +#define dest $[install_lib_dir] + cd ./$[so_dir]; $[INSTALL] + +#if $[igatescan] +// Now, some additional rules to generate and compile the interrogate +// data, if needed. + +// The library name is based on this library. +#define igatelib lib$[TARGET] +// The module name comes from the metalib that includes this library. +#define igatemod $[module $[TARGET],$[TARGET]] +#if $[eq $[igatemod],] + // Unless no metalib includes this library. + #define igatemod $[TARGET] +#endif + +$[install_igatedb_dir]/$[igatedb] : $[so_dir]/$[igatedb] +#define local $[igatedb] +#define dest $[install_igatedb_dir] + cd ./$[so_dir]; $[INSTALL] + +lib$[TARGET]_igatescan = $[igatescan] +$[so_dir]/$[igatedb] $[so_dir]/$[igateoutput] : $[filter-out .c .cxx,$[igatescan]] + interrogate -od $[so_dir]/$[igatedb] -oc $[so_dir]/$[igateoutput] $[interrogate_options] -module "$[igatemod]" -library "$[igatelib]" $(lib$[TARGET]_igatescan) + +$[igateoutput:%.cxx=$[so_dir]/%.o] : $[so_dir]/$[igateoutput] +#define target $@ +#define source $[so_dir]/$[igateoutput] +#define ipath . $[target_ipath] +#define flags $[get_cflags] $[C++FLAGS] $[CFLAGS_OPT$[OPTIMIZE]] $[CFLAGS_SHARED] + $[COMPILE_C++] +#endif // $[igatescan] + +#if $[igatemout] +// And finally, some additional rules to build the interrogate module +// file into the library, if this is a metalib that includes +// interrogated components. + +#define igatelib lib$[TARGET] +#define igatemod $[TARGET] + +lib$[TARGET]_igatemscan = $[igatemscan] +$[so_dir]/$[igatemout] : $(lib$[TARGET]_igatemscan) + interrogate_module -oc $@ -module "$[igatemod]" -library "$[igatelib]" -python $(lib$[TARGET]_igatemscan) + +$[igatemout:%.cxx=$[so_dir]/%.o] : $[so_dir]/$[igatemout] +#define target $@ +#define source $[so_dir]/$[igatemout] +#define ipath . $[target_ipath] +#define flags $[get_cflags] $[C++FLAGS] $[CFLAGS_OPT$[OPTIMIZE]] $[CFLAGS_SHARED] + $[COMPILE_C++] +#endif // $[igatescan] + +#end metalib_target lib_target + + + + +///////////////////////////////////////////////////////////////////// +// Now, the noninstalled dynamic libraries. These are presumably used +// only within this directory, or at the most within this tree, and +// also presumably will never include interrogate data. That, plus +// the fact that we don't need to generate install rules, makes it a +// lot simpler. +///////////////////////////////////////////////////////////////////// + +#forscopes noinst_lib_target +lib_$[TARGET]_so = $[unique $[patsubst %.cxx %.c %.yxx %.lxx,$[so_dir]/%.o,%,,$[get_sources]]] +$[so_dir]/lib$[TARGET].so : $(lib_$[TARGET]_so) +#define target $@ +#define sources $(lib_$[TARGET]_so) +#if $[filter %.cxx %.yxx %.lxx,$[get_sources]] + $[SHARED_LIB_C++] +#else + $[SHARED_LIB_C] +#endif + +#end noinst_lib_target + + + +///////////////////////////////////////////////////////////////////// +// Now the static libraries. Again, we assume there's no interrogate +// interfaces going on in here, and there's no question of this being +// a metalib, making the rules relatively simple. +///////////////////////////////////////////////////////////////////// + +#forscopes static_lib_target +lib_$[TARGET]_a = $[unique $[patsubst %.cxx %.c %.yxx %.lxx,$[st_dir]/%.o,%,,$[get_sources]]] +$[st_dir]/lib$[TARGET].a : $(lib_$[TARGET]_a) +#define target $@ +#define sources $(lib_$[TARGET]_a) +#if $[filter %.cxx %.yxx %.lxx,$[get_sources]] + $[STATIC_LIB_C++] +#else + $[STATIC_LIB_C] +#endif +#if $[RANLIB] + $[RANLIB] +#endif + +#define installed_files \ + $[install_lib_dir]/lib$[TARGET].a \ + $[INSTALL_SCRIPTS:%=$[install_bin_dir]/%] \ + $[INSTALL_HEADERS:%=$[install_headers_dir]/%] \ + $[INSTALL_DATA:%=$[install_data_dir]/%] \ + $[INSTALL_CONFIG:%=$[install_config_dir]/%] + +install-lib$[TARGET] : $[installed_files] + +uninstall-lib$[TARGET] : +#if $[installed_files] + rm -f $[sort $[installed_files]] +#endif + +$[install_lib_dir]/lib$[TARGET].a : $[st_dir]/lib$[TARGET].a +#define local lib$[TARGET].a +#define dest $[install_lib_dir] + cd ./$[st_dir]; $[INSTALL] + +#end static_lib_target + + + +///////////////////////////////////////////////////////////////////// +// The sed_bin_targets are a special bunch. These are scripts that +// are to be preprocessed with sed before being installed, for +// instance to insert a path or something in an appropriate place. +///////////////////////////////////////////////////////////////////// + +#forscopes sed_bin_target +$[st_dir]/$[TARGET] : $[SOURCE] + $[SED] $[COMMAND] $[SOURCE] >$@ + chmod +x $@ + +#define installed_files \ + $[install_bin_dir]/$[TARGET] + +install-$[TARGET] : $[installed_files] + +uninstall-$[TARGET] : +#if $[installed_files] + rm -f $[sort $[installed_files]] +#endif + +$[install_bin_dir]/$[TARGET] : $[st_dir]/$[TARGET] +#define local $[TARGET] +#define dest $[install_bin_dir] + cd ./$[st_dir]; $[INSTALL_PROG] + +#end sed_bin_target + + +///////////////////////////////////////////////////////////////////// +// And now, the bin_targets. These are normal C++ executables. No +// interrogate, metalibs, or any such nonsense here. +///////////////////////////////////////////////////////////////////// + +#forscopes bin_target +bin_$[TARGET] = $[unique $[patsubst %.cxx %.c %.yxx %.lxx,$[st_dir]/%.o,%,,$[get_sources]]] +$[st_dir]/$[TARGET] : $(bin_$[TARGET]) +#define target $@ +#define sources $(bin_$[TARGET]) +#define ld $[get_ld] +#if $[ld] + // If there's a custom linker defined for the target, we have to use it. + $[ld] -o $[target] $[sources] $[lpath:%=-L%] $[libs:%=-l%] +#else + // Otherwise, we can use the normal linker. + #if $[filter %.cxx %.yxx %.lxx,$[get_sources]] + $[LINK_BIN_C++] + #else + $[LINK_BIN_C] + #endif +#endif + +#define installed_files \ + $[install_bin_dir]/$[TARGET] \ + $[INSTALL_SCRIPTS:%=$[install_bin_dir]/%] \ + $[INSTALL_HEADERS:%=$[install_headers_dir]/%] \ + $[INSTALL_DATA:%=$[install_data_dir]/%] \ + $[INSTALL_CONFIG:%=$[install_config_dir]/%] + +install-$[TARGET] : $[installed_files] + +uninstall-$[TARGET] : +#if $[installed_files] + rm -f $[sort $[installed_files]] +#endif + +$[install_bin_dir]/$[TARGET] : $[st_dir]/$[TARGET] +#define local $[TARGET] +#define dest $[install_bin_dir] + cd ./$[st_dir]; $[INSTALL_PROG] + +#end bin_target + + + +///////////////////////////////////////////////////////////////////// +// The noinst_bin_targets and the test_bin_targets share the property +// of being built (when requested), but having no install rules. +///////////////////////////////////////////////////////////////////// + +#forscopes noinst_bin_target test_bin_target +bin_$[TARGET] = $[unique $[patsubst %.cxx %.c %.yxx %.lxx,$[st_dir]/%.o,%,,$[get_sources]]] +$[st_dir]/$[TARGET] : $(bin_$[TARGET]) +#define target $@ +#define sources $(bin_$[TARGET]) +#if $[filter %.cxx %.yxx %.lxx,$[get_sources]] + $[LINK_BIN_C++] +#else + $[LINK_BIN_C] +#endif + +#end noinst_bin_target test_bin_target + + + + +///////////////////////////////////////////////////////////////////// +// Finally, we put in the rules to compile each source file into a .o +// file. +///////////////////////////////////////////////////////////////////// + +// Rules to generate a C++ file from a Bison input file. +#foreach file $[sort $[yxx_so_sources] $[yxx_st_sources]] +$[patsubst %.yxx,%.cxx,$[file]] : $[file] + $[BISON] -y $[if $[YACC_PREFIX],-d --name-prefix=$[YACC_PREFIX]] $[file] + mv y.tab.c $@ + mv y.tab.h $[patsubst %.yxx,%.h,$[file]] + +#end file + +// Rules to generate a C++ file from a Flex input file. +#foreach file $[sort $[lxx_so_sources] $[lxx_st_sources]] +$[patsubst %.lxx,%.cxx,$[file]] : $[file] + $[FLEX] $[if $[YACC_PREFIX],-P$[YACC_PREFIX]] -olex.yy.c $[file] + $[SED] '/#include /d' lex.yy.c > $@ + rm lex.yy.c + +#end file + +// Rules to compile ordinary C files that appear on a shared library. +#foreach file $[sort $[c_so_sources]] +$[patsubst %.c,$[so_dir]/%.o,$[file]] : $[file] $[dependencies $[file]] +#define target $@ +#define source $[file] +#define ipath $[file_ipath] +#define flags $[cflags] $[CFLAGS_SHARED] + $[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]] +$[patsubst %.c,$[st_dir]/%.o,$[file]] : $[file] $[dependencies $[file]] +#define target $@ +#define source $[file] +#define ipath $[file_ipath] +#define flags $[cflags] + $[COMPILE_C] + +#end file + +// Rules to compile C++ files that appear on a shared library. +#foreach file $[sort $[cxx_so_sources] $[yxx_so_sources] $[lxx_so_sources]] +#define source $[patsubst %.cxx %.lxx %.yxx,%.cxx,$[file]] +$[patsubst %.cxx %.lxx %.yxx,$[so_dir]/%.o,$[file]] : $[source] $[dependencies $[file]] +#define target $@ +#define ipath $[file_ipath] +#define flags $[c++flags] $[CFLAGS_SHARED] + $[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] $[yxx_st_sources] $[lxx_st_sources]] +#define source $[patsubst %.cxx %.lxx %.yxx,%.cxx,$[file]] +$[patsubst %.cxx %.lxx %.yxx,$[st_dir]/%.o,$[file]] : $[source] $[dependencies $[file]] +#define target $@ +#define ipath $[file_ipath] +#define flags $[c++flags] + $[COMPILE_C++] + +#end file + +// And now the rules to install the auxiliary files, like headers and +// data files. +#foreach file $[install_scripts] +$[install_bin_dir]/$[file] : $[file] +#define local $[file] +#define dest $[install_bin_dir] + $[INSTALL_PROG] +#end file + +#foreach file $[install_headers] +$[install_headers_dir]/$[file] : $[file] +#define local $[file] +#define dest $[install_headers_dir] + $[INSTALL] +#end file + +#foreach file $[install_parser_inc] +$[install_parser_inc_dir]/$[file] : $[file] +#define local $[file] +#define dest $[install_parser_inc_dir] + $[INSTALL] +#end file + +#foreach file $[install_data] +$[install_data_dir]/$[file] : $[file] +#define local $[file] +#define dest $[install_data_dir] + $[INSTALL] +#end file + +#foreach file $[install_config] +$[install_config_dir]/$[file] : $[file] +#define local $[file] +#define dest $[install_config_dir] + $[INSTALL] +#end file + + +// Finally, the rules to freshen the Makefile itself. +Makefile : $[SOURCE_FILENAME] + ppremake + +#if $[and $[DEPENDENCY_CACHE_FILENAME],$[dep_sources]] +$[DEPENDENCY_CACHE_FILENAME] : $[dep_sources] + @ppremake -D $[DEPENDENCY_CACHE_FILENAME] +#endif + + +#end Makefile + + +////////////////////////////////////////////////////////////////////// +#elif $[eq $[DIR_TYPE], group] +////////////////////////////////////////////////////////////////////// + +// This is a group directory: a directory above a collection of source +// directories, e.g. $DTOOL/src. We don't need to output anything in +// this directory. + + + +////////////////////////////////////////////////////////////////////// +#elif $[eq $[DIR_TYPE], toplevel] +////////////////////////////////////////////////////////////////////// + +// This is the toplevel directory, e.g. $DTOOL. Here we build the +// root makefile and also synthesize the dtool_config.h (or whichever +// file) we need. + +#map subdirs +// Iterate through all of our known source files. Each src and +// metalib type file gets its corresponding Makefile listed +// here. However, we test for $[DIR_TYPE] of toplevel, because the +// source directories typically don't define their own DIR_TYPE +// variable, and they end up inheriting this one dynamically. +#forscopes */ +#if $[or $[eq $[DIR_TYPE], src],$[eq $[DIR_TYPE], metalib],$[and $[eq $[DIR_TYPE], toplevel],$[ne $[DIRNAME],top]]] +#if $[build_directory] + #addmap subdirs $[DIRNAME] +#endif +#endif +#end */ + +#output Makefile +#format makefile +#### Generated automatically by $[PPREMAKE] $[PPREMAKE_VERSION] from $[SOURCEFILE]. +################################# DO NOT EDIT ########################### + +all : $[subdirs] +test : $[subdirs:%=test-%] +clean : $[subdirs:%=clean-%] +cleanall : $[subdirs:%=cleanall-%] +install : $[if $[CONFIG_HEADER],$[install_headers_dir] $[install_headers_dir]/$[CONFIG_HEADER]] $[subdirs:%=install-%] +uninstall : $[subdirs:%=uninstall-%] +#if $[CONFIG_HEADER] + rm -f $[install_headers_dir]/$[CONFIG_HEADER] +#endif + +// Somehow, something in the cttools confuses some shells, so that +// when we are attached, 'cd foo' doesn't work, but 'cd ./foo' does. +// Weird. We get around this by putting a ./ in front of each cd +// target below. + +#formap dirname subdirs +#define depends +$[dirname] : $[dirnames $[if $[build_directory],$[DIRNAME]],$[DEPEND_DIRS]] + cd ./$[PATH]; $(MAKE) all +#end dirname + +#formap dirname subdirs +test-$[dirname] : + cd ./$[PATH]; $(MAKE) test +#end dirname + +#formap dirname subdirs +clean-$[dirname] : + cd ./$[PATH]; $(MAKE) clean +#end dirname + +#formap dirname subdirs +cleanall-$[dirname] : + cd ./$[PATH]; $(MAKE) cleanall +#end dirname + +#formap dirname subdirs +install-$[dirname] : $[patsubst %,install-%,$[dirnames $[if $[build_directory],$[DIRNAME]],$[DEPEND_DIRS]]] + cd ./$[PATH]; $(MAKE) install +#end dirname + +#formap dirname subdirs +uninstall-$[dirname] : + cd ./$[PATH]; $(MAKE) uninstall +#end dirname + +#if $[ne $[CONFIG_HEADER],] +$[install_headers_dir] : + @test -d $[install_headers_dir] || echo mkdir -p $[install_headers_dir] + @test -d $[install_headers_dir] || mkdir -p $[install_headers_dir] + +$[install_headers_dir]/$[CONFIG_HEADER] : $[CONFIG_HEADER] +#define local $[CONFIG_HEADER] +#define dest $[install_headers_dir] + $[INSTALL] +#endif + +#end Makefile + +// If there is a file called LocalSetup.pp in the package's top +// directory, then invoke that. It might contain some further setup +// instructions. +#sinclude $[TOPDIRPREFIX]LocalSetup.msvc.pp +#sinclude $[TOPDIRPREFIX]LocalSetup.pp + +////////////////////////////////////////////////////////////////////// +#endif // DIR_TYPE diff --git a/dtool/src/egg-build/Makefile.findlatest b/dtool/src/egg-build/Makefile.findlatest deleted file mode 100644 index dd572c8936..0000000000 --- a/dtool/src/egg-build/Makefile.findlatest +++ /dev/null @@ -1,67 +0,0 @@ -#### Makefile for binaries. Any fields commented out are optional. -#### Generated automatically by ppremake 0.50 from Sources.pp. -################################# DO NOT EDIT ########################### - -#### Target's name: -TARGET = findlatest - -# Standard .o file conversion information. - -#### Lex files -LFILES = -LEX = flex -LFLAGS = -olex.yy.c -LEXTENSION = yy.cxx -# LSUBST = - -#### Yacc files -YFILES = -YACC = bison -YFLAGS = -y -d -YEXTENSION = tab.cxx -# YSUBST = - -#### C files -CFILES = -CFLAGS = - -#### C++ files -C++FILES = findlatest.cxx -C++FLAGS = - -#### Additional search directories for C/C++ header files: -IPATH = \ - -I/usr/local/mozilla/dist/Linux2.2.10_x86_PTH_DBG.OBJ/include \ - -I/usr/local/mozilla/dist/Linux2.2.12_x86_PTH_DBG.OBJ/include \ - -I/usr/local/include/python1.6 - -#### Location to put .o files: -# ODIR = - -#### Source file dependencies (unnecessary with clearmake) -# foo.c: foo.h - -#### Other files and lib. Include $(ODIR) in any .o names. -# OFILES = -WHEN_NO_DEFER_LIBS = -ldtoolbase -WHEN_DEFER_LIBS = -ldtool -LIBS = -SYSLIBS = -lnspr3 - -#### Additional search directories for lib: -LPATH = - -#### Other linker flags. -# LDFLAGS = - -#### Pull in standard .o make variables -include $(DTOOL)/include/Makefile.o.vars - -#### The .o action is here. -include $(DTOOL)/include/Makefile.o.rules - -#### Pull in standard binary make variables. -include $(DTOOL)/include/Makefile.bin.vars - -#### The bin action is here. -include $(DTOOL)/include/Makefile.bin.rules diff --git a/dtool/src/egg-build/Sources.pp b/dtool/src/egg-build/Sources.pp index f0b7ce6023..60fac32a3e 100644 --- a/dtool/src/egg-build/Sources.pp +++ b/dtool/src/egg-build/Sources.pp @@ -1,6 +1,6 @@ #define INSTALL_HEADERS \ Makefile.a2egg-static.rules Makefile.a2egg.rules \ - Makefile.char-egg.rules Makefile.findlatest Makefile.flt-egg.rules \ + Makefile.char-egg.rules Makefile.flt-egg.rules \ Makefile.inst-egg.vars Makefile.soft2egg.rules \ Makefile.source-egg.rules Makefile.textures.rules