diff options
310 files changed, 56715 insertions, 0 deletions
diff --git a/ACE/MPC/ChangeLog b/ACE/MPC/ChangeLog new file mode 100644 index 00000000000..9fd9d1b0726 --- /dev/null +++ b/ACE/MPC/ChangeLog @@ -0,0 +1,1120 @@ +Wed Jan 27 11:11:14 UTC 2010 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/ndds_ts_defaults.mpb: + Removed -enableEscapeChar as default argument, it is not supported with the + 4.4 release we have on emulab + +Tue Jan 26 12:00:14 UTC 2010 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/ndds_ts_defaults.mpb: + Added -enableEscapeChar as default argument + +Mon Jan 25 18:55:14 UTC 2010 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/ndds_ts_defaults.mpb: + Use the new <%bat%>, on windows this is a batch file, not an + executable + +Mon Jan 25 18:46:30 UTC 2010 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * docs/USAGE: + * docs/html/MakeProjectCreator.html: + * modules/ProjectCreator.pm: + + Added additional psuedo template variables (bat, cmd and exe) and + an optional environment variable to force Windows compatible + commands to be used in psuedo template variables. See the + documentation for more on this. + + * templates/make.mpd: + * templates/makedll.mpt: + + Modified this template and template input file to use a C compiler + on files that have a .c extension instead of always using the C++ + compiler. + +Sat Jan 23 18:32:14 UTC 2010 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/ndds_ts_defaults.mpb: + Commented out the dependent setting, with the vc and nmake + project types, MPC adds .exe as default extension, but this + script is a .bat file on windows. See bugzilla 3816 for some + more details. + +Thu Jan 21 12:52:48 UTC 2010 Chad Elliott <elliott_c@ociweb.com> + + * modules/Depgen/MakeDependencyWriter.pm: + + Move checks to the file level status. + + * modules/TemplateParser.pm: + + Fixed bugs with using a scope inside of a foreach. Also, fixed + bugs where 'flag_overrides' would sometimes end up as an array + and would be printed to the project as if it were a string. + Finally, a filename ending in a '.' will be considered to have an + extension of '.'. + + * templates/automake.mpd: + Modified to best handle dependencies with a space or $(...) in + them. Dependencies with spaces in them will be handled at the + template level and $(...) dependencies will be dropped. + + * templates/make.mpd: + + Modified to best handle dependencies with a space or $(...) in + them. If the 'gnumake' template variable is set, a GNU make + substitute function will be used. Otherwise, it will be done at + the template level for spaces and $(...) dependencies will be + dropped. + +Mon Jan 18 09:24:14 UTC 2010 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/ndds_ts_defaults.mpb: + Add TAO_ROOT and TAO_ROOT/tao to the default include paths to + get the same behaviour as with TAO_IDL + +Sun Jan 17 19:31:14 UTC 2010 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/loki.mpb: + Added base project for loki + +Thu Jan 14 17:23:14 UTC 2010 Chad Elliott <elliott_c@ociweb.com> + + * docs/templates/common.txt: + + Documented the language template variable. + + * modules/Depgen/MakeDependencyWriter.pm: + + Correctly deal with whitespace in file paths. Also, convert + <drive letter>: to a cygwin path on Windows (even if the user + isn't using cygwin). Otherwise, make will fail. + + * docs/templates/make.txt: + * templates/make.mpd: + + Use DEPLIBS to cause an executable to be relinked when a static + library on which the executable depends is updated. This will + only be used if the 'gnumake' template variable is set. + + * templates/makedll.mpt: + + Set the 'gnumake' template variable for the linux, nucleus and + cygwin platforms. + +Wed Jan 13 13:07:57 UTC 2010 Abdul Sowayan <sowayan@gmail.com> + + * config/ndds_ts_defaults.mpb: + + Use the CORBA Compatability Kit (CCK) by default. + +Thu Jan 7 16:29:06 UTC 2010 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + + Fixed a bug where template variable modifications made one project + would accidentally be retained for future projects. + + * modules/WorkspaceCreator.pm: + + Added a work-around in the create_command_line_string() method for + dollar signs in the command line arguments. On non-Windows + platforms, the argument with dollar signs will be wrapped in + single quotes. + +Tue Jan 5 14:33:11 UTC 2010 Chad Elliott <elliott_c@ociweb.com> + + * config/libpng.mpb: + * config/zlib.mpb: + + Put double quotes around settings that contain $(...) so that when + it is filled in with something that contains spaces, the value is + retained correctly. + + There are probably other base projects that could benefit from + this, but I only need these at the moment. + +Mon Jan 4 15:48:32 UTC 2010 James H. Hill <hillj at cs dot iupui dot edu> + + * config/iodbc.mpb: + * config/odbc.mpb: + * config/unixodbc.mpb: + + Rewrote the odbc.mpb project in terms of feature specifications + for UnixODBC and iODBC. + +Mon Jan 4 15:25:54 UTC 2010 Chad Elliott <elliott_c@ociweb.com> + + * config/qt.mpb: + + Added an include path for non-Windows project types. + + * modules/Creator.pm: + + Added a method to replace environment variables within a string. + This isn't new code, it's just removal of duplicated code. + + * modules/Depgen/DependencyEditor.pm: + + Don't process directories as if they were files. + + * modules/ProjectCreator.pm: + + Use environment variable replacement method from Creator. + + * modules/WorkspaceCreator.pm: + + Replace environment variables in non-scoped assignments as they + are encountered. This avoids errors in 'cmdline' assignments + within aggregated workspaces. + +Sat Jan 2 16:37:15 UTC 2010 James H. Hill <hillj at cs dot iupui dot edu> + + * config/odbc.mpb: + + Fixed comment in iODBC section. + +Mon Dec 21 18:55:57 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Fixed a bug where the conditional 'associate' tag (--) would be + used as an AM_CONDITIONAL in the generated configure.ac. + + * templates/makedll.mpt: + + The system directory variable for arm_elf_gcc should have been + $(SYSTEMDIR) not $(SYSTEM). + +Thu Dec 17 20:45:21 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug where adding a string containing $(...) would not have + double quotes which, when used with -expand_vars, could cause + invalid values if the variable value had a space in it. + + * templates/makedll.mpt: + + Changed the hard-coded /usr/local to use $(SYSTEM) in the + arm_elf_gcc compiler configuration. + +Tue Dec 1 15:05:46 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * docs/templates/common.txt: + * templates/vc7csharp.mpd: + * templates/vc7java.mpd: + * templates/vc7vb.mpd: + * templates/vc8csharp.mpd: + * templates/vc8java.mpd: + * templates/vc8vb.mpd: + + Allow the setting of the "DelaySign" value through a template + variable. + +Mon Nov 30 17:17:30 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * modules/Depgen/NMakeObjectGenerator.pm: + + Moved a comment. + + * templates/make.mpd: + + If the 'targetoutdir' or 'obj_dir' template variables are set, we + need to set the VDIR environment variable when calling depgen.pl + so that the generated dependencies have the right directory. + +Thu Nov 26 08:57:00 UTC 2009 Simon Massey <sma@prismtech.com> + + * modules/ProjectCreator.pm: + + Reverted allowing double-quote characters to be treated + in a project specific way for the. If quotes are to be + preserved within "idlflags" inside project mpc files, then + explicit <%quote%> must be used. Swapping natual quotes + broke other parts of MPC parsing. + +Tue Nov 17 15:05:06 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a problem with my last change. In some cases, a perl + variable wasn't set causing strange template variable results. + +Mon Nov 16 02:52:53 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * config/msgfmt.mpb: + + Added a base project to utilize the msgfmt executable. + + * modules/ProjectCreator.pm: + + Fixed a bug where adding to a scoped template variable nullified + the setting of the non-scoped template variable. + +Fri Nov 13 15:30:00 UTC 2009 Simon Massey <sma@prismtech.com> + + * modules/ProjectCreator.pm: + + update_template_variable() now processes values through + replace_parameters() and treats double-quote characters + in a project specific way. This allows the "tao_idlflags" + template variable to contain quoted roots, to allow for + spaces within the directory names. + Also convert_command_parameters() now also treats + double-quote characters in a project specific way for the + same reason, to allow " to be used within "idlflags" inside + project mpc files. + +Wed Nov 11 07:00:20 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/ndds_ts_defaults.mpb: + + Don't use visibility with ndds + +Mon Nov 9 15:22:20 UTC 2009 Mike Martinez <martinez_m@ociweb.com> + + * config/qt4_core.mpb: + + Added QT4_INCDIR to allow user to specify include directory + which is not relative to QTDIR (such as distributions that + place qt in /usr/include/qt4). + + * config/qt4_gui.mpb: + + Added QRC resource compiler command handling. + Added 'ui_' prefix to output filename of UI compiler to match + the behavior of 'qmake'. + +Fri Nov 6 03:39:51 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * config/mpich.mpb: + + Added an include path and remove an unnecessary library (for + non-windows project types). + +Thu Nov 5 19:39:35 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + * modules/XMLProjectBase.pm: + + Fixed the 'equote' pseudo template variable. It wasn't actually + escaped before. Now it is. + +Mon Nov 2 13:35:00 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Fixed a bug where an MPC file used in more than one aggregated + workspace wouldn't be ignored. + +Thu Oct 29 22:55:05 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * docs/html/MakeProjectCreator.html: + * modules/ProjectCreator.pm: + + Added the current language as a property. So, prop:cplusplus, for + example, can be used within a 'specific' scope. + + * docs/USAGE: + * modules/Options.pm: + + Minor change. Separated languages using commas in usage. + +Wed Oct 28 16:00:03 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * templates/make.mpd: + + If a custom 'dependent' setting contains a double quote, then we + must make a fake rule that corresponds to it. Otherwise, make + doesn't know how to deal with it. + +Fri Oct 23 09:49:30 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/ndds_ts_defaults.mpb: + Wrap the command with quotes because NDDSHOME could contain spaces + +Wed Oct 21 19:29:58 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * docs/templates/make.txt: + * templates/make.mpd: + + Modified to allow the user to override the 'touch' command via + -value_template. For example, if you're using GNU make on Windows + you may want to replace 'touch' with 'copy nul' (e.g, mwc.pl + -value_template "touch=copy nul"). + + * templates/vc8.mpd: + + Replaced spaces with tabs so that the generated project is more + like ones created by Visual Studio. + +Tue Oct 20 06:31:30 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/ndds_ts_defaults.mpb: + Don't wrap the command with quotes, that breaks on linux + +Mon Oct 19 12:05:30 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/ndds_ts_defaults.mpb: + Wrap the command with quotes + +Fri Oct 16 17:42:30 UTC 2009 Steven Stallion <stallions@ociweb.com> + + * templates/vc7.mpd: + * templates/vc8.mpd: + + Reverted changes (r1646): + Mon Oct 5 11:38:03 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + Commit broke OpenDDS builds on Windows platforms. Custom commands + should not be wrapped in double quotes; some custom commands use + compound commands (i.e. dcps_ts.pl). + + * config/udm.mpb: + * config/wix.mpb: + + Reverted changes (r1649): + Tue Oct 13 13:38:48 UTC 2009 Sumant Tambe <sutambe@nospam> + + No longer neccessary. + +Fri Oct 16 02:25:30 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Reverted my change from Tue Sep 1 12:58:30 UTC 2009 and modified + the get_custom_value() method to not add >> files when gendir is + set to something other than '.'. Thanks to Steve Stallion for + tracking this down. + +Tue Oct 13 13:38:48 UTC 2009 Sumant Tambe <sutambe@nospam> + + * config/udm.mpb: + * config/wix.mpb: + + . Removed quotes because they are no longer necessary. Quotes are + generated automatically as per Johnny's changes on Oct 5th. + +Tue Oct 6 09:04:03 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/ndds_ts_defaults.mpb: + This base project requires ndds + +Mon Oct 5 11:38:03 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc7.mpd: + * templates/vc8.mpd: + Generate quotes around a custom command, the tool we execute could + be in a path with a space in it + +Fri Oct 2 20:31:03 UTC 2009 Steven Stallion <stallions@ociweb.com> + + * config/global.features: + + Updated support for erlang. + +Mon Sep 28 15:18:36 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * config/global.features: + * config/libpng.mpb: + + Added support for libpng. + + * templates/makedll.mpt: + + Added support for gcc on Nucleus OS. + +Thu Sep 24 12:38:20 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc8platforms.mpt: + Added Beckhoff_HMI_600 (x86) + +Tue Sep 22 21:12:20 UTC 2009 Sumant Tambe <sutambe@nospam> + + * config/udm.mpb: + + Added paths for GME 7 and GME 9. + +Thu Sep 17 13:52:10 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * config/pcre.mpb: + + Only add the $(PCRE_VERSION) variable to the library name when not + using Microsoft products. Since the windows version of pcre + doesn't have a version number, the variable is always empty and + Visual Studio complains. + +Wed Sep 9 21:48:19 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * docs/html/MakeProjectCreator.html: + * modules/ProjectCreator.pm: + + Added a new psuedo variable, 'prj_type', which holds the project + type as specified by the -type command line option. + + * config/wix.mpb: + + Modified to use the new 'prj_type' pseudo variable. + + * modules/WorkspaceCreator.pm: + + Changed the duplicate project through workspace aggregation from a + warning to information. + +Tue Sep 8 04:16:19 UTC 2009 Sumant Tambe <sutambe@nospam> + + * config/udm.mpb: + * config/wix.mpb: + + Added support for VC9 and UDM version 3.2.1. + +Tue Sep 8 00:48:45 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * modules/Driver.pm: + + When the -gfeature_file option is used, turn the file path into a + full path if it is relative. This is necessary for when the + -recurse option is used and a full path isn't provided to the + feature file. + + * modules/ProjectCreator.pm: + + When setting up the 'input_ext' and 'output_ext' pseudo template + variables, set them to an empty string if the input and output + files do not contain an extension. + +Thu Sep 3 19:15:49 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * docs/html/MakeProjectCreator.html: + + Corrected the documentation for the 'remove_from' template + function. + + * modules/FeatureParser.pm: + + Sort the feature names as they come out for reproducibility. + + * modules/Options.pm: + + Fixed a bug where an ending /. would not be removed from a + relative path on Windows. + + * modules/TemplateParser.pm: + + Added missing 'lc' related functions to have a symmetry with 'uc'. + +Thu Sep 3 12:57:41 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * config/default.rel: + + Added a comment about comma separating the columns. + + * docs/html/MakeProjectCreator.html: + + Added more info about the 'scope' template function. + + * modules/Options.pm: + + Fixed a bug where the valid languages wouldn't be printed in the + usage. + + * modules/TemplateParser.pm: + + Added a comment about what we're checking and why after + successfully parsing the template. + + * modules/ProjectCreator.pm: + * modules/WorkspaceCreator.pm: + + Changed to pass an array reference to the source listing callback + instead of passing an array. + + * templates/make.mpd: + + Added slightly better support for multiple platforms. It's still + not fully functional though. + +Tue Sep 1 12:58:30 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Removed code that added output files (added via the '>>' + construct) when accessing output files from the template. The + code was redundant and when gendir was something other than '.', + it would cause duplicate files to be added when the template was + generating the output file. + +Mon Aug 31 16:41:00 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * PROBLEM-REPORT-FORM: + + Updated URLs. + + * modules/BCB2007ProjectCreator.pm: + * modules/BCB2007WorkspaceCreator.pm: + * modules/ConfigParser.pm: + + Corrected comments. + + * modules/ProjectCreator.pm: + + Alphabetized the keywords (which makes it easier when updating + documentation). Updated comments and added a minor performance + enhancment. + + * modules/TemplateParser.pm: + + Fixed a bug where 'features' used in a template would get confused + with template scopes. + + * modules/WB26ProjectCreator.pm: + + If the user overrides the template, still provide a valid project + file name in the project_file_name() method. + + * modules/WorkspaceCreator.pm: + + Fixed a bug where duplicate mpc files added by aggregated + workspaces would not be correctly ignored. + +Tue Aug 25 12:22:59 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * config/qt4_core.mpb: + * config/qt4_designer.mpb: + * config/qt4_designercomponents.mpb: + * config/qt4_gui.mpb: + * config/qt4_network.mpb: + * config/qt4_opengl.mpb: + * config/qt4_qt3support.mpb: + * config/qt4_sql.mpb: + * config/qt4_svg.mpb: + * config/qt4_test.mpb: + * config/qt4_xml.mpb: + + Committing changes from Ciju John. Removed the hard-coded 4 in + the library names and switch from using $(QTDEBUG) to $(QT_CFG). + +Mon Aug 24 13:10:16 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * docs/USAGE: + * modules/Options.pm: + + Changed VAR to VAL. + + * docs/html/MakeProjectCreator.html: + + Added missing <a name>'s. + + * modules/AutomakeWorkspaceCreator.pm: + + Added associated names to the list of AM_CONDITIONAL. + + * modules/Creator.pm: + + Fixed a bug where $(...) used in an exclude block would cause ./ + to be prepended to the value. Also, only remove unmatched $(...) + variables after attempting with the secondary relative values. + + * modules/WorkspaceCreator.pm: + + Fixed a bug where $PWD used in a 'cmdline' setting within an + exclude block would not be evaluated correctly. + +Wed Aug 19 14:28:52 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * docs/html/MakeProjectCreator.html: + * modules/ProjectCreator.pm: + + Added a 'static' property that can be used within the 'specifc' + and 'conditional' clauses. The 'static' property will only be set + if the -static option was used on the command line. + +Wed Aug 19 13:49:34 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * modules/VC8WorkspaceCreator.pm: + + We should also avoid adding references to 'custom_only' projects. + These also cause warnings in Visual Studio. + +Wed Aug 19 02:11:03 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * create_base.pl: + + Added a description of what the script does to the usage. + + * modules/Driver.pm: + + Use DirectoryManager::onVMS() instead of comparing $^O to 'VMS'. + + * modules/Options.pm: + + Removed a redundant exit() call. + + * modules/ProjectCreator.pm: + + Added comments to the get_special_value method. + + * modules/NMakeWorkspaceCreator.pm: + * modules/TemplateParser.pm: + * modules/VC7WorkspaceCreator.pm: + + Added the 'managed' setting to the saved project info structure. + + * modules/VC8WorkspaceCreator.pm: + + Used the new 'managed' setting in the saved project info structure + to avoid adding a reference to a non-managed c++ library. + + * templates/vc8.mpd: + + Removed the use of <%language%> in the MPC ADD DEPENDENCIES + comment. It was not necessary since we have that information + available from the saved project info structure. + + * modules/WorkspaceCreator.pm: + + Removed the redundant setting of the 'info' data member. + + * registry.pl: + + Added vc10 and wix types. + + * vs_postclean.pl: + + Changed spaces in a regular expression to \s*. + +Fri Aug 14 18:46:11 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * config/pcre.mpb: + * config/pcreposix.mpb: + + Added the ability to specify a version for the pcre libraries. + + * config/udm.mpb: + + Fixed a typo. + + * devtools/document_template.pl: + + Fixed a bug where mixed case template variables used in a foreach + would not be handled correctly. + + * docs/templates/vc7.txt: + + Documented the DisableSpecificWarnings template variable. + + * rpm/MPC.spec: + * rpm/buildrpm.sh: + + Made packager dynamic based on who's actually creating the RPM. + +Fri Aug 14 12:43:22 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/udm.mpb + Use DisableSpecificWarnings + +Fri Aug 14 12:17:36 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * templates/em3.mpd: + * templates/nmake.mpd: + * templates/vc6.mpd: + * templates/vc7.mpd: + + Support the DisableSpecificWarnings template variable as it is in + vc8 and higher. Since support isn't built directly into the + project format, we use the /wd command line option for each + warning number supplied. + +Fri Aug 14 02:20:11 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * rpm: + * rpm/MPC.spec: + * rpm/buildrpm.sh: + + Added the ability to create an RPM file out of the MPC source. + +Wed Aug 12 22:29:21 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * modules/BMakeWorkspaceCreator.pm: + * modules/WixWorkspaceCreator.pm: + + Cleaned up code. + + * modules/ProjectCreator.pm: + + Reverted one of the performance enhancements from yesterday. It + made a faulty assumption that caused issue with the DDS builds. + + * modules/WB26WorkspaceCreator.pm: + * modules/WorkspaceCreator.pm: + + Added a 'requires_make_coexistence' method to always use + -make_coexistence without having to pass the option on the command + line. + +Wed Aug 12 17:56:20 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/gacutil.mpb: + Use prop:microsoft + +Wed Aug 12 12:48:20 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * docs/html/MakeProjectCreator.html: + Fixed broken link + +Tue Aug 11 16:08:20 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * docs/html/MakeProjectCreator.html: + + Added an Id tag. + + * modules/ProjectCreator.pm: + + Made minor performance enhancements. + + * modules/WB26WorkspaceCreator.pm: + + Added code to only put top-level dependencies in the project + files. This build tool doesn't handle indirectly duplicated + project dependencies very well. + +Mon Aug 10 21:40:58 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Return immediately from generate_default_target_names() if the + project has custom_only set to 1. We need not waste time setting + the sharedname, staticname or exename. + + * modules/WinVersionTranslator.pm: + + Cleaned up and commented the code. + +Mon Aug 10 17:55:53 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * config/global.features: + + Added disabled features that were missing. + + * devtools/document_template.pl: + + Updated the usage and added automatic language selection for java. + + * docs/README: + * docs/USAGE: + + Updated to reflect the current state of MPC. + + * docs/html: + * docs/html/MakeProjectCreator.css: + * docs/html/MakeProjectCreator.html: + + Converted the Frame Maker source into HTML and updated to reflect + the current state of MPC. + + * docs/templates/wix.txt: + + Added incomplete documentation for the WIX template variables. + + * modules/GHSProjectCreator.pm: + + Corrected poorly written code. + + * modules/Options.pm: + + Fixed a bug in the -relative_file portion of the usage output. + + * modules/ProjectCreator.pm: + + Added the ability to use the 'temporary' pseudo template variable + outside of a custom_type context. It will contain a different + value than 'temporary' referenced from within the custom_type + context. + + * modules/WixProjectCreator.pm: + + Changed to use 'exeout' instead of the deprecated 'install' + project variable name. + + * docs/MakeProjectCreator.pdf: + * docs/fm: + * docs/fm/MakeProjectCreator.fm: + * docs/fm/images: + * docs/fm/images/OCILOGO_bw_book.eps: + * docs/fm/images/mpc.fig: + * docs/fm/images/mpc.gif: + * docs/fm/images/mpc_mtiff.eps: + * docs/fm/images/mwc.fig: + * docs/fm/images/mwc.gif: + * docs/fm/images/mwc_mtiff.eps: + * docs/html/MakeProjectCreator.fm: + + Removed these files. + +Fri Aug 7 09:23:58 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc8platforms.mpt: + Removed release_link_options for the SuperSonic SDK, the options + are not ok + +Thu Aug 6 15:11:07 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * devtools/document_template.pl: + * modules/CCProjectCreator.pm: + * modules/Creator.pm: + * modules/MakeProjectCreator.pm: + * modules/MakeWorkspaceCreator.pm: + * modules/Options.pm: + * modules/ProjectCreator.pm: + * modules/VC6ProjectCreator.pm: + * modules/VC7ProjectCreator.pm: + * modules/VC7WorkspaceCreator.pm: + * modules/VC8ProjectCreator.pm: + * modules/VC8WorkspaceCreator.pm: + * modules/WB26ProjectCreator.pm: + + Replaced all language related strings with constants stored in the + Creator base class. + + Also, fixed a bug where a project that contained source files or + resource files for a language not supported by the project type + would be created. Now, the project will be skipped if the project + type does not support the language setting. + +Wed Aug 5 18:41:55 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * MPC.ico: + + Updated to use the new MPC logo. + + * docs/README: + * modules/ProjectCreator.pm: + + Modified 'conditional' to use properties like 'specific'. + + * modules/WixProjectCreator.pm: + + Inherit from XMLProjectBase and WinProjectBase. The output is xml + and this is a Windows specific project creator. + + * docs/templates/make.net.txt + * templates/make.net.mpd: + * templates/make.net.mpt: + + Updated to support icon files and resx files, the trace template + variable and to set the DESIGN and DEBUG constants in debug mode. + +Wed Aug 5 06:21:58 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc8.mpd: + Added release_link_options. This fixes bugzilla 3527, thank to + Chad Elliot for providing the patch + + * templates/vc8platforms.mpt: + Use release_link_options for the SuperSonic SDK + + * templates/vc8platforms.mpt: + No need to set charset anymore + + * docs/templates/vc8.txt: + Document new release_link_options + +Tue Aug 4 18:11:58 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + + Added a new template function, 'extensions', that can be used to + get a list of valid extensions based on the component name (e.g, + source_files, header_files, inline_files, etc.) + + * templates/em3.mpd: + * templates/vc6.mpd: + * templates/vc7.mpd: + * templates/vc8.mpd: + * templates/wb26wrproject.mpd: + + Use the 'extensions' function instead of hard-coded strings. + +Tue Aug 4 16:29:11 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + + Default the language to 'cplusplus' if it isn't provided during + construction. This ensures that language is always set and we + don't have to check it to make sure it's defined elsewhere. + + * modules/ProjectCreator.pm: + + Modified the behavior of dealing with resource files. The + behavior specific to C++ was being applied to all languages. + + * modules/TemplateParser.pm: + + Added implementations of various template functions. Some were + required for the bmake template change below. + + * modules/WixProjectCreator.pm: + + Removed unused code. + + * modules/WixWorkspaceCreator.pm: + + Fixed a the case of the WixProjectCreator name. + + * templates/bmake.mpd: + * templates/bmakedll.mpt: + * templates/bmakedllexe.mpt: + + Added the ability to build static projects without providing the + -static option to MPC. The static-only projects can still be + created with the -static option, but it is no longer necessary. + +Tue Aug 4 10:31:40 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/unicode.mpb: + Changed this to a feature + +Mon Aug 3 16:43:18 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * modules/Driver.pm: + * mpc.pl: + * mwc.pl: + + Added a pair of constants that will be used in determining which + type of creators to use (either workspace or project). + + * modules/ProjectCreator.pm: + + Removed the use of a hard-coded string and simplified some code. + +Fri Jul 24 09:29:31 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/nddslib.mpb: + Added requires += ndds. If you want to use RTI DDS you have to + add ndds=1 to your default.features file. This way we can add + dds4ccm support to CIAO without requiring all users to install + RTI DDS + +Fri Jul 3 03:25:31 UTC 2009 James H. Hill <hillj@dre.vanderbilt.edu> + + * templates/wix.mpd: + + Added support for setting the install location of a set of + files for a project using 'install_location'. This takes a + comma separated list of directories that represent the location + for installing the files. The following is a simple example: + + specific (wix) { + install_location = etc models + } + + The example above will install files for the given project + in etc/models directory under the root install directory. + +Thu Jul 2 06:37:36 UTC 2009 James H. Hill <hillj@dre.vanderbilt.edu> + + * templates/wix.mpd: + + Fixed bugs GME section of generated Wix files for vc8. + +Sun Jun 28 08:05:20 UTC 2009 James H. Hill <hillj@dre.vanderbilt.edu> + + * templates/wix.mpd: + + Added support for installing GME components using Wix. In order + to include GME components in the installer, you must define the + following properties in a *wix* scope: + + gme_install = [0 | 1]; default is 0 + gme_register = [HKLM | HKCU]; default is HKLM + gme_progid = <program id> + gme_uuid = <uuid> + gme_paradigms = <space separated list> + gme_has_icon = [0 | 1] + gme_description = <descrption of component> + gme_tooltip = <tooltip for component> + + The values for each of these properties can be found in + ComponentConfig.h + +Thu Jun 25 06:25:12 UTC 2009 James H. Hill <hillj@dre.vanderbilt.edu> + + * modules/WixProjectCreator.pm: + * templates/wix.mpd: + + Added support to creating a directory if there is no output + file specified in the project. + + Disabled skipping projects if there are no useful targets + defined. + + Added markers to the top and bottom of the component. The + name of the markers are: component_top and component_bottom. + +Thu Jun 25 00:39:12 UTC 2009 James H. Hill <hillj@dre.vanderbilt.edu> + + * modules/WixProjectCreator.pm: + * modules/WixWorkspaceCreator.pm: + + Forgot to change the case on the pacakge names. + +Wed Jun 24 21:19:36 UTC 2009 James H. Hill <hillj@dre.vanderbilt.edu> + + * config/wix.mpb: + * config/wix_ui.mpb: + * config/wix_xml.mpb: + + Base projects for building Wix files. + +Wed Jun 24 21:14:20 UTC 2009 James H. Hill <hillj@dre.vanderbilt.edu> + + * modules/WixProjectCreator.pm: + * modules/WixWorkspaceCreator.pm: + * templates/wix.mpd: + * templates/wix.mpt: + + . First version of the Wix module that is used in conjuction + with the Wix toolset that creates .msi files. This project + type will generate the include files (.wxi) that can be included + in a .wxs configuration file. + + Right now, the installer only can generate files for + shared libraries. The next update will include support for + executables. + +Wed Jun 17 18:37:31 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc8platforms.mpt: + Explicitly set charset to get CharacterSet set when using + multiple platforms + +Tue May 26 19:01:53 UTC 2009 Adam Mitz <mitza@ociweb.com> + + * modules/ProjectCreator.pm: + + Changed hard-coded 'resource_files' to a call to get_resource_tag, + which is a new method on ProjectCreator. get_resource_tag + determines the name of 'resource_files' for the current language + based on the %language hash (for C# and VB this is 'resx_files'). + +Mon May 25 11:03:31 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc8platforms.mpt: + Added a new target and corrected some wince versions + +Sun May 24 18:46:31 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * MPC version 3.7.0 released. + +Local Variables: +mode: change-log +add-log-time-format: (lambda () (progn (setq tz (getenv TZ)) (set-time-zone-rule UTC) (setq time (format-time-string %a %b %e %H:%M:%S %Z %Y (current-time))) (set-time-zone-rule tz) time)) +indent-tabs-mode: nil +End: diff --git a/ACE/MPC/MPC.ico b/ACE/MPC/MPC.ico Binary files differnew file mode 100644 index 00000000000..2d56840fd1c --- /dev/null +++ b/ACE/MPC/MPC.ico diff --git a/ACE/MPC/PROBLEM-REPORT-FORM b/ACE/MPC/PROBLEM-REPORT-FORM new file mode 100644 index 00000000000..34d2c75a9e8 --- /dev/null +++ b/ACE/MPC/PROBLEM-REPORT-FORM @@ -0,0 +1,30 @@ +Documentation for MPC can be found at the following location. + + http://downloads.ociweb.com/MPC/docs/html/MakeProjectCreator.html + +Please consult the documentation to ensure that you are using MPC correctly. + +If you are still having a problem getting MPC to do what you want, please +consult the FAQ before sending a support request. + + http://www.ociweb.com/products/mpc/mpc-faq + +When requesting MPC support please provide the following items: + + MPC version (using mwc.pl -version): + + Perl version (using perl --version): + + Operating System and Shell: + + ACE or TAO version (if using either): + + The contents of default.features (if any): + + MPC command line options: + + Problem description (please be as detailed as possible): + +Finally, send support requests to support@ociweb.com. You may send +questions to the author (elliott_c@ociweb.com), but a response is not +guaranteed. diff --git a/ACE/MPC/clone_build_tree.pl b/ACE/MPC/clone_build_tree.pl new file mode 100755 index 00000000000..a374ed5f10b --- /dev/null +++ b/ACE/MPC/clone_build_tree.pl @@ -0,0 +1,542 @@ +#! /usr/bin/perl +eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' + & eval 'exec perl -w -S $0 $argv:q' + if 0; + +# ****************************************************************** +# Author: Chad Elliott +# Date: 4/8/2004 +# $Id$ +# Description: Clone a build tree into an alternate location. +# This script is a rewrite of create_ace_build.pl and +# does not restrict the user to place the build +# in any particular location or that it be used with +# ACE_wrappers. Some of the functions were barrowed +# from create_ace_build.pl, but were modified quite a +# bit. +# ****************************************************************** + +# ****************************************************************** +# Pragma Section +# ****************************************************************** + +use strict; +use Cwd; +use FileHandle; +use File::Copy; +use File::Find; +use File::Path; +use File::stat; +use File::Basename; + +# ****************************************************************** +# Data Section +# ****************************************************************** + +my $exclude; +my @foundFiles; +my $verbose = 0; +my $lbuildf = 0; +my $version = '1.16'; + +eval 'symlink("", "");'; +my $hasSymlink = ($@ eq ''); + +# ****************************************************************** +# Subroutine Section +# ****************************************************************** + +sub findCallback { + my $matches = !(/^CVS\z/s && ($File::Find::prune = 1) || + /^\.svn\z/s && ($File::Find::prune = 1) || + defined $exclude && + /^$exclude\z/s && ($File::Find::prune = 1) || + /^\.cvsignore\z/s && ($File::Find::prune = 1) || + /^build\z/s && ($File::Find::prune = 1) || + /^\..*obj\z/s && ($File::Find::prune = 1) || + /^Templates\.DB\z/s && ($File::Find::prune = 1) || + /^Debug\z/s && ($File::Find::prune = 1) || + /^Release\z/s && ($File::Find::prune = 1) || + /^Static_Debug\z/s && ($File::Find::prune = 1) || + /^Static_Release\z/s && ($File::Find::prune = 1) + ); + + if ($matches) { + $matches &&= (! -l $_ && + ! /^core\z/s && + ! /^.*\.rej\z/s && + ! /^.*\.state\z/s && + ! /^.*\.so\z/s && + ! /^.*\.[oa]\z/s && + ! /^.*\.dll\z/s && + ! /^.*\.lib\z/s && + ! /^.*\.obj\z/s && + ! /^.*~\z/s && + ! /^\.\z/s && + ! /^\.#.*\z/s && + ! /^.*\.ncb\z/s && + ! /^.*\.opt\z/s && + ! /^.*\.bak\z/s && + ! /^.*\.suo\z/s && + ! /^.*\.ilk\z/s && + ! /^.*\.pdb\z/s && + ! /^.*\.pch\z/s && + ! /^.*\.log\z/s && + ! ( -f $_ && /^.*\.d\z/s ) + ); + + if ($matches) { + if (!$lbuildf) { + $matches = (! /^.*\.dsp\z/s && + ! /^.*\.dsw\z/s && + ! /^.*\.vcproj\z/s && + ! /^.*\.sln\z/s && + ! /^Makefile.*\z/s && + ! /^GNUmakefile.*\z/s && + ! /^.*\.am\z/s && + ! /^\.depend\..*\z/s && + ! /^.*\.vcn\z/s && + ! /^.*\.vcp\z/s && + ! /^.*\.vcw\z/s && + ! /^.*\.vpj\z/s && + ! /^.*\.vpw\z/s && + ! /^.*\.cbx\z/s && + ! /^.*\.bpgr\z/s && + ! /^.*\.bmak\z/s && + ! /^.*\.bmake\z/s && + ! /^.*\.mak\z/s && + ! /^.*\.nmake\z/s && + ! /^.*\.bld\z/s && + ! /^.*\.icc\z/s && + ! /^.*\.icp\z/s && + ! /^.*\.project\z/s && + ! /^.*\.wrproject\z/s && + ! /^.*\.wrmakefile\z/s && + ! /^.*\.vxtest\z/s + ); + } + + if ($matches) { + ## Remove the beginning dot slash as we save the file + push(@foundFiles, $File::Find::name); + $foundFiles[$#foundFiles] =~ s/^\.[\\\/]+//; + } + } + } +} + + +sub getFileList { + File::Find::find({wanted => \&findCallback}, '.'); + return \@foundFiles; +} + + +sub backupAndMoveModified { + my($realpath, $linkpath) = @_; + my $mltime = -M $linkpath; + my $mrtime = -M $realpath; + my $status = 1; + + ## -M returns the number of days since modification. Therefore, + ## a smaller time means that it has been modified more recently. + ## This is different than what stat() returns. + + ## If the hard linked file is newer than the original file, that means + ## the link has been broken by something and needs to be "fixed". We + ## will back up the original file and move the modified file into it's + ## place. + if ($mltime < $mrtime) { + $status = 0; + + ## Move the real file to a backup + unlink("$realpath.bak"); + if (rename($realpath, "$realpath.bak")) { + ## Move the linked file to the real file name + if (move($linkpath, $realpath)) { + $status = 1; + } + else { + ## The move failed, so we will attempt to put + ## the original file back. + unlink($realpath); + rename("$realpath.bak", $realpath); + } + } + } + elsif ($mltime != $mrtime || -s $linkpath != -s $realpath) { + ## The two files are different in some way, we need to make a backup + ## so that we don't cause a loss of data/work. + $status = 0; + } + + if (!$status) { + ## We were not able to properly deal with this file. We will + ## attempt to preserve the modified file. + unlink("$linkpath.bak"); + rename($linkpath, "$linkpath.bak"); + } +} + + +sub hardlink { + my($realpath, $linkpath) = @_; + + if ($^O eq 'MSWin32' && ! -e $realpath) { + ## If the real file "doesn't exist", then we need to + ## look up the short file name. + my $short = Win32::GetShortPathName($realpath); + + ## If we were able to find the short file name, then we need to + ## try again. + if (defined $short) { + $realpath = $short; + } + else { + ## This should never happen, but there appears to be a bug + ## with the underlying Win32 APIs on Windows Server 2003. + ## Long paths will cause an error which perl will ignore. + ## Unicode versions of the APIs seem to work fine. + ## To experiment try Win32 _fullpath() and CreateHardLink with + ## long paths. + print "WARNING: Skipping $realpath.\n"; + return 1; + } + } + + return link($realpath, $linkpath); +} + + +sub symlinkFiles { + my($files, $fullbuild, $dmode, $startdir, $absolute) = @_; + my $sdlength = length($startdir) + 1; + my $partial = ($absolute ? undef : + substr($fullbuild, $sdlength, + length($fullbuild) - $sdlength)); + + foreach my $file (@$files) { + my $fullpath = "$fullbuild/$file"; + if (-e $fullpath) { + ## We need to make sure that we're not attempting to mix hardlinks + ## and softlinks. + if (! -d $fullpath && ! -l $fullpath) { + my $stat = stat($fullpath); + if ($stat->nlink() > 1) { + print STDERR "ERROR: Attempting to mix softlinks ", + "with a hardlink build.\n", + "$fullpath has ", $stat->nlink(), " links.\n"; + return 1; + } + } + } + else { + if (-d $file) { + if ($verbose) { + print "Creating $fullpath\n"; + } + if (!mkpath($fullpath, 0, $dmode)) { + print STDERR "ERROR: Unable to create $fullpath\n"; + return 1; + } + } + else { + if ($absolute) { + if ($verbose) { + print "symlink $startdir/$file $fullpath\n"; + } + if (!symlink("$startdir/$file", $fullpath)) { + print STDERR "ERROR: Unable to symlink $fullpath\n"; + return 1; + } + } + else { + my $buildfile = "$partial/$file"; + my $slashcount = ($buildfile =~ tr/\///); + my $real = ($slashcount == 0 ? './' : ('../' x $slashcount)) . + $file; + + print "symlink $real $fullpath\n" if ($verbose); + if (!symlink($real, $fullpath)) { + print STDERR "ERROR: Unable to symlink $fullpath\n"; + return 1; + } + } + } + } + } + + ## Remove links that point to non-existant files. The subroutine is + ## now anonymous to avoid the "will not stay shared" warning for %dirs. + my %dirs; + File::Find::find({wanted => sub { + if (-l $_ && ! -e $_) { + unlink($_); + $dirs{$File::Find::dir} = 1; + if ($verbose) { + print "Removing $File::Find::dir/$_\n"; + } + } + } + }, $fullbuild); + foreach my $key (keys %dirs) { + rmdir($key); + } + return 0; +} + + +sub hardlinkFiles { + my($files, $fullbuild, $dmode, $startdir) = @_; + my @hardlinks; + + foreach my $file (@$files) { + my $fullpath = "$fullbuild/$file"; + if (-d $file) { + if (! -e $fullpath) { + if ($verbose) { + print "Creating $fullpath\n"; + } + if (!mkpath($fullpath, 0, $dmode)) { + print STDERR "ERROR: Unable to create $fullpath\n"; + return 1; + } + } + } + else { + if (-e $fullpath) { + ## We need to make sure that we're not attempting to mix hardlinks + ## and softlinks. + if (-l $fullpath) { + print STDERR "ERROR: Attempting to mix hardlinks ", + "with a softlink build.\n", + "$fullpath is a softlink.\n"; + return 1; + } + backupAndMoveModified($file, $fullpath); + } + if (! -e $fullpath) { + if ($verbose) { + print "hardlink $file $fullpath\n"; + } + if (!hardlink($file, $fullpath)) { + print STDERR "ERROR: Unable to link $fullpath\n"; + return 1; + } + } + + ## If we successfully linked the file or it already exists, + ## we need to keep track of it. + push(@hardlinks, $file); + } + } + + ## Remove links that point to non-existant files + my $lfh = new FileHandle(); + my $txt = "$fullbuild/clone_build_tree.links"; + if (open($lfh, $txt)) { + my %dirs; + while(<$lfh>) { + my $line = $_; + $line =~ s/\s+$//; + if (! -e $line) { + my $full = "$fullbuild/$line"; + unlink($full); + $dirs{dirname($full)} = 1; + print "Removing $full\n" if ($verbose); + } + } + close($lfh); + foreach my $key (keys %dirs) { + rmdir($key); + } + } + + ## Rewrite the link file. + unlink($txt); + if (open($lfh, ">$txt")) { + foreach my $file (@hardlinks) { + print $lfh "$file\n"; + } + close($lfh); + } + + return 0; +} + + +sub linkFiles { + my($absolute, $dmode, $hardlink, $builddir, $builds) = @_; + my $status = 0; + my $starttime = time(); + my $startdir = getcwd(); + + ## Ensure that the build directory exists and is writable + mkpath($builddir, 0, $dmode); + if (! -d $builddir || ! -w $builddir) { + print STDERR "ERROR: Unable to create or write to $builddir\n"; + return 1; + } + + ## Search for the clonable files + print "Searching $startdir for files...\n"; + my $files = getFileList(); + my $findtime = time() - $starttime; + print 'Found ', scalar(@$files), ' files and directories in ', + $findtime, ' second', ($findtime == 1 ? '' : 's'), ".\n"; + + foreach my $build (@$builds) { + my $fullbuild = "$builddir/$build"; + + ## Create all of the links for this build + if (-d $fullbuild) { + print "Updating $fullbuild\n"; + } + else { + print "Creating $fullbuild\n"; + mkpath($fullbuild, 0, $dmode); + } + + if ($hardlink) { + $status += hardlinkFiles($files, $fullbuild, $dmode, $startdir); + } + else { + $status += symlinkFiles($files, $fullbuild, + $dmode, $startdir, $absolute); + } + print "Finished in $fullbuild\n"; + } + + print 'Total time: ', time() - $starttime, " seconds.\n" if ($status == 0); + + return $status; +} + + +sub usageAndExit { + my $msg = shift; + + print STDERR "$msg\n" if (defined $msg); + + my $base = basename($0); + my $spc = ' ' x (length($base) + 8); + + print STDERR "$base v$version\n\n", + "Create a tree identical in layout to the current directory\n", + "with the use of ", ($hasSymlink ? "symbolic links or " : ''), + "hard links.\n\n", + "Usage: $base [-b <builddir>] [-d <dmode>] [-f] ", + ($hasSymlink ? "[-a] [-l] " : ''), + "[-v]\n", + $spc, "[build names...]\n\n", + ($hasSymlink ? + "-a Use absolute paths when creating soft links.\n" . + "-l Use hard links instead of soft links.\n" : ''), + "-b Set the build directory. It defaults to the ", + "<current directory>/build.\n", + "-d Set the directory permissions mode.\n", + "-f Link build files (Makefile, .dsw, .sln, .etc).\n", + "-s Set the start directory. It defaults to the ", + "<current directory>.\n", + "-v Enable verbose mode.\n"; + + exit(0); +} + + +# ****************************************************************** +# Main Section +# ****************************************************************** + +my $dmode = 0777; +my $absolute = 0; +my $hardlink = !$hasSymlink; +my $builddir; +my @builds; +my $startdir; + +for(my $i = 0; $i <= $#ARGV; ++$i) { + if ($ARGV[$i] eq '-a') { + $absolute = 1; + } + elsif ($ARGV[$i] eq '-b') { + ++$i; + if (defined $ARGV[$i]) { + $builddir = $ARGV[$i]; + + ## Convert backslashes to slashes + $builddir =~ s/\\/\//g; + + ## Remove trailing slashes + $builddir =~ s/\/+$//; + + ## Remove duplicate slashes + while($builddir =~ s/\/\//\//g) { + } + } + else { + usageAndExit('-b requires an argument'); + } + } + elsif ($ARGV[$i] eq '-d') { + ++$i; + if (defined $ARGV[$i]) { + $dmode = $ARGV[$i]; + } + else { + usageAndExit('-d requires an argument'); + } + } + elsif ($ARGV[$i] eq '-f') { + $lbuildf = 1; + } + elsif ($ARGV[$i] eq '-l') { + $hardlink = 1; + } + elsif ($ARGV[$i] eq '-v') { + $verbose = 1; + } + elsif ($ARGV[$i] eq '-s') { + ++$i; + if (defined $ARGV[$i]) { + $startdir = $ARGV[$i]; + } + else { + usageAndExit('-s requires an argument'); + } + } + elsif ($ARGV[$i] =~ /^-/) { + usageAndExit('Unknown option: ' . $ARGV[$i]); + } + else { + push(@builds, $ARGV[$i]); + } +} + +if (defined $startdir && !chdir($startdir)) { + print "ERROR: Unable to change directory to $startdir\n"; + exit(1); +} + +$builddir = getcwd() . '/build' if (!defined $builddir); + +if (index($builddir, getcwd()) == 0) { + $exclude = substr($builddir, length(getcwd()) + 1); + $exclude =~ s/([\+\-\\\$\[\]\(\)\.])/\\$1/g; +} +else { + $absolute = 1; +} + +if (!defined $builds[0]) { + my $cwd = getcwd(); + if (chdir($builddir)) { + @builds = glob('*'); + chdir($cwd); + } + else { + usageAndExit('There are no builds to update.'); + } +} + +exit(linkFiles($absolute, $dmode, $hardlink, $builddir, \@builds)); diff --git a/ACE/MPC/combine_dsw.pl b/ACE/MPC/combine_dsw.pl new file mode 100755 index 00000000000..f1c2f4b1c4c --- /dev/null +++ b/ACE/MPC/combine_dsw.pl @@ -0,0 +1,145 @@ +#! /usr/bin/perl +eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' + & eval 'exec perl -w -S $0 $argv:q' + if 0; + +# ****************************************************************** +# Author: Chad Elliott +# Date: 4/8/2004 +# $Id$ +# Description: Combined multiple dsw's into a single dsw +# ****************************************************************** + +# ****************************************************************** +# Pragma Section +# ****************************************************************** + +use strict; +use FileHandle; +use File::Basename; + +# ****************************************************************** +# Data Section +# ****************************************************************** + +my $version = '1.3'; + +# ****************************************************************** +# Subroutine Section +# ****************************************************************** + +sub usageAndExit { + my $str = shift; + print STDERR "$str\n" if (defined $str); + print STDERR "Combine DSW v$version\n", + "Usage: ", basename($0), + " [-u] <output file> <input files...>\n\n", + "-u Each input file will be removed after successful ", + "combination\n\n", + "NOTE: This script will work for vcw's too.\n\n", + "Combine multiple dsw's into a single dsw. You can use ", + "MPC to generate\n", + "dynamic projects and then generate static projects using ", + "the -static,\n", + "-name_modifier and -apply_project options together. You ", + "can then run this\n", + "script to combine the workspaces into one.\n"; + exit(0); +} + +# ****************************************************************** +# Main Section +# ****************************************************************** + +my $output; +my $unlink; +my @input; + +for(my $i = 0; $i <= $#ARGV; $i++) { + my $arg = $ARGV[$i]; + if ($arg =~ /^-/) { + if ($arg eq '-u') { + $unlink = 1; + } + else { + usageAndExit("Unknown option: $arg"); + } + } + else { + if (!defined $output) { + $output = $arg; + } + else { + push(@input, $arg); + } + } +} + +## Print the usage if there is no output file provided or there isn't at +## least two input files. +usageAndExit() if (!defined $output || + !defined $input[0] || !defined $input[1]); + +my $tmp = "$output.$$.tmp"; +my $oh = new FileHandle(); + +if (open($oh, ">$tmp")) { + my $msident; + for(my $i = 0; $i <= $#input; ++$i) { + ## We only want to take the global settings from the last input file. + my $input = $input[$i]; + my $global = ($i == $#input); + + ## Read in the input file and write out the parts that are common + ## between multiple workspace files (but only on the first input + ## file). After that, write out the project information from each + ## input file. + my $fh = new FileHandle(); + if (open($fh, $input)) { + my $in_global = 0; + while(<$fh>) { + if (/Microsoft\s+(Developer\s+Studio|eMbedded\s+Visual)/) { + ## We only want to print out the identifier from the first + ## input file. + if (!$msident) { + $msident = 1; + print $oh $_; + } + } + else { + if (/^Global:/) { + $in_global = 1; + } + elsif ($in_global && /^[#]{79,}/) { + $in_global = 0; + $_ = ''; + } + + ## Only print out the line if it's not part of the global + ## settings (unless this is the last input file). + print $oh $_ if (!$in_global || ($global && $in_global)); + } + } + close($fh); + } + else { + print STDERR "ERROR: Unable to open '$input' for reading\n"; + exit(2); + } + } + close($oh); + + ## If the user wants us to remove the input files after successfully + ## combining them, then do so here. + unlink(@input) if ($unlink); + + ## We have written the new workspace to a temporary file to allow an + ## input file to be the same as an output file. Once we're done, we + ## need to move it to it's correct output name. + unlink($output); + rename($tmp, $output); +} +else { + print STDERR "ERROR: Unable to open '$tmp' for writing\n"; + exit(1); +} diff --git a/ACE/MPC/config/bison.mpb b/ACE/MPC/config/bison.mpb new file mode 100644 index 00000000000..7fc4c776e8b --- /dev/null +++ b/ACE/MPC/config/bison.mpb @@ -0,0 +1,14 @@ +// $Id$ +project { + requires += bison + Define_Custom(BISON) { + automatic = 1 + command = bison + commandflags = -d + pch_postrule = 1 + inputext = .yy, .y + pre_extension = .tab + source_outputext = .c, .cpp, .cxx, .cc, .C + header_outputext = .h, .hpp, .hxx, .hh + } +} diff --git a/ACE/MPC/config/boost_base.mpb b/ACE/MPC/config/boost_base.mpb new file mode 100644 index 00000000000..58df1ac9dc2 --- /dev/null +++ b/ACE/MPC/config/boost_base.mpb @@ -0,0 +1,15 @@ +// -*- MPC -*- +// $Id$ + +project { + requires += boost + includes += $(BOOST_ROOT)/include/$(BOOST_VERSION) $(BOOST_ROOT)/. + + // If the libraries for boost are not installed in a location relative to + // the include files, set the BOOST_ROOT_LIB environment variable + expand(BOOST_ROOT_LIB) { + $BOOST_ROOT_LIB + $(BOOST_ROOT)/lib + } + libpaths += $(BOOST_ROOT_LIB) +} diff --git a/ACE/MPC/config/boost_date_time.mpb b/ACE/MPC/config/boost_date_time.mpb new file mode 100644 index 00000000000..9e7165f6a86 --- /dev/null +++ b/ACE/MPC/config/boost_date_time.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project: boost_base { + specific(!prop:windows) { + lit_libs += $(BOOST_STATIC_LIB_PREFIX)boost_date_time$(BOOST_CFG) + } +} diff --git a/ACE/MPC/config/boost_filesystem.mpb b/ACE/MPC/config/boost_filesystem.mpb new file mode 100644 index 00000000000..144da5de75c --- /dev/null +++ b/ACE/MPC/config/boost_filesystem.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project: boost_base { + specific(!prop:windows) { + lit_libs += $(BOOST_STATIC_LIB_PREFIX)boost_filesystem$(BOOST_CFG) + } +} diff --git a/ACE/MPC/config/boost_iostreams.mpb b/ACE/MPC/config/boost_iostreams.mpb new file mode 100644 index 00000000000..2e439122fec --- /dev/null +++ b/ACE/MPC/config/boost_iostreams.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project: boost_base { + specific(!prop:windows) { + lit_libs += $(BOOST_STATIC_LIB_PREFIX)boost_iostreams$(BOOST_CFG) + } +} diff --git a/ACE/MPC/config/boost_prg_exec_monitor.mpb b/ACE/MPC/config/boost_prg_exec_monitor.mpb new file mode 100644 index 00000000000..b7c7bc14e87 --- /dev/null +++ b/ACE/MPC/config/boost_prg_exec_monitor.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project: boost_base { + specific(!prop:windows) { + lit_libs += $(BOOST_STATIC_LIB_PREFIX)boost_prg_exec_monitor$(BOOST_CFG) + } +} diff --git a/ACE/MPC/config/boost_program_options.mpb b/ACE/MPC/config/boost_program_options.mpb new file mode 100644 index 00000000000..de449951c15 --- /dev/null +++ b/ACE/MPC/config/boost_program_options.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project: boost_base { + specific(!prop:windows) { + lit_libs += $(BOOST_STATIC_LIB_PREFIX)boost_program_options$(BOOST_CFG) + } +} diff --git a/ACE/MPC/config/boost_python.mpb b/ACE/MPC/config/boost_python.mpb new file mode 100644 index 00000000000..315fe01f297 --- /dev/null +++ b/ACE/MPC/config/boost_python.mpb @@ -0,0 +1,6 @@ +// -*- MPC -*- +// $Id$ + +project: boost_base { + lit_libs += $(BOOST_STATIC_LIB_PREFIX)boost_python$(BOOST_CFG) +} diff --git a/ACE/MPC/config/boost_regex.mpb b/ACE/MPC/config/boost_regex.mpb new file mode 100644 index 00000000000..0a5b9babc80 --- /dev/null +++ b/ACE/MPC/config/boost_regex.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project: boost_base { + specific(!prop:windows) { + lit_libs += $(BOOST_STATIC_LIB_PREFIX)boost_regex$(BOOST_CFG) + } +} diff --git a/ACE/MPC/config/boost_serialization.mpb b/ACE/MPC/config/boost_serialization.mpb new file mode 100644 index 00000000000..9196bd92012 --- /dev/null +++ b/ACE/MPC/config/boost_serialization.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project: boost_base { + specific(!prop:windows) { + lit_libs += $(BOOST_STATIC_LIB_PREFIX)boost_serialization$(BOOST_CFG) + } +} diff --git a/ACE/MPC/config/boost_signals.mpb b/ACE/MPC/config/boost_signals.mpb new file mode 100644 index 00000000000..63707ad2695 --- /dev/null +++ b/ACE/MPC/config/boost_signals.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project: boost_base { + specific(!prop:windows) { + lit_libs += $(BOOST_STATIC_LIB_PREFIX)boost_signals$(BOOST_CFG) + } +} diff --git a/ACE/MPC/config/boost_system.mpb b/ACE/MPC/config/boost_system.mpb new file mode 100644 index 00000000000..ba95ed2b14d --- /dev/null +++ b/ACE/MPC/config/boost_system.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project: boost_base { + specific(!prop:windows) { + lit_libs += $(BOOST_STATIC_LIB_PREFIX)boost_system$(BOOST_CFG) + } +} diff --git a/ACE/MPC/config/boost_test_exec_monitor.mpb b/ACE/MPC/config/boost_test_exec_monitor.mpb new file mode 100644 index 00000000000..06de4742b02 --- /dev/null +++ b/ACE/MPC/config/boost_test_exec_monitor.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project: boost_base { + specific(!prop:windows) { + lit_libs += $(BOOST_STATIC_LIB_PREFIX)boost_test_exec_monitor$(BOOST_CFG) + } +} diff --git a/ACE/MPC/config/boost_thread.mpb b/ACE/MPC/config/boost_thread.mpb new file mode 100644 index 00000000000..a3d0c7cc95b --- /dev/null +++ b/ACE/MPC/config/boost_thread.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project: boost_base { + specific(!prop:windows) { + lit_libs += $(BOOST_STATIC_LIB_PREFIX)boost_thread$(BOOST_CFG) + } +} diff --git a/ACE/MPC/config/boost_unit_test_framework.mpb b/ACE/MPC/config/boost_unit_test_framework.mpb new file mode 100644 index 00000000000..bea8d7b1762 --- /dev/null +++ b/ACE/MPC/config/boost_unit_test_framework.mpb @@ -0,0 +1,11 @@ +// -*- MPC -*- +// $Id$ + +project: boost_base { + // Starting with boost 1.34 auto linking is enabled. + // vc6 and vc7 are added to this list because it is likely that + // any vc6 or vc7 users are using an older pre-auto-linking version. + specific(!prop:windows, vc6, vc7) { + lit_libs += $(BOOST_STATIC_LIB_PREFIX)boost_unit_test_framework$(BOOST_CFG) + } +} diff --git a/ACE/MPC/config/boost_wave.mpb b/ACE/MPC/config/boost_wave.mpb new file mode 100644 index 00000000000..dcf8664bcc9 --- /dev/null +++ b/ACE/MPC/config/boost_wave.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project: boost_base { + specific(!prop:windows) { + lit_libs += $(BOOST_STATIC_LIB_PREFIX)boost_wave$(BOOST_CFG) + } +} diff --git a/ACE/MPC/config/build_files.mpb b/ACE/MPC/config/build_files.mpb new file mode 100644 index 00000000000..8b7a5153c1d --- /dev/null +++ b/ACE/MPC/config/build_files.mpb @@ -0,0 +1,7 @@ +// $Id$ +project { + Define_Custom(Build) { + inputext = .mpc, .mpb, .mwc + } +} + diff --git a/ACE/MPC/config/bzip2.mpb b/ACE/MPC/config/bzip2.mpb new file mode 100644 index 00000000000..e2f514921de --- /dev/null +++ b/ACE/MPC/config/bzip2.mpb @@ -0,0 +1,14 @@ +// -*- MPC -*- +// $Id$ + +feature(bzip2) { + includes += $(BZIP2_ROOT)/include + libpaths += $(BZIP2_ROOT)/lib + macros += USE_BZIP2 + + specific(prop:windows) { + lit_libs += bzip2 + } else { + lit_libs += bz2 + } +} diff --git a/ACE/MPC/config/cppunit.mpb b/ACE/MPC/config/cppunit.mpb new file mode 100644 index 00000000000..71671198f10 --- /dev/null +++ b/ACE/MPC/config/cppunit.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project { + includes += $(CPPUNIT_ROOT)/include + libpaths += $(CPPUNIT_ROOT)/lib + lit_libs += cppunit +} diff --git a/ACE/MPC/config/default.rel b/ACE/MPC/config/default.rel new file mode 100644 index 00000000000..3ac8965618d --- /dev/null +++ b/ACE/MPC/config/default.rel @@ -0,0 +1,6 @@ +// This is the default relative definitions. Wildcards are acceptable. +// +// The first column is the name for which we create a relative definition. +// The second (optional) column, which must be comma separated, is the value +// to build up if it isn't defined as an environmenment variable. +*_ROOT diff --git a/ACE/MPC/config/erlang.mpb b/ACE/MPC/config/erlang.mpb new file mode 100644 index 00000000000..af1c5d5c094 --- /dev/null +++ b/ACE/MPC/config/erlang.mpb @@ -0,0 +1,15 @@ +// +// $Id$ +// + +feature(erlang) { + Define_Custom(Erlang) { + automatic_in = 1 + automatic_out = 1 + command = erlc + commandflags = + inputext = .erl, .yrl, .mib, .bin, .rel, .asn1, .idl + generic_outputext = .beam, .jam, .erl, .hrl, .bin, .rel, .boot, .asn1db + keyword erlcflags = commandflags + } +} diff --git a/ACE/MPC/config/erlang_otp.mpb b/ACE/MPC/config/erlang_otp.mpb new file mode 100644 index 00000000000..3e461cdd502 --- /dev/null +++ b/ACE/MPC/config/erlang_otp.mpb @@ -0,0 +1,12 @@ +// +// $Id$ +// + +project : erlang { + erlcflags += -o ebin + + Modify_Custom(Erlang) { + generic_pre_dirname = ebin/ + output_follows_input = 0 + } +} diff --git a/ACE/MPC/config/flex.mpb b/ACE/MPC/config/flex.mpb new file mode 100644 index 00000000000..1158756839f --- /dev/null +++ b/ACE/MPC/config/flex.mpb @@ -0,0 +1,13 @@ +// $Id$ +project { + requires += flex + Define_Custom(FLEX) { + automatic = 1 + command = flex + commandflags = -t + output_option = > + pch_postrule = 1 + inputext = .ll, .l + source_outputext = .c, .cpp, .cxx, .cc, .C + } +} diff --git a/ACE/MPC/config/gacutil.mpb b/ACE/MPC/config/gacutil.mpb new file mode 100644 index 00000000000..660e6b18ad2 --- /dev/null +++ b/ACE/MPC/config/gacutil.mpb @@ -0,0 +1,8 @@ +// $Id$ + +project { + specific(prop:microsoft) { + postbuild += \ + gacutil -nologo -i <%cwd%>\<%dllout%>\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%dll_ext%> -f + } +} diff --git a/ACE/MPC/config/global.features b/ACE/MPC/config/global.features new file mode 100644 index 00000000000..2303ee4b518 --- /dev/null +++ b/ACE/MPC/config/global.features @@ -0,0 +1,39 @@ +// The global features file contains the default feature settings. +// By default, if a feature isn't listed here then it is enabled. +// If it is listed, then the value assigned to the feature is interpreted +// as a boolean value. You really shouldn't have to edit this file except +// to change the defaults. If you want to override these values you can do +// one of two things. +// +// 1) Create a default.features in this directory with the features you +// want enabled or disabled. +// 2) Create a feature file anywhere you like with the features you want and +// use the -feature_file option to specify where it is located. +// +// Feature definitions from this file are always overridden by the -features +// option. +// +// By default we disable these. +boost = 0 +bzip2 = 0 +erlang = 0 +java = 0 +mfc = 0 +libpng = 0 +python = 0 +qt = 0 +rpc = 0 +swig_java = 0 +swig_perl = 0 +swig_php = 0 +swig_python = 0 +swig_ruby = 0 +swig_tcl = 0 +uses_wchar = 0 // i.e., unicode +xalanc = 0 +xerces = 0 +xerces2 = 0 +xerces3 = 0 +ziparchive = 0 +zlib = 0 +zzip = 0 diff --git a/ACE/MPC/config/global.mpb b/ACE/MPC/config/global.mpb new file mode 100644 index 00000000000..a4254553288 --- /dev/null +++ b/ACE/MPC/config/global.mpb @@ -0,0 +1,12 @@ +// -*- MPC -*- +// $Id$ + +project { + // By default send all libraries to the same directory as the project + libout = . + + // Automake doesn't need the project directory in the libpaths + specific(!automake) { + libpaths = . + } +} diff --git a/ACE/MPC/config/gsl.mpb b/ACE/MPC/config/gsl.mpb new file mode 100644 index 00000000000..694e2f2b45a --- /dev/null +++ b/ACE/MPC/config/gsl.mpb @@ -0,0 +1,6 @@ +// -*- MPC -*- +// $Id$ + +feature(gsl) { + lit_libs += gsl +} diff --git a/ACE/MPC/config/iiopnet.mpb b/ACE/MPC/config/iiopnet.mpb new file mode 100644 index 00000000000..22fc17a9474 --- /dev/null +++ b/ACE/MPC/config/iiopnet.mpb @@ -0,0 +1,19 @@ +// $Id$ + +project { + custom_only = 1 + + specific { + IIOPNET_BIN = $(IIOPNET_ROOT)/bin/IDLToCLSCompiler + IIOPNET_DEP = $(IIOPNET_ROOT)/bin/IDLToCLSCompiler + } + + Define_Custom (IDL) { + automatic = 0 + command = <%quote%>$(IIOPNET_BIN)<%quote%> + dependent = <%quote%>$(IIOPNET_DEP)<%quote%> + inputext = .idl + generic_outputext = .dll + keyword iiopnetflags = commandflags + } +} diff --git a/ACE/MPC/config/iodbc.mpb b/ACE/MPC/config/iodbc.mpb new file mode 100644 index 00000000000..8558336df69 --- /dev/null +++ b/ACE/MPC/config/iodbc.mpb @@ -0,0 +1,12 @@ +// $Id$ + +project { + // Support for iODBC (http://www.iodbc.org). This is one + // variant of porting ODBC to non-Windows systems. + avoids += unixodbc + + libpaths += $(IODBC_ROOT)/lib + includes += $(IODBC_ROOT)/include + + lit_libs += iodbc iodbcinst +} diff --git a/ACE/MPC/config/ixml.mpb b/ACE/MPC/config/ixml.mpb new file mode 100644 index 00000000000..5261788dd94 --- /dev/null +++ b/ACE/MPC/config/ixml.mpb @@ -0,0 +1,7 @@ +// $Id$ + +project { + includes += $(UPNP_ROOT)/include + libpaths += $(UPNP_ROOT)/lib + lit_libs += ixml +} diff --git a/ACE/MPC/config/lex.mpb b/ACE/MPC/config/lex.mpb new file mode 100644 index 00000000000..c593bcbfd0d --- /dev/null +++ b/ACE/MPC/config/lex.mpb @@ -0,0 +1,13 @@ +// $Id$ +project { + requires += lex + Define_Custom(LEX) { + automatic = 1 + command = lex + commandflags = -t + output_option = > + pch_postrule = 1 + inputext = .ll, .l + source_outputext = .c, .cpp, .cxx, .cc, .C + } +} diff --git a/ACE/MPC/config/libpng.mpb b/ACE/MPC/config/libpng.mpb new file mode 100644 index 00000000000..bb381331e0a --- /dev/null +++ b/ACE/MPC/config/libpng.mpb @@ -0,0 +1,10 @@ +// -*- MPC -*- +// $Id$ + +feature(libpng): zlib { + requires += zlib + includes += "$(PNG_ROOT)/include/libpng" + libpaths += "$(PNG_ROOT)/lib" + lit_libs += png + macros += PNG +} diff --git a/ACE/MPC/config/log4cplus.mpb b/ACE/MPC/config/log4cplus.mpb new file mode 100644 index 00000000000..cb0991b473a --- /dev/null +++ b/ACE/MPC/config/log4cplus.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project { + includes += $(LOG4CPLUS_ROOT)/include + libpaths += $(LOG4CPLUS_ROOT)/lib + libs += log4cplus +} diff --git a/ACE/MPC/config/loki.mpb b/ACE/MPC/config/loki.mpb new file mode 100644 index 00000000000..7b54d09da37 --- /dev/null +++ b/ACE/MPC/config/loki.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project { + includes += $(LOKI_ROOT)/include + libpaths += $(LOKI_ROOT)/lib + lit_libs += loki +} diff --git a/ACE/MPC/config/lzo1.mpb b/ACE/MPC/config/lzo1.mpb new file mode 100644 index 00000000000..dd145771044 --- /dev/null +++ b/ACE/MPC/config/lzo1.mpb @@ -0,0 +1,12 @@ +// -*- MPC -*- +// $Id$ + +feature(lzo1) { + includes += $(LZO1_ROOT)/include + libpaths += $(LZO1_ROOT)/lib + specific (prop:microsoft) { + lit_libs += liblzo + } else { + lit_libs += lzo + } +} diff --git a/ACE/MPC/config/lzo2.mpb b/ACE/MPC/config/lzo2.mpb new file mode 100644 index 00000000000..1e674b8d065 --- /dev/null +++ b/ACE/MPC/config/lzo2.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +feature(lzo2) { + includes += $(LZO2_ROOT)/include + libpaths += $(LZO2_ROOT)/lib + lit_libs += lzo2 +} diff --git a/ACE/MPC/config/mfc.mpb b/ACE/MPC/config/mfc.mpb new file mode 100644 index 00000000000..7f8a8f2edce --- /dev/null +++ b/ACE/MPC/config/mfc.mpb @@ -0,0 +1,16 @@ +// -*- MPC -*- +// $Id$ + +project { + requires += mfc + macros += _AFXDLL + specific(em3, nmake, vc6) { + subsystem = windows + } else { + subsystem = 2 + } + specific { + use_mfc = 2 + unicode_mfc_entry = wWinMainCRTStartup + } +} diff --git a/ACE/MPC/config/mpb.mpb b/ACE/MPC/config/mpb.mpb new file mode 100644 index 00000000000..7ec891e1dd2 --- /dev/null +++ b/ACE/MPC/config/mpb.mpb @@ -0,0 +1,12 @@ +// -*- MPC -*- +// $Id$ + +project { + // Allow users to specify .mpb files in their project. This gives the + // opportunity to see them in IDE's and to install them using + // prj_install.pl. + Define_Custom(MPB) { + automatic = 0 + inputext = .mpb + } +} diff --git a/ACE/MPC/config/mpich.mpb b/ACE/MPC/config/mpich.mpb new file mode 100644 index 00000000000..c6f3e8216bc --- /dev/null +++ b/ACE/MPC/config/mpich.mpb @@ -0,0 +1,13 @@ +// $Id$ + +project { + includes += $(MPI_ROOT)/include $(MPI_ROOT)/include/mpi + libpaths += $(MPI_ROOT)/lib + requires += mpi + + specific(prop:windows) { + lit_libs += mpi + } else { + lit_libs += mpich + } +} diff --git a/ACE/MPC/config/msgfmt.mpb b/ACE/MPC/config/msgfmt.mpb new file mode 100644 index 00000000000..2c885fec4cb --- /dev/null +++ b/ACE/MPC/config/msgfmt.mpb @@ -0,0 +1,11 @@ +// $Id$ + +project { + Define_Custom(PO) { + command = msgfmt + commandflags = -c + output_option = -o + inputext = .po + generic_outputext = .mo + } +} diff --git a/ACE/MPC/config/mysql.mpb b/ACE/MPC/config/mysql.mpb new file mode 100644 index 00000000000..0c02083a1c4 --- /dev/null +++ b/ACE/MPC/config/mysql.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project { + includes += $(MYSQL_ROOT)/include/mysql + libpaths += $(MYSQL_ROOT)/lib/mysql + lit_libs += mysqlclient +} diff --git a/ACE/MPC/config/mysqlpp.mpb b/ACE/MPC/config/mysqlpp.mpb new file mode 100644 index 00000000000..c6d3513b191 --- /dev/null +++ b/ACE/MPC/config/mysqlpp.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project: mysql { + includes += $(MYSQLPLUS_ROOT)/include/mysql++ + libpaths += $(MYSQLPLUS_ROOT)/lib + lit_libs += mysqlpp +} diff --git a/ACE/MPC/config/ndds_ts_defaults.mpb b/ACE/MPC/config/ndds_ts_defaults.mpb new file mode 100644 index 00000000000..da6b9ae35fd --- /dev/null +++ b/ACE/MPC/config/ndds_ts_defaults.mpb @@ -0,0 +1,24 @@ +// -*- MPC -*- +// $Id$ + +project { + Define_Custom(NDDSTypeSupport) { + automatic = 1 + command = <%quote%>$(NDDSHOME)/scripts/rtiddsgen<%quote%> + commandflags = -language C++ -replace -namespace -corba <%input_noext%>C.h -orb ACE_TAO1.7 -I$(TAO_ROOT) -I$(TAO_ROOT)/tao + + dependent = <%quote%>$(NDDSHOME)/scripts/rtiddsgen<%bat%><%quote%> + + source_pre_extension = , Support, Plugin + source_outputext = .cxx + header_pre_extension = , Support, Plugin + header_outputext = .h + keyword ndds_ts_flags = commandflags + } + + requires += ndds + + verbatim(gnuace, macros) { + override no_hidden_visibility = 1 + } +} diff --git a/ACE/MPC/config/nddsexe.mpb b/ACE/MPC/config/nddsexe.mpb new file mode 100644 index 00000000000..af928ff2f53 --- /dev/null +++ b/ACE/MPC/config/nddsexe.mpb @@ -0,0 +1,5 @@ +// -*- MPC -*- +// $Id$ + +project : nddslib { +} diff --git a/ACE/MPC/config/nddsexe_with_idl.mpb b/ACE/MPC/config/nddsexe_with_idl.mpb new file mode 100644 index 00000000000..744651307b2 --- /dev/null +++ b/ACE/MPC/config/nddsexe_with_idl.mpb @@ -0,0 +1,5 @@ +// -*- MPC -*- +// $Id$ + +project : nddsexe, ndds_ts_defaults { +} diff --git a/ACE/MPC/config/nddslib.mpb b/ACE/MPC/config/nddslib.mpb new file mode 100644 index 00000000000..01d0640a07b --- /dev/null +++ b/ACE/MPC/config/nddslib.mpb @@ -0,0 +1,15 @@ +// -*- MPC -*- +// $Id$ + +project { + requires += ndds + libs += nddscpp nddsc nddscore + libpaths += $(NDDSHOME)/lib/$(NDDSARCHITECTURE) + includes += $(NDDSHOME)/include $(NDDSHOME)/include/ndds + + specific(prop:windows) { + macros += RTI_WIN32 NDDS_DLL_VARIABLE + } else { + macros += RTI_UNIX + } +} diff --git a/ACE/MPC/config/nddslib_with_idl.mpb b/ACE/MPC/config/nddslib_with_idl.mpb new file mode 100644 index 00000000000..73f96ba2d86 --- /dev/null +++ b/ACE/MPC/config/nddslib_with_idl.mpb @@ -0,0 +1,5 @@ +// -*- MPC -*- +// $Id$ + +project : nddslib, ndds_ts_defaults { +} diff --git a/ACE/MPC/config/odbc.mpb b/ACE/MPC/config/odbc.mpb new file mode 100644 index 00000000000..d069d675485 --- /dev/null +++ b/ACE/MPC/config/odbc.mpb @@ -0,0 +1,23 @@ +// $Id$ + +project { + specific(prop:windows) { + // Out of the box, Windows supports ODBC since ODBC originated + // on Windows. We, however, need to ensure that UnixODBC and + // iODBC are not enabled. We may be able to drop the 'avoids' + // statement. + avoids += unixodbc iodbc + lit_libs += odbc32 odbcbcp odbcCP32 + } +} + +//============================================================================= +// Non-Windows support + +feature(unixodbc) : unixodbc { + avoids += iodbc +} + +feature(iodbc) : iodbc { + avoids += unixodbc +} diff --git a/ACE/MPC/config/openmpi.mpb b/ACE/MPC/config/openmpi.mpb new file mode 100644 index 00000000000..291a6c1350c --- /dev/null +++ b/ACE/MPC/config/openmpi.mpb @@ -0,0 +1,9 @@ +// -*- MPC -*- +// $Id$ + +project { + includes += $(MPI_ROOT)/include + libpaths += $(MPI_ROOT)/lib + lit_libs += mpi + requires += mpi +} diff --git a/ACE/MPC/config/openssl.mpb b/ACE/MPC/config/openssl.mpb new file mode 100644 index 00000000000..88a6d9e4297 --- /dev/null +++ b/ACE/MPC/config/openssl.mpb @@ -0,0 +1,32 @@ +// -*- MPC -*- +// $Id$ + +// openssl is a completely different feature than ssl. +// Currently ssl uses openssl, and openssl is enabled by +// default. If we ever add a new ssl library, then you +// would likely enable only one ssl library feature. +feature(openssl) { + includes += $(SSL_ROOT)/include + libpaths += $(SSL_ROOT)/lib + + specific(prop:windows) { + lit_libs += libeay32 ssleay32 + includes += $(SSL_ROOT)/inc32 + libpaths += $(SSL_ROOT)/out32dll $(SSL_ROOT)/out32 + } else { + lit_libs += ssl crypto + + // Some Linux OpenSSL installations compile in Kerberos support. Add + // the Kerberos include path to preprocessor include path. + includes += /usr/kerberos/include + } + + // Some prepackaged installations of OpenSSL have libraries in different + // locations. + specific(prop:borland) { + libpaths += $(SSL_ROOT)/lib/Builder5 + } + specific(prop:microsoft) { + libpaths += $(SSL_ROOT)/lib/VC + } +} diff --git a/ACE/MPC/config/pcre.mpb b/ACE/MPC/config/pcre.mpb new file mode 100644 index 00000000000..665b8b22b52 --- /dev/null +++ b/ACE/MPC/config/pcre.mpb @@ -0,0 +1,17 @@ +// $Id$ + +project { + requires += pcre + includes += $(PCRE_ROOT)/include + libpaths += $(PCRE_ROOT)/lib + + // At this point in time (9/17/2009) the windows version of pcre does not + // have a version number. And since Visual Studio complains about empty + // environment variables, we're not adding the version variable to the + // library. This may have to change in the future. + specific(prop:microsoft) { + lit_libs += pcre + } else { + lit_libs += pcre$(PCRE_VERSION) + } +} diff --git a/ACE/MPC/config/pcreposix.mpb b/ACE/MPC/config/pcreposix.mpb new file mode 100644 index 00000000000..06c75971d7f --- /dev/null +++ b/ACE/MPC/config/pcreposix.mpb @@ -0,0 +1,5 @@ +// $Id$ + +project: pcre { + lit_libs += pcreposix$(PCRE_VERSION) +} diff --git a/ACE/MPC/config/python.mpb b/ACE/MPC/config/python.mpb new file mode 100644 index 00000000000..cb69f3960ff --- /dev/null +++ b/ACE/MPC/config/python.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +project { + requires += python + includes += $(PYTHON_INCLUDE)/. + libpaths += $(PYTHON_LIBDIR)/. +} diff --git a/ACE/MPC/config/qt.mpb b/ACE/MPC/config/qt.mpb new file mode 100644 index 00000000000..d0dca9f7e1c --- /dev/null +++ b/ACE/MPC/config/qt.mpb @@ -0,0 +1,55 @@ +// -*- MPC -*- +// $Id$ + +project { + requires += qt + includes += $(QTDIR)/include + libpaths += $(QTDIR)/lib $(QTDIR)/lib64 + macros += QT_THREAD_SUPPORT + lit_libs += qt-mt$(QT_VERSION) + + // Some Linux installations have the includes here. + specific(!prop:windows) { + includes += /usr/include/qt3 + } + + Define_Custom(UIC) { + automatic = 1 + command = $(QTDIR)/bin/uic + output_option = -o + inputext = .ui + header_outputext = .h + } + + Define_Custom(UIC_Impl) { + automatic = 1 + command = $(QTDIR)/bin/uic + commandflags = -impl <%quote%><%output_noext%>.h<%quote%> + dependent = <%output_noext%>.h + output_option = -o + pch_postrule = 1 + inputext = .ui + source_outputext = .cpp + } + + Define_Custom(MOC) { + automatic = 0 + command = $(QTDIR)/bin/moc + output_option = -o + pch_postrule = 1 + inputext = .h + pre_extension = _moc + source_outputext = .cpp + } + + Define_Custom(QRC) { + automatic = 1 + command = $(QTDIR)/bin/rcc + output_option = -o + commandflags = -name <%input_noext%> + pch_postrule = 1 + inputext = .qrc + pre_extension = _qrc + source_outputext = .cpp + } +} diff --git a/ACE/MPC/config/qt3.mpb b/ACE/MPC/config/qt3.mpb new file mode 100644 index 00000000000..2e0ecd5f1e9 --- /dev/null +++ b/ACE/MPC/config/qt3.mpb @@ -0,0 +1,5 @@ +// -*- MPC -*- +// $Id$ + +project: qt { +} diff --git a/ACE/MPC/config/qt4_core.mpb b/ACE/MPC/config/qt4_core.mpb new file mode 100644 index 00000000000..ae68a4f7f3a --- /dev/null +++ b/ACE/MPC/config/qt4_core.mpb @@ -0,0 +1,16 @@ +// -*- MPC -*- +// $Id$ + +project { + // If the include files for QT are not relative to the root (for + // example, /usr/include/qt4), set the QT4_INCDIR environment variable. + expand(QT4_INCDIR) { + $QT4_INCDIR + $(QTDIR)/include + } + + requires += qt4 + includes += $(QT4_INCDIR) + libpaths += $(QTDIR)/lib + lit_libs += QtCore$(QT_CFG) +} diff --git a/ACE/MPC/config/qt4_designer.mpb b/ACE/MPC/config/qt4_designer.mpb new file mode 100644 index 00000000000..9367fb3a3cb --- /dev/null +++ b/ACE/MPC/config/qt4_designer.mpb @@ -0,0 +1,6 @@ +// -*- MPC -*- +// $Id$ + +project: qt4_xml { + lit_libs += QtDesigner$(QT_CFG) +} diff --git a/ACE/MPC/config/qt4_designercomponents.mpb b/ACE/MPC/config/qt4_designercomponents.mpb new file mode 100644 index 00000000000..f7fe183cd22 --- /dev/null +++ b/ACE/MPC/config/qt4_designercomponents.mpb @@ -0,0 +1,6 @@ +// -*- MPC -*- +// $Id$ + +project: qt4_designer { + lit_libs += QtDesignerComponents$(QT_CFG) +} diff --git a/ACE/MPC/config/qt4_gui.mpb b/ACE/MPC/config/qt4_gui.mpb new file mode 100644 index 00000000000..8f0c8b22f30 --- /dev/null +++ b/ACE/MPC/config/qt4_gui.mpb @@ -0,0 +1,36 @@ +// -*- MPC -*- +// $Id$ + +project: qt4_core { + lit_libs += QtGui$(QT_CFG) + + Define_Custom(UIC) { + automatic = 1 + command = $(QTDIR)/bin/uic + output_option = -o + inputext = .ui + pre_filename = ui_ + header_outputext = .h + } + + Define_Custom(MOC) { + automatic = 0 + command = $(QTDIR)/bin/moc + output_option = -o + pch_postrule = 1 + inputext = .h + pre_extension = _moc + source_outputext = .cpp + } + + Define_Custom(QRC) { + automatic = 1 + command = $(QTDIR)/bin/rcc + output_option = -o + commandflags = -name <%input_noext%> + pch_postrule = 1 + inputext = .qrc + pre_extension = _qrc + source_outputext = .cpp + } +} diff --git a/ACE/MPC/config/qt4_network.mpb b/ACE/MPC/config/qt4_network.mpb new file mode 100644 index 00000000000..c0b4eec557d --- /dev/null +++ b/ACE/MPC/config/qt4_network.mpb @@ -0,0 +1,6 @@ +// -*- MPC -*- +// $Id$ + +project: qt4_core { + lit_libs += QtNetwork$(QT_CFG) +} diff --git a/ACE/MPC/config/qt4_opengl.mpb b/ACE/MPC/config/qt4_opengl.mpb new file mode 100644 index 00000000000..20d656227e1 --- /dev/null +++ b/ACE/MPC/config/qt4_opengl.mpb @@ -0,0 +1,6 @@ +// -*- MPC -*- +// $Id$ + +project: qt4_gui { + lit_libs += QtOpenGL$(QT_CFG) +} diff --git a/ACE/MPC/config/qt4_qt3support.mpb b/ACE/MPC/config/qt4_qt3support.mpb new file mode 100644 index 00000000000..f0688523e24 --- /dev/null +++ b/ACE/MPC/config/qt4_qt3support.mpb @@ -0,0 +1,7 @@ +// -*- MPC -*- +// $Id$ + +project: qt4_gui { + lit_libs += Qt3Support$(QT_CFG) + macros += QT3_SUPPORT +} diff --git a/ACE/MPC/config/qt4_sql.mpb b/ACE/MPC/config/qt4_sql.mpb new file mode 100644 index 00000000000..4744baaf954 --- /dev/null +++ b/ACE/MPC/config/qt4_sql.mpb @@ -0,0 +1,6 @@ +// -*- MPC -*- +// $Id$ + +project: qt4_core { + lit_libs += QtSql$(QT_CFG) +} diff --git a/ACE/MPC/config/qt4_svg.mpb b/ACE/MPC/config/qt4_svg.mpb new file mode 100644 index 00000000000..7088f8185a9 --- /dev/null +++ b/ACE/MPC/config/qt4_svg.mpb @@ -0,0 +1,6 @@ +// -*- MPC -*- +// $Id$ + +project: qt4_xml { + lit_libs += QtSvg$(QT_CFG) +} diff --git a/ACE/MPC/config/qt4_test.mpb b/ACE/MPC/config/qt4_test.mpb new file mode 100644 index 00000000000..82aa2ad7dd6 --- /dev/null +++ b/ACE/MPC/config/qt4_test.mpb @@ -0,0 +1,6 @@ +// -*- MPC -*- +// $Id$ + +project: qt4_core { + lit_libs += QtTest$(QT_CFG) +} diff --git a/ACE/MPC/config/qt4_xml.mpb b/ACE/MPC/config/qt4_xml.mpb new file mode 100644 index 00000000000..12de7668d6a --- /dev/null +++ b/ACE/MPC/config/qt4_xml.mpb @@ -0,0 +1,6 @@ +// -*- MPC -*- +// $Id$ + +project: qt4_core { + lit_libs += QtXml$(QT_CFG) +} diff --git a/ACE/MPC/config/qwt.mpb b/ACE/MPC/config/qwt.mpb new file mode 100644 index 00000000000..7a616e78926 --- /dev/null +++ b/ACE/MPC/config/qwt.mpb @@ -0,0 +1,11 @@ +// -*- MPC -*- +// $Id$ + +// This project also requires Qt, however it will work with both +// Qt 3.3.x and Qt 4.x so we will leave it up to the user to pull +// in the right Qt base projects. +project { + includes += $(QWT_ROOT)/include + libpaths += $(QWT_ROOT)/lib + lit_libs += qwt +} diff --git a/ACE/MPC/config/rpc.mpb b/ACE/MPC/config/rpc.mpb new file mode 100644 index 00000000000..722389edeac --- /dev/null +++ b/ACE/MPC/config/rpc.mpb @@ -0,0 +1,15 @@ +// -*- MPC -*- +// $Id$ + +project { + requires += rpc + Define_Custom(rpcgen) { + command = rpcgen + commandflags = -C + pch_postrule = 1 + inputext = .x + source_pre_extension = _svc, _clnt + source_outputext = .c + header_outputext = .h + } +} diff --git a/ACE/MPC/config/ruby.mpb b/ACE/MPC/config/ruby.mpb new file mode 100644 index 00000000000..314fb5d160a --- /dev/null +++ b/ACE/MPC/config/ruby.mpb @@ -0,0 +1,6 @@ +// -*- MPC -*- +// $Id$ + +feature(ruby) { + lit_libs += ruby +} diff --git a/ACE/MPC/config/splice_ts_defaults.mpb b/ACE/MPC/config/splice_ts_defaults.mpb new file mode 100644 index 00000000000..df56862e3fc --- /dev/null +++ b/ACE/MPC/config/splice_ts_defaults.mpb @@ -0,0 +1,24 @@ +// -*- MPC -*- +// $Id$ + +project : taoidldefaults { + Define_Custom(SpliceTypeSupport) { + automatic = 1 + command = <%quote%>$(OSPL_HOME)/bin/idlpp<%quote%> + dependent = <%quote%>$(OSPL_HOME)/bin/idlpp<%quote%> + source_pre_extension = SplDcps, Dcps_impl + source_outputext = .cpp + header_pre_extension = , SplDcps, Dcps_impl + header_pre_filename = ccpp_ + header_outputext = .h + generic_pre_extension = Dcps + generic_outputext = .idl + keyword splice_ts_flags = commandflags + } + + splice_ts_flags += \ + -I <%quote%>$(OSPL_HOME)/include/dcps/C++/CCPP/$(SPLICE_ORB)<%quote%> \ + -C -l cpp -b CCPP/$(SPLICE_ORB) + + idlflags += -I <%quote%>$(OSPL_HOME)/custom_lib/ccpp<%quote%> +} diff --git a/ACE/MPC/config/spliceexe.mpb b/ACE/MPC/config/spliceexe.mpb new file mode 100644 index 00000000000..fce0c8d8a96 --- /dev/null +++ b/ACE/MPC/config/spliceexe.mpb @@ -0,0 +1,5 @@ +// -*- MPC -*- +// $Id$ + +project : splicelib { +} diff --git a/ACE/MPC/config/spliceexe_with_idl.mpb b/ACE/MPC/config/spliceexe_with_idl.mpb new file mode 100644 index 00000000000..c0032eeafa6 --- /dev/null +++ b/ACE/MPC/config/spliceexe_with_idl.mpb @@ -0,0 +1,5 @@ +// -*- MPC -*- +// $Id$ + +project : spliceexe, splice_ts_defaults { +} diff --git a/ACE/MPC/config/splicelib.mpb b/ACE/MPC/config/splicelib.mpb new file mode 100644 index 00000000000..62d1f22f7d9 --- /dev/null +++ b/ACE/MPC/config/splicelib.mpb @@ -0,0 +1,21 @@ +// -*- MPC -*- +// $Id$ + +project { + libs += dcpsccpp + lit_libs += dcpsgapi ddsdatabase ddsos + libpaths += $(OSPL_HOME)/lib + includes += $(OSPL_HOME)/include \ + $(OSPL_HOME)/include/sys \ + $(OSPL_HOME)/include/dcps/C++/CCPP \ + $(OSPL_HOME)/include/dcps/C++/CCPP/$(SPLICE_ORB) \ + $(OSPL_HOME)/custom_lib/ccpp + + specific(prop:microsoft) { + DisableSpecificWarnings += 4101 + } + + verbatim(gnuace, macros) { + override no_hidden_visibility = 1 + } +} diff --git a/ACE/MPC/config/splicelib_with_idl.mpb b/ACE/MPC/config/splicelib_with_idl.mpb new file mode 100644 index 00000000000..e64d71130bc --- /dev/null +++ b/ACE/MPC/config/splicelib_with_idl.mpb @@ -0,0 +1,5 @@ +// -*- MPC -*- +// $Id$ + +project : splicelib, splice_ts_defaults { +} diff --git a/ACE/MPC/config/sqlite3.mpb b/ACE/MPC/config/sqlite3.mpb new file mode 100644 index 00000000000..aeee567e1e9 --- /dev/null +++ b/ACE/MPC/config/sqlite3.mpb @@ -0,0 +1,8 @@ +// $Id$ + +project { + requires += sqlite3 + includes += $(SQLITE_ROOT)/include + libpaths += $(SQLITE_ROOT)/lib + lit_libs += sqlite3 +} diff --git a/ACE/MPC/config/swig_java.mpb b/ACE/MPC/config/swig_java.mpb new file mode 100644 index 00000000000..6573d7c44a1 --- /dev/null +++ b/ACE/MPC/config/swig_java.mpb @@ -0,0 +1,16 @@ +// -*- MPC -*- +// $Id$ + +project { + Define_Custom(SWIG) { + automatic = 1 + command = swig + commandflags = -java -c++ + inputext = .swg, .swig, .i + source_outputext = _wrap.cxx + generic_pre_extension = , JNI + generic_outputext = .java + } + requires += swig_java + includes += $(JAVA_ROOT)/include $(JAVA_ROOT)/include/$(JAVA_PLATFORM) +} diff --git a/ACE/MPC/config/swig_perl.mpb b/ACE/MPC/config/swig_perl.mpb new file mode 100644 index 00000000000..e3d655b6bd2 --- /dev/null +++ b/ACE/MPC/config/swig_perl.mpb @@ -0,0 +1,19 @@ +// -*- MPC -*- +// $Id$ + +project { + Define_Custom(SWIG) { + automatic = 1 + command = swig + commandflags = -perl -c++ + inputext = .swg, .swig, .i + source_outputext = _wrap.cxx + generic_outputext = .pm + } + requires += swig_perl + includes += $(PERL5_INCLUDE)/. + libpaths += $(PERL5_INCLUDE)/. + specific(prop:windows) { + lit_libs += $(PERL5_LIB) + } +} diff --git a/ACE/MPC/config/swig_php.mpb b/ACE/MPC/config/swig_php.mpb new file mode 100644 index 00000000000..f97e700dbdd --- /dev/null +++ b/ACE/MPC/config/swig_php.mpb @@ -0,0 +1,19 @@ +// -*- MPC -*- +// $Id$ + +project { + Define_Custom(SWIG) { + automatic = 1 + command = swig + commandflags = -php -c++ + inputext = .swg, .swig, .i + source_outputext = _wrap.cpp + header_pre_filename = php_ + header_outputext = .h + generic_outputext = .php + } + requires += swig_php + includes += $(PHP_INCLUDE)/. $(PHP_INCLUDE)/main $(PHP_INCLUDE)/Zend \ + $(PHP_INCLUDE)/TSRM + libpaths += $(PHP_LIBPATH)/. +} diff --git a/ACE/MPC/config/swig_python.mpb b/ACE/MPC/config/swig_python.mpb new file mode 100644 index 00000000000..3b7b24933de --- /dev/null +++ b/ACE/MPC/config/swig_python.mpb @@ -0,0 +1,20 @@ +// -*- MPC -*- +// $Id$ + +project { + Define_Custom(SWIG) { + automatic = 1 + command = swig + commandflags = -python -c++ + inputext = .swg, .swig, .i + source_outputext = _wrap.cxx + generic_outputext = .py + } + requires += swig_python + includes += $(PYTHON_INCLUDE)/. + libpaths += $(PYTHON_LIBPATH)/. + + specific { + lib_prefix = + } +} diff --git a/ACE/MPC/config/swig_ruby.mpb b/ACE/MPC/config/swig_ruby.mpb new file mode 100644 index 00000000000..868eeac2c40 --- /dev/null +++ b/ACE/MPC/config/swig_ruby.mpb @@ -0,0 +1,19 @@ +// -*- MPC -*- +// $Id$ + +project { + Define_Custom(SWIG) { + automatic = 1 + command = swig + commandflags = -ruby -c++ + inputext = .swg, .swig, .i + source_outputext = _wrap.cxx + } + requires += swig_ruby + includes += $(RUBY_INCLUDE)/. + libpaths += $(RUBY_LIBPATH)/. + + specific { + lib_prefix = + } +} diff --git a/ACE/MPC/config/swig_tcl.mpb b/ACE/MPC/config/swig_tcl.mpb new file mode 100644 index 00000000000..020564e5add --- /dev/null +++ b/ACE/MPC/config/swig_tcl.mpb @@ -0,0 +1,15 @@ +// -*- MPC -*- +// $Id$ + +project { + Define_Custom(SWIG) { + automatic = 1 + command = swig + commandflags = -tcl -c++ + inputext = .swg, .swig, .i + source_outputext = _wrap.cxx + } + requires += swig_tcl + includes += $(TCL_INCLUDE)/. + libpaths += $(TCL_LIBPATH)/. +} diff --git a/ACE/MPC/config/udm.mpb b/ACE/MPC/config/udm.mpb new file mode 100644 index 00000000000..9e6d8364aa4 --- /dev/null +++ b/ACE/MPC/config/udm.mpb @@ -0,0 +1,29 @@ +// -*- MPC -*- +// $Id$ + +project : xerces { + libs += UdmDll zlib + includes += $(GME_ROOT)/SDK/BON/Common $(GME_ROOT)/SDK/BON $(UDM_PATH)/include . + libpaths += $(UDM_PATH)/lib $(UDM_3RDPARTY_PATH)/zlib + + specific { + midl_flags += /server none /client none + midl_includes += $(GME_ROOT) $(GME_ROOT)/Interfaces . + } + + specific(prop:microsoft) { + DisableSpecificWarnings += 4251 + } + + Define_Custom(UDM) { + automatic = 1 + dependent = $(UDM_PATH)/bin/Udm + command = <%quote%>$(UDM_PATH)<%quote%>/bin/Udm + inputext = .xml + header_outputext = .h + source_outputext = .cpp + generic_outputext = .xsd + + keyword udmflags = commandflags + } +} diff --git a/ACE/MPC/config/unicode.mpb b/ACE/MPC/config/unicode.mpb new file mode 100644 index 00000000000..7745b1f8ee5 --- /dev/null +++ b/ACE/MPC/config/unicode.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +feature (uses_wchar) { + specific { + unicode = 1 + } +} diff --git a/ACE/MPC/config/unixodbc.mpb b/ACE/MPC/config/unixodbc.mpb new file mode 100644 index 00000000000..14cf47d35fd --- /dev/null +++ b/ACE/MPC/config/unixodbc.mpb @@ -0,0 +1,10 @@ +// $Id$ + +project { + // Support for UnixODBC (http://www.unixodbc.org). This is one + // variant of porting ODBC to non-Windows systems. + libpaths += $(UNIXODBC_ROOT)/lib + includes += $(UNIXODBC_ROOT)/include + + lit_libs += odbc odbcinst +} diff --git a/ACE/MPC/config/upnp.mpb b/ACE/MPC/config/upnp.mpb new file mode 100644 index 00000000000..df166fe9ca5 --- /dev/null +++ b/ACE/MPC/config/upnp.mpb @@ -0,0 +1,5 @@ +// $Id$ + +project: ixml { + lit_libs += threadutil upnp +} diff --git a/ACE/MPC/config/wix.mpb b/ACE/MPC/config/wix.mpb new file mode 100644 index 00000000000..fb6b1c250e2 --- /dev/null +++ b/ACE/MPC/config/wix.mpb @@ -0,0 +1,29 @@ +// $Id$ + +project { + custom_only = 1 + + Define_Custom (WXS) { + automatic = 1 + command = <%quote%>$(WIX_ROOT)/bin/candle.exe<%quote%> + + inputext = .wxs + output_option = -out + commandflags = -nologo + generic_outputext = .wixobj + keyword wix_flags = commandflags + } + + Define_Custom (WXI) { + automatic = 1 + inputext = .wxi + } + + postbuild = \ + <%quote%>$(WIX_ROOT)/bin/light.exe<%quote%> -out <%project_name%>.msi \ + <%light_flags%> <%foreach(wxs_files)%><%noextension(wxs_file)%>.wixobj <%endfor%> + + specific(vc7, vc71, vc8, vc9, vc10) { + wix_flags += -dtype=<%prj_type%> + } +} diff --git a/ACE/MPC/config/wix_ui.mpb b/ACE/MPC/config/wix_ui.mpb new file mode 100644 index 00000000000..d48bc40045a --- /dev/null +++ b/ACE/MPC/config/wix_ui.mpb @@ -0,0 +1,8 @@ +// $Id$ + +project : wix { + specific { + wix_flags += -ext WixUIExtension + light_flags += '-ext WixUIExtension' + } +} diff --git a/ACE/MPC/config/wix_xml.mpb b/ACE/MPC/config/wix_xml.mpb new file mode 100644 index 00000000000..487995795f2 --- /dev/null +++ b/ACE/MPC/config/wix_xml.mpb @@ -0,0 +1,8 @@ +// $Id$ + +project : wix { + specific { + wix_flags += -ext WixUtilExtension + light_flags += '-ext WixUtilExtension' + } +} diff --git a/ACE/MPC/config/xalanc.mpb b/ACE/MPC/config/xalanc.mpb new file mode 100644 index 00000000000..f07fa201675 --- /dev/null +++ b/ACE/MPC/config/xalanc.mpb @@ -0,0 +1,9 @@ +// -*- MPC -*- +// $Id$ + +project: xerces { + requires += xalanc + includes += $(XALANCROOT)/include + libpaths += $(XALANCROOT)/lib + lit_libs += xalan-c xalanMsg +} diff --git a/ACE/MPC/config/xerces.mpb b/ACE/MPC/config/xerces.mpb new file mode 100644 index 00000000000..338bdb541c2 --- /dev/null +++ b/ACE/MPC/config/xerces.mpb @@ -0,0 +1,57 @@ +// -*- MPC -*- +// $Id$ +feature(!xerces2, !xerces3) { + requires += xerces +} + +feature(xerces2) { + includes += $(XERCESCROOT)/include + libpaths += $(XERCESCROOT)/lib + + specific(prop:microsoft) { + xerceslib = xerces-c_2 + + // Linking the optimized version of xerces-c_2 into a debug application + // has been known to cause run-time issues (as of 4/25/2005), so we + // will link in the debug version for the "Debug" configuration. + Debug::xerceslib = xerces-c_2D + } + specific(prop:borland) { + xerceslib = XercesLib + } + specific(!prop:windows) { + macros += XML_USE_PTHREADS + xerceslib = xerces-c + } + + // We have to use lit_libs here as the library decorator + // does not necessarily match what MPC uses (particularly for + // static builds). + lit_libs += $(XERCESLIB) +} +feature(xerces3) { + includes += $(XERCESCROOT)/include + libpaths += $(XERCESCROOT)/lib + + specific(prop:microsoft) { + xerceslib = xerces-c_3 + + // Linking the optimized version of xerces-c_2 into a debug application + // has been known to cause run-time issues (as of 4/25/2005), so we + // will link in the debug version for the "Debug" configuration. + Debug::xerceslib = xerces-c_3D + } + specific(prop:borland) { + xerceslib = XercesLib + } + specific(!prop:windows) { + macros += XML_USE_PTHREADS + xerceslib = xerces-c + } + + // We have to use lit_libs here as the library decorator + // does not necessarily match what MPC uses (particularly for + // static builds). + lit_libs += $(XERCESLIB) +} + diff --git a/ACE/MPC/config/yacc.mpb b/ACE/MPC/config/yacc.mpb new file mode 100644 index 00000000000..3f96b213383 --- /dev/null +++ b/ACE/MPC/config/yacc.mpb @@ -0,0 +1,15 @@ +// $Id$ +project { + requires += yacc + Define_Custom(YACC) { + automatic = 1 + command = yacc + commandflags = -d + postcommand = <%mv%> y.tab.c <%source_file%> <%and%> <%mv%> y.tab.h <%header_file%> + pch_postrule = 1 + inputext = .yy, .y + pre_extension = .tab + source_outputext = .c, .cpp, .cxx, .cc, .C + header_outputext = .h, .hpp, .hxx, .hh + } +} diff --git a/ACE/MPC/config/ziparchive.mpb b/ACE/MPC/config/ziparchive.mpb new file mode 100644 index 00000000000..6e80d7d3ea7 --- /dev/null +++ b/ACE/MPC/config/ziparchive.mpb @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +feature(ziparchive) { + includes += $(ZIPARCHIVEROOT)/. + libpaths += $(ZIPARCHIVEROOT)/lib + lit_libs += ziparch +}
\ No newline at end of file diff --git a/ACE/MPC/config/zlib.mpb b/ACE/MPC/config/zlib.mpb new file mode 100644 index 00000000000..0f24c99358e --- /dev/null +++ b/ACE/MPC/config/zlib.mpb @@ -0,0 +1,17 @@ +// -*- MPC -*- +// $Id$ + +feature(zlib) { + includes += "$(ZLIB_ROOT)/include" + libpaths += "$(ZLIB_ROOT)/lib" + macros += ZLIB + + // @@ Notice: If you are building with Cygwin, you may need to manually + // change the following library to zlib. + specific(prop:windows) { + zlibname = zlib + lit_libs += $(ZLIBNAME) + } else { + lit_libs += z + } +} diff --git a/ACE/MPC/config/zzip.mpb b/ACE/MPC/config/zzip.mpb new file mode 100644 index 00000000000..39125e503a9 --- /dev/null +++ b/ACE/MPC/config/zzip.mpb @@ -0,0 +1,17 @@ +// -*- MPC -*- +// $Id$ + +feature(zzip): zlib { + requires += zlib + includes += $(ZZIP_ROOT)/include + macros += USE_ZZIP + libpaths += $(ZZIP_ROOT)/lib + + // @@ Notice: If you are building with Cygwin, you may need to manually + // change the following library to zziplib. + specific(prop:windows) { + libs += zziplib + } else { + lit_libs += zzip + } +} diff --git a/ACE/MPC/create_base.pl b/ACE/MPC/create_base.pl new file mode 100755 index 00000000000..1788fa629b8 --- /dev/null +++ b/ACE/MPC/create_base.pl @@ -0,0 +1,199 @@ +#! /usr/bin/perl +eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' + & eval 'exec perl -w -S $0 $argv:q' + if 0; + +# ****************************************************************** +# Author: Chad Elliott +# Date: 9/13/2007 +# $Id$ +# Description: Generate a base project based on a library project +# ****************************************************************** + +# ****************************************************************** +# Pragma Section +# ****************************************************************** + +use strict; +use FindBin; +use FileHandle; +use File::Spec; +use File::Basename; + +my $basePath = $FindBin::Bin; +if ($^O eq 'VMS') { + $basePath = File::Spec->rel2abs(dirname($0)) if ($basePath eq ''); + $basePath = VMS::Filespec::unixify($basePath); +} +unshift(@INC, $basePath . '/modules'); + +require Creator; + +# ****************************************************************** +# Data Section +# ****************************************************************** + +my $version = '0.1'; + +# ****************************************************************** +# Subroutine Section +# ****************************************************************** + +sub gather_info { + my $name = shift; + my $fh = new FileHandle(); + + if (open($fh, $name)) { + my @lines = (); + my $pname = undef; + while(<$fh>) { + ## Get the line a remove leading and trailing white space + my $line = $_; + $line =~ s/^\s+//; + $line =~ s/\s+$//; + + ## Look for the project declaration and pull out the name and any + ## parents. + if ($line =~ /^project\s*(\(([^\)]+)\))?\s*(:.+)?\s*{$/) { + $pname = $2; + my $parents = $3 || ''; + + ## Create the default project name by removing the extension and + ## converting back-slashes, spaces and dashes to underscores. + ## This needs to be done regardless of whether the project name + ## was provided or not since it's used below in the + ## fill_type_name call. + my $def = basename($name); + $def =~ s/\.[^\.]+$//; + $def =~ s/\\/_/g; + $def =~ s/[\s\-]/_/g; + + if (!defined $pname || $pname eq '') { + ## Take the default project name since one wasn't provided. + $pname = $def; + } + else { + ## Convert back-slashes, spaces and dashes to underscores. + $pname =~ s/\\/_/g; + $pname =~ s/[\s\-]/_/g; + } + + ## If the project has a '*' we need to have MPC fix that up for + ## us. + $pname = Creator::fill_type_name(undef, $pname, $def); + push(@lines, "project$parents {"); + } + elsif ($line =~ /^(shared|static)name\s*=\s*(.+)$/) { + ## Add in the libs and after settings. + my $lib = $2; + if (defined $pname && $lib ne '') { + push(@lines, " libs += $2", + " after += $pname", + "}"); + } + last; + } + } + close($fh); + + ## Only return the lines if there is more than one line. It is + ## possible (and likely) that we've read in the project declaration, + ## but the project did not contain a sharedname or staticname + ## setting. + return @lines if ($#lines > 0); + } + + return (); +} + +sub write_base { + my($in, $out) = @_; + my @lines = gather_info($in); + + if ($#lines >= 0) { + if (-r $out) { + print STDERR "ERROR: $out already exists\n"; + } + else { + my $fh = new FileHandle(); + if (open($fh, ">$out")) { + foreach my $line (@lines) { + print $fh "$line\n"; + } + close($fh); + + ## Everything was ok, return zero. + return 0; + } + else { + print STDERR "ERROR: Unable to write to $out\n"; + } + } + } + else { + if (-r $in) { + print STDERR "ERROR: $in is not a valid MPC file\n"; + } + else { + print STDERR "ERROR: Unable to read from $in\n"; + } + } + + ## Non-zero indicates an error (as in the shell $? value). + return 1; +} + +sub usageAndExit { + my $str = shift; + print STDERR "$str\n" if (defined $str); + print STDERR "Create Base Project v$version\n", + "Usage: ", basename($0), " <mpc files> <output file or ", + "directory>\n\nThis script will create a base project ", + "based on the contents of the\nsupplied MPC file. ", + "This is only useful if the project ", + "explictly sets\nsharedname or staticname.\n"; + exit(0); +} + +# ****************************************************************** +# Main Section +# ****************************************************************** + +if ($#ARGV > 1) { + ## Get the last argument and make sure it's a directory. + my $dir = pop(@ARGV); + if (!-d $dir) { + usageAndExit("Creating multiple base projects, but the " . + "last argument, $dir, is not a directory"); + } + + ## Process each input file and create the base project with an implicit + ## base project file name. + my $status = 0; + foreach my $input (@ARGV) { + my $output = $dir . '/' . lc(basename($input)); + $output =~ s/mpc$/mpb/; + $status += write_base($input, $output); + } + exit($status); +} +else { + my $input = shift; + my $output = shift; + + ## Print the usage and exit if there is no input, output or the input + ## file looks like an option. + usageAndExit() if (!defined $output || + !defined $input || index($input, '-') == 0); + + ## If the output file is a directory, we will create the output file + ## name based on the input file. + if (-d $output) { + $output .= '/' . lc(basename($input)); + $output =~ s/mpc$/mpb/; + } + + ## Create the base project and return the status to the caller of the + ## script. + exit(write_base($input, $output)); +} diff --git a/ACE/MPC/depgen.pl b/ACE/MPC/depgen.pl new file mode 100755 index 00000000000..9a3af91a5a3 --- /dev/null +++ b/ACE/MPC/depgen.pl @@ -0,0 +1,36 @@ +#! /usr/bin/perl +eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' + & eval 'exec perl -w -S $0 $argv:q' + if 0; + +# ************************************************************ +# Description : Generate dependencies for Make and NMake. +# Author : Chad Elliott +# Create Date : 5/06/2002 +# $Id$ +# ************************************************************ + +# ************************************************************ +# Pragma Section +# ************************************************************ + +use strict; +use FindBin; +use File::Spec; +use File::Basename; + +my $basePath = $FindBin::Bin; +if ($^O eq 'VMS') { + $basePath = File::Spec->rel2abs(dirname($0)) if ($basePath eq ''); + $basePath = VMS::Filespec::unixify($basePath); +} +unshift(@INC, $basePath . '/modules/Depgen', $basePath . '/modules'); + +require Driver; + +# ************************************************************ +# Main Section +# ************************************************************ + +my $driver = new Driver(); +exit($driver->run(\@ARGV)); diff --git a/ACE/MPC/devtools/document_template.pl b/ACE/MPC/devtools/document_template.pl new file mode 100755 index 00000000000..f1c51f65cd4 --- /dev/null +++ b/ACE/MPC/devtools/document_template.pl @@ -0,0 +1,372 @@ +#! /usr/bin/perl +eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' + & eval 'exec perl -w -S $0 $argv:q' + if 0; + +# ****************************************************************** +# Author: Chad Elliott +# Date: 7/12/2006 +# $Id$ +# ****************************************************************** + +# ****************************************************************** +# Pragma Section +# ****************************************************************** + +use strict; +use FileHandle; +use FindBin; +use File::Spec; +use File::Basename; + +my $basePath = $FindBin::Bin; +if ($^O eq 'VMS') { + $basePath = File::Spec->rel2abs(dirname($0)) if ($basePath eq ''); + $basePath = VMS::Filespec::unixify($basePath); +} +$basePath = dirname($basePath); +unshift(@INC, $basePath . '/modules'); + +require ProjectCreator; +require TemplateParser; +require ConfigParser; +require StringProcessor; + +# ****************************************************************** +# Data Section +# ****************************************************************** + +my %keywords; +my %arrow_op; +my $doc_ext = '.txt'; +my $version = '1.3'; + +# ****************************************************************** +# Subroutine Section +# ****************************************************************** + +sub setup_keywords { + my $language = shift; + + ## Get the main MPC keywords + my $keywords = ProjectCreator::getKeywords(); + foreach my $key (keys %$keywords) { + $keywords{$key} = 1; + } + + ## Get the MPC valid components + $keywords = ProjectCreator::getValidComponents($language); + foreach my $key (keys %$keywords) { + $keywords{lc($key)} = 1; + } + + ## Get the pseudo template variables + my $pjc = new ProjectCreator(); + $keywords = $pjc->get_command_subs(); + foreach my $key (keys %$keywords) { + $keywords{$key} = 1; + } + + ## Get the template function names + $keywords = TemplateParser::getKeywords(); + foreach my $key (keys %$keywords) { + $keywords{$key} = 1; + } + + ## Get the template parser arrow operator keys + $keywords = TemplateParser::getArrowOp(); + foreach my $key (keys %$keywords) { + $arrow_op{$key} = 1; + } +} + + +sub display_template { + my($fh, $cp, $input, $tkeys) = @_; + + print $fh '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n", + "<head>\n", + " <title>$input</title>\n", + " <style type=\"text/css\">\n", + " h1 {font: 36pt verdana, lucida; width: 800px; color: darkcyan;}\n", + " td {font: 12pt verdana, lucida; color: white; padding: 3px; background-color: cadetblue;}\n", + " td.sub {font: 12pt verdana, lucida; color: white; padding: 3px; background-color: darkcyan;}\n", + " td.subsub {font: 12pt verdana, lucida; color: white; padding: 3px; padding-left: 12px; background-color: darkcyan;}\n", + " thead tr td {font: 16pt \"trebuchet ms\", helvetica; color: white; padding: 3px; background-color: teal;}\n", + " th {font: 14pt bold verdana, lucida; background-color: teal; color: white; padding: 3px;}\n", + " </style>\n", + "</head>\n", + "<body>\n", + " <h1>$input</h1>\n", + " <table>\n", + " <tr>\n", + " <th>Template Variable</th>\n", + " <th>Default Value</th>\n", + " <th>Description</th>\n", + " </tr>\n"; + foreach my $key (sort keys %$tkeys) { + my $desc = $cp->get_value($key) || ' '; + my $def; + if (defined $$tkeys{$key}) { + foreach my $ikey (sort keys %{$$tkeys{$key}}) { + if (defined $def) { + $def .= ' <b>or</b> '; + } + else { + $def = ''; + } + $def .= StringProcessor::process_special(undef, $ikey); + } + } + + ## Convert < and > to html friendly codes + $desc =~ s/</</g; + $desc =~ s/>/>/g; + + print $fh " <tr>\n", + " <td>$key</td>\n", + " <td>", (defined $def ? $def : ' '), "</td>\n", + " <td>$desc</td>\n", + " </tr>\n"; + } + print $fh " </table>\n", + "</body>\n"; +} + + +sub usageAndExit { + print "document_template.pl v$version\n", + "Usage: ", basename($0), " <template> [<html output> [language]]\n\n", + "html output - This defaults to the name of the template file ", + "with the .mpd\n extenion replaced with .html.\n", + "language - This defaults to the language for which the ", + "template is designed.\n It can be any of the valid ", + "language settings for MPC:\n ", + join(' ', sort(Creator::validLanguages())), "\n"; + exit(0); +} + +# ****************************************************************** +# Main Section +# ****************************************************************** + +my $status = 0; +my $fh = new FileHandle(); +my $input = $ARGV[0]; +my $output = $ARGV[1]; +my $language = $ARGV[2]; + +usageAndExit() if (!defined $input || $input =~ /^-/); + +if (!defined $output) { + $output = $input; + $output =~ s/\.mpd$//; + $output .= '.html'; +} + +if (open($fh, $input)) { + if (!defined $language) { + if (index($input, 'vb') != -1) { + $language = Creator::vb(); + } + elsif (index($input, 'csharp') != -1 || index($input, '.net') != -1) { + $language = Creator::csharp(); + } + elsif (index($input, 'java') != -1) { + $language = Creator::java(); + } + else { + $language = Creator::cplusplus(); + } + } + + my %template_keys; + setup_keywords($language); + + my @foreach; + my $findex = -1; + while(<$fh>) { + my $len = length($_); + for(my $start = 0; $start < $len;) { + my $sindex = index($_, '<%', $start); + if ($sindex >= 0) { + my $eindex = index($_, '%>', $sindex); + if ($eindex >= $sindex) { + $eindex += 2; + } + else { + $eindex = $len; + } + + my $part = substr($_, $sindex, $eindex - $sindex); + my $key = substr($part, 2, length($part) - 4); + my $name = lc($key); + my $tvar; + my $def; + if ($key =~ /^([^\(]+)\((.*)\)/) { + $name = lc($1); + my $vname = $2; + + if (defined $keywords{$name}) { + $tvar = 1; + if ($name eq 'foreach') { + ++$findex; + + ## Remove the functions inside the foreach + foreach my $keyword (keys %keywords) { + $vname =~ s/$keyword\(([^\)]+)\)/$1/gi; + } + + my $remove_s = 1; + if ($vname =~ /([^,]*),(.*)/) { + my $n = $1; + my $v = $2; + $n =~ s/^\s+//; + $n =~ s/\s+$//; + $v =~ s/^\s+//; + $v =~ s/\s+$//; + + if ($n =~ /^\d+$/) { + $n = $v; + } + else { + $remove_s = undef; + } + $vname = $n; + } + + $name = lc($vname); + + $key = lc($vname); + $vname =~ s/\s.*//; + $vname =~ s/s$// if ($remove_s); + + $foreach[$findex] = lc($vname); + $tvar = undef; + } + elsif ($name eq 'if') { + $vname =~ s/(!|&&|\|\|)//g; + + ## Keep pulling off keyword functions until we get down to + ## the actual template variable used in the function call. + my $retry; + do { + $retry = undef; + foreach my $keyword (keys %keywords) { + if ($vname =~ s/$keyword\((.*)[\)]?/$1/g) { + $retry = 1 if ($vname ne ''); + last; + } + } + } while($retry); + $vname =~ s/\s*,.*//; + $vname =~ s/\)//g; + + if ($vname !~ /^\s*$/) { + $name = lc($vname); + $key = lc($vname); + $tvar = undef; + } + } + } + else { + $def = $2; + } + } + else { + $key = lc($key); + } + + my $otvar = $tvar; + foreach my $k (split(/\s+/, $key)) { + $tvar = $otvar; + if (defined $keywords{$k}) { + $tvar = 1; + if ($k eq 'endfor') { + $foreach[$findex] = undef; + --$findex; + } + } + else { + foreach my $ao (keys %arrow_op) { + if ($k =~ /^$ao/) { + $tvar = 1; + last; + } + } + } + + if (!$tvar) { + for(my $index = 0; $index <= $findex; $index++) { + if ($foreach[$index] eq $k) { + $tvar = 1; + last; + } + } + } + + if (!$tvar) { + foreach my $n (split(/\s+/, $name)) { + $tvar = undef; + if (defined $keywords{$n}) { + } + else { + foreach my $ao (keys %arrow_op) { + if ($n =~ /^$ao/) { + $tvar = 1; + last; + } + } + if (!$tvar) { + if (defined $template_keys{$n}) { + if (defined $def) { + $template_keys{$n}->{$def} = 1; + } + } + else { + $template_keys{$n} = {}; + $template_keys{$n}->{$def} = 1 if (defined $def); + } + } + } + } + } + } + $start = $eindex; + } + else { + $start += ($len - $start); + } + } + } + close($fh); + + my $cp = new ConfigParser(); + $cp->read_file("$basePath/docs/templates/common$doc_ext"); + + my $doc = $input; + $doc =~ s/\.[^\.]+$/$doc_ext/; + $doc =~ s/templates/docs\/templates/; + if (-r $doc) { + $cp->read_file($doc); + } + else { + $cp->read_file("$basePath/docs/templates/" . basename($doc)); + } + + if (open($fh, ">$output")) { + display_template($fh, $cp, $input, \%template_keys); + close($fh); + } + else { + print STDERR "ERROR: Unable to open $output for writing\n"; + ++$status; + } +} +else { + print STDERR "ERROR: Unable to open $input for reading\n"; + ++$status; +} + +exit($status); + diff --git a/ACE/MPC/devtools/highlight_template.pl b/ACE/MPC/devtools/highlight_template.pl new file mode 100755 index 00000000000..e8d77920a0e --- /dev/null +++ b/ACE/MPC/devtools/highlight_template.pl @@ -0,0 +1,242 @@ +#! /usr/bin/perl +eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' + & eval 'exec perl -w -S $0 $argv:q' + if 0; + +# ****************************************************************** +# Author: Chad Elliott +# Date: 2/16/2006 +# $Id$ +# ****************************************************************** + +# ****************************************************************** +# Pragma Section +# ****************************************************************** + +use strict; +use FileHandle; +use FindBin; +use File::Spec; +use File::Basename; + +my $basePath = $FindBin::Bin; +if ($^O eq 'VMS') { + $basePath = File::Spec->rel2abs(dirname($0)) if ($basePath eq ''); + $basePath = VMS::Filespec::unixify($basePath); +} +$basePath = dirname($basePath); +unshift(@INC, $basePath . '/modules'); + +require ProjectCreator; +require TemplateParser; + +# ****************************************************************** +# Data Section +# ****************************************************************** + +my %keywords; +my %arrow_op; +my $ifmod = 0; +my $formod = 0; +my $cmod = 50; +my %keycolors = (0 => [160, 32, 240], + 1 => [255, 50, 50], + 2 => [50, 50, 255], + ); +my $version = '1.3'; + +# ****************************************************************** +# Subroutine Section +# ****************************************************************** + +sub setup_keywords { + ## Get the main MPC keywords + my $keywords = ProjectCreator::getKeywords(); + foreach my $key (keys %$keywords) { + $keywords{$key} = 0; + } + + ## Get the pseudo template variables + my $pjc = new ProjectCreator(); + $keywords = $pjc->get_command_subs(); + foreach my $key (keys %$keywords) { + $keywords{$key} = 0; + } + + ## Get the template function names + $keywords = TemplateParser::getKeywords(); + foreach my $key (keys %$keywords) { + $keywords{$key} = 0; + } + + ## Get the template parser arrow operator keys + $keywords = TemplateParser::getArrowOp(); + foreach my $key (keys %$keywords) { + $arrow_op{$key} = 0; + } + + ## These TemplateParser keywords need special values so + ## that the color coding will recognize these as different + ## from the rest of the keywords + foreach my $key ('if', 'else', 'endif') { + $keywords{$key} = 1; + } + foreach my $key ('foreach', 'forfirst', + 'fornotfirst', 'fornotlast', 'forlast', 'endfor') { + $keywords{$key} = 2; + } +} + + +sub convert_to_html { + my $line = shift; + $line =~ s/&/&/g; + $line =~ s/</</g; + $line =~ s/>/>/g; + $line =~ s/"/"/g; + $line =~ s/ / /g; + $line =~ s/\t/ /g; + $line =~ s/\n/<br>/; + return $line; +} + + +sub usageAndExit { + print "highlight_template.pl v$version\n", + "Usage: ", basename($0), " <template> [html output]\n\n", + "This script will color highlight the template provided using\n", + "varying colors for the different keywords, variables and text.\n", + "Nested if's and foreach's will have slightly different colors.\n"; + exit(0); +} + +# ****************************************************************** +# Main Section +# ****************************************************************** + +my $status = 0; +my $fh = new FileHandle(); +my $input = $ARGV[0]; +my $output = $ARGV[1]; + +usageAndExit() if (!defined $input || $input =~ /^-/); + +if (!defined $output) { + $output = $input; + $output =~ s/\.mpd$//; + $output .= '.html'; +} + +if (open($fh, $input)) { + setup_keywords(); + + my $deftxt = 'black'; + my @codes; + while(<$fh>) { + my $len = length($_); + for(my $start = 0; $start < $len;) { + my $sindex = index($_, '<%', $start); + if ($sindex >= 0) { + my $left = substr($_, $start, $sindex - $start); + if ($left ne '') { + push(@codes, [$deftxt, $left]); + } + my $eindex = index($_, '%>', $sindex); + if ($eindex >= $sindex) { + $eindex += 2; + } + else { + $eindex = $len; + } + + my $part = substr($_, $sindex, $eindex - $sindex); + my $key = substr($part, 2, length($part) - 4); + my $name = $key; + my $color = 'green'; + my @entry; + if ($key =~ /^([^\(]+)\(.*\)/) { + $name = $1; + if (defined $keywords{$name}) { + @entry = @{$keycolors{$keywords{$1}}}; + } + } + elsif (defined $keywords{$key}) { + @entry = @{$keycolors{$keywords{$key}}}; + } + else { + foreach my $ao (keys %arrow_op) { + if ($key =~ /^$ao/) { + @entry = @{$keycolors{$arrow_op{$ao}}}; + last; + } + } + } + + if (defined $entry[0]) { + if ($name eq 'if') { + $ifmod++; + $entry[0] -= ($cmod * ($ifmod - 1)); + } + elsif ($name eq 'endif') { + $entry[0] -= ($cmod * ($ifmod - 1)); + $ifmod-- if ($ifmod > 0); + } + elsif (defined $keywords{$name} && + $keywords{$name} == $keywords{'if'}) { + $entry[0] -= ($cmod * ($ifmod - 1)); + } + elsif ($name eq 'foreach') { + $formod++; + $entry[2] -= ($cmod * ($formod - 1)); + } + elsif ($name eq 'endfor') { + $entry[2] -= ($cmod * ($formod - 1)); + $formod-- if ($formod > 0); + } + elsif (defined $keywords{$name} && + $keywords{$name} == $keywords{'foreach'}) { + $entry[2] -= ($cmod * ($formod - 1)); + } + foreach my $entry (@entry) { + $entry = 0 if ($entry < 0); + } + $color = '#' . sprintf("%02x%02x%02x", @entry); + } + + push(@codes, [$color, $part]); + $start = $eindex; + } + else { + my $part = substr($_, $start, $len - $start); + push(@codes, [$deftxt, $part]); + $start += ($len - $start); + } + } + } + close($fh); + + if (open($fh, ">$output")) { + print $fh "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n", + "<html><head><title>", basename($input), "</title></head>\n", + "<body>\n"; + foreach my $code (@codes) { + $$code[1] = convert_to_html($$code[1]); + my $newline = ($$code[1] =~ s/<br>//); + print $fh ($$code[1] ne '' ? + "<font color=\"$$code[0]\">$$code[1]</font>" : ''), + ($newline ? "<br>\n" : ''); + } + print $fh "</body></html>\n"; + } + else { + print STDERR "ERROR: Unable to open $output for writing\n"; + ++$status; + } +} +else { + print STDERR "ERROR: Unable to open $input for reading\n"; + ++$status; +} + +exit($status); + diff --git a/ACE/MPC/docs/LICENSE b/ACE/MPC/docs/LICENSE new file mode 100644 index 00000000000..6639f549d0b --- /dev/null +++ b/ACE/MPC/docs/LICENSE @@ -0,0 +1,53 @@ +MPC (Licensed Product) is protected by copyright, and is distributed under +the following terms. + +MPC (Make, Project and workspace Creator) is an open source tool, developed +by OCI and written in Perl. It is designed to generate a variety of tool +specific project files from a common baseline. Through the powerful +combination of inheritance and defaults MPC is able to reduce the +maintenance burden normally associated with keeping multiple target +platforms, their unique build tools, and inconsistent feature sets current. +It is also easily extensible to support new build environments. The +objective is to solve the prevalent problem of fragile build environments, +usually experienced by developer groups, by replacing it with a singular +robust build environment, and an active community of users committed to its +evolution. + +Since MPC is open source and free of licensing fees, you are free to use, +modify, and distribute the source code, as long as you include this +copyright statement. + +In particular, you can use MPC to build proprietary software and are under +no obligation to redistribute any of your source code that is built using +MPC. Note, however, that you may not do anything to the MPC code, such as +copyrighting it yourself or claiming authorship of the MPC code, that will +prevent MPC from being distributed freely using an open source development +model. + +Warranty + +LICENSED PRODUCT IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING +THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE, NON-INFRINGEMENT, OR ARISING FROM A COURSE OF DEALING, USAGE OR +TRADE PRACTICE. + +Support + +LICENSED PRODUCT IS PROVIDED WITH NO SUPPORT AND WITHOUT ANY OBLIGATION ON +THE PART OF OCI OR ANY OF ITS SUBSIDIARIES OR AFFILIATES TO ASSIST IN ITS +USE, CORRECTION, MODIFICATION OR ENHANCEMENT. + +Support may be available from OCI to users who have agreed to a support +contract. + +Liability + +OCI OR ANY OF ITS SUBSIDIARIES OR AFFILIATES SHALL HAVE NO LIABILITY WITH +RESPECT TO THE INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY +LICENSED PRODUCT OR ANY PART THEREOF. + +IN NO EVENT WILL OCI OR ANY OF ITS SUBSIDIARIES OR AFFILIATES BE LIABLE FOR +ANY LOST REVENUE OR PROFITS OR OTHER SPECIAL, INDIRECT AND CONSEQUENTIAL +DAMAGES, EVEN IF OCI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +MPC copyright OCI. St. Louis MO USA, 2003-2006 diff --git a/ACE/MPC/docs/MPC.sgml b/ACE/MPC/docs/MPC.sgml new file mode 100644 index 00000000000..c6a8765b835 --- /dev/null +++ b/ACE/MPC/docs/MPC.sgml @@ -0,0 +1,560 @@ +<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [ + <!ENTITY mpc "mpc.pl"> + <!ENTITY mwc "mwc.pl"> +]> +<!-- This file was written by Thomas Girard <thomas.g.girard@free.fr> --> +<!-- on May 2006 for the Debian GNU/Linux operating system. --> +<!-- It is mainly a plain text to DocBook conversion of the USAGE file. --> +<refentry> + <refmeta> + <refentrytitle>MPC</refentrytitle> + <manvolnum>1</manvolnum> + </refmeta> + <refnamediv> + <refname>&mpc;, &mwc;</refname> + <refpurpose>generate project and workspace files</refpurpose> + </refnamediv> + <refsynopsisdiv> + <cmdsynopsis> + <command>&mpc;</command> + <arg rep="repeat"><replaceable>OPTION</replaceable></arg> + <arg rep="repeat"><replaceable>FILE</replaceable></arg> + </cmdsynopsis> + <cmdsynopsis> + <command>&mwc;</command> + <arg rep="repeat"><replaceable>OPTION</replaceable></arg> + <arg rep="repeat"><replaceable>FILE</replaceable></arg> + </cmdsynopsis> + </refsynopsisdiv> + <refsect1> + <title>DESCRIPTION</title> + <para> + <command>&mpc;</command> and <command>&mwc;</command>, the Makefile, + Project and Workspace Creator generate platform and compiler specific + files to automate the compilation process + (e.g. <filename>GNUmakefile</filename> + and <filename>Makefile.am</filename>). + </para> + <para> + The most common way to use the Make Project Creator is to run the + workspace generator (<command>&mwc;</command>). This script will + generate projects and a single workspace that contains the generated + projects. If no input + <replaceable>FILE</replaceable> (<filename>.mwc</filename> file) + is specified, it will recurse into + the directory in which the script was started. It looks for + <filename>.mpc</filename> files and generates a project or projects + for each one found. + </para> + <para> + Most of what is stated about <command>&mwc;</command> applies to + <command>&mpc;</command> except that it only generates projects. If an + input <replaceable>FILE</replaceable> (<filename>.mpc</filename> file) is + not provided, the project creator will attempt to create a default + project in the directory from which the script was started. + </para> + <variablelist> + <varlistentry> + <term><parameter>-global</parameter> <replaceable>file</replaceable></term> + <listitem> + <para> + specifies the global input file. Values stored within this file are + applied to all projects. If not specified, defaults to + <filename>config/global.mpb</filename> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-include</parameter> <replaceable>directory</replaceable></term> + <listitem> + <para> + specifies a directory to search when looking for base projects, + template input files and templates. This option can be used + multiple times to add directories. Two include directories + are used by default (<filename class="directory">config</filename> + and <filename class="directory">templates</filename>) + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-recurse</parameter></term> + <listitem> + <para> + recurse from the current directory and generate from all found + input files. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-ti dll | lib | dll_exe | lib_exe:</parameter><replaceable>file</replaceable></term> + <listitem> + <para> + specifies the template input file (with no extension) for the + specific type, e.g. <parameter>-ti dll_exe:vc8exe</parameter>. Each + project creator has a default template input file for each type of + project (<parameter>dll_exe</parameter>, <parameter>lib_exe</parameter>, + <parameter>dll</parameter>, <parameter>lib</parameter>). You can + override the default template input file name with the + <parameter>-ti</parameter> option. The file must have a + <filename>mpt</filename> extension and must reside within the + include search directories. NOTE: the <parameter>lib</parameter> + and the <parameter>lib_exe</parameter> template input files are only + used when MPC is generating static projects + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-hierarchy</parameter></term> + <listitem> + <para> + generate a workspace in a hierarchical fashion. Forces the + generation of a hierarchical workspace at each directory level in + between the toplevel directory and the location of the + <filename>.mpc</filename> file that is being processed. This is the + default for <parameter>make</parameter> based workspace creators. + NOTE: This option has no effect when when used with + <command>&mpc;</command> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-template</parameter> <replaceable>file</replaceable></term> + <listitem> + <para> + specifies the template name (with no extension). + <replaceable>file</replaceable> should have a + <filename>.mpd</filename> extension and sit in one of the include + search directories. NOTE: The <parameter>-template</parameter> + option overrides the template file for all types specified + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-relative</parameter> <replaceable>name</replaceable>=<replaceable>var</replaceable></term> + <listitem> + <para> + any <varname>$()</varname> variable in an mpc file that is matched to + <replaceable>name</replaceable> is replaced by + <replaceable>var</replaceable> only if + <replaceable>var</replaceable> can be made into a relative path based + on the current working directory + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-base</parameter> <replaceable>project</replaceable></term> + <listitem> + <para> + add <replaceable>project</replaceable> as a base project to each + generated project file. Do not provide a file extension, the + <filename>.mpb</filename> extension will be tried first; if that + fails the <filename>.mpc</filename> extension will be tried + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-nocomments</parameter></term> + <listitem> + <para> + do not place comments in the generated files + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-noreldefs</parameter></term> + <listitem> + <para> + do not try to generate default relative definitions for + <varname>*_ROOT</varname>, which come from environment variables + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-notoplevel</parameter></term> + <listitem> + <para> + do not generate the top level target file. Files are still processed, + but no top level file is created. For <command>&mwc;</command>, it + says process all projects for a workspace, but do not generate the + top level workspace file. For <command>&mpc;</command>, it says + process the <filename>.mpc</filename> files, but do not generate + the project files + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-static</parameter></term> + <listitem> + <para> + specifies that only static projects are generated. By default, + only dynamic projects will be generated. This parameter was + previously <parameter>-static_only</parameter>. Currently, + <command>&mpc;</command> only supports generating dynamic projects + or static projects, but not both during the same run. To generate + them both you must run <command>&mpc;</command> twice, once with the + <parameter>-static</parameter> option and once without. + Additionally, the <parameter>vc6</parameter>, + <parameter>em3</parameter>, <parameter>vc7</parameter>, + <parameter>vc71</parameter> and <parameter>vc8</parameter> project + names will no longer automatically have + <filename>_Static</filename> appended to the project name when + generating static projects. This can still be achieved by using the + <parameter>-name_modifier</parameter> option. + </para> + <para> + When generating static projects, inter-project dependencies will + not be generated for libraries within <parameter>vc6</parameter>, + <parameter>em3</parameter>, <parameter>vc7</parameter>, + and <parameter>vc71</parameter> workspaces. The reason is due to + the fact that each static library that depended upon another would + be combined at the library creation stage, resulting in extremely + large libraries. Dependencies are handled correctly by vc8 and + later. This behavior can be modified by setting the + <envar>MPC_DEPENDENCY_COMBINED_STATIC_LIBRARY</envar> environment + variable. It will force <command>&mpc;</command> to generate + inter-project dependencies for libraries within a single workspace + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-genins</parameter></term> + <listitem> + <para> + generate <filename>.ins</filename> files after + processing each project that can be used in conjunction with the + <command>prj_install.pl</command> script to install different + parts of the project (such as header files) into an alternate + location + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-use_env</parameter></term> + <listitem> + <para> + use environment variables for all uses of + <varname>$()</varname> instead of the relative replacement values + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-value_template</parameter> <replaceable>name</replaceable><parameter>+=</parameter><replaceable>val</replaceable> | <replaceable>name</replaceable><parameter>=</parameter><replaceable>val</replaceable> | <replaceable>name</replaceable><parameter>-=</parameter><replaceable>val</replaceable></term> + <listitem> + <para> + this option allows modification of a template input name pair. Use + <parameter>+=</parameter> to add + <replaceable>val</replaceable> to the + <replaceable>name</replaceable>'s value. Use + <parameter>-=</parameter> to subtract and <parameter>=</parameter> to + override the value. If a template variable value will contain + spaces, it is best to enclose the whole setting in double quotes + and use single quotes within the value to retain spaces (if it is + necessary) + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-value_project</parameter> <replaceable>name</replaceable><parameter>+=</parameter><replaceable>val</replaceable> | <replaceable>name</replaceable><parameter>=</parameter><replaceable>val</replaceable> | <replaceable>name</replaceable><parameter>-=</parameter><replaceable>val</replaceable></term> + <listitem> + <para> + this option allows modification of a project variable + assignment. Use <parameter>+=</parameter> to add + <replaceable>val</replaceable> to the + <replaceable>name</replaceable>'s value. Use + <parameter>-=</parameter> to subtract and <parameter>=</parameter> to + override the value. This can be used to introduce new name value + pairs to a project. However, it must be a valid project assignment + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-make_coexistence</parameter></term> + <listitem> + <para> + if multiple <command>make</command> based project types are generated, + they will be named such that they can coexist + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-feature_file</parameter> <replaceable>file</replaceable></term> + <listitem> + <para> + specifies the features file to read before processing. These + feature names can be anything, but they should correspond + to values used for the <property>requires</property> and + <property>avoids</property> keywords. If a feature is required and + is not enabled then the project will not be created. If a feature + is to be avoided and it is enabled then the project will not be + created. The default feature file is + <filename>default.features</filename> under the + <filename class="directory">config</filename> directory + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-expand_vars</parameter></term> + <listitem> + <para> + perform direct expansion, instead of performing relative replacement + with either <parameter>-use_env</parameter> or + <parameter>-relative</parameter> options + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-features</parameter> <replaceable>features</replaceable></term> + <listitem> + <para> + specifies the feature list to set before processing. Values + specified by this option overwrite values from features files, + e.g. <parameter>-features "qos=1,ssl=0"</parameter> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-gendot</parameter></term> + <listitem> + <para> + generate .dot files for use with <command>Graphvis</command>. + This option, which is only useful with <command>&mwc;</command>, + will result in the generation of .dot files for each workspace + processed. Each .dot file will contain information that can be + fed to Graphvis to display the dependency information for the + various projects found within the workspace. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-exclude</parameter> <replaceable>directories</replaceable></term> + <listitem> + <para> + use this option to exclude directories or files when searching for + input files. NOTE: This option has no effect when used with + <command>&mpc;</command> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-name_modifier</parameter> <replaceable>pattern</replaceable></term> + <listitem> + <para> + modify generated workspace or project names. The + <replaceable>pattern</replaceable> passed + to this parameter will have the <filename>*</filename> portion + replaced with the actual output name. For example + <parameter>-name_modifier '*_Static'</parameter> will result in all + workspace and project names ending in <filename>_Static</filename>, + e.g. <filename>FOO_Static.dsw</filename> and + <filename>FOO_Static.dsp</filename> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-apply_project</parameter></term> + <listitem> + <para> + when used in conjunction with <parameter>-name_modifier</parameter>, + it applies the name modifier to the project name also. NOTE: this + option has no effect without the + <parameter>-name_modifier</parameter> option + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-version</parameter></term> + <listitem> + <para> + print the MPC version and exit + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-into</parameter> <replaceable>directory</replaceable></term> + <listitem> + <para> + place all output files in a mirrored directory structure starting + at <replaceable>directory</replaceable> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-gfeature_file</parameter> <replaceable>file</replaceable></term> + <listitem> + <para> + specifies the global feature file. The default value is + <filename>global.features</filename> under the + <filename class="directory">config</filename> directory + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-language cplusplus | csharp | java | vb</parameter></term> + <listitem> + <para> + specify the language preference. The default is + <parameter>cplusplus</parameter> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>-type automake | bcb2007 | bcb2009 | bds4 | bmake | cc | em3 | ghs | html | make | nmake | sle | vc6 | vc7 | vc71 | vc8 | vc9 | vc10 | wb26</parameter></term> + <listitem> + <para> + specifies the type of project file to generate. This option can + be used multiple times to generate multiple types. There is no + longer a default. NOTE: The <parameter>-ti</parameter> + option overrides the template input file for all types specified + </para> + </listitem> + </varlistentry> + + </variablelist> + <refsect2> + <title>MPC Codebase Configuration File</title> + <para> + This configuration file can be used to specify alternate locations for the + MPC Configuration File. If a base.cfg is found underneath the 'config' + directory where MPC is executed, it will be read to determine the location + of MPC.cfg based on the directory in which MPC was started. + </para> + <para> + For example, if $MPC_ROOT/mwc.pl is run under /foo/bar_root/src and + $MPC_ROOT/config/base.cfg contained: + </para> + <para> + /foo/bar_root = /foo/bar_root/MPC/config + </para> + <para> + MPC would attempt to open and read /foo/bar_root/MPC/config/MPC.cfg as the + MPC Configuration File. If the base configuration file is not present, + MPC will try to use $MPC_ROOT/config/MPC.cfg as the MPC Configuration File. + </para> + <para> + You may reference environment variables, accessed by $NAME, on either side + of the equals sign. + </para> + </refsect2> + <refsect2> + <title>MPC Configuration File</title> + <para> + In an effort to move away from the use of environment variables, a + configuration file has been introduced. The configuration file (MPC.cfg) + can contain settings to provide command line options, control logging and + direct MPC to dynamic project types. + </para> + <para> + The following keywords are allowed in the configuration file, which will + be read from the 'config' directory of MPC. + </para> + <para> + <variablelist> + <varlistentry> + <term><parameter>command_line</parameter></term> + <listitem> + <para> + provide additional command line options to MPC. The value of + this setting will be prepended to the options passed to + <command>&mwc;</command> or <command>&mpc;</command> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>default_type</parameter></term> + <listitem> + <para> + provide a single project type (as specified by the -type + option) as the default project type + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>dynamic_types</parameter></term> + <listitem> + <para> + this comma separated list points to directories in which + MPC will search for Perl modules to implement additional + MPC project types, base projects or template files. This + setting can be used to augment or replace functionality + in MPC. For each suitable directory found, it will add a + <property>modules</property> include path for Perl to find + modules, add a <property>config</property> include path to + locate base projects and a <property>template</property> + include path to find MPC templates. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><parameter>includes</parameter></term> + <listitem> + <para> + similar to the -include command line option, it adds the + list of comma separated paths to the MPC include search paths. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><envar>logging</envar></term> + <listitem> + <para> + if this setting contains + <property>info=1</property>, informational + messages will be printed. If it contains + <property>warn=1</property>, warning + messages will be printed. If it contains + <property>diag=1</property>, diagnostic + messages will be printed. If it contains + <property>debug=1</property>, debug + messages will be printed. And lastly, if it contains + <property>detail=1</property>, + detail messages will be printed. If it contains none of these, + <command>&mpc;</command> will not print out any information or + warnings when processing projects or workspaces. Errors are + always printed if any are encountered. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><envar>verbose_ordering</envar></term> + <listitem> + <para> + if this is set, <command>&mwc;</command> will warn the user about + references to projects in the <property>after</property> keyword + that have not been processed + </para> + </listitem> + </varlistentry> + </variablelist> + </para> + </refsect2> + <refsect2> + <title>ENVIRONMENT VARIABLES</title> + <para> + The following environment variable could affect + <command>&mwc;</command> and <command>&mpc;</command>: + + <variablelist> + <varlistentry> + <term><envar>MPC_DEPENDENCY_COMBINED_STATIC_LIBRARY</envar></term> + <listitem> + <para> + see the help on <parameter>-static</parameter> parameter above + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><envar>MPC_GHS_UNIX</envar></term> + <listitem> + <para> + this environment variable is only meaningful when generating + the ghs project files. By default, the ghs type assumes that it is for + Windows. If this is not the case, set this environment variable + prior to running MPC + </para> + </listitem> + </varlistentry> + </variablelist> + </para> + </refsect2> + </refsect1> +</refentry> diff --git a/ACE/MPC/docs/README b/ACE/MPC/docs/README new file mode 100644 index 00000000000..ad67a3c9dec --- /dev/null +++ b/ACE/MPC/docs/README @@ -0,0 +1,981 @@ +.:: 3/13/2002 ::. + +The Makefile, Project and Workspace Creator. +Designed by Justin Michel (michel_j@ociweb.com) and Chad Elliott. +Implemented by Chad Elliott (elliott_c@ociweb.com). + +A single tool (MPC) can be used to generate tool specific input (i.e., +Makefile, dsp, vcproj, etc.) The generator takes platform and building +tool generic files (mpc files) as input which describe basic information +needed to generate a "project" file for various build tools. These tools +include Make, NMake, Visual C++ 6, Visual C++ 7, etc. + +One of the many unique and useful features of the Makefile, Project and +Workspace Creator is that the project definition files can employ the idea +of inheritance. This feature allows a user to set up a basic base project +(mpb file) that can contain information that is applicable to all +sub-projects. Things such as include paths, library paths and inter-project +dependencies could be described in this base project and any project that +inherits from it would contain this information as well. + +Another set of files, known as template input files (mpt files), provides +the generator with the necessary information to fill platform and build tool +specific information for dynamic and static library and binary executable +projects. + +Together, the generic input files and the template input files are applied +toward a platform and build specific template (mpd file) to create the final +product (a build tool specific input file). These templates contain +"variables" that are filled in by the project creator with information +gathered through the mpc and mpt files and possibly by default values set +within the template itself. + +Workspaces are defined by providing a list of mpc files in a single (mwc) +file. For each mpc file specified, the workspace creator (mwc.pl) calls +upon the project creator to generate the project. After all of the projects +are successfully generated, the tool specific workspace is generated +containing the projects and any defined inter-project dependency information +(if supported by the build tool). If no workspace files are provided to the +workspace creator, then the current directory is traversed and any mpc files +located will be part of the workspace that is generated. + + +Workspace Declarations +---------------------- + +workspace(workspace_name) { + file.mpc + directory + relative/path/to/another/mwc_file +} + +Workspaces can contain individual mpc files, directories or other mwc files. +In the case of a directory, the workspace creator will traverse it and use +any mpc files that are found. If another workspace file is listed in the +workspace files, it will be aggregated into the workspace with paths relative +to the directory in which the main workspace is found. These "aggregated" +workspaces should not inherit from any other base workspace. The workspace +files should have an 'mwc' extension. + +You can exclude directories and .mpc files from a workspace using the 'exclude' +scope operator: + +workspace { + dir1 + dir2 + + // exclude this_dir for all project types + exclude { + dir2/this_dir + } + + // exclude other_dir for vc6, vc71, vc8, and vc9 types + exclude(vc6, vc71, vc8, vc9) { + dir2/other_dir + } + + // exclude unix_only for every type except gnuace and make + exclude(!gnuace, !make) { + dir2/unix_only + } + + dir3 + + // Associate the name "other" with dir3 + associate(other) { + dir3 + } +} + +The associate scope associates a name with one or more directories. This +does not add directories to a workspace, it only makes an association. This +may or may not have an effect on the generated workspace; it depends solely +upon whether the project type supports associations. + +Currently automake is the only project type that supports associations. +Each directory listed under an association is grouped together and built +conditionally based on the association name. + +Project Declarations +-------------------- + +project(project_name) : baseproject, anotherbaseproject { + exename = foo + includes += "." + libpaths = directory + + Source_Files { + file1.cpp + file2.cpp + . + . + fileN.cpp + } + + Header_Files { + file1.h + file2.h + . + . + fileN.h + } +} + + +MPC expects all files to be listed with forward slashes (/) if a file name +contains a directory. Providing files with back slashes (\) can cause +unexpected results during generation. + +When listing files within components (Source_Files, Header_Files, etc.), you +can use wild cards (*?[]) to include groups of files as can be done in shells. +You can exclude files by preceding the name (or wild card) with the '!', but +this sort of exclusion only pertains to files that exist in the directory at +the time of project generation. There is an additional syntax similar to +the '!' ('^') which works the same as the '!' except that after all of the +source files are added to the list (after automatic custom generated files +are added) these files are explicitly removed from the list. + +The (project_name) part of the project declaration is optional. If it is +left off, the project name will default to the name of the mpc file without +the extension. Inheritance is optional. + +If the project name or workspace name contains an asterisk (*) then the +default project (workspace) name will be used in its place. For example, if +the mpc file is named example.mpc and it contains the following: + +project(*client) { + +The project name will be example_client. If the any part of the modified +project (workspace) name contains a capital letter then each word will be +capitalized. For instance, if the above mpc file example was named +Example.mpc, then the modified project name would be Example_Client. + +If the value set for exename contains an asterisk then the asterisk portion +of the name will be replaced with the current project name. The same logic +applies to sharedname and staticname. + +If multiple projects are going to be contained within a single workspace +(using mwc.pl), there can be no duplication of project names. This is +disallowed due to limitations of some workspace tools. + +Project Keywords +---------------- +exename Specifies the name of the executable that will be created +sharedname Specifies the name of the shared library that will be created +staticname Specifies the name of the static library that will be created +buildflags This keyword can only be used as a source component scoped + setting (ie. inside the scope of Source_Files). It + specifies additional build flags that will be passed to the + compiler as the source files are being compiled. +dllout If defined, specifies where the dynamic libraries will be + placed. This overrides libout in the dynamic case. +libout Specifies where the dynamic and static libraries will be placed +exeout Specifies where executables will be placed (Previously known + as install) +managed This keyword can be used as a global setting or as a source + component scoped setting (ie. inside the scope of + Source_Files). It specifies that the source files should be + compiled as managed C++. Since this is Microsoft specific, it + is only supported by the nmake, vc7, vc71, vc8, vc9, vc10 + project types. +no_pch This keyword can only be used as a source component scoped + setting (ie. inside the scope of Source_Files). It + specifies that precompiled headers should not be used for + the source files listed within the scope of it's setting. +pch_header Specifies the precompiled header file name +pch_source Specifies the precompiled source file name +postbuild If this is defined in the project, the value will be + interpreted as commands to run after the project has been + successfully built. The <%..%> construct can be used within + this value to access template variables and functions of the + template parser. In addition, the following pseudo variables + can be used. + + <%cat%> - Platform non-specific command to cat a file. + <%cmp%> - Platform non-specific compare command. + <%cp%> - Platform non-specific copy command. + <%mkdir%> - Platform non-specific mkdir command. + <%mv%> - Platform non-specific move command. + <%os%> - Returns either win32 or unix. + <%rm%> - Platform non-specific delete command. + <%rmdir%> - Platform non-specific recursive directory + delete command. + <%nul%> - Platform non-specific null device. + <%gt%> - Project non-specific greater than sign. + <%lt%> - Project non-specific less than sign. + <%and%> - Project non-specific and sign. + <%or%> - Project non-specific or sign. + <%quote%> - Project non-specific double quote. + <%slash%> - Platform non-specific directory separator. + <%equote%> - Project non-specific escaped quote. + <%crlf%> - Platform non-specific line ending. + <%cmdsep%> - Project/platform non-specific command separator + which always runs the right-hand side command. +prebuild This is similar to postbuild except that it will be + performed before the build instead of after. +postclean This is similar to postbuild except that it will be + performed after cleaning up the project (the realclean + target for make based project types). NOTE: This is not + used in the IDE based project types since there is no hook + for such an action. +recurse If set to 1, MPC will recurse into directories listed under + component listings and add any component corresponding files + to the list. This keyword can be used as a global project + setting or a component scoped setting. +version Specifies the version number for the library or executable +macros These values will be passed as macros to the compiler. +libpaths Specifies 1 or more locations to find libraries +recursive_libpaths Specifies 1 or more locations to find libraries which will + be added recursively. +includes Specifies 1 or more locations to find include files +libs Specifies 1 or more libraries to link into the exe or library +recursive_includes Specifies 1 or more locations to find include files which + will be added recursively. +lit_libs Specifies 1 or more libraries to link into the exe or library. + If libraries receive a library decorator, then these will not. +pure_libs Specifies 1 or more libraries to link into the exe or library. + The values specified for this variable are passed to the + linker unmodified. +after Specifies that this project must be built after 1 or more + project names listed. +custom_only Create a project that contains only custom generation + targets (any file type described by a Define_Custom section). + This will automatically be set to 1 when a project contains + no source or resource files, but does contain custom input + files. +dynamicflags Specifies preprocessor flags needed for dynamic libraries +staticflags Specifies preprocessor flags needed for static libraries + +verbatim This allows arbitrary information to be place in a generated + project file. The syntax is as follows: + + verbatim(<project type>, <location>[, 1]) { + .. + .. + } + + When MPC is generating a project of type <project type> and + comes upon a marker that matches the <location> name, it + will place the text found inside the construct directly into + the generated project. If the third and optional parameter is + passed and is true, the verbatim section will be added to + existing verbatim settings at the same location. If you need + to preserve white space, the line or lines should be placed + inside double quotes. + +specific This scope allows assignments that are specific to a + particular project type or property. The syntax is as + follows: + + specific(<proj_type|prop:prop_name> [, <proj_type|prop:prop_name> ...]) { + lit_libs += c + ... + } + + or + + specific(<proj_type|prop:prop_name> [, <proj_type|prop:prop_name> ...]) { + lit_libs += c + ... + } else { + list_libs += c_other + ... + } + + If the else is provided, it is required to be on + the same line as the closing curly brace. You may + also negate the project type (using '!') which will cause + the specific to be evaluated for all types except the type + specified. + + The following property names are available: borland, make, + microsoft, windows, and static. The table below shows which + properties apply to which project types. The static + property will be set if the -static option was supplied. + Additionally, a property that corresponds to the language + will be set (e.g., cplusplus, csharp, java, vb). + + | borland | make | microsoft | windows | + ---------+---------+------+-----------+---------| + automake | | X | | | + bcb2007 | X | | | X | + bcb2009 | X | | | X | + bds4 | X | | | X | + bmake | X | X | | X | + cc | | | | X | + em3 | | | X | X | + ghs | | | | ? | + make | | X | | | + nmake | | X | X | X | + vc6 | | | X | X | + vc7 | | | X | X | + vc71 | | | X | X | + vc8 | | | X | X | + vc9 | | | X | X | + vc10 | | | X | X | + wix | | | | X | + + ? - indicates that this is controled by the MPC_GHS_UNIX + environment variable. + + If a keyword is not recognized as a valid MPC keyword, it is + interpreted as a template value modifier. In this + situation, this construct has the exact same restrictions as + the -value_template command line option. See the USAGE file + for more information. + + Scopes are available in some of the MPC templates. These + scopes are created by using a template variable within a + <%foreach%> context. The scope will be, one at a time, each + space separated words within the template variable value. + Variables can be modified using a scope modifier. For + example, the word 'FOO' will be added to the template + variable 'defines' when it is seen in the 'Debug' scope: + + specific { + Debug::defines += FOO + } + +expand This scope allows the specification for a variable that is + found within $() to be expanded from the list of possible + values. These possible values can contain environment + variables (specified by $VAR_NAME) and plain text. If a + possible value contains an environment variable and that + variable is defined then this value is used to expand the + $() variable. If the environment variable is not defined + then this possible value is not used. The syntax is as + follows: + + expand(<variable name>) { + <possible value 1> + . + . + <possible value n> + } + +conditional This scope allows addition of source files conditionally + based on a particular project type or property as describe + in the 'specific' section. The syntax is as follows: + + conditional(<proj_type|prop:prop_name> [, <proj_type|prop:prop_name> ...]) { + source1.cpp + ... + } + + or + + conditional(<proj_type|prop:prop_name> [, <proj_type|prop:prop_name> ...]) { + source1.cpp + ... + } else { + source2.cpp + ... + } + + If the else is provided, it is required to be on + the same line as the closing curly brace. You may + also negate the project type (using '!') which will cause + the conditional to be evaluated for all types except the + type specified. + +requires Specifies which features should be enabled in order to + generate the project file. +avoids Specifies which features should be disabled in order to + generate the project file. +webapp Determines whether the project is a Web Application or not. + A web application project will have no project file written + but the information will be included in the workspace (if + web applications are supported by the project type). + +C# Specific Project Keywords +---------------------------- +dependent_upon This can only be applied to source and resx components. It + determines which file the source or resx file is dependent + upon for vc8, vc9, and vc10 only. +generates_source This can only be applied to resx components. It indicates + that the resx file or files auto generates a source file for + vc8, vc9, and vc10 only. A value of '1' indicates that the + resx file generates a source file and the default generator is + used. Any other value indicates that the resx file generates a + source file and the generator name is taken from the value + supplied. The auto generated name is created by taking the + resx file without the extension and appending .Designer.cs. +subtype This can only be applied to source and resx components. It + determines the SubType setting for vc8, vc9, and vc10 only. + +Custom File Definitions +----------------------- +In order to support a variety of custom build rules, MPC allows you to +define your own custom file types. Below is an example of a custom +definition. + +project { + Define_Custom(MOC) { + automatic_in = 0 + automatic_out = 0 + command = $(QTDIR)/bin/moc + postcommand = echo <%quote%>#include <%lt%>some.h<%gt%><%quote%> <%gt%> <%temporary%> <%and%> \ + <%cat%> <%output%> <%gt%><%gt%> <%temporary%> <%and%> \ + <%mv%> <%temporary%> <%output%> + output_option = -o + inputext = .h + pre_extension = _moc + source_outputext = .cpp + } + + MOC_Files { + QtReactor.h + } + + Source_Files { + QtReactor_moc.cpp + } +} + +The above example defines a custom file type "MOC" which describes basic +information about how to process the input files and what output files are +created. Once the custom file type is defined, MOC_Files can be defined in +order to specify the input files for this new file type. + +Here is a list of keywords that can be used within the scope of +Define_Custom or Modify_Custom: + +automatic This keyword is deprecated. Use automatic_in and + automatic_out instead. +automatic_in If set to 1, then attempt to automatically determine + which files belong to the set of input files for the + custom type. If set to 0, then no files are + automatically added to the input files. If omitted, + automatic_in is assumed to be 1. +automatic_out If set to 1, then attempt to automatically determine + which generated files belong to the set of components + (e.g., Source_Files, Header_Files, etc.) based on the + type of file generated from the custom command. If set + to 0, then no files are automatically added to the + various components. If omitted, automatic_out is + assumed to be 1. +command The name of the command that should be used to process + the input files for the custom type. +commandflags Any options that should be passed to the command go here. +dependent If this is given a value, then a dependency upon that + value will be given to all of the generated files. + The default for this is unset and no dependency will be + generated. +inputext This is a comma separated list of input file extensions + that belong to the command. +keyword This is a special assignment that takes the form of the + following: + + keyword newname = existing_custom_name + + This has the effect of mapping newname to be the + same as existing_custom_name. existing_custom_name, + which is optional, corresponds to one of the keywords + available within a Define_Custom scope (except for + keyword). This function puts newname into the project + level scope such that it can be used outside of the + scope of the particular custom file type being defined. + It should be noted that the mapped keywords can not be + used within the scope of a 'specific' clause. It does + not cause an error, but it has absolutely no affect. + If existing_custom_name is not supplied, then the only + way to utilize the newname value is from within the + template code. ex. <%newname%> +libpath If the command requires an additional library path, add + it here. +output_option If the command takes an option to specify only a single + file output name, then set it here. Otherwise, this + should be omitted. +output_follows_input This setting defaults to 1 and indicates that output + files from the custom command will end up in the same + directory as the input files. If this is set to 0, it + is assumed that the output files will go into the same + directory as the .mpc file. +pch_postrule If this is set to 1, then a rule will be added to the + custom rule that will modify the source output files to + include the precompiled header file. +postcommand Allows a user to execute arbitrary commands after + the main command is run to generate the output file. + The following pseudo variables can be accessed from + within the postcommand assignment: + <%input%> - The input file for the original command. + <%output%> - The output created by the original command. + <%input_basename%> - The basename of the input file. + <%input_dirname%> - The directory of the input file. + <%input_noext%> - The input file with no extension. + <%output_basename%> - The basename of the output file. + <%output_dirname%> - The directory of the output file. + <%output_noext%> - The output file with no extension. + The output file can be referenced as a generic output + file using <%output%> or can be referenced as a + component file (if it matches the particular type) + using one of the following: + + <%source_file%> + <%template_file%> + <%header_file%> + <%inline_file%> + <%documentation_file%> + <%resource_file%> + + The output file without an extension can be referenced + as a generic output file using <%output_noext%> or can + be referenced as a component file (if it matches the + particular type) using one of the following: + + <%source_file_noext%> + <%template_file_noext%> + <%header_file_noext%> + <%inline_file_noext%> + <%documentation_file_noext%> + <%resource_file_noext%> + + The following are also available for use within the + postcommand setting. They return the extension (if + there is any) of the input and output files + respectively: + + <%input_ext%> + <%output_ext%> + + The following pseudo template variables, in addition to + all project settings, are valid for use within the + command, commandflags, dependent, postcommand and + output_option settings: + + <%and%> - Project non-specific and sign. + <%cat%> - Platform non-specific command to cat a file. + <%cmdsep%> - Project/platform non-specific command + separator which always runs the right-hand + side command. + <%cp%> - Platform non-specific copy command. + <%gendir%> - The output directory specified by the + gendir setting. + <%gt%> - Project non-specific greater than sign. + <%lt%> - Project non-specific less than sign. + <%nul%> - Platform non-specific null device. + <%mkdir%> - Platform non-specific mkdir command. + <%mv%> - Platform non-specific move command. + <%or%> - Project non-specific or sign. + <%quote%> - Project non-specific double quote. + <%rm%> - Platform non-specific delete command. + <%temporary%> - A temporary file name. + <%prj_type%> - The project type supplied by the -type + option. + + The following psuedo template variables will be set to + the known extension for Windows and empty on non-Windows + based project types. + + <%bat%> - The extension for batch files. + <%cmd%> - The extension for command files. + <%exe%> - The extension for executable files. + + If any referenced pseudo template variable does + not contain a value, then the particular setting + (command, commandflags, dependent, postcommand or + output_option) will not be used. + + It should also be noted that use of automatically + generated project settings, such as sharedname, exename, + etc., may not exist at the time that a project setting + is evaluated and will end up empty. To avoid this + situation, explicitly set project settings that are + going to be used within this context. +pre_extension If the command produces multiple files of the same + extension, this comma separated list can be used to + specify them. For example, tao_idl creates two types of + files per extension (C.h, S.h, C.cpp, S.cpp, etc). +source_pre_extension This is the same as pre_extension except that it + only applies to source files. +inline_pre_extension This is the same as pre_extension except that it + only applies to inline files. +header_pre_extension This is the same as pre_extension except that it + only applies to header files. +template_pre_extension This is the same as pre_extension except that it + only applies to template files. +resource_pre_extension This is the same as pre_extension except that it + only applies to resource files. +documentation_pre_extension This is the same as pre_extension except that it + only applies to documentation files. +generic_pre_extension This is the same as pre_extension except that it + only applies to generic files. +pre_filename This is similar to pre_extension except that the values + are prepended to the file name instead of the extension. +source_pre_filename This is the same as pre_filename except that it + only applies to source files. +inline_pre_filename This is the same as pre_filename except that it + only applies to inline files. +header_pre_filename This is the same as pre_filename except that it + only applies to header files. +template_pre_filename This is the same as pre_filename except that it + only applies to template files. +resource_pre_filename This is the same as pre_filename except that it + only applies to resource files. +documentation_pre_filename This is the same as pre_filename except that it + only applies to documentation files. +generic_pre_filename This is the same as pre_filename except that it + only applies to generic files. +pre_dirname This is similar to pre_filename except that the + value is prepended to the directory portion of + the file name instead of the file name itself. + If a separate directory is desired, the + pre_dirname setting should end in a slash. +source_pre_dirname This is the same as pre_dirname except that it + only applies to source files. +inline_pre_dirname This is the same as pre_dirname except that it + only applies to inline files. +header_pre_dirname This is the same as pre_dirname except that it + only applies to header files. +template_pre_dirname This is the same as pre_dirname except that it + only applies to template files. +resource_pre_dirname This is the same as pre_dirname except that it + only applies to resource files. +documentation_pre_dirname This is the same as pre_dirname except that it + only applies to documentation files. +generic_pre_dirname This is the same as pre_dirname except that it + only applies to generic files. +source_outputext This is a comma separated list of possible source file + output extensions. If the command does not produce + source files, then this can be omitted. +inline_outputext This is a comma separated list of possible inline file + output extensions. If the command does not produce + inline files, then this can be omitted. +header_outputext This is a comma separated list of possible header file + output extensions. If the command does not produce + header files, then this can be omitted. +template_outputext This is a comma separated list of possible template file + output extensions. If the command does not produce + template files, then this can be omitted. +resource_outputext This is a comma separated list of possible resource file + output extensions. If the command does not produce + resource files, then this can be omitted. +documentation_outputext This is a comma separated list of possible + documentation file output extensions. If the + command does not produce documentation files, then + this can be omitted. +generic_outputext If the command does not generate any of the other output + types listed above, then the extensions should be listed + under this. + +If the custom output can not be represented with the above output extension +keywords (*_outputext) and you have knowledge of the output files a priori, +you can represent them with the '>>' construct. + +Below is an example that demonstrates the use of '>>'. The command takes an +input file name of foo.prp and produces two files that have completely +unrelated filenames (i.e. foo !~ hello). + +project { + Define_Custom(Quogen) { + automatic_in = 0 + automatic_out = 0 + command = perl quogen.pl + commandflags = --debuglevel=1 --language=c++ \ + --kernel_language=c++ + inputext = .prp + keyword quogenflags = commandflags + } + + Quogen_Files { + foo.prp >> hello.h hello.cpp + } + + Source_Files { + hello.cpp + } +} + +You can use the '<<' construct to represent dependencies for specific custom +input file. For instance, in the above example, assume that foo.prp depends +upon foo.in, we would represent this by adding << foo.in as shown below. + + Quogen_Files { + foo.prp >> hello.h hello.cpp << foo.in + } + +There is a construct that can be used within a Define_Custom section +called 'optional' and can be used to represent optional custom output +dependent upon particular command line parameters passed to the custom +command. + +project { + Define_Custom(TEST) { + optional(keyword) { + flag_keyword(option) += value [, value] + } + } +} + +In the above example, keyword can be any of the pre_extension, pre_filename +or keywords that end in _outputext. flag_keyword can be any of the custom +definition keywords, however only commandflags really make any sense. +Inside the parenthesis, the flag_keyword value is searched for the 'option' +value. If it is found, then the 'value' after the += is added to the list +specified by 'keyword'. This can also be negated by prefixing 'option' with +an exclamation point (!). + +project { + Define_Custom(IDL) { + source_pre_extension = C, S + optional(source_pre_extension) { + commandflags(-GA) += A + } + } +} + +In the preceding example, the source_pre_extension contains C and S. The +optional clause can be read as follows: If 'commandflags' contains -GA then +add A to source_pre_extension. + +Particular output extensions are not required. However at least one output +extension type is required in order for MPC to generate a target. Within +graphical build environments, the custom input file will be listed +regardless of the presence of an extension definition. In this case, the +input file will be "excluded" from the build. + +For custom file types, there are a few keywords that can be used within the +custom file type input lists: command, commandflags, dependent, gendir and +postcommand. These keywords (except for gendir) can be used to augment or +override the values of the same name defined in a Define_Custom section. +gendir can be used to specify the directory in which the generated +output will go. Below is an example: + + MOC_Files { + commandflags += -nw + gendir = moc_generated + QtReactor.h + } + + Source_Files { + moc_generated/QtReactor_moc.cpp + } + +In the above example, the generated file (QtReactor_moc.cpp) is placed in +the moc_generated directory and the -nw option is added to commandflags. +It should be noted that if the custom file definition does not set the +output_option then you must provide the necessary options in +commandflags to ensure that the generated output goes into the directory +specified by gendir. + +The following example illustrates the use of the keyword mapping capability +of the Define_Custom: + +project { + Define_Custom(CIDL) { + automatic_in = 0 + automatic_out = 0 + command = $(CIAO_ROOT)/bin/cidlc + commandflags = -I$(TAO_ROOT)/tao -I$(TAO_ROOT)/orbsvcs/orbsvcs -- + inputext = .cidl + source_outputext = _svnt.cpp + generic_outputext = E.idl + + // Allow cidlflags to be used outside the scope of CIDL_Files + keyword cidlflags = commandflags + } + + // This will get added to all commandflags for CIDL_Files + cidlflags += --some_option + + CIDL_Files { + // This will have a combination of the original commandflags plus + // the value added to cidlflags above. + file.cidl + } + + CIDL_Files { + // This will have a combination of the original commandflags plus + // the value added to cidlflags above plus the value added to + // cidlflags here. + cidlflags += --another_option + another_file.cidl + } +} + +A Modify_Custom section can be used to modify an existing custom definition. +The Define_Custom must be processed prior to processing a Modify_Custom +section; otherwise, an error will occur. + +Special type of feature project +------------------------------- +A feature project contains information as a project would, but can only +be a base project and will only be added to a sub project if the features +that it requires (or avoids) are present. + +A feature definition requires at least one feature name. A name by itself +specifies that the feature is required. A '!' in front of the feature name +indicates that the feature must be disabled. There may be more than one +feature listed between the parenthesis and they must be comma separated. +Each feature will be logically anded together. + +The following feature definition requires that the qt feature be enabled. + +feature(qt) { + Define_Custom(MOC) { + automatic_in = 0 + automatic_out = 0 + command = $(QTDIR)/bin/moc + output_option = -o + inputext = .h + pre_extension = _moc + source_outputext = .cpp + } + + MOC_Files { + QtSpecific.h + } + + Source_Files { + QtSpecific_moc.cpp + } +} + +Assuming that the above feature definition is stored in a file named +qt_specific.mpb, an mpc project could inherit from it and would only receive +the feature definition if the qt feature was enabled. + +project: qt_specific { + ... +} + + +Feature Files +------------- +Features are enabled and disable within feature files or through the use of +the -features option (see USAGE for more details). The first feature file +read is always global.features found in the config directory. The second +feature file read is the project type name with .features appended +(ex. vc71.features, make.features, etc.) which must be located in the same +directory as the global.features file. Lastly, the file specified by the +-feature_file option is read if this option is used. + +Each successive feature file has precedence over the previous. That is, +if a feature has already been set previously it is overridden. The +-features option has precedence over feature files. + +Special Keywords Available to Templates +--------------------------------------- +project_name This contains the name of the project. +project_file This contains the name of the output file. +guid This is used by the VC7 project and workspace creator. +configurations When used within a foreach context, this info (each + configuration) is gathered for use with the VC7 workspace + creator. +flag_overrides Used to determine flags that have been overridden on a per + file basis. +custom_types The list of custom file types that may have been defined + in the mpc file or a base project. +fornotlast Insert the text on every foreach iteration except the last. +forlast Insert the text only on the last foreach iteration. +fornotfirst Insert the text on every foreach iteration except the first. +forfirst Insert the text only on the first foreach iteration. +forcount By default, a one based index number of the foreach + iterations. The base can be modified by providing a base + number in the foreach as in the following examples: + +<%foreach(4, includes)%> + ... +<%endfor%> + + +<%foreach(include, 4, includes)%> + ... +<%endfor%> + +If the list variable ('includes' in the above example) is a function call, +it is necessary to provide both a variable name and a base count number. + +Project Variable and Template Input Variable Interaction +-------------------------------------------------------- +Project variables and template input variables are separate entities and in +the context of the TemplateParser, template input variables have precedence +over project variables. + +This means that if the project keyword 'libout' is set in an MPC project and +is set as a template input variable, the template input variable value will +be used. There are exceptions to this rule. The following list shows the +project keywords that have their MPC project value appended to the template +input value (if there is a template input value). + +libpaths +includes +libs +lit_libs +pure_libs +dynamicflags +staticflags +requires +avoids +macros + +Workspaces +---------- +Workspaces (mwc files) can have assignments similar to projects. There are +currently only two assignments allowed. + +The first is 'cmdline'. The values given to the cmdline assignment will be +processed as command line options, but only to the projects that are +contained within the workspace (or the scope of the assignment). All +command line options are valid for cmdline, except for the following: +-exclude, -for_eclipse, -gendot, -gfeature_file, -into, -make_coexistence, +-noreldefs, and -recurse. + +The second assignment is 'implicit'. This assignment takes two different +types of values. It takes a boolean value (0 or 1) to indicate that an +implicit project should be created in directories that contain no mpc file, +but contain project related files (source, headers, etc.). The default +value for implicit is 0. It also takes a character string that represents a +base project (similar to the -base option). In this case, implicit is +enabled and each implicitly generate project file will have the base project +or base projects (when addition is used) when the project is created. + +Defaulting Behavior +------------------- +1) If a project name is not specified: + + it will be defaulted to the name of the mpc file without the extension + +2) If a particular list is not specified (Source_Files, Header_Files, etc.): + + all of the files in the directory will be added to the corresponding list + by extension + +3) If the custom type is automatic (both input and output) and custom files + (ex., idl files) exist in the directory and the custom files components + (ex., IDL_Files) are left defaulted (i.e. not listed) or the custom files + components are specified and none of the custom generated files are listed + in the corresponding lists: + + the custom files are added to the custom files component list if they + weren't specified and all of the (would be) generated files will be added + to the front of the corresponding lists (source, inline and header lists) + +4) If files are listed in the Source_Files list and a corresponding header or + inline file exists: + + the corresponding file will be added to the corresponding list (if it + isn't already there) + +5) If a sharedname is specified and staticname is not: + + staticname is assigned the sharedname value (the same applies if + staticname is specified and sharedname is not) + +6) If exename is specified then the project target is considered an + executable. If neither exename, sharedname or staticname are used and + any of the source files listed contains a language dependent "main", then + the project target is considered an executable, otherwise it is considered + a library. + +7) If pch_header is not specified and a header file matches *_pch.h: + + it is assumed to be the precompiled header file (the same applies to + pch_source) + +Processing Order +---------------- +1) Project file is read +2) Template input file is read +3) Template file is read +4) Output project is written diff --git a/ACE/MPC/docs/USAGE b/ACE/MPC/docs/USAGE new file mode 100644 index 00000000000..50f98d157bf --- /dev/null +++ b/ACE/MPC/docs/USAGE @@ -0,0 +1,306 @@ +Running the Workspace Generator +------------------------------- + +The most common way to use the Make Project Creator is to run the +workspace generator (mwc.pl). This script will generate projects and a +single workspace that contains the generated projects. If no input file +(.mwc file) is specified, it will recurse into the directory in which the +script was started. It looks for .mpc files and generates a project or +projects for each one found. + + +Usage: mwc.pl [-global <file>] [-include <directory>] [-recurse] + [-ti <dll | lib | dll_exe | lib_exe>:<file>] [-hierarchy] + [-template <file>] [-relative NAME=VAL] [-base <project>] + [-noreldefs] [-notoplevel] [-static] [-genins] [-use_env] + [-value_template <NAME+=VAL | NAME=VAL | NAME-=VAL>] + [-value_project <NAME+=VAL | NAME=VAL | NAME-=VAL>] + [-make_coexistence] [-feature_file <file name>] + [-expand_vars] [-features <feature definitions>] [-gendot] + [-exclude <directories>] [-name_modifier <pattern>] + [-apply_project] [-version] [-into <directory>] + [-gfeature_file <file name>] [-nocomments] [-for_eclipse] + [-relative_file <file name>] + [-language <cplusplus | csharp | java | vb>] + [-type <automake | bcb2007 | bcb2009 | bds4 | bmake | cc | em3 | + ghs |html | make | nmake | sle | vc6 | vc7 | vc71 | + vc8 |vc9 | vc10 | wb26>] + [files] + + -base Add <project> as a base project to each generated + project file. Do not provide a file extension, the + .mpb extension will be tried first; if that fails the + .mpc extension will be tried. + -exclude Use this option to exclude directories or files when + searching for input files. + -expand_vars Perform direct expansion, instead of performing relative + replacement with either -use_env or -relative options. + -feature_file Specifies the feature file to read before processing. + The default feature file is default.features under the + config directory. + -features Specifies the feature list to set before processing. + -for_eclipse Generate files for use with eclipse. This is only + useful for make based project types. + -gendot Generate .dot files for use with Graphviz. + -genins Generate .ins files for use with prj_install.pl. + -gfeature_file Specifies the global feature file. The + default value is global.features under the + config directory. + -global Specifies the global input file. Values stored + within this file are applied to all projects. + -hierarchy Generate a workspace in a hierarchical fashion. + -include Specifies a directory to search when looking for base + projects, template input files and templates. This + option can be used multiple times to add directories. + -into Place all output files in a mirrored directory + structure starting at <directory>. This should be a + full path. + -language Specify the language preference; possible values are + [cplusplus, csharp, java, vb]. The default is + cplusplus. + -make_coexistence If multiple 'make' based project types are + generated, they will be named such that they can coexist. + -name_modifier Modify output names. The pattern passed to this + parameter will have the '*' portion replaced with the + actual output name. Ex. *_Static + -apply_project When used in conjunction with -name_modifier, it applies + the name modifier to the project name also. + -nocomments Do not place comments in the generated files. + -noreldefs Do not try to generate default relative definitions. + -notoplevel Do not generate the top level target file. Files + are still process, but no top level file is created. + -recurse Recurse from the current directory and generate from + all found input files. + -relative Any $() variable in an mpc file that is matched to NAME + is replaced by VAL only if VAL can be made into a + relative path based on the current working directory. + This option can be used multiple times to add multiple + variables. + -relative_file Specifies the relative file to read before processing. + The default feature file is default.rel under the + config directory. + -static Specifies that only static projects will be generated. + By default, only dynamic projects are generated. + -template Specifies the template name (with no extension). + -ti Specifies the template input file (with no extension) + for the specific type (ex. -ti dll_exe:vc8exe). + -type Specifies the type of project file to generate. This + option can be used multiple times to generate multiple + types. There is no longer a default. + -use_env Use environment variables for all uses of $() instead + of the relative replacement values. + -value_project This option allows modification of a project variable + assignment . Use += to add VAL to the NAME's value. + Use -= to subtract and = to override the value. + This can be used to introduce new name value pairs to + a project. However, it must be a valid project + assignment. + -value_template This option allows modification of a template input + name value pair. Use += to add VAL to the NAME's + value. Use -= to subtract and = to override the value. + -version Print the MPC version and exit. + +The default global input file (config/global.mpb) is used if -global +is not specified on the command line. + +Two include directories are used by default (config and templates). + +Each project creator has a default template input file for each type of +project (dll_exe, lib_exe, dll, lib). You can override the default template +input file name with the -ti option. The file must have a 'mpt' extension +and must reside within the include search directories. NOTE: the 'lib' and +the 'lib_exe' template input files are only used when MPC is generating +static projects. + +The -exclude option is used to exclude directories when searching for input +files. NOTE: This option has no effect when used with mpc.pl. + +The -gendot option (useful only to mwc.pl) will result in the generation of +.dot files for each workspace processed. Each .dot file will contain +information that can be fed to Graphvis to display the dependency +information for the various projects found within the workspace. + +The -genins option will cause MPC to generate an "install" file after +processing each project that can be used in conjunction with the +prj_install.pl script to install different parts of the project (such as +header files) into an alternate location. + +The -hierarchy option is used to force the generation of a hierarchical +workspace at each directory level in between the toplevel directory and the +location of the mpc file that is being processed. This is the default for +"make" based workspace creators. NOTE: This option only has an effect when +passed to mwc.pl. + +The -template option is used to override the default template name. This +file should have a .mpd extension and sit in one of the include search +directories. NOTE: The -template option overrides the template file for all +types specified. + +The -static option can be used to generate only static project files. + +The -static_only option has been replaced by the -static option. Currently, +MPC only supports generating dynamic projects or static projects, but not +both during the same run. To generate them both you must run MPC twice, once +with the -static option and once without. Additionally, the vc6, em3, vc7, +vc71 and vc8 project names will no longer automatically have _Static +appended to the project name when generating static projects. This can +still be achieved by using the -name_modifier option. + +When generating static projects, inter-project dependencies will not be +generated for libraries within vc6, em3, vc7 and vc71 workspaces. The +reason is due to the fact that each static library that depended upon another +would be combined at the library creation stage, resulting in extremely large +libraries. Dependencies are handled correctly by vc8 and later. + +This behavior can be modified by setting the +MPC_DEPENDENCY_COMBINED_STATIC_LIBRARY environment variable. It will force +MPC to generate inter-project dependencies for libraries within a single +workspace. + +The -name_modifier option can be used to modify the generated workspace or +project name. The parameter to the -name_modifier option is a pattern where +an asterisk (*) within the pattern is replaced by the actual workspace or +project name. Thus, passing -name_modifier '*_Static' to mwc.pl will result +in all workspace and project names ending in _Static. (Ex. FOO_Static.dsw, +FOO_Static.dsp, etc.) + +The -apply_project option, when used in conjunction with the -name_modifier +option, causes MPC to apply the name modifier to the project name in +addition to the workspace and project file names. This option has no effect +outside the scope of the -name_modifier option. + +The -noreldefs option says not to generate default relative definitions for +*_ROOT (which comes from environment variables). + +The -notoplevel option tells mwc.pl to generate all projects for a +workspace, but do not generate the top level workspace file. For mpc.pl, it +says process the mpc files, but do not generate the project files. + +The -recurse option is used to search for all files that could be processed +from the current directory and its sub-directories. If directories are +passed in a comma separated list (e.g -recurse=examples,apps,TAO), then +those directories will be excluded when searching for project or workspace +files. + +The -type option can be used multiple times on the same command line to +generate projects of different types per mpc file. The default type for +this version of MPC is 'make'. NOTE: The -ti option overrides the template +input file for all types specified. + +The -feature_file specifies a file to be read that enables or disables +features. These feature names can be anything, but they should correspond +to values used for the 'requires' and 'avoids' keywords. If a feature is +required and is not enable then the project will not be created. If a +feature is to be avoided and it is enabled then the project will not be +created. + +The -features specifies additional list of features values. Values +specified by this option overwrite values from features files. +Example: +mwc.pl -features "qos=1,ssl=0" ace.mwc + +The -value_template option can be used to set various template variables. +If a template variable value will contain spaces, it is best to enclose the +whole setting in double quotes and use single quotes within the value to +retain spaces (if it is necessary). Below is an example where the value +will have spaces and some spaces need to be retained. + +mwc.pl -value_template "configurations=Debug Release 'Memcheck Debug' 'Memcheck Release'" + + +Running only the Project Generator +---------------------------------- + +Most of what is stated about the Workspace Generator applies to the Project +Generator except that it only generates projects. If an input file (.mpc +file) is not provided, the project creator will attempt to create a default +project in the directory from which the script was started. + + +MPC Codebase Configuration File +------------------------------- +This configuration file can be used to specify alternate locations for the +MPC Configuration File. If a base.cfg is found underneath the 'config' +directory where MPC is executed, it will be read to determine the location +of MPC.cfg based on the directory in which MPC was started. + +For example, if $MPC_ROOT/mwc.pl is run under /foo/bar_root/src and +$MPC_ROOT/config/base.cfg contained: + +/foo/bar_root = /foo/bar_root/MPC/config + +MPC would attempt to open and read /foo/bar_root/MPC/config/MPC.cfg as the +MPC Configuration File. If the base configuration file is not present, +MPC will try to use $MPC_ROOT/config/MPC.cfg as the MPC Configuration File. + +You may reference environment variables, accessed by $NAME, on either side of +the equals sign. + + +MPC Configuration File +---------------------- +In an effort to move away from the use of environment variables, a +configuration file has been introduced. The configuration file (MPC.cfg) +can contain settings to provide command line options, control logging and +direct MPC to dynamic project types. + +The following keywords are allowed in the configuration file, which will be +read from the 'config' directory of MPC. + +command_line - Provide additional command line options to MPC. The + value of this setting will be prepended to the options + passed to mwc.pl or mpc.pl. +default_type - Provide a single project type (as specified by the -type + option) as the default project type. +dynamic_types - This comma separated list points to directories in which + MPC will search for Perl modules to implement additional + MPC project types, base projects or template files. This + setting can be used to augment or replace functionality + in MPC. For each suitable directory found, it will add a + 'modules' include path for Perl to find modules, add a + 'config' include path to locate base projects and a + 'template' include path to find MPC templates. +includes - Similar to the -include command line option, it adds the + list of comma separated paths to the MPC include search + paths. +logging - If this setting contains info=1, informational messages + will be printed. If it contains warn=1, warning messages + will be printed. If it contains diag=1, diagnostic + messages will be printed. If it contains debug=1, debug + message will be printed. And lastly, if it contains + detail=1, detail messages will be printed. If it + contains none of these, MPC will not print out any + information or warnings when processing projects or + workspaces. Errors are always printed if any are + encountered. The default is warn=1 diag=1 detail=1. +main_functions - Provide additional main functions to be recognized in + conjunction with automatic executable project + recognition. The value assigned should be of the form + <language>:<func name>[, <language>:<func name>]*. A + function can be specified for all languages by only + providing the function name. +verbose_ordering - If this is set, mwc.pl will warn the user about + references to projects in the 'after' keyword that have + not been processed. + +Below is an example configuration file: + +// MPC configuration file +dynamic_types = $ACE_ROOT/bin/MakeProjectCreator +logging = info=1 warn=1 +verbose_ordering = 1 + + +Environment Variables +--------------------- + +MPC_DEPENDENCY_COMBINED_STATIC_LIBRARY - See the -static section above. + +MPC_GHS_UNIX - This environment variable is only meaningful when generating +the ghs project files. By default, the ghs type assumes that it is for +Windows. If this is not the case, set this environment variable prior to +running MPC. + +MPC_USE_WIN_COMMANDS - Setting this causes the Windows related pseudo +template variables to be used regardless of the type of project being +generated. diff --git a/ACE/MPC/docs/html/MakeProjectCreator.css b/ACE/MPC/docs/html/MakeProjectCreator.css new file mode 100644 index 00000000000..66b10c69071 --- /dev/null +++ b/ACE/MPC/docs/html/MakeProjectCreator.css @@ -0,0 +1,1713 @@ +A.link { + color: blue; + text-decoration: underline; +} +A.visited { + color: purple; + text-decoration: underline; +} +A.active { + color: red; + text-decoration: underline; +} +LI.Appendix-name { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 19.500000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 27.000000pt; + font-weight: Bold; + font-style: small-caps Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +LI.Appendix-number { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 15.000000pt; + font-weight: Bold; + font-style: small-caps Regular; + color: #b2b2b2; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +P.AuthorBook { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 292.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 13.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +LI.Body { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 11.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.BodyNoLead { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 11.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.Bullet1 { + display: block; + text-align: left; + text-indent: -18.000000pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 18.000000pt; + font-size: 11.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.Bullet2 { + display: block; + text-align: left; + text-indent: -11.999527pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 41.999756pt; + font-size: 11.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.Bulleted { + display: block; + text-align: left; + text-indent: -18.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 18.000000pt; + font-size: 12.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.BulletNoLead1 { + display: block; + text-align: left; + text-indent: -12.000229pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 12.000229pt; + font-size: 10.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.BulletNoLead2 { + display: block; + text-align: left; + text-indent: -11.999527pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 23.999756pt; + font-size: 10.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +P.Callout { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 3.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 8.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +P.CellBody { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 12.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +P.CellHeading { + display: block; + text-align: center; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 12.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +H1.ChapterNum, H2.ChapterNum, H3.ChapterNum, H4.ChapterNum, H5.ChapterNum, H6.ChapterNum { + display: block; + text-align: left; + text-indent: -126.000000pt; + margin-top: 83.000000pt; + margin-bottom: 166.000000pt; + margin-right: 0.000000pt; + margin-left: 126.000000pt; + font-size: 20.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +P.Code { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 2.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 8.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Courier New"; +} +P.Code-Line2 { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 2.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 12.000229pt; + font-size: 8.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Courier New"; +} +P.Code-Line3 { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 2.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 23.999756pt; + font-size: 8.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Courier New"; +} +P.Code-Line4 { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 2.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 36.000000pt; + font-size: 8.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Courier New"; +} +P.Code-Line5 { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 2.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 48.000229pt; + font-size: 8.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Courier New"; +} +P.CodeLarge { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 3.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 12.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Courier New"; +} +P.CodeWide { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 3.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 8.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Courier New"; +} +P.Copyright { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.EditingNote { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 3.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Italic; + color: #0000ff; + text-decoration: underline ; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.FigTitle, H2.FigTitle, H3.FigTitle, H4.FigTitle, H5.FigTitle, H6.FigTitle { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 1.000000pt; + margin-bottom: 1.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +P.Footnote { + display: block; + text-align: left; + text-indent: -12.000229pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 12.000229pt; + font-size: 10.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +H1.Head1, H2.Head1, H3.Head1, H4.Head1, H5.Head1, H6.Head1 { + display: block; + text-align: left; + text-indent: -126.000000pt; + margin-top: 100.000000pt; + margin-bottom: 200.000000pt; + margin-right: 0.000000pt; + margin-left: 126.000000pt; + font-size: 24.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.Head2, H2.Head2, H3.Head2, H4.Head2, H5.Head2, H6.Head2 { + display: block; + text-align: left; + text-indent: -66.023987pt; + margin-top: 22.000000pt; + margin-bottom: 10.000000pt; + margin-right: 0.000000pt; + margin-left: 66.023987pt; + font-size: 18.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.Head3, H2.Head3, H3.Head3, H4.Head3, H5.Head3, H6.Head3 { + display: block; + text-align: left; + text-indent: -66.023987pt; + margin-top: 15.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 66.023987pt; + font-size: 15.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.Head4, H2.Head4, H3.Head4, H4.Head4, H5.Head4, H6.Head4 { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 16.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 13.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +LI.Head4-nonum { + display: block; + text-align: left; + text-indent: -66.023987pt; + margin-top: 16.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 66.023987pt; + font-size: 13.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.Head5, H2.Head5, H3.Head5, H4.Head5, H5.Head5, H6.Head5 { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 13.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 11.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +LI.Head5-special { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 13.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 11.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.Head6, H2.Head6, H3.Head6, H4.Head6, H5.Head6, H6.Head6 { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 12.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Italic; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.Heading1, H2.Heading1, H3.Heading1, H4.Heading1, H5.Heading1, H6.Heading1 { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 14.000000pt; + margin-bottom: 6.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 14.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +H1.Heading2, H2.Heading2, H3.Heading2, H4.Heading2, H5.Heading2, H6.Heading2 { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 12.000000pt; + margin-bottom: 3.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 12.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +P.HeadingRunIn { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 6.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 12.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.IlloCaption { + display: block; + text-align: left; + text-indent: -50.399994pt; + margin-top: 5.000000pt; + margin-bottom: 1.000000pt; + margin-right: 0.000000pt; + margin-left: 50.399994pt; + font-size: 10.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.IlloCaptionApp { + display: block; + text-align: left; + text-indent: -50.399994pt; + margin-top: 5.000000pt; + margin-bottom: 1.000000pt; + margin-right: 0.000000pt; + margin-left: 50.399994pt; + font-size: 10.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +P.Indent1 { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 18.000000pt; + font-size: 11.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +P.Indent2 { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 23.999756pt; + font-size: 11.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +P.Indented { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 18.000000pt; + font-size: 12.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.IndexTitle { + display: block; + text-align: center; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 5.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 25.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +P.Mapping-Table-Cell { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 2.000000pt; + margin-bottom: 2.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 12.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +P.Mapping-Table-Title { + display: block; + text-align: center; + text-indent: 0.000000pt; + margin-top: 1.000000pt; + margin-bottom: 1.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +LI.NoteBody { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 5.000000pt; + margin-bottom: 15.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 11.000000pt; + font-weight: medium; + font-style: Italic; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.NoteSpecial { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 5.000000pt; + margin-bottom: 15.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 11.000000pt; + font-weight: medium; + font-style: Italic; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.NoteSpecial2 { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 9.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 7.000000pt; + font-weight: medium; + font-style: Italic; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.Numbered { + display: block; + text-align: left; + text-indent: -18.000000pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 18.000000pt; + font-size: 11.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.Numbered1 { + display: block; + text-align: left; + text-indent: -18.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 18.000000pt; + font-size: 12.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.Numbered2 { + display: block; + text-align: left; + text-indent: -12.000229pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 30.000229pt; + font-size: 11.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +H1.NumberedTableTitle, H2.NumberedTableTitle, H3.NumberedTableTitle, H4.NumberedTableTitle, H5.NumberedTableTitle, H6.NumberedTableTitle { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 1.000000pt; + margin-bottom: 1.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +LI.OptionHeader { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 22.000000pt; + margin-bottom: 10.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 18.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +LI.ParmBody { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 11.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.Part-Name { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 58.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 24.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.Part-No { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 58.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 24.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +P.PublisherBook { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 12.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +P.RuningH-F { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 3.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 9.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +LI.Section-name { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 15.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 24.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +LI.Section-number { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 15.000000pt; + font-weight: Bold; + font-style: small-caps Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +H1.SideDescription, H2.SideDescription, H3.SideDescription, H4.SideDescription, H5.SideDescription, H6.SideDescription { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.SideExample, H2.SideExample, H3.SideExample, H4.SideExample, H5.SideExample, H6.SideExample { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.SideException, H2.SideException, H3.SideException, H4.SideException, H5.SideException, H6.SideException { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.SideImpact, H2.SideImpact, H3.SideImpact, H4.SideImpact, H5.SideImpact, H6.SideImpact { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 4.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.SideLine, H2.SideLine, H3.SideLine, H4.SideLine, H5.SideLine, H6.SideLine { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.SideLocCodeAUnits, H2.SideLocCodeAUnits, H3.SideLocCodeAUnits, H4.SideLocCodeAUnits, H5.SideLocCodeAUnits, H6.SideLocCodeAUnits { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 15.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.SideLocCodeUnits, H2.SideLocCodeUnits, H3.SideLocCodeUnits, H4.SideLocCodeUnits, H5.SideLocCodeUnits, H6.SideLocCodeUnits { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 15.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.SideNote, H2.SideNote, H3.SideNote, H4.SideNote, H5.SideNote, H6.SideNote { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 20.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.SideParameters, H2.SideParameters, H3.SideParameters, H4.SideParameters, H5.SideParameters, H6.SideParameters { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.SideReturn, H2.SideReturn, H3.SideReturn, H4.SideReturn, H5.SideReturn, H6.SideReturn { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.SideSeeAlso, H2.SideSeeAlso, H3.SideSeeAlso, H4.SideSeeAlso, H5.SideSeeAlso, H6.SideSeeAlso { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.SideSynopsis, H2.SideSynopsis, H3.SideSynopsis, H4.SideSynopsis, H5.SideSynopsis, H6.SideSynopsis { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +H1.SideUsage, H2.SideUsage, H3.SideUsage, H4.SideUsage, H5.SideUsage, H6.SideUsage { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 4.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +P.TableFootnote { + display: block; + text-align: left; + text-indent: -12.000229pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 18.000000pt; + margin-left: 30.000229pt; + font-size: 10.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.TableTitle { + display: block; + text-align: center; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 12.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +P.Tbl-Body { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 2.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +P.Tbl-Heading { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +P.Tbl-SideHeading { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +P.Tbl-Subhead { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 3.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 9.500000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.TblCaption { + display: block; + text-align: left; + text-indent: -48.000229pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 48.000229pt; + font-size: 10.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.TblCaptionApp { + display: block; + text-align: left; + text-indent: -48.000229pt; + margin-top: 5.500000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 48.000229pt; + font-size: 9.500000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +P.TblCode { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 8.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Courier New"; +} +P.TblFootnote { + display: block; + text-align: left; + text-indent: -12.000229pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 12.000229pt; + font-size: 8.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +H1.Title, H2.Title, H3.Title, H4.Title, H5.Title, H6.Title { + display: block; + text-align: center; + text-indent: 0.000000pt; + margin-top: 24.000000pt; + margin-bottom: 12.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 18.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +P.TitleBook { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 60.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 30.000000pt; + font-weight: medium; + font-style: Italic; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.TopLine { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 5.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 11.000000pt; + font-weight: medium; + font-style: Italic; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +P.zHead-rightside { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 12.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 13.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +LI.zNumberAppendix { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 3.000000pt; + margin-bottom: 0.000000pt; + margin-right: 4.999680pt; + margin-left: 0.000000pt; + font-size: 126.000000pt; + font-weight: Bold; + font-style: Regular; + color: #00ffff; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +LI.zNumberSection { + display: block; + text-align: right; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 4.999680pt; + margin-left: 0.000000pt; + font-size: 72.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +P.zRunningFooter { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 8.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +P.zRunningHeader { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 8.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +P.zSlugline { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 10.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +EM.Bold { + font-weight: Bold; +} +EM.BoldCode { + font-size: 11.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Courier New"; +} +EM.Code { + font-size: 11.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Courier New"; +} +EM.CodeOption { + font-size: 11.000000pt; + font-weight: medium; + font-style: Italic; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +EM.Dialog-Box-Title { + font-size: 11.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial Narrow"; +} +EM.Emphasis { + font-style: Oblique; +} +EM.EquationVariables { + font-style: Italic; +} +EM.IXgenMarker { + text-decoration: underline ; +} +EM.SmallCaps { + text-transform: none; +} +EM.Subscript { + vertical-align: sub; +} +EM.Superscript { + vertical-align: super; +} +EM.SymbolFont { + font-family: "Symbol"; +} +EM.TableCode { + font-size: 10.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Courier New"; +} +EM.Underline { + text-decoration: underline ; +} +EM.URL { + font-size: 11.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Courier New"; +} +EM.zAuto-Format { + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + font-family: "Arial"; +} +EM.zAuto-FormatGray { + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #b2b2b2; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +EM.zBulletGray { + font-size: 10.000000pt; + font-weight: Bold; + font-style: Regular; + color: #b2b2b2; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +EM.zBulletHyphen { + font-size: 11.000000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + font-family: "Arial"; +} +EM.zCaptionNumberFormat { + font-size: 9.500000pt; + font-weight: Bold; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Arial"; +} +EM.zPageNumber { + font-size: 9.000000pt; + font-weight: medium; + font-style: Regular; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Times New Roman"; +} +EM.zWhite { + font-size: 4.000000pt; + font-weight: medium; + font-style: Regular; + color: #ffffff; + text-decoration: none; + vertical-align: baseline; + font-family: "Times New Roman"; +} diff --git a/ACE/MPC/docs/html/MakeProjectCreator.html b/ACE/MPC/docs/html/MakeProjectCreator.html new file mode 100644 index 00000000000..802ef252d18 --- /dev/null +++ b/ACE/MPC/docs/html/MakeProjectCreator.html @@ -0,0 +1,7148 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> + +<html> +<head> + <meta name="generator" content= + "HTML Tidy for Linux (vers 1 September 2005), see www.w3.org"> + <meta http-equiv="Content-Type" content="text/html; charset=us-ascii"> + <meta http-equiv="Content-Style-Type" content="text/css"> + <meta name="id" content= + "$Id$"> + <link rel="STYLESHEET" href="MakeProjectCreator.css" charset="ISO-8859-1" + type="text/css"> + + <title>MPC</title> +</head> + +<body bgcolor="#FFFFFF"> + <div> + <h2 class="ChapterNum"> </h2> + </div> + + <div> + <h1 class="Head1">The Makefile, Project, and Workspace Creator (MPC)</h1> + + <div> + <h3 class="Head2">Introduction</h3> + <hr> + + <ul> + <li class="Body">Maintaining multiple build tool files for a + multi-platform project can be quite a challenge, especially when the + project structure and platforms are constantly changing and evolving. + A project may support Makefiles, Visual C++ project files, Borland + Makefiles, and many others. Adding files, deleting files, changing + project options or even changing the name of the target within your + project will require you to expend time updating each build tool + file. What you need instead is a single location to store project + specific information to avoid repetitious, tedious modifications to + multiple build tool files. This is where Makefile Project Creator + (MPC) comes into the picture.</li> + + <li class="Body">MPC can be used to generate build tool specific + project files from a generic mpc file. The MPC project file is a + collection of source files that make up a single build target. MPC + uses platform specific input along with mpc files and generates build + tool specific files like makefiles, Visual C++ workspace and project + files, Visual Studio solution and project files, etc.</li> + + <li class="Body">MPC provides many advantages over the build tool + files it replaces. It provides mechanisms for minimizing maintenance + of project build files. It does this through support for project + inheritance and defaults for all aspects of a project, and the syntax + is simple and easy to use and maintain. These and other features will + be discussed in detail in the following sections. A complete example + of the use of MPC is shown in the <a href= + "MakeProjectCreator.html#ExampleMPCFile" class="XRef">Example MPC + File</a> section.</li> + </ul> + </div> + + <div> + <h3 class="Head2">Using MPC</h3> + <hr> + + <ul> + <li class="Body">An MPC project is a set of parameters that describe + an individual build target (such as a library or executable). These + parameters include the target name, include paths, source files, + header files, etc. One or more projects can be defined within a + single mpc file. An MPC workspace is just an arbitrary collection of + projects.</li> + + <li class="Body">Projects can be generated (without workspaces) by + using the mpc.pl script. Multiple mpc files can be passed to this + script. If no mpc files are passed to the script, it will search for + project-related files (such as source files, header files, etc.) and + incorporate them into a default project.</li> + + <li class="Body"><a name="Figure 1-2"></a>This diagram shows a + high-level view of project file generation using mpc.pl.</li> + + <li style="list-style: none"> + <h6 class="FigTitle">Generating projects with mpc.pl</h6> + + <table border="1" summary="Generating projects with mpc.pl"> + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + + <div> + <img src="images/mpc.gif" alt= + "Generating projects with mpc.pl"> + </div> + </td> + </tr> + </table> + </li> + + <li class="Body">To generate workspaces, you must run <em class= + "Code">mwc.pl</em>. This script will generate projects from mpc files + and create a workspace based on those mpc files. If no mwc files are + passed to the script, it will search in the current directory and its + subdirectories for all mpc files and incorporate them into a single + workspace.</li> + + <li class="Body">For make based project types (make, gnuace, bmake, + nmake), a workspace is just a top-level makefile. But, for graphical + interfaces such as Visual Studio, a workspace is the top-level file + that groups all of the project files together.</li> + + <li class="Body">The following diagram shows a high-level view of + workspace file generation using mwc.pl.</li> + + <li style="list-style: none"> + <h6 class="FigTitle">Generating workspaces with mwc.pl</h6> + + <table border="1" summary="Generating workspaces with mwc.pl"> + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + + <div> + <img src="images/mwc.gif" alt= + "Generating workspaces with mwc.pl"> + </div> + </td> + </tr> + </table> + </li> + </ul> + + <div> + <h4 class="Head3">Supported Build Tools</h4> + + <ul> + <li class="Body">MPC generates workspaces and projects for use with + many build tools. This table lists the MPC types (used with + mpc’s <em class="Code">-type</em> option) and their + associated build tools.</li> + + <li style="list-style: none"> + <h6 class="NumberedTableTitle">MPC Types</h6> + + <table border="1" summary="MPC Types"> + <tr> + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Type</p> + </th> + + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Build Tool</p> + </th> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">automake</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">GNU Automake.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">bcb2007</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Borland C++ Builder 2007.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">bcb2009</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">CodeGear C++ Builder 2009.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">bds4</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Support for Borland Developer Studio 4 + is incomplete.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">bmake</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Borland Make.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">cc</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Code Composer Studio 2.0</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">em3</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">eMbedded Visual C++ 3.00 and 4.00.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class="TableCode">ghs</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Green Hills C++ Builder.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">gnuace</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">GNU Make for ACE/TAO/CIAO only + (ACE/TAO/CIAO extension).</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">html</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">html pages are generated for + visualization of project information.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class="TableCode">make</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Generic make. The makefiles generated + by this project type can be used with any version of make. + However, due to configuration issues, it should not be used + with ACE or TAO.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class="TableCode">nmake</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Microsoft NMake.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class="TableCode">sle</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Support for Visual SlickEdit is + incomplete.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class="TableCode">vc6</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Visual C++ 6.0.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class="TableCode">vc7</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Visual Studio .NET 2002.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class="TableCode">vc71</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Visual Studio .NET 2003.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class="TableCode">vc8</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Visual Studio 2005.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode">vc9</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Visual Studio 2008.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode">vc10</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Visual Studio 2010.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode">wb26</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Wind River Workbench 2.6.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">wix</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Wix toolset for .msi creation.</p> + </td> + </tr> + </table> + </li> + </ul> + </div> + + <div> + <h4 class="Head3">Command Line</h4> + + <ul> + <li class="BodyNoLead">The command line options for the workspace + creator (<em class="Code">mwc.pl</em>) and the project creator + (<em class="Code">mpc.pl</em>) are exactly the same. The project + creator is used to generate one or more separate projects by + passing mpc files to it on the command line. The workspace creator + is used to generate one or more workspaces and the projects related + to those workspaces.</li> + + <li class="Body">The table below describes each option with the + more commonly used options in bold and project specific options in + italics.</li> + + <li style="list-style: none"> + <h6 class="NumberedTableTitle"><a name= + "Command Line Options"></a>Command Line Options</h6> + + <table border="1" summary="Command Line Options"> + <tr> + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Option</p> + </th> + + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Description</p> + </th> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">-base</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This option allows the user to force + any project to inherit from a specified base project. This + option can be used multiple times to force multiple + inheritance upon a project.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-complete</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This hidden option can be used to + generate a tcsh <em class="TableCode">complete</em> command + that allows a user of the tcsh shell to complete on options + as well as file names.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">-exclude</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If this option is used with <em class= + "Code">mwc.pl</em> , the directories or mwc files provided + in a comma separated list will be excluded when searching + for mpc files. Each element provided for exclusion should + be relative to the starting directory. This option has no + effect when used with <em class="Code">mpc.pl</em>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-expand_vars</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This option instructs MPC to perform + direct replacement of $() variables with the values from + the environment (if the <em class="Code">-use_env</em> + option is used) or the values specified by the <em class= + "Code">-relative</em> option.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-feature_file</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This option allows the user to override + the default feature file (<em class="Code">MPC/config/</em> + <em class="Code">default.features</em> or <em class= + "Code">ACE_wrappers/bin/MakeProjectCreator/config/default.features</em> + ) which may or may not exist. This file can be used to + override feature values specified in the <em class= + "Code">global.features</em> file located in the <em class= + "Code">config</em> directory. Feature files are described + in the <a href="MakeProjectCreator.html#TheFeatureFile" + class="XRef">Feature File</a> section.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-features</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Specifies the feature list to set + before processing. This is a comma separated list and + should contain no spaces.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-for_eclipse</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Allows generated makefiles to be used + with Eclipse.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">-gendot</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A .dot file, for use with Graphviz, + will be created for each workspace processed.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">-genins</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This option instructs MPC to generate + an “install” file after processing each + project. These “install” files can be used with + the prj_install.pl script which will copy portions of the + project related files into a user specified location.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-gfeature_file</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Specifies the global feature file. The + default global feature file is <em class= + "Code">global.features</em> found in the <em class= + "Code">config</em> directory.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">-global</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This option specifies the global input + file. Values stored within this base project are applied to + all generated projects. The default value is <em class= + "Code">ACE_wrappers/bin/MakeProjectCreator/global.mpb or + MPC/config/global.mpb</em>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-hierarchy</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If this option is used with <em class= + "Code">mwc.pl</em> , it will generate a workspace at each + directory between the directory in which it is run and the + location of a processed mpc file. This option has no effect + when used with <em class="Code">mpc.pl</em> and is the + default for “make” based workspace types.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="Bold"><em class= + "TableCode">-include</em></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Include search directories are added + with this option. These search directories are used when + locating base projects, template input files and templates. + It can be used multiple times on the same command line.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">-into</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This option specifies that all + generated project files will be placed in a mirrored + directory structure.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-language</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This option is used to specify which + language to assume when generating projects. The default + language is <em class="Code">cplusplus</em>, but <em class= + "Code">csharp</em>, <em class="Code">java</em> and + <em class="Code">vb</em> are also supported.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-make_coexistence</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Make based project types that normally + name the workspace <em class="Code">Makefile</em> + (<em class="Code">bmake</em> or <em class="Code">nmake</em> + ) will name the generated output files such that they can + coexist within the same directory. In essence, the + <em class="Code">bmake</em> and <em class="Code">nmake</em> + workspace names will not be <em class="Code">Makefile</em>, + but the name of the workspace followed by the project type + (<em class="Code">.bmake</em> or <em class= + "Code">.nmake</em> ).</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-name_modifier</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This option allows the user to modify + the output names of projects and workspaces. These are + usually determined by either the mpc or mwc file, but can + be modified using a pattern replacement. The parameter + passed to this option will be used as the pattern and any + asterisks (*) found in the pattern will be replaced with + the project or workspace name depending on which type of + file is being created.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-apply_project</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This option is only useful with the + <em class="Code">-name_modifier</em> option. When used in + conjunction with <em class="Code">-name_modifier</em>, the + pattern will be applied to the project name in addition to + the project or workspace name.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-nocomments</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Comments will not be placed in the + generated workspace files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-noreldefs</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This option specifies that the default + relative definitions should not be generated. See the + <em class="TableCode">-relative</em> option below.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-notoplevel</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This option tells <em class= + "TableCode">mwc.pl</em> to generate all workspace related + project files, but do not generate the associated + workspace. This option tells <em class= + "TableCode">mpc.pl</em> to process all mpc files passed in, + but it will not generate any project files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">-recurse</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Search from the current directory for + any input files and process them from the directory in + which they are located.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="Bold"><em class= + "TableCode">-relative</em></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Relative paths are used to replace + variables enclosed with <em class="TableCode">$()</em>. By + default, any environment variable that ends in <em class= + "TableCode">_ROOT</em> will be automatically used as a + relative path replacement. For more information see + <a href="MakeProjectCreator.html#Additional%20-relative%20information" + class="XRef">the -relative Option.</a>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-relative_file</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This option allows you to override the + default relative definitions file, which is default.rel + under the MPC config directory..</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">-static</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Specifies that static project files + will be generated from the MPC projects. The default is to + generate dynamic project files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-template</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This option allows a user to specify an + alternate template. Each project type has its own template + and this option allows a user to override the default + template.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">-ti</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Each project type has a set of template + input files. With this option the default template input + file can be overridden for a particular project type. For + more information see <a href= + "MakeProjectCreator.html#Additional%20-ti%20information" + class="XRef">the -ti Option.</a>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="Bold"><em class= + "TableCode">-type</em></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This option specifies the type of + project or workspace to be generated. It can be specified + multiple times to generate different project types for a + single set of input files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">-use_env</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This option instructs MPC to replace + all <em class="TableCode">$()</em> instances with the + corresponding environment variable value instead of using + values provided by the -relative option.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-value_project</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Use this option to override an mpc + project assignment from the command line. This can be used + to introduce new name value pairs to a project. However, it + must be a valid project assignment. For more information + see <a href= + "MakeProjectCreator.html#Additional%20-value_project%20information" + class="XRef">the -value_project Option.</a>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">-value_template</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This option can be used to override + existing template input variable values from the command + line. It can not be used to introduce new template input + name value pairs. For more information see <a href= + "MakeProjectCreator.html#Additional%20-value_template%20information" + class="XRef">the -value_template Option.</a>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">-version</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The MPC version is printed and no files + are processed.</p> + </td> + </tr> + </table> + </li> + </ul> + + <div> + <h5 class="Head4">Additional Option Descriptions</h5> + + <ul> + <li class="BodyNoLead">Some of the options in <a href= + "MakeProjectCreator.html#Command%20Line%20Options" class= + "XRef">Command Line Options</a> require an expanded explanation. + You will find more information on the <em class= + "Code">-relative</em>, <em class="Code">-ti</em>, <em class= + "Code">-value_project</em> and <em class= + "Code">-value_template</em> options below.</li> + </ul> + + <div> + <h6 class="Head5"><a name= + "Additional -relative information"></a>The -relative Option.</h6> + + <ul> + <li class="BodyNoLead">Some project types do not (completely) + support the idea of accessing environment variables through the + use of <em class="Code">$()</em>, and therefore MPC must ensure + that generated projects are usable in these cases. In order to + avoid the existence of <em class="Code">$()</em> variables + within the generated project files, relative paths are put in + place of those (where possible).</li> + + <li class="Body">The <em class="Code">-relative</em> option + takes a single parameter of a name value pair, for + example:</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">mwc.pl -relative + PROJ_TOP=/usr/projects/top</p> + + <p class="Code"> </p> + </li> + + <li class="Body">In above example, if the text <em class= + "Code">"$(PROJ_TOP)</em> " is found as a value for any mpb, + mpc, mpd, or mpt variable then it is replaced by a path that is + relative to <em class="Code">/usr/projects/top</em>. For + example, if an mpc file located under <em class= + "Code">/usr/projects/top/dir</em> contained the following:</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">project {</p> + + <p class="Code"> includes += $(PROJ_TOP)</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="Body">The generated project file would contain text + similar to:</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">CPPFLAGS += -I..</p> + + <p class="Code"> </p> + </li> + + <li class="Body">The <em class="Code">$(PROJ_TOP)</em> string + was replaced with a directory value that is relative to the + directory in which the mpc file is located.</li> + </ul> + </div> + + <div> + <a name="Additional -ti information"></a> + + <h6 class="Head5">The -ti Option.</h6> + + <ul> + <li class="BodyNoLead">The <em class="Code">-ti</em> option + allows you to identify different template input files based on + the type of target being built. Template input files correspond + to four different categories: <em class="Code">dll</em>, + <em class="Code">lib</em>, <em class="Code">dll_exe</em>, and + <em class="Code">lib_exe</em>. Not all project types + distinguish between the different categories, but the templates + for various project types will be combined with different + template input files, depending on the build target type, to + generate different output.</li> + + <li class="Body">To override the default template input file + names, a <em class="Code">-ti</em> option is provided. The + <em class="Code">-ti</em> option takes a single parameter of + the form <em class="Code">type:file</em>. The <em class= + "Code">type</em> is one of the four categories stated above and + the <em class="Code">file</em> is the base name of an mpt file + located somewhere in the include search paths.</li> + + <li class="Body">The following example shows a usage of the -ti + option. It says that when generating a static project (lib), + use the <em class="Code">vc7lib</em> template input file and + when generating a dynamic project (dll), use the <em class= + "Code">vc7dll</em> template input file:</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">mpc.pl -type vc71 -ti lib:vc7dsplib -ti + dll:vc7dspdll</p> + + <p class="Code"> </p> + </li> + + <li class="Body">These happen to be the default values for the + <em class="Code">vc71</em> type, but it illustrates that a + different template input can be specified for each + category.</li> + </ul> + </div> + + <div> + <a name="Additional -value_project information"></a> + + <h6 class="Head5">The -value_project Option.</h6> + + <ul> + <li class="BodyNoLead">The <em class="Code">-value_project</em> + option can be useful when the need arises to modify the value + of an MPC variable across one or more mpc files. For example, + if you wanted to generate all of your projects with an + additional include search path you would run the following + command:</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">mwc.pl -value_project + includes+=/include/path</p> + + <p class="Code"> </p> + </li> + + <li class="Body">In the above example, an additional include + search path of <em class="Code">/include/path</em> would be + placed in all generated projects.</li> + </ul> + </div> + + <div> + <a name="Additional -value_template information"></a> + + <h6 class="Head5">The -value_template Option.</h6> + + <ul> + <li class="BodyNoLead">This option modifies existing or adds + new template input name/value pairs. For example, if you wanted + to generate dynamic <em class="Code">vc71</em> projects with + only <em class="Code">Release</em> targets, you would run the + following command:</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">mwc.pl -type vc71 -value_template + configurations=Release</p> + + <p class="Code"> </p> + </li> + + <li class="Body">To find out what template input variables are + defined, see the individual mpd file of interest (<em class= + "Code">$ACE_ROOT/bin/MakeProjectCreator/templates/*.mpd</em> + and <em class="Code">$MPC_ROOT/templates/*.mpd</em> ) and + search for names used within <em class="Code"><%</em> and + <em class="Code">%></em> or use the <em class= + "Code">document_template.pl</em> script described in the + <a href="#Document%20Template%20Script">Template Variable + Documentation</a> section. Names that are not listed as project + keywords (see <a href="MakeProjectCreator.html#82186" class= + "XRef">Assignment Keywords</a>) are template variables.</li> + </ul> + </div> + </div> + </div> + + <div> + <h4 class="Head3">Configuration Files</h4> + + <ul> + <li class="BodyNoLead"> + <h6 class="Head5">Codebase Configuration File</h6> + </li> + + <li class="BodyNoLead">This configuration file can be used to + specify alternate locations for the MPC Configuration File + (discussed below). If a <em class="Code">base.cfg</em> is found + underneath the <em class="Code">config</em> directory in the MPC + root directory, it will be read to determine the location of + MPC.cfg based on the directory in which MPC was started.</li> + + <li class="Body">For example, if <em class= + "Code">$MPC_ROOT/mwc.pl</em> is run under <em class= + "Code">/foo/bar_root/src</em> and <em class= + "Code">$MPC_ROOT/config/base.cfg</em> contained:</li> + + <li class="Body"> + <p class="Code"> </p> + + <p class="Code">/foo/bar_root = /foo/bar_root/MPC/config</p> + + <p class="Code"> </p> + </li> + + <li class="Body">MPC would attempt to open and read <em class= + "Code">/foo/bar_root/MPC/config/MPC.cfg</em> as the MPC + Configuration File. If the base configuration file is not present, + MPC will try to use <em class="Code">$MPC_ROOT/config/MPC.cfg</em> + as the MPC Configuration File.</li> + + <li class="Body">You may reference environment variables, accessed + via the dollar sign (e.g., <em class="Code">$NAME</em>), on either + side of the equals sign.</li> + </ul> + + <ul> + <li class="BodyNoLead"> + <h6 class="Head5">MPC Configuration File</h6> + </li> + + <li class="BodyNoLead">In an effort to move away from the use of + environment variables, a configuration file has been introduced. + The configuration file (<em class="Code">MPC.cfg</em>) can contain + settings to provide command line options, control logging and + direct MPC to dynamic project types.</li> + + <li class="Body">The following keywords are allowed in the + configuration file.</li> + + <li class="Body"> + <table border="1" summary="Configuration File Keywords"> + <tr> + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Keyword</p> + </th> + + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Description</p> + </th> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">command_line</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Provide additional command line options + to MPC. The value of this setting will be prepended to the + options passed to <em class="Code">mwc.pl</em> or + <em class="Code">mpc.pl</em>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">default_type</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Provide a single project type (as + specified by the <em class="Code">-type</em> option) as the + default project type.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">dynamic_types</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This comma separated list points to + directories in which MPC will search for Perl modules to + implement additional MPC project types, base projects or + template files. This setting can be used to augment or + replace functionality in MPC. For each suitable directory + found, it will add a <em class="Code">modules</em> include + path for Perl to find modules, add a <em class= + "Code">config</em> include path to locate base projects and + a <em class="Code">template</em> include path to find MPC + templates.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">includes</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Similar to the <em class= + "Code">-include</em> command line option, it adds the list + of comma separated paths to the MPC include search + paths.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">logging</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If this setting contains <em class= + "Code">info=1</em>, informational messages will be printed. + If it contains <em class="Code">warn=1</em>, warning + messages will be printed. If it contains <em class= + "Code">diag=1</em>, diagnostic messages will be printed. If + it contains <em class="Code">debug=1</em>, debug message + will be printed. And lastly, if it contains <em class= + "Code">detail=1</em>, detail messages will be printed. If + it contains none of these, MPC will not print out any + information or warnings when processing projects or + workspaces. Errors are always printed if any are + encountered. The default value is <em class="Code">warn=1, + diag=1, detail=1</em>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">main_functions</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Provide additional main functions to be + recognized in conjunction with automatic executable project + recognition. The value assigned should be of the form + <em class="Code"><language>:<func name>[, + <language>:<func name>]*</em>. A function can + be specified for all languages by only providing the + function name.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">verbose_ordering</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If this is set, mwc.pl will warn the + user about references to projects in the <em class= + "Code">after</em> keyword that have not been processed.</p> + </td> + </tr> + </table> + </li> + </ul> + </div> + + <div> + <h4 class="Head3">Environment Variables</h4> + + <ul> + <li class="BodyNoLead">MPC recognizes a few environment variables + that alter the way it performs certain tasks. The sections below + describe each one and the effect it has on MPC.</li> + + <li class="Body">The <em class= + "Code">MPC_DEPENDENCY_COMBINED_STATIC_LIBRARY</em> environment + variable only affects the way workspace dependencies are created + for <em class="Emphasis">static</em> projects with the <em class= + "Code">em3</em>, <em class="Code">vc6</em>, <em class= + "Code">vc7</em>, <em class="Code">vc71</em>, vc8, vc9 and + <em class="Code">vc10</em> project types. If this environment + variable is set, MPC will generate inter-project dependencies for + libraries within a single workspace. This is usually not desired + since adding these dependencies in a static workspace has the side + effect of including dependee libraries into the dependent + library.</li> + + <li class="Body">The <em class="Code">MPC_GHS_UNIX</em> environment + variable is only meaningful when generating the ghs project files. + By default, the ghs type assumes that it is for Windows. Set this + environment variable prior to running MPC if this is not the + case.</li> + + <li class="Body">The <em class="Code">MPC_USE_WIN_COMMANDS</em> + environment variable causes the Windows related pseudo template + variables to be used regardless of the type of project being + generated.</li> + </ul> + </div> + </div> + + <div> + <h3 class="Head2">Writing MPC and MWC Files</h3> + <hr> + + <ul> + <li class="Body">You may want to familiarize yourself with the + various input files for MPC. The input file types and the syntax of + each are discussed in the sections below.</li> + </ul> + + <div> + <h4 class="Head3">Input Files</h4> + + <ul> + <li class="BodyNoLead">There are four different input files + associated with MPC. For most users of MPC, the main files of + concern are mpc and mwc files.</li> + </ul> + + <div> + <h5 class="Head4">Project Files (mpc)</h5> + + <ul> + <li class="BodyNoLead">Project files, those with the <em class= + "Code">mpc</em> extension, contain such things as include paths, + library paths, source files and inter-project dependencies. An + mpc file can contain one or more “projects” each of + which needs to be uniquely named to avoid project generation + errors. Projects represent build targets such as libraries and + executables.</li> + </ul> + </div> + + <div> + <h5 class="Head4">Workspace Files (mwc)</h5> + + <ul> + <li class="BodyNoLead">Workspaces are defined by providing a list + of mpc files, directories or other mwc files in a single mwc + file. For each mpc file, the Workspace Creator calls upon the + Project Creator to generate the project. After all of the + projects are successfully generated, the tool-specific workspace + is generated containing the projects and any defined + inter-project dependency information (if supported by the build + tool). An mwc file can contain one or more + “workspaces,” each of which needs to be uniquely + named. If no workspace files are provided to the workspace + creator, the current directory is traversed and any mpc files + located will be part of the workspace that is generated.</li> + </ul> + </div> + + <div> + <h5 class="Head4">Base Project Files (mpb)</h5> + + <ul> + <li class="BodyNoLead">One of the many unique and useful features + of MPC is that the project definition files can use inheritance. + Project inheritance allows a user to set up a base project (mpb + file) that can contain information that is applicable to all + derived projects. Common project attributes, such as include + paths, library paths, and inter-project dependencies, could be + described in this base project and any project that inherits from + it would contain this information as well.</li> + </ul> + </div> + + <div> + <h5 class="Head4">Base Workspace Files (mwb)</h5> + + <ul> + <li class="BodyNoLead">As with projects, workspaces can also + inherit from other workspaces. A base workspace can provide + workspace information that may be common to other + workspaces.</li> + </ul> + </div> + </div> + + <div> + <h4 class="Head3">General Input File Syntax</h4> + + <ul> + <li class="BodyNoLead">In this section we discuss the syntax of the + various files. We also describe some of the default values that go + along with these files.</li> + </ul> + + <div> + <h5 class="Head4">mwc and mwb</h5> + + <ul> + <li class="BodyNoLead">Workspaces can contain individual mpc + files or directories. There can be one or more workspaces defined + within a single mwc file.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">workspace(optional name): + optional_base_workspace {</p> + + <p class="Code"> file.mpc</p> + + <p class="Code"> directory</p> + + <p class="Code"> other.mwc</p> + + <p class="Code"> </p> + + <p class="Code"> exclude(vc6, vc7, vc71, vc8, vc9, + vc10, nmake) {</p> + + <p class="Code"> this_directory</p> + + <p class="Code"> }</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="BodyNoLead">A workspace can be given a name. This is + the value given in the parentheses after the keyword <em class= + "Code">workspace</em>. If the workspace is not given a name, the + workspace name is taken from the name of the mwc file without the + extension.</li> + + <li class="Body">Workspaces can also inherit from other + workspaces. In the above example, <em class= + "Code">optional_base_workspace</em> would be the base name of an + mwb file with no extension that contains workspace information. + This information would then be included in each workspace that + inherits from it.</li> + + <li class="Body">The lines between the curly braces contain + assignments, mpc files, directories, other workspace files or + exclusion sections. The mpc files listed will be included in the + workspace. If a directory is listed within the workspace, the + workspace creator will recursively traverse that directory and + use any mpc files that are found. If a workspace file is listed + it will be aggregated into the main workspace.</li> + + <li class="Body">A workspace can have assignments interspersed + within the directories and mpc files. These assignments modify + the way projects are generated.</li> + + <li class="Body">The <em class="Code">cmdline</em> setting can be + used to provide command line options that would normally be + passed to <em class="Code">mwc.pl</em> (see <a href= + "MakeProjectCreator.html#Command%20Line%20Options" class= + "XRef">Command Line Options</a>). However, the <em class= + "Code">-type</em>, <em class="Code">-recurse</em> , <em class= + "Code">-noreldefs</em> , <em class="Code">-make_coexistence</em>, + <em class="Code">-genins</em>, <em class="Code">-into</em> and + <em class="Code">-language</em> options as well as input files + are ignored. Environment variables may be accessed through + <em class="Code">$NAME</em>, where <em class="Code">NAME</em> is + the environment variable name. The <em class="Code">cmdline</em> + assignment may be useful for workspaces that require specific + <em class="Code">mwc.pl</em> options in order to process + correctly.</li> + + <li class="Body">The only other setting supported by mwc.pl is + <em class="Code">implicit</em>. If <em class="Code">implicit</em> + is set to <em class="Code">1</em> then default project files are + generated in each directory where no mpc file exists. The + <em class="Code">implicit</em> keyword can also be set to the + name of a base project. In this case, the implicitly generated + project will inherit from the base project specified in the + assignment. Either way, if the directory does not contain files + that can be used within a project, no project is created. Setting + <em class="Code">implicit</em> can be useful when you want to + define specific workspaces, but the MPC defaults are sufficient + for the directories involved within the workspace.</li> + + <li class="Body">Scoped assignments are assignments that are + associated with specific mpc files or directories listed with the + scope of the assignment. The following example shows a scoped + assignment of <em class="Code">cmdline</em> that only applies to + <em class="Code">one of the mpc files listed in the + workspace</em>. In this example, <em class= + "Code">directory/foo.mpc</em> would be processed as if the + <em class="Code">-static</em> option had been passed on the + command line whereas other directories and mpc files would + not.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">workspace {</p> + + <p class="Code"> ...</p> + + <p class="Code"> static {</p> + + <p class="Code"> cmdline += -static</p> + + <p class="Code"> directory/foo.mpc</p> + + <p class="Code"> }</p> + + <p class="Code"> </p> + + <p class="Code"> exclude(gnuace, make) {</p> + + <p class="Code"> some.mpc</p> + + <p class="Code"> }</p> + + <p class="Code"> </p> + + <p class="Code"> // Associate the name "other" with + dir3</p> + + <p class="Code"> associate(other) {</p> + + <p class="Code"> dir3</p> + + <p class="Code"> }</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="Body">Exclusion sections are used to prevent + directories and mpc files from being processed. These excluded + directories and mpc files will be skipped when generating project + files and workspaces. The <em class="Code">exclude</em> keyword + accepts project types within the parentheses (as above), which + will cause the workspace creator to only exclude the listing for + particular types. If no types are provided, exclusion will take + place for all project types.</li> + + <li class="Body">The <em class="Code">associate</em> scope + associates a name with one or more directories. This does not add + directories to a workspace, it only makes an association. This + may or may not have an effect on the generated workspace; it + depends solely upon whether the project type supports + associations. Currently <em class="Code">automake</em> is the + only project type that supports associations. Each directory + listed under an association is grouped together and built + conditionally based on the association name.</li> + + <li class="Body">Comments are similar to the C++ style comments. + Any text after a double slash (<em class="Code">//</em> ) is + considered a comment.</li> + </ul> + </div> + + <div> + <h5 class="Head4">mpc and mpb</h5> + + <div> + <h6 class="Head5">Project Declarations</h6> + + <ul> + <li class="BodyNoLead">Project declarations are similar to + workspace declarations, but are a bit more complex. An mpc file + can contain one or more “projects” and each project + can inherit from base projects.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">project(optional name): base_project, + another_base_project {</p> + + <p class="Code"> exename = client</p> + + <p class="Code"> includes += directory_name + other_directory</p> + + <p class="Code"> libpaths += /usr/X11R6/lib</p> + + <p class="Code"> </p> + + <p class="Code"> Header_Files {</p> + + <p class="Code"> file1.h</p> + + <p class="Code"> file2.h</p> + + <p class="Code"> fileN.h</p> + + <p class="Code"> }</p> + + <p class="Code"> </p> + + <p class="Code"> Source_Files {</p> + + <p class="Code"> file1.cpp</p> + + <p class="Code"> file2.cpp</p> + + <p class="Code"> fileN.cpp</p> + + <p class="Code"> }</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="BodyNoLead">If the optional project name is not + given, then the project name is taken from the name of the mpc + file without the extension. Therefore, if your mpc file is + going to contain multiple projects, it is important to provide + project names to prevent each generated project from + overwriting the other. MPC will issue an error and stop if + duplicate project names are detected.</li> + </ul> + </div> + + <div> + <h6 class="Head5">Base Projects</h6> + + <ul> + <li class="BodyNoLead">Base projects can be of the extension + <em class="Code">mpb</em> and <em class="Code">mpc</em>. If a + file with the name of the base project with an <em class= + "Code">mpb</em> or <em class="Code">mpc</em> extension cannot + be found within the mpc include search path, a fatal error is + issued and processing halts.</li> + </ul> + </div> + + <div> + <h6 class="Head5">Assignment Keywords</h6> + + <ul> + <li class="BodyNoLead">This table shows the keywords that can + be used in an assignment (i.e., <em class="Code">=</em>, + <em class="Code">+=</em> or <em class="Code">-=</em> ) within + an mpc file. The most commonly used keywords are shown in bold + face.</li> + + <li style="list-style: none"> + <h6 class="NumberedTableTitle"><a name="82186"></a>Assignment + Keywords</h6> + + <table border="1" summary="Assignment Keywords"> + <tr> + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Keyword</p> + </th> + + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Description</p> + </th> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="Bold"><em class= + "TableCode">after</em></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Specifies that this project must be + built after 1 or more project names listed.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">avoids</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Specifies which features should be + disabled in order to generate the project file. Under + the GNUACE type, it also specifies which make macros + should not be set to build the target.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">custom_only</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This setting instructs MPC to + create projects that only contain custom generation + targets. Any files included in the projects will be + provided by custom component lists defined through the + use of <em class="Code">Define_Custom</em>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">dllout</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If defined, specifies where the + dynamic libraries will be placed. This overrides libout + in the dynamic case.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="Bold"><em class= + "TableCode">dynamicflags</em></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Specifies preprocessor flags passed + to the compiler when building a dynamic library.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="Bold"><em class= + "TableCode">exename</em></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Determines that the project will be + an executable and the name of the executable + target.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="Bold"><em class= + "TableCode">exeout</em></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Specifies where executables will be + placed.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="Bold"><em class= + "TableCode">includes</em></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Specifies one or more directories + to supply to the compiler for use as include search + paths.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="Bold"><em class= + "TableCode">libout</em></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Specifies where the dynamic and + static libraries will be placed.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="Bold"><em class= + "TableCode">libpaths</em></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Specifies one or more directories + to supply to the compiler for use as library search + paths.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="Bold"><em class= + "TableCode">libs</em></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Specifies one or more libraries to + link into the target. Library modifiers may be added + when being processed in the template file. For example, + library modifiers are added when using the vc6 project + type.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">lit_libs</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as libs except + that a library modifier will not be added.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">macros</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Values supplied here will be passed + directly to the compiler as command line defined + macros.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">managed</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Specifies that the source files + should be compiled as managed C++. This is only + supported by the <em class="Code">nmake</em>, + <em class="Code">vc7</em>, <em class="Code">vc71</em>, + <em class="Code">vc8</em>, <em class="Code">vc9</em>, + and <em class="Code">vc10</em> project types.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">no_pch</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">It specifies that precompiled + headers should not be used for the source files listed + within the scope of it’s setting. This keyword + can only be used as a source component scoped setting + (i.e., inside the scope of Source_Files).</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">pch_header</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The name of the precompiled header + file. See the discussion below this table for more + information.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">pch_source</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The name of the precompiled source + file. See the discussion below this table for more + information.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">postbuild</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If this is defined in the project, + the value will be interpreted as commands to run after + the project has been successfully built. The <em class= + "Code"><% %></em> construct (see <a href= + "MakeProjectCreator.html#MPD%20Syntax" class= + "XRef">Template Files</a>) can be used within this + value to access template variables and functions of the + template parser. See <a href= + "#Common%20Pseudo%20Variables" class="XRef">Common + Pseudo Variables</a> for a list of pseudo variables + that are also available.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">postclean</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If this is defined in the project, + the value will be interpreted as commands to run after + the project has been cleaned. It should be noted that + this setting is not supported by all project types. As + with <em class="Code">postbuild</em>, the <em class= + "Code"><% %></em> construct (see <a href= + "MakeProjectCreator.html#MPD%20Syntax" class= + "XRef">Template Files</a>) can be used within this + value to access template variables and functions of the + template parser. See <a href= + "#Common%20Pseudo%20Variables" class="XRef">Common + Pseudo Variables</a> for a list of pseudo variables + that are also available.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">prebuild</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If this is defined in the project, + the value will be interpreted as commands to run before + the project has been built. As with <em class= + "Code">postbuild</em>, the <em class="Code"><% + %></em> construct (see <a href= + "MakeProjectCreator.html#MPD%20Syntax" class= + "XRef">Template Files</a>) can be used within this + value to access template variables and functions of the + template parser. See <a href= + "#Common%20Pseudo%20Variables" class="XRef">Common + Pseudo Variables</a> for a list of pseudo variables + that are also available.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">pure_libs</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is similar to <em class= + "Code">lit_libs</em> except that no prefix or extension + is added to the names specified.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">recurse</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If set to 1, MPC will recurse into + directories listed under component listings (such as + Source_Files, Header_Files, etc.) and add any component + corresponding files to the list. This keyword can be + used as a global project setting or a component scoped + setting.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">recursive_includes</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is similar to <em class= + "Code">includes</em> in that it provides include paths + to the compiler. However, each path supplied will be + recursively searched for sub-directories which will + also be provided as include paths to the compiler.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">recursive_libpaths</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is similar to <em class= + "Code">libpaths</em> in that it provides library search + paths to the linker. However, each path supplied will + be recursively searched for sub-directories which will + also be provided as library search paths to the + linker.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">requires</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Specifies which features should be + enabled in order to generate the project file. Under + the GNUACE type, it also specifies which make macros + should be set to build the target.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="Bold"><em class= + "TableCode">sharedname</em></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Determines that the project will be + a library and the name of the dynamic library target. + See the discussion below this table for more + information.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="Bold"><em class= + "TableCode">staticflags</em></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Specifies preprocessor flags passed + to the compiler when building a static library.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="Bold"><em class= + "TableCode">staticname</em></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Determines that the project will be + a library and the name of the static library + target.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">tagchecks</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">For GNUACE Make only, specifies one + or more names to search for in the macros specified by + tagname.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">tagname</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Specifies the GNUACE Make macro to + check before building the target.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">version</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Specifies the version number for + the library or executable.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">webapp</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Determines whether the project is a + Web Application. A web application project will have no + project file written but the information will be + included in the workspace if web applications are + supported by the project type.</p> + </td> + </tr> + </table> + </li> + + <li class="BodyNoLead">Assignments can also use the <em class= + "Code">+=</em> and <em class="Code">-=</em> operators to add + and subtract values from keyword values.</li> + + <li class="Body">If a <em class="Code">sharedname</em> is + specified in the mpc file and <em class="Code">staticname</em> + is not used, then <em class="Code">staticname</em> is assumed + to be the same as <em class="Code">sharedname</em>. This also + applies in the opposite direction.</li> + + <li class="Body">If neither exename, sharedname nor staticname + is specified, MPC will search the source files for a <em class= + "Code">main</em> function. If a <em class="Code">main</em> is + found, the exename will be set to the name of the file, minus + the extension, that contained the <em class="Code">main</em> + function. Otherwise, sharedname and staticname will be set to + the project name.</li> + + <li class="Body">If the project name, exename, sharedname or + staticname contain an asterisk it instructs MPC to dynamically + determine a portion of the name based on certain defaults. If + the project name contains an asterisk, then the asterisk will + be replaced with the default project name. If exename, + sharedname or staticname contains an asterisk, then the + asterisk will be replaced with the project name.</li> + + <li class="Body">If the <em class="Code">pch_header</em> + keyword is not used and a file exists, in the directory in + which the mpc file is located, that matches <em class= + "Code">*_pch.h</em> it is assumed to be the precompiled header + for that directory. If there are multiple pch files in the + directory, then the precompiled header that closely matches the + project name will be chosen. Similar logic applies for the + <em class="Code">pch_source</em> keyword.</li> + </ul> + </div> + + <div> + <a name="16907"></a> + + <h6 class="Head5">Components</h6> + + <ul> + <li class="BodyNoLead">An mpc file can also specify the files + to be included in the generated “project” file. + These files are specified using the component names shown in + the following table. However, most of the time users will want + to allow MPC to provide the default values for project + files.</li> + + <li style="list-style: none"> + <h6 class="NumberedTableTitle">Component Names and Default + Values</h6> + + <table border="1" summary= + "Component Names and Default Values"> + <tr> + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Name</p> + </th> + + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Default Value</p> + </th> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">Source_Files</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Defaults to all files in the + directory that have the following extensions: + <em class="Code">cpp</em>, <em class="Code">cxx</em>, + <em class="Code">cc</em>, <em class="Code">c</em>, and + <em class="Code">C</em>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">Header_Files</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Defaults to all files in the + directory that have the following extensions: + <em class="Code">h</em>, hpp, <em class= + "Code">hxx</em>, and <em class="Code">hh</em>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">Inline_Files</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Defaults to all files in the + directory that have the following extensions: + <em class="Code">i</em> and <em class= + "Code">inl</em>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">Template_Files</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Defaults to all files in the + directory that end in the following: <em class= + "Code">_T.cpp</em>, <em class="Code">_T.cxx</em>, + <em class="Code">_T.cc</em>, <em class= + "Code">_T.c</em>, and <em class="Code">_T.C</em>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">Documentation_Files</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Defaults to all files in the + directory that match the following: <em class= + "Code">README</em>, <em class="Code">readme</em>, + <em class="Code">.doc</em>, <em class="Code">.html</em> + and <em class="Code">.txt</em>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">Resource_Files</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Defaults to all files in the + directory that match the project name and have an + <em class="Code">rc</em> extension.</p> + </td> + </tr> + </table> + </li> + + <li class="Body">If a component is not specified in the mpc + file, the default value will be used. To disallow a particular + set of files that may exist in the directory, you must declare + an empty set of the particular component type.</li> + + <li class="Body">Each component name accepts two forms. The + first form is a simple list of files within the construct.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">Source_Files {</p> + + <p class="Code"> file1.cpp</p> + + <p class="Code"> file2.cpp</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="Body">The second form is a complex list of files + within named blocks.</li> + + <li style="list-style: none"> + <a name="MPC grouping example"></a> + + <p class="Code"> </p> + + <p class="Code">Source_Files(MACRO_NAME) {</p> + + <p class="Code"> BlockA {</p> + + <p class="Code"> file1.cpp</p> + + <p class="Code"> file2.cpp</p> + + <p class="Code"> }</p> + + <p class="Code"> BlockB {</p> + + <p class="Code"> file3.cpp</p> + + <p class="Code"> file4.cpp</p> + + <p class="Code"> }</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="Body">The second form allows the user to logically + group the files to make future maintenance easier. Using this + form has the effect of visually grouping files in the generated + project file for the <em class="Code">em3</em>, <em class= + "Code">gnuace</em>, <em class="Code">vc6</em>, <em class= + "Code">vc7</em>, <em class="Code">vc71</em>, vc8, vc9 and + <em class="Code">vc10</em> project types.</li> + + <li class="Body">If a file is listed in the <em class= + "Code">Source_Files</em> component list and a corresponding + header or inline file exists in the directory, it is added to + the corresponding component list unless it is already + listed.</li> + </ul> + </div> + + <div> + <h6 class="Head5">Verbatim Clause</h6> + + <ul> + <li class="BodyNoLead">The <em class="Code">verbatim</em> + construct can be used to place text into a generated project + file verbatim. The <em class="Code">verbatim</em> syntax is as + follows:</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">verbatim(<project type>, + <location>) {</p> + + <p class="Code"> ...</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="Body">When MPC is generating a project of type + <em class="Code"><project type></em> and encounters a + <em class="Code">marker</em> in the template file (see <a href= + "MakeProjectCreator.html#38037" class="XRef">Template File + Keywords</a>) that matches the <em class= + "Code"><location></em> name, it will place the text found + inside the construct directly into the generated project. If + the text inside the construct requires that white space be + preserved, each line must be enclosed in double quotes. The + following <em class="Code">verbatim</em> example would result + in <em class="Code">gnuace</em> generated projects having a + rule at the bottom of the GNUmakefile where the <em class= + "Code">all:</em> target depends on <em class= + "Code">foo</em>.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">verbatim(gnuace, bottom) {</p> + + <p class="Code"> all: foo</p> + + <p class="Code">}</p> + </li> + </ul> + </div> + + <div> + <h6 class="Head5">Expand Clause</h6> + + <ul> + <li class="BodyNoLead">The <em class="Code">expand</em> keyword + can be used to provide values for variable names enclosed + within <em class="Code">$()</em>. In the example below, we see + the name <em class="Code">VAR_NAME</em> inside the parenthesis. + Whenever MPC sees <em class="Code">$(VAR_NAME)</em> it will + attempt to replace it with values from the expansion list. MPC + will first try to replace it with the value of the environment + variable named <em class="Code">ENV_VAR</em>. If that + environment variable has a value, it will be used. Otherwise, + it will continue down the list until a suitable value is found. + In this example, the text <em class= + "Code">last_resort_value</em> will be used. MPC will leave the + <em class="Code">$()</em> value as it was in the event that no + value is found.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">expand(VAR_NAME) {</p> + + <p class="Code"> $ENV_VAR</p> + + <p class="Code"> last_resort_value</p> + + <p class="Code">}</p> + </li> + </ul> + </div> + + <div> + <h6 class="Head5">Specific Clause</h6> + + <ul> + <li class="BodyNoLead">The <em class="Code">specific</em> + keyword can be used to define assignments that are specific to + a particular project type or property specified in the + parenthesis. This will allow platform or OS-specific values to + be placed into a project. For example, on one platform you may + want to link in a library named <em class="Code">qt-mt</em>, + but on another you need to link in <em class= + "Code">qt-mt230nc</em>.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">specific(prop:windows) {</p> + + <p class="Code"> lit_libs += qt-mt230nc</p> + + <p class="Code">} else {</p> + + <p class="Code"> lit_libs += qt-mt</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="Body">If an else clause is provided, it is required + to be on the same line as the closing curly brace. You may also + negate the project type or property (using ’!’) + which will cause the specific to be evaluated for all types + except the type specified.</li> + + <li class="Body">If a keyword used within a <em class= + "Code">specific</em> section is not recognized as a valid MPC + keyword, it is interpreted to be template value modifier. In + this situation, this construct works exactly the same way as + the <em class="Code">-value_template</em> command line option + (see <a href="MakeProjectCreator.html#Command%20Line%20Options" + class="XRef">Command Line Options</a>).</li> + + <li class="Body">The following table shows which properties + apply to which project types. The <em class="Code">static</em> + property (not represented in the table) is set if the -static + option is supplied when processing the project files. + Additionally, a property that corresponds to the language + will be set (e.g., cplusplus, csharp, java, vb).</li> + + <li class="Body"> + <h6 class="NumberedTableTitle"><a name= + "Property Table"></a>Property Table</h6> + + <table border="1" summary="Property Table"> + <tr> + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Project Type</p> + </th> + + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">borland</p> + </th> + + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">make</p> + </th> + + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">microsoft</p> + </th> + + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">windows</p> + </th> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">automake</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">bcb2007</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">bcb2009</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">bds4</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">bmake</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">cc</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">em3</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">ghs</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Depends</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">make</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">nmake</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">vc6</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">vc7</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">vc71</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">vc8</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">vc9</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">vc10</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">wix</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"> </p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Yes</p> + </td> + </tr> + </table> + </li> + + <li class="Body">The ghs project type can be used on both + Windows and UNIX. The windows property will be active if the + <em class="Code">MPC_GHS_UNIX</em> environment variable is not + set during project generation.</li> + </ul> + </div> + + <div> + <h6 class="Head5">Conditional Clause</h6> + + <ul> + <li class="Body">This scope allows addition of source files + conditionally based on a particular project type or property + (see the <a href="#Property%20Table" class="XRef">property + table</a>). The syntax is as follows:</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">conditional(<project type|property> [, + <project type|property> ...]) {</p> + + <p class="Code"> source1.cpp</p> + + <p class="Code"> ...</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + + <p class="Code">conditional(<project type|property> [, + <project type|property> ...]) {</p> + + <p class="Code"> source1.cpp</p> + + <p class="Code"> ...</p> + + <p class="Code">} else {</p> + + <p class="Code"> source2.cpp</p> + + <p class="Code"> ...</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="Body">If the else is provided, it is required to be + on the same line as the closing curly brace. You may also + negate the project type (using ’!’) which will + cause the conditional to be evaluated for all types except the + type specified.</li> + </ul> + </div> + + <div> + <a name="Custom Types and Build Rules"></a> + + <h6 class="Head5">Custom Types and Build Rules</h6> + + <ul> + <li class="BodyNoLead">MPC allows you to define your own custom + file types to support a variety of custom build rules. Below is + an example of a custom definition.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">project {</p> + + <p class="Code"> Define_Custom(MOC) {</p> + + <p class="Code"> automatic = 0</p> + + <p class="Code"> command = + $(QTDIR)/bin/moc</p> + + <p class="Code"> output_option = + -o</p> + + <p class="Code"> inputext = .h</p> + + <p class="Code"> pre_extension = + _moc</p> + + <p class="Code"> source_outputext = + .cpp</p> + + <p class="Code"> keyword mocflags = + commandflags</p> + + <p class="Code"> }</p> + + <p class="Code"> </p> + + <p class="Code"> // Custom Component</p> + + <p class="Code"> MOC_Files {</p> + + <p class="Code"> QtReactor.h</p> + + <p class="Code"> }</p> + + <p class="Code"> </p> + + <p class="Code"> Source_Files {</p> + + <p class="Code"> QtReactor_moc.cpp</p> + + <p class="Code"> }</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="Body">The above example defines a custom file type, + “<em class="Code">MOC</em> ”, that describes basic + information about how to process the input files and what + output files are created. Once the custom file type is defined, + <em class="Code">MOC_Files</em> can be used to specify the + input files for this new file type.</li> + + <li class="Body">The following table contains the keywords that + can be used within the scope of <em class= + "Code">Define_Custom</em>.</li> + + <li style="list-style: none"> + <a name="32899"></a> + + <h6 class="NumberedTableTitle">Define_Custom Keywords</h6> + + <table border="1" summary="Define_Custom Keywords"> + <tr> + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Keyword</p> + </th> + + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Description</p> + </th> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">automatic_in</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If set to 1, then attempt to + automatically determine which files belong to the set + of input files for the custom type. If set to 0, then + no files are automatically added to the input + files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">automatic_out</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If set to 1, then attempt to + automatically determine which generated files belong to + the set of components (<em class= + "Code">Source_Files</em>, <em class= + "Code">Inline_Files</em> , <em class= + "Code">Header_Files</em>, <em class= + "Code">Template_Files</em>, <em class= + "Code">Resource_Files</em> and <em class= + "Code">Documentation_Files</em>) based on type files + that the command generates. If omitted, then + automatic_out is assumed to be 1.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">command</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The name of the command that should + be used to process the input files for the custom + type.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">commandflags</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Any options that should be passed + to the command.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">dependent</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If this is given a value, then a + dependency upon that value will be given to all of the + generated files. The default for this is unset and no + dependency will be generated.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">inputext</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is a comma separated list of + input file extensions that belong to the command.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">keyword + <name></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is a special assignment that + allows the user to map <name> into the project + level namespace. The value (if any) that is assigned to + this construct must be one of the keywords that can be + used within a Define_Custom clause. The result of this + assignment is the ability modify the value of keywords + that are normally only accessible within the scope of a + custom component (e.g. <em class="Code">command</em>, + <em class="Code">commandflags</em>, etc.).</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">libpath</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If the command requires a library + that is not in the normal library search path, this + keyword can be used to ensure that the command is able + to find the library that it needs to run.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">output_option</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If the command takes an option to + specify a single file output name, then set it here. + Otherwise, this should be omitted.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">output_follows_input</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This setting defaults to 1 and + indicates that output files from the custom command + will end up in the same directory as the input files. + If this is set to 0, it is assumed that the output + files will go into the same directory as the .mpc + file.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">pch_postrule</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If this is set to 1, then a rule + will be added to the custom rule that will modify the + source output files to include the precompiled header + file.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">postcommand</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This allows users to create + arbitrary commands that will be run after the main + command is run to process the custom input files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">pre_extension</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If the command produces multiple + files of the same extension, this comma separated list + can be used to specify them. For example, <em class= + "Code">tao_idl</em> creates two types of files per + extension (<em class="Code">C.h</em>, <em class= + "Code">S.h</em>, <em class="Code">C.cpp</em>, + <em class="Code">S.cpp</em>, etc.) This applies to all + extension types.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">source_pre_extension</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_extension + except that it only applies to source files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">inline_pre_extension</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_extension + except that it only applies to inline files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">header_pre_extension</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_extension + except that it only applies to header files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">template_pre_extension</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_extension + except that it only applies to template files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">resource_pre_extension</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_extension + except that it only applies to resource files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">documentation_pre_extension</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_extension + except that it only applies to documentation files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">generic_pre_extension</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_extension + except that it only applies to generic files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">pre_filename</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The syntax for this is the same as + <em class="Code">pre_extension</em>, but the values + specified are prepended to the file name instead of the + extension. This applies to all extension types.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">source_pre_filename</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_filename + except that it only applies to source files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">inline_pre_filename</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_filename + except that it only applies to inline files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">header_pre_filename</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_filename + except that it only applies to header files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">template_pre_filename</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_filename + except that it only applies to template files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">resource_pre_filename</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_filename + except that it only applies to resource files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">documentation_pre_filename</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_filename + except that it only applies to documentation files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">generic_pre_filename</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_filename + except that it only applies to generic files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">pre_dirname</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The syntax for this is the same as + <em class="Code">pre_filename</em>, but the value + specified is prepended to the directory portion of the + file name instead of the file name itself. If a + separate directory is desired, the <em class= + "Code">pre_dirname</em> setting should end in a + slash.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">source_pre_dirname</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_dirname + except that it only applies to source files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">inline_pre_dirname</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_dirname + except that it only applies to inline files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">header_pre_dirname</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_dirname + except that it only applies to header files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">template_pre_dirname</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_dirname + except that it only applies to template files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">resource_pre_dirname</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_dirname + except that it only applies to resource files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">documentation_pre_dirname</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_dirname + except that it only applies to documentation files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">generic_pre_dirname</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is the same as pre_dirname + except that it only applies to generic files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">source_outputext</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is a comma separated list of + possible source file output extensions. If the command + does not produce source files, then this can be + omitted.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">inline_outputext</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is a comma separated list of + possible inline file output extensions. If the command + does not produce inline files, then this can be + omitted.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">header_outputext</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is a comma separated list of + possible header file output extensions. If the command + does not produce header files, then this can be + omitted.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">template_outputext</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is a comma separated list of + possible template file output extensions. If the + command does not produce template files, then this can + be omitted.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">resource_outputext</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is a comma separated list of + possible resource file output extensions. If the + command does not produce resource files, then this can + be omitted.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">documentation_outputext</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is a comma separated list of + possible documentation file output extensions. If the + command does not produce documentation files, then this + can be omitted.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">generic_outputext</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">If the command does not generate + any of the other output types listed above, then the + extensions should be listed under this.</p> + </td> + </tr> + </table> + </li> + + <li class="Body">There is a special interaction between custom + components and the source, header and inline components. If a + <em class="Code">custom</em> definition is set to be + “automatic” and custom component files are present + but not specified, the default custom generated names are added + to the source, header and inline component lists unless those + names are already listed (or partially listed) in those + component lists. See <a href= + "MakeProjectCreator.html#Custom%20Types%20and%20Build%20Rules" + class="XRef">Custom Types and Build Rules</a> for more + information about defining your own custom type.</li> + + <li class="Body">Particular output extensions for custom build + types are not required. However, at least one output extension + type is required for MPC to generate a target. Your command + does not necessarily have to generate output, but an extension + type is required if you want the input file to be processed + during the project compilation.</li> + + <li class="Body">If the custom output can not be represented + with the above output extension keywords (*_outputext) and you + have knowledge of the output files <em class="Emphasis">a + priori</em>, you can represent them with the <em class= + "Code">>></em> construct.</li> + + <li class="Body">Below is an example that demonstrates the use + of <em class="Code">>></em>. The command takes an input + file name of foo.prp and produces two files that have + completely unrelated filenames, <em class="Code">hello.h</em> + and <em class="Code">hello.cpp</em>.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">project {</p> + + <p class="Code"> Define_Custom(Quogen) {</p> + + <p class="Code"> automatic = 0</p> + + <p class="Code"> command = perl quogen.pl</p> + + <p class="Code"> commandflags = --debuglevel=1 + --language=c++ \</p> + + <p class="Code"> + --kernel_language=c++</p> + + <p class="Code"> inputext = .prp</p> + + <p class="Code"> keyword quogenflags = + commandflags</p> + + <p class="Code"> }</p> + + <p class="Code"> </p> + + <p class="Code"> Quogen_Files {</p> + + <p class="Code"> foo.prp >> + hello.h hello.cpp</p> + + <p class="Code"> }</p> + + <p class="Code"> </p> + + <p class="Code"> Source_Files {</p> + + <p class="Code"> hello.cpp</p> + + <p class="Code"> }</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="Body">You can use the <em class="Code"><<</em> + construct to represent dependencies for specific custom input + file. For instance, in the above example, assume that foo.prp + depends upon foo.in, we would represent this by adding + <em class="Code"><<</em> foo.in as shown below.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">Quogen_Files {</p> + + <p class="Code"> foo.prp >> hello.h + hello.cpp << foo.in</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="Body">An additional construct can be used within the + scope of a <em class="Code">Define_Custom</em>. This construct + is called <em class="Code">optional</em>, and can be used to + represent optional custom command output that is dependent upon + particular command line parameters passed to the custom + command.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">project {</p> + + <p class="Code"> Define_Custom(TEST) {</p> + + <p class="Code"> optional(keyword) + {</p> + + <p class="Code"> + flag_keyword(option) += + value [, value]</p> + + <p class="Code"> }</p> + + <p class="Code"> }</p> + + <p class="Code">}</p> + </li> + + <li class="Body">In the above fragment, <em class= + "Code">keyword</em> can be any of the <em class= + "Code">pre_extension</em>, <em class="Code">pre_filename</em> + keywords or any of the keywords that end in <em class= + "Code">_outputext</em>. The <em class="Code">flag_keyword</em> + can be any of the custom definition keywords, however only + <em class="Code">commandflags</em> has any functional value. + The <em class="Code">flag_keyword</em> value is searched for + the <em class="Code">option</em> value contained inside the + parenthesis. If it is found the <em class="Code">value</em> or + <em class="Code">values</em> after the += are added to the list + specified by <em class="Code">keyword</em>. This can also be + negated by prefixing the <em class="Code">option</em> with an + exclamation point (!).</li> + + <li class="Body">The example below shows how the <em class= + "Code">optional</em> construct is used by the custom definition + for the <em class="Code">tao_idl</em> command (see <em class= + "Code">ACE_wrappers/TAO/MPC/config/taoidldefaults.mpb</em> ). + The <em class="Code">-GA</em> option causes <em class= + "Code">tao_idl</em> to generate an additional source file + (based on the idl file name) with an <em class= + "Code">A.cpp</em> extension. The <em class="Code">-Sc</em> + option causes <em class="Code">tao_idl</em> to suppress the + generation of <em class="Code">S_T</em> related files.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">Define_Custom(IDL) {</p> + + <p class="Code"> ...</p> + + <p class="Code"> inputext = .idl</p> + + <p class="Code"> source_pre_extension = C, S</p> + + <p class="Code"> header_pre_extension = C, S</p> + + <p class="Code"> inline_pre_extension = C, S</p> + + <p class="Code"> source_outputext = .cpp, .cxx, + .cc, .C</p> + + <p class="Code"> header_outputext = .h, .hpp, + .hxx, .hh</p> + + <p class="Code"> inline_outputext = .inl, .i</p> + + <p class="Code"> keyword idlflags = + commandflags</p> + + <p class="Code"> </p> + + <p class="Code"> optional(source_pre_extension) + {</p> + + <p class="Code"> commandflags(-GA) += + A</p> + + <p class="Code"> }</p> + + <p class="Code"> optional(template_outputext) + {</p> + + <p class="Code"> commandflags(!-Sc) += + S_T.cpp, S_T.cxx, S_T.cc, S_T.C</p> + + <p class="Code"> }</p> + + <p class="Code"> optional(header_pre_extension) + {</p> + + <p class="Code"> commandflags(!-Sc) += + S_T</p> + + <p class="Code"> }</p> + + <p class="Code"> optional(inline_pre_extension) + {</p> + + <p class="Code"> commandflags(!-Sc) += + S_T</p> + + <p class="Code"> }</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="Body">For custom file types, there are a few + keywords that can be used within the custom file type component + lists: <em class="Code">command</em>, <em class= + "Code">commandflags</em>, <em class="Code">dependent</em>, + <em class="Code">gendir</em>, <em class= + "Code">postcommand</em>, and <em class= + "Code">recurse</em>.</li> + + <li class="Body">The <em class="Code">recurse</em> keyword + works as described in <a href="MakeProjectCreator.html#82186" + class="XRef">Assignment Keywords</a>.</li> + + <li class="Body">The <em class="Code">command</em>, <em class= + "Code">commandflags</em>, <em class="Code">dependent</em> and + <em class="Code">postcommand</em> keywords can be used to + augment or override the value defined in the <em class= + "Code">Define_Custom</em> section.</li> + + <li class="Body">The <em class="Code">gendir</em> keyword can + be used (only if <em class="Code">output_option</em> is set in + <em class="Code">Define_Custom</em> ) to specify the directory + in which the generated output will go. Here is an example:</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">MOC_Files {</p> + + <p class="Code"> commandflags += -nw</p> + + <p class="Code"> gendir = moc_generated</p> + + <p class="Code"> QtReactor.h</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + + <p class="Code">Source_Files {</p> + + <p class="Code"> + moc_generated/QtReactor_moc.cpp</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="Body">In the above example, the <em class= + "Code">-nw</em> option is added to <em class= + "Code">commandflags</em> and the generated file (<em class= + "Code">QtReactor_moc.cpp</em> ) is placed in the <em class= + "Code">moc_generated</em> directory. If the <em class= + "Code">MOC</em> custom definition did not have an <em class= + "Code">output_option</em> setting, then options would need to + be added to <em class="Code">commandflags</em> or a <em class= + "Code">postcommand</em> would need to be defined to ensure that + the output actually went into the <em class= + "Code">moc_generated</em> directory.</li> + </ul> + + <div> + <h6 class="Head6">Modify_Custom</h6> + + <ul> + <li class="Body">An existing <em class= + "Code">Define_Custom</em> section can be modified by using + <em class="Code">Modify_Custom</em>. The syntax of the body + is identical to that of a <em class= + "Code">Define_Custom</em>. The example below shows a + modification to the TAO IDL defaults found in <em class= + "Code">taoidldefaults.mpb</em> of the TAO+ACE distribution. + Everything provided by the <em class= + "Code">Define_Custom(IDL)</em> remains unchanged except for + the values set within the <em class= + "Code">Modify_Custom(IDL).</em></li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">project: taoidldefaults {</p> + + <p class="Code"> specific(!automake) {</p> + + <p class="Code"> tao_idlflags += -Sc + -hs _s.h -si _s.i -ss _s.cpp -hc .h -ci .i -cs .cpp</p> + + <p class="Code"> }</p> + + <p class="Code"> </p> + + <p class="Code"> // This allows "make idl_stubs" + to work</p> + + <p class="Code"> verbatim(gnuace, macros) {</p> + + <p class="Code"> IDL_CLIENT_HDR_EXT + ?= .h</p> + + <p class="Code"> IDL_CLIENT_INL_EXT + ?= .i</p> + + <p class="Code"> IDL_CLIENT_SRC_EXT + ?= .cpp</p> + + <p class="Code"> IDL_SERVER_HDR_EXT + ?= _s.h</p> + + <p class="Code"> IDL_SERVER_INL_EXT + ?= _s.i</p> + + <p class="Code"> IDL_SERVER_SRC_EXT + ?= _s.cpp</p> + + <p class="Code"> }</p> + + <p class="Code"> </p> + + <p class="Code"> Modify_Custom(IDL) {</p> + + <p class="Code"> + source_pre_extension = , _s</p> + + <p class="Code"> + header_pre_extension = , _s</p> + + <p class="Code"> + inline_pre_extension = , _s</p> + + <p class="Code"> inline_outputext + = .i</p> + + <p class="Code"> }</p> + + <p class="Code">}</p> + </li> + </ul> + </div> + + <div> + <h6 class="Head6">Custom Post Command</h6> + + <ul> + <li class="BodyNoLead">When defining a <em class= + "Code">postcommand</em> as part of a <em class= + "Code">Define_Custom</em>, a few pseudo template variables + are available to provide some flexibility. The following + table shows the pseudo template variables that can be + accessed only from the <em class="Code">postcommand</em>. + Please note that <em class="Code"><%</em> and <em class= + "Code">%></em> are part of the syntax.</li> + + <li style="list-style: none"> + <h6 class="NumberedTableTitle">Post Command Pseudo + Variables</h6> + + <table border="1" summary="Post Command Pseudo Variables"> + <tr> + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Variable</p> + </th> + + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Description</p> + </th> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%input%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The input file to the + command.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%input_basename%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The basename of the input file to + the command.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%input_dirname%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The directory name of the input + file to the command.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%input_noext%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The input file to the command + with the extension stripped off.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%input_ext%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This gives the file extension of + the input file (if there is one).</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%output%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The output file created by the + original command.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%output_basename%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The basename of the output file + to the command.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%output_dirname%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The directory name of the output + file to the command.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%output_noext%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The output file created by the + original command with the extension stripped off.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%output_ext%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This gives the file extension of + the output file (if there is one).</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="2"> + <p class="TblCode">The output file can be referenced + as a generic output file, or it can be referenced as + a component file using one of the following + variables. If it does not match the specific type the + value will be empty.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%documentation_file%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The output file if it is a + documentation file.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%header_file%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The output file if it has a + header file extension.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%inline_file%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The output file if it has an + inline file extension.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%resource_file%></em> (<em class= + "TableCode"><%resx_file%></em> for C# and + VB)</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The output file if it has a + resource file extension.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%source_file%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The output file if it has a + source file extension.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%template_file%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The output file if it is a + template file.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%documentation_file_noext%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The output file without an + extension if it is a documentation file.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%header_file_noext%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The output file without an + extension if it has a header file extension.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%inline_file_noext%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The output file without an + extension if it has an inline file extension.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%resource_file_noext%></em> + (<em class="TableCode"><%resx_file_noext%></em> + for C# and VB)</p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The output file without an + extension if it has a resource file extension.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%source_file_noext%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The output file without an + extension if it has a source file extension.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%template_file_noext%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The output file without an + extension if it is a template file.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="2"> + <p class="TblCode">The extensions of the input and + output files are also available as pseudo + variables.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%input_ext%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The extension of the input file + (if it has one).</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%output_ext%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The extension of the output file + (if it has one).</p> + </td> + </tr> + </table> + </li> + + <li class="Body"> </li> + + <li class="Body">The following table describes the pseudo + template variables that can be used in the <em class= + "Code">command</em>, <em class="Code">commandflags</em>, + <em class="Code">dependent</em>, <em class= + "Code">output_option</em> and <em class= + "Code">postcommand</em> settings.</li> + + <li style="list-style: none"> + <h6 class="NumberedTableTitle"><a name= + "Common Pseudo Variables"></a>Common Pseudo Variables</h6> + + <table border="1" summary="Common Pseudo Variables"> + <tr> + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Variable</p> + </th> + + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Description</p> + </th> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%and%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A platform and project + non-specific representation of a command conditional + and.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%cat%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A platform non-specific command + to print a file to the terminal.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%cmdsep%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A project and platform + non-specific command separator which always runs + right-hand side of the command. For example, in the + following psuedo commmand string, both the <em class= + "Code"><%cat%></em> and <em class= + "Code"><%mv%></em> commands would be run. + <em class="Code"><%cat%> <%source_file%> + <%gt%> foo <%cmdsep%> <%mv%> foo + other_dir</em></p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%cmp%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A platform non-specific command + to compare two files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%cp%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A platform non-specific command + to copy a file.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%crlf%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A platform non-specific line + ending.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%equote%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A project non-specific escaped + double quote.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%gendir%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The output directory specified by + the <em class="Code">gendir</em> setting. This + variable is not available to <em class= + "Code">postbuild</em>, <em class= + "Code">postclean</em>, or<em class= + "Code">prebuild.</em></p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%gt%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A platform and project + non-specific representation of a greater than + sign.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%lt%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A platform and project + non-specific representation of a less than sign.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%mkdir%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A platform non-specific command + to make a directory.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%mv%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A platform non-specific command + to move a file.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%nul%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A platform non-specific null + device.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%or%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A platform and project + non-specific representation of a command conditional + or.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%os%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Returns either win32 or unix.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%prj_type%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The project type as supplied + by the -type command line option.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%quote%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A project non-specific + representation of a double quote.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%rm%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A platform non-specific command + to delete a file.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%rmdir%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A platform non-specific recursive + directory delete command.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%slash%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A platform non-specific directory + separator.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%temporary%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">A temporary file name. The + generated temporary file name contains no directory + portion and is the same for each use within the same + variable setting.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="2"> + <p class="TblCode">The following variables will + be set to the known extension for Windows based + project types and empty on non-Windows based + project types.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%bat%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The extension for batch + files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%cmd%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The extension for command + files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="TblCode"><em class= + "TableCode"><%exe%></em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The extension for executable + files.</p> + </td> + </tr> + </table> + </li> + </ul> + </div> + </div> + </div> + + <div> + <a name="TheFeatureFile" id="TheFeatureFile"></a> + + <h5 class="Head4">The Feature File</h5> + + <ul> + <li class="BodyNoLead">The term feature, as used by MPC, + describes different concepts or external software that a project + may require in order to build properly. The feature file + determines which features are enabled or disabled which has a + direct effect on whether or not MPC generates a project.</li> + + <li class="Body">It supports the standard comment (<em class= + "Code">//</em> ) and assignment of numbers to feature names. + These feature names will correspond to values given to the + <em class="Code">requires</em> and <em class="Code">avoids</em> + keywords in mpc files.</li> + + <li class="Body">If a feature is not listed in the feature file + or is listed with a boolean value of true (1), that feature is + enabled. If a feature is listed and has a boolean value of false + (0), that feature is disabled.</li> + + <li class="Body">If a feature name is listed in the <em class= + "Code">requires</em> value for a particular project and that + feature is enabled, that project will be generated. If the + feature is not enabled, the project will not be generated.</li> + + <li class="Body">The opposite holds true for the <em class= + "Code">avoids</em> keyword. If a feature name is listed in the + <em class="Code">avoids</em> value for a project and the feature + is disabled, that project will be generated. If the feature is + enabled, the project will not be generated.</li> + + <li class="Body">The global feature file for MPC contains the + following values.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">boost = 0</p> + + <p class="Code">bzip2 = 0</p> + + <p class="Code">java = 0</p> + + <p class="Code">mfc = 0</p> + + <p class="Code">python = 0</p> + + <p class="Code">qt = 0</p> + + <p class="Code">rpc = 0</p> + + <p class="Code">swig_java = 0</p> + + <p class="Code">swig_perl = 0</p> + + <p class="Code">swig_php = 0</p> + + <p class="Code">swig_python = 0</p> + + <p class="Code">swig_ruby = 0</p> + + <p class="Code">swig_tcl = 0</p> + + <p class="Code">uses_wchar = 0</p> + + <p class="Code">xalan = 0</p> + + <p class="Code">xerces = 0</p> + + <p class="Code">xerces2 = 0</p> + + <p class="Code">xerces3 = 0</p> + + <p class="Code">ziparchive = 0</p> + + <p class="Code">zlib = 0</p> + + <p class="Code">zzip = 0</p> + + <p class="Code"> </p> + </li> + + <li class="Body">In the above contents, all of these features are + disabled for each project generated. If these values do not suit + your needs, then you must do one of the following:</li> + + <li class="BodyNoLead"> + <ul> + <li>Create a project specific feature file in the <em class= + "Code">config</em> directory (ex., <em class= + "Code">make.features</em> for the <em class="Code">make</em> + project type) to set features for a particular project + type.</li> + + <li>Create a <em class="Code">default.features</em> file in + the <em class="Code">config</em> directory that contains the + feature set you need. These will be applied to all project + types.</li> + + <li>Create a feature file anywhere you like with the features + you want and use the <em class="Code">-feature_file</em> + option to specify the location.</li> + + <li>Use the <em class="Code">-features</em> option to + dynamically modify the feature settings.</li> + </ul> + </li> + + <li class="Body">Generated projects will have a combination of + features specified in the <em class="Code">global.features</em> + file as well as in your feature file. Therefore, if a feature is + disabled in the global file and you want to enable it, you must + explicitly enable it in your feature file.</li> + </ul> + </div> + + <div> + <h5 class="Head4">Feature Projects</h5> + + <ul> + <li class="BodyNoLead">A feature project contains information as + a project would, but can only be a base project and will only be + added to a sub project if the features that it requires are + enabled or the features that it avoids are disabled.</li> + + <li class="Body">A feature definition requires at least one + feature name. A name by itself specifies that the feature must be + enabled. A ’!’ in front of the feature name indicates + that the feature must be disabled. There may be more than one + comma separated feature listed between the parenthesis.</li> + + <li class="Body">The following example show how to declare a + feature project.</li> + + <li class="Body"> + <p class="Code"> </p> + + <p class="Code">// ziparchive.mpb</p> + + <p class="Code">feature(ziparchive) {</p> + + <p class="Code"> includes += $(ZIPARCHIVEROOT)</p> + + <p class="Code"> libpaths += + $(ZIPARCHIVEROOT)/lib</p> + + <p class="Code"> libs += + ziparch</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="Body">With this example, any project that inherits + from the <em class="Code">ziparchive</em> base feature project + will contain the project information only if the <em class= + "Code">ziparchive</em> feature is enabled.</li> + </ul> + </div> + </div> + + <div> + <h4 class="Head3">Defaults</h4> + + <ul> + <li class="BodyNoLead">MPC has been designed to minimize the amount + of maintenance that goes into keeping build tool files up-to-date + with the project. If your source code is organized <em class= + "Emphasis">properly</em>, the maintenance of your mpc files should + be minimal.</li> + + <li class="Body">With the use of inheritance and proper code + arrangement, an mpc file for a TAO related project may be as simple + as:</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">project: taoserver {</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="Body">This project definition could be used to generate + a project for a TAO server with multiple idl, header and source + files.</li> + + <li class="Body">The idea of <em class="Emphasis">proper</em> + source layout is basically summarized as <em class="Emphasis">one + directory per binary target.</em> If only the files that pertain to + a single target are located in the directory with the mpc file, + then the MPC defaults will satisfy most project needs.</li> + + <li class="Body">Of course, it will not always be possible or + desirable to organize your project code in this fashion, so all + defaulting behavior can be overridden. The next sections describe + the default behaviors of MPC and how to override them.</li> + </ul> + + <div> + <h5 class="Head4">Source Files</h5> + + <ul> + <li class="BodyNoLead">New source files are added and others are + removed quite often in a developing project. If the <em class= + "Code">Source_Files</em> component is left out of an mpc file, + then MPC will assume that any file matching one of the <em class= + "Emphasis">source</em> extensions is to be included in the + project. For most project types, the source extensions are: + <em class="Code">.cpp</em>, <em class="Code">.cxx</em>, + <em class="Code">.cc</em>, <em class="Code">.c</em> and + <em class="Code">.C</em>. Only the following extensions are + considered source extensions: <em class="Code">.cpp</em>, + <em class="Code">.cxx</em> and <em class="Code">.c</em> for the + <em class="Code">em3</em> and <em class="Code">vc6</em> project + types as eMbedded Visual C++ and Visual C++ 6.0 do not understand + files with the <em class="Code">.cc</em> or <em class= + "Code">.C</em> extension.</li> + </ul> + </div> + + <div> + <h5 class="Head4">Template Files</h5> + + <ul> + <li class="BodyNoLead">MPC assumes that any file matching one of + the <em class="Emphasis">template</em> extensions is to be + included in the project if the <em class= + "Code">Template_Files</em> component is left out of an mpc file. + For most project types, the template extensions are: <em class= + "Code">_T.cpp</em>, <em class="Code">_T.cxx</em>, <em class= + "Code">_T.cc</em>, <em class="Code">_T.c</em>, and <em class= + "Code">_T.C</em>. However, only the <em class="Code">_T.cpp</em> + and <em class="Code">_T.cxx</em> extensions are considered + template extensions for the <em class="Code">em3</em> and + <em class="Code">vc6</em> project types.</li> + + <li class="Body">If the <em class="Code">Source_Files</em> + component is defaulted, and a file is explicitly listed in the + Template_Files section that happens to appear to MPC as a source + file (i.e., has a source file extension, but does not have + <em class="Code">_T</em> directly before it), MPC will + automatically exclude it from the <em class= + "Code">Source_Files</em> component.</li> + </ul> + </div> + + <div> + <h5 class="Head4">Inline Files</h5> + + <ul> + <li class="BodyNoLead">As with source files, the <em class= + "Code">Inline_Files</em> component can be left out of an mpc file + to allow it to generate defaults. Files that match the <em class= + "Code">.i</em> and <em class="Code">.inl</em> extensions are + considered inline files.</li> + + <li class="Body">The <em class="Code">Inline_Files</em> component + has a special interaction with the <em class= + "Code">Source_Files</em> component. If the <em class= + "Code">Source_Files</em> component has files listed and the + <em class="Code">Inline_Files</em> component is omitted, then + each source file is <em class="Emphasis">matched</em> to an + inline file. If the matching inline file is found or would be + generated from a custom command, it is added to the <em class= + "Code">Inline_Files</em> component list.</li> + </ul> + </div> + + <div> + <h5 class="Head4">Header Files</h5> + + <ul> + <li class="BodyNoLead">As with source files, the <em class= + "Code">Header_Files</em> component can be left out of an mpc file + to allow it to generate defaults. Files that match the <em class= + "Code">.h</em>, <em class="Code">.hpp</em>, <em class= + "Code">.hxx</em>, and <em class="Code">.hh</em> extensions are + considered header files.</li> + + <li class="Body">The <em class="Code">Header_Files</em> component + has a special interaction with the <em class= + "Code">Source_Files</em> component. If the <em class= + "Code">Source_Files</em> component has files listed and the + <em class="Code">Header_Files</em> component is omitted, then + each source file is <em class="Emphasis">matched</em> to a header + file. If the matching header file is found or would be generated + from a custom command, then it is added to the <em class= + "Code">Header_Files</em> component list.</li> + </ul> + </div> + + <div> + <h5 class="Head4">Documentation Files</h5> + + <ul> + <li class="BodyNoLead">The <em class= + "Code">Documentation_Files</em> component, if omitted, will + default to all files that end in the following: <em class= + "Code">README</em>, <em class="Code">readme</em>, <em class= + "Code">.doc</em>, <em class="Code">.html</em> and <em class= + "Code">.txt</em>.</li> + </ul> + </div> + + <div> + <h5 class="Head4">Resource Files</h5> + + <ul> + <li class="BodyNoLead">The <em class="Code">Resource_Files</em> + component, if omitted, will default to only the files that end in + <em class="Code">.rc</em> and are similar to the name of the + project. For example, if a directory contains three <em class= + "Code">.rc</em> files and the project name is <em class= + "Code">foo</em>, only the <em class="Code">.rc</em> files that + contain the word <em class="Code">foo</em> will automatically be + added to the <em class="Code">Resource_Files</em> component + list.</li> + </ul> + </div> + + <div> + <h5 class="Head4">Custom Defined Files</h5> + + <ul> + <li class="BodyNoLead">The <em class="Code">Custom Defined + Files</em> components have a special interaction with the + <em class="Code">Source_Files</em> component. If the custom + command generates source files and has the <em class= + "Code">automatic_out</em> setting set to 1, they will + automatically be added to the <em class="Code">Source_Files</em> + component list. If any of the files listed in the <em class= + "Code">Source_Files</em> components list match any of the + generated source file names, then none of the generated source + file names will be automatically added to the <em class= + "Code">Source_Files</em> components list.</li> + </ul> + </div> + + <div> + <a name="ExampleMPCFile" id="ExampleMPCFile"></a> + + <h5 class="Head4">Example MPC File</h5> + + <ul> + <li class="BodyNoLead">The example below uses the directory + contents of <em class= + "Code">$TAO_ROOT/orbsvcs/performance-tests/RTEvent/lib</em> to + illustrate the simplicity of mpc files:</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">Auto_Disconnect.cpp Loopback_Supplier.h + RTEC_Initializer.cpp</p> + + <p class="Code">Auto_Disconnect.h Low_Priority_Setup.cpp + RTEC_Initializer.h</p> + + <p class="Code">Auto_Disconnect.inl Low_Priority_Setup.h + rtec_perf_export.h</p> + + <p class="Code">Auto_Functor.cpp Low_Priority_Setup.inl + RTEC_Perf.mpc</p> + + <p class="Code">Auto_Functor.h Makefile RTPOA_Setup.cpp</p> + + <p class="Code">Auto_Functor.inl ORB_Holder.cpp + RTPOA_Setup.h</p> + + <p class="Code">Client_Group.cpp ORB_Holder.h + RTPOA_Setup.inl</p> + + <p class="Code">Client_Group.h ORB_Holder.inl + RTServer_Setup.cpp</p> + + <p class="Code">Client_Group.inl ORB_Shutdown.cpp + RTServer_Setup.h</p> + + <p class="Code">Client_Options.cpp ORB_Shutdown.h + RTServer_Setup.inl</p> + + <p class="Code">Client_Options.h ORB_Shutdown.inl + Send_Task.cpp</p> + + <p class="Code">Client_Pair.cpp ORB_Task_Activator.cpp + Send_Task.h</p> + + <p class="Code">Client_Pair.h ORB_Task_Activator.h + Send_Task_Stopper.cpp</p> + + <p class="Code">Client_Pair.inl ORB_Task_Activator.inl + Send_Task_Stopper.h</p> + + <p class="Code">Consumer.cpp ORB_Task.cpp + Send_Task_Stopper.inl</p> + + <p class="Code">Consumer.h ORB_Task.h Servant_var.cpp</p> + + <p class="Code">Control.cpp ORB_Task.inl Servant_var.h</p> + + <p class="Code">Control.h Peer_Base.cpp Servant_var.inl</p> + + <p class="Code">EC_Destroyer.cpp Peer_Base.h Shutdown.cpp</p> + + <p class="Code">EC_Destroyer.h PriorityBand_Setup.cpp + Shutdown.h</p> + + <p class="Code">EC_Destroyer.inl PriorityBand_Setup.h + Shutdown.inl</p> + + <p class="Code">Federated_Test.idl PriorityBand_Setup.inl + Supplier.cpp</p> + + <p class="Code">Implicit_Deactivator.cpp RIR_Narrow.cpp + Supplier.h</p> + + <p class="Code">Implicit_Deactivator.h RIR_Narrow.h + SyncScope_Setup.cpp</p> + + <p class="Code">Implicit_Deactivator.inl RT_Class.cpp + SyncScope_Setup.h</p> + + <p class="Code">Loopback_Consumer.cpp RT_Class.h + SyncScope_Setup.inl</p> + + <p class="Code">Loopback_Consumer.h RT_Class.inl + TAO_RTEC_Perf.dsp</p> + + <p class="Code">Loopback.cpp RTClient_Setup.cpp + TAO_RTEC_Perf.dsw</p> + + <p class="Code">Loopback.h RTClient_Setup.h + Task_Activator.cpp</p> + + <p class="Code">Loopback_Pair.cpp RTClient_Setup.inl + Task_Activator.h</p> + + <p class="Code">Loopback_Pair.h RTCORBA_Setup.cpp + Task_Activator.inl</p> + + <p class="Code">Loopback_Pair.inl RTCORBA_Setup.h</p> + + <p class="Code">Loopback_Supplier.cpp RTCORBA_Setup.inl</p> + + <p class="Code"> </p> + </li> + + <li class="Body">The following mpc file (<em class= + "Code">RTEC_Perf.mpc</em> ) shows the simple and small number of + lines required to generate usable build tool project files.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">project(RTEC_Perf): strategies, rtcorbaevent, + minimum_corba {</p> + + <p class="Code"> sharedname = TAO_RTEC_Perf</p> + + <p class="Code"> idlflags += + -Wb,export_macro=TAO_RTEC_Perf_Export \</p> + + <p class="Code"> + -Wb,export_include=rtec_perf_export.h</p> + + <p class="Code"> dllflags += + TAO_RTEC_PERF_BUILD_DLL</p> + + <p class="Code"> </p> + + <p class="Code"> Template_Files {</p> + + <p class="Code"> Auto_Disconnect.cpp</p> + + <p class="Code"> Auto_Functor.cpp</p> + + <p class="Code"> + Low_Priority_Setup.cpp</p> + + <p class="Code"> RIR_Narrow.cpp</p> + + <p class="Code"> Servant_var.cpp</p> + + <p class="Code"> Shutdown.cpp</p> + + <p class="Code"> Task_Activator.cpp</p> + + <p class="Code"> }</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="Body">A line-by-line explanation of the example mpc + file is listed below.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">project(RTEC_Perf): strategies, rtcorbaevent, + minimum_corba {</p> + + <p class="Code"> </p> + </li> + + <li class="Body">The first line declares a project named + <em class="Code">RTEC_Perf</em> that inherits from the base + projects listed after the colon.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">sharedname = TAO_RTEC_Perf</p> + + <p class="Code"> </p> + </li> + + <li class="Body">Line two determines that the project is a + library and the library name is <em class= + "Code">TAO_RTEC_Perf</em>.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">idlflags += + -Wb,export_macro=TAO_RTEC_Perf_Export \</p> + + <p class="Code">-Wb,export_include=rtec_perf_export.h</p> + + <p class="Code"> </p> + </li> + + <li class="Body">Lines three and four add to the flags passed to + the IDL compiler when processing the idl files.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">dllflags += TAO_RTEC_PERF_BUILD_DLL</p> + + <p class="Code"> </p> + </li> + + <li class="Body">Line five adds <em class= + "Code">TAO_RTEC_PERF_BUILD_DLL</em> to the <em class= + "Code">dllflags</em>, which defines a macro that is used by the + <em class="Code">rtec_perf_export.h</em> header file.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">Template_Files {</p> + + <p class="Code"> Auto_Disconnect.cpp</p> + + <p class="Code"> Auto_Functor.cpp</p> + + <p class="Code"> Low_Priority_Setup.cpp</p> + + <p class="Code"> RIR_Narrow.cpp</p> + + <p class="Code"> Servant_var.cpp</p> + + <p class="Code"> Shutdown.cpp</p> + + <p class="Code"> Task_Activator.cpp</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + </li> + + <li class="Body">Lines 7 through 15 name the listed cpp files as + part of the <em class="Code">Template_Files</em>.</li> + + <li class="Body">You may have noticed that there isn’t much + to the file above. With the default behaviors that are built into + MPC, there does not need to be. We rely on the defaults to + determine the values of <em class="Code">IDL_Files</em>, + <em class="Code">Source_Files</em>, <em class= + "Code">Inline_Files</em> , and <em class= + "Code">Header_Files</em>. Since the template files do not match + the MPC built-in defaults, we must explicitly list them. We also + rely on inheritance to get many of the TAO-related options.</li> + </ul> + </div> + </div> + </div> + + <div> + <h3 class="Head2">Adding a New Type</h3> + <hr> + + <ul> + <li class="Body">If MPC does not support a particular build tool, you + may want to consider adding a new project type. For instance, support + could be added to MPC for Boost Jam, Xcode and many others. To do so + will require knowledge of the MPC input files, as well as Object + Oriented Perl.</li> + </ul> + + <div> + <h4 class="Head3">Input File Syntax</h4> + + <ul> + <li class="BodyNoLead">This section describes the syntax of the + files that are used during project generation.</li> + </ul> + + <div> + <h5 class="Head4"><a name="MPD Syntax"></a>Template Files + (mpd)</h5> + + <ul> + <li class="BodyNoLead">Template files make up the bulk of what + MPC puts into each generated project file. They provide the plain + text and the layout of the data provided by the mpc files, using + various template directives.</li> + + <li class="Body">Template directives are declared using a + <em class="Code"><% %></em> construct. This construct is + used to create if statements, for loops and to access variables. + One thing to note is that any text, including white space, that + is not enclosed within <em class="Code"><% %></em> is left + untouched and is passed directly into the generated project + file.</li> + + <li class="Body">An <em class="Code">if</em> statement can appear + on a single line or it can span multiple lines. For example, the + following line:</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code"><%if(exename)%>BIN = + <%exename%><%else%>LIB = + <%sharedname%><%endif%></p> + + <p class="Code"> </p> + </li> + + <li class="Body">is equivalent to:</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code"><%if(exename)%></p> + + <p class="Code">BIN = <%exename%></p> + + <p class="Code"><%else%></p> + + <p class="Code">LIB = <%sharedname%></p> + + <p class="Code"><%endif%></p> + + <p class="Code"> </p> + </li> + + <li class="Body"><a name="foreach syntax"></a> A <em class= + "Code">foreach</em> statement can also appear on a single line or + can span multiple lines. As described below in the keywords + section, the <em class="Code">foreach</em> statement evaluates + the variable in a space-separated list context.</li> + + <li class="Body">There are a couple of ways to write a <em class= + "Code">foreach</em> loop. The first and preferred way is to name + the loop variable and then list each variable to be + evaluated.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">FILES=<%foreach(fvar, idl_files source_files + header_files)%> <%fvar%><%endfor%></p> + + <p class="Code"> </p> + </li> + + <li class="Body">The second way is to let the <em class= + "Code">foreach</em> statement determine the loop variable. With + this style, each value can be accessed via the first variable + name passed to the <em class="Code">foreach</em> with the + trailing ’<em class="Code">s</em> ’ removed.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">FILES=<%foreach(idl_files source_files + header_files)%> <%idl_file%><%endfor%></p> + + <p class="Code"> </p> + </li> + + <li class="Body">Note that the <em class= + "Code"><%idl_file%></em> variable will contain each + individual value of the <em class="Code">idl_files</em>, + <em class="Code">source_files</em> and <em class= + "Code">header_files</em> list. If the variable in the <em class= + "Code">foreach</em> does not end in ’<em class= + "Code">s</em> ’, the variable of the same name within the + <em class="Code">foreach</em> will contain each individual value, + e.g.,</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code"><%foreach(filelist)%> + <%filelist%><%endfor%></p> + + <p class="Code"> </p> + </li> + + <li class="Body">The following table lists keywords that can + appear in template files.</li> + + <li style="list-style: none"> + <a name="38037"></a> + + <h6 class="NumberedTableTitle">Template File Keywords</h6> + + <table border="1" summary="Template File Keywords"> + <tr> + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Keyword</p> + </th> + + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Description</p> + </th> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">basename</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Evaluates the variable name and + removes the directory portion from that value.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">basenoextension</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is similar to <em class= + "Code">basename</em> except that the extension is also + removed from the variable name value.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">comment</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The value passed to comment is + ignored and can be any set of characters, except a new + line or a closing parenthesis.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">compares</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This function returns true if the + variable value (first parameter) is equal to the string + value (second parameter).</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">contains</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This function returns true if the + variable value (first parameter) contains the regular + expression (second parameter).</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">dirname</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Evaluates the variable name and + removes the <em class="Code">basename</em> from that + value.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">duplicate_index</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This function returns a number based + on the number of times a file with the same name (but + different directory) is seen within a project. The + function returns false upon the first occurrence of a + file.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">else</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Used with the <em class= + "Code">if</em> statement. An <em class="Code">else</em> + block will be evaluated if the statement does not + evaluate to true.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">endfor</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Used with <em class= + "Code">foreach</em>. This ends <em class= + "Code">foreach</em> block.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">endif</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Used with the <em class= + "Code">if</em> statement. This ends an <em class= + "Code">if</em> or <em class="Code">if/else</em> + block.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">ends_with</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This function returns true if the + variable value (first parameter) ends with the regular + expression (second parameter).</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">eval</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is similar to eval in perl. The + template code passed to this function will be evaluated + within the context of the current template.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">extensions</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Returns a list of extensions based on + the component name parameter (e.g., source_files, + header_files, etc.)</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">flag_overrides</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is directly related to + overriding the project-wide settings in an mpc file. It + takes two variable names that are comma separated. The + first corresponds to a file name and the second is any + variable name.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">foreach</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The given variable names are + evaluated in a list context which is space separated.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">forfirst</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Used with <em class= + "Code">foreach</em>. The literal value passed to + <em class="Code">forfirst</em> will be placed on the + first iteration of <em class="Code">foreach</em>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">forlast</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Used with <em class= + "Code">foreach</em>. The literal value passed to + <em class="Code">forlast</em> will be placed on the last + iteration of <em class="Code">foreach</em>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">fornotfirst</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Used with <em class= + "Code">foreach</em>. The literal value passed to + <em class="Code">fornotfirst</em> will be placed on each + iteration of <em class="Code">foreach</em> except for the + first.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">fornotlast</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Used with <em class= + "Code">foreach</em>. The literal value passed to + <em class="Code">fornotlast</em> will be placed on each + iteration of <em class="Code">foreach</em> except for the + last.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">full_path</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Returns full path of the value of the + variable name passed a the parameter.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">has_extension</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Returns true is the variable value + has a file extension.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">if</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Used to determine if a variable is + defined. The not operator (<em class="Code">!</em> ) can + be used to invert the if check. This construct will only + check for values defined within an mpc or mpt file. + Default values (even those implemented by the project + creators) are not considered in the <em class= + "Code">if</em> statement.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">keyname_used</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This function is used to associate a + key with a variable value. If the key has been associated + with a variable value more than once, either through + physical repetition of the key in the template or through + evaluation of a foreach context, the count of association + will be appended to the output.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">lc</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Return the given variable value in + all lower case characters.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">marker</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is directly related to the + <em class="Code">verbatim</em> keyword from the mpc + syntax. This can be used to designate markers within a + template. Ex. <em class= + "Code"><%marker(local)%></em>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">multiple</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This function returns true if the + array parameter contains multiple values.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">noextension</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Evaluates the variable name value as + a file name and removes the extension from that value + including the period.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">normalize</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Convert spaces, dashes, slashes, + dollar signs, parenthesis and dots in the given variable + value to underscores.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">remove_from</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This function will remove a file in a + component list. It requires three parameters. The first + parameter is a component name (e.g., Source_Files), the + second parameter is a regular expression pattern and + the third parameter is a project or template variable + name. The fourth and optional parameter allows you to + alter the project or template variable value by + removing the end matching portion. If the value of + the project or template variable (i.e., parameter + three) after being modified by parameter four and + having the regular expression pattern (i.e., + parameter two) appended to it matches any value + within the compent list (named by parameter one), it + will be removed from that component list and passed + back. + any </p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">reverse</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This function reverses the order of + the array parameter values.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">scope</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This is used to set the scope of + execution of a function that will operate on the template + output. A scope is begun by passing "enter" as the first + parameter and a function name as the second parameter. + Currently, the only function name supported is "escape". + The third parameter specifies a string on which the + function will operate. Any template text that matches the + string parameter while within this scope will be + transformed by the function parameter. A scope is then + ended by passing "leave".</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">sort</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This function sorts the array + parameter values.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">starts_with</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This function returns true if the + variable value (first parameter) starts with the regular + expression (second parameter).</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">transdir</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Replaces values within the directory + portion of a variable value with something that can be + used as a relative path. The current working directory is + removed and ".." is replaced with "dotdot".</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">uc</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Return the given variable value in + all upper case characters.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">ucw</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Return the given variable value with + the first letter of each word in upper case. Words are + separated by spaces or underscores.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">uniq</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This function returns the unique set + of the array parameter values.</p> + </td> + </tr> + </table> + </li> + + <li class="Body">The following table lists special names that can + be used as variables in some template files. The variables listed + in the <a href= + "MakeProjectCreator.html#Common%20Pseudo%20Variables" class= + "XRef">Common Pseudo Variables</a> table can be used as well + (except for <em class="Code"><%temporary%></em>).</li> + + <li style="list-style: none"> + <h6 class="NumberedTableTitle">Special Values used in Template + Files</h6> + + <table border="1" summary= + "Special Values used in Template Files"> + <tr> + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Value</p> + </th> + + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Description</p> + </th> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">am_version</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Implemented by the Automake project + creator module, converts the <em class= + "Code">version</em> setting into a suitable value for + automake.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">ciao</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Implemented by the GNUACE project + creator module, specifies that the project uses CIAO.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">compilers</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Implemented by the Make project + creator module, provides the compiler name based on the + current project language.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">cppdir</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This value is implemented by the + BMake project creator module. It returns a semicolon + separated list of directories taken from each value in + the <em class="Code">Source_Files</em> list.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">custom_types</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Contains a list of the custom build + types. See <a href= + "MakeProjectCreator.html#Custom%20Types" class= + "XRef">Custom Types</a> for more details.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">cwd</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The full current working + directory.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">forcount</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This only has a value within the + context of a <em class="Code">foreach</em> and provides a + 1 based count, by default, of the index of the elements + in <em class="Code">foreach</em>.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">guid</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This value is implemented by the VC7 + and WIX project creator modules. It returns a <em class= + "Code">guid</em> value based on the project that is + usable within VC7, VC71, VC8, VC9, VC10 and WIX project + files.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">language</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This value is implemented by the VC7 + and Make project creator modules. It returns the current + language setting for the project.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">make_file_name</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This value is implemented by the VC6 + and EM3 project creator modules. It returns the project + name with the make file extension that corresponds to the + particular project type.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">project_file</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This variable contains the name of + the output file for the current project being + generated.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">project_name</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This variable contains the name of + the current project being generated.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">rcdir</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This value is implemented by the + BMake project creator module. It returns a semicolon + separated list of directories taken from each value in + the <em class="Code">Resource_Files</em> list.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">source_directory</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This value is implemented by the WIX + project creator module. It converts the variable portion + of the binary output directory (either <em class= + "Code">exeout</em>, <em class="Code">dllout</em>, or + <em class="Code">libout</em>) to a suitable value for + WIX.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">tao</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">Implemented by the GNUACE project + creator module, specifies that the project uses TAO.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">vcversion</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This value is implemented by the + VC7ProjectCreator. It returns the version number of the + type of project being generated. 7.00 is return for vc7, + 7.10 is return for vc71 and 8.00 is returned for vc8, + 9.00 is returned for vc9, 10.00 is returned for vc10.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class="TableCode">vpath</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">This value is implemented by the + GNUACEProjectCreator. It returns a value, based on the + location of the source files, that specifies the + <em class="Code">VPATH</em> setting for GNU Make.</p> + </td> + </tr> + </table> + </li> + </ul> + + <ul> + <li class="Body"> + <h6 class="Head5"><a name="Document Template Script"></a> + Template Variable Documentation</h6> + </li> + + <li class="Body">Template variables used within the MPC templates + are numerous and vary from template to template; there are far + too many to include in this document. However, you can generate + an HTML document containing all of the template variables used + within a template using the <em class= + "Code">document_template.pl</em> script found in the <em class= + "Code">devtools</em> directory under the MPC root directory. You + may find that some templates and individual template variables + are well documented and, unfortunately, some are not.</li> + + <li class="Body">The script will generate documentation for an + individual template file. The usage is as follows:</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">document_template.pl v1.3</p> + + <p class="Code">Usage: document_template.pl <template> + [<html output> [language]]</p> + + <p class="Code"> </p> + + <p class="Code">html output - This defaults to the name of the + template file with the .mpd</p> + + <p class="Code"> + extension replaced with + .html.</p> + + <p class="Code">language - This defaults to + the language for which the template is designed.</p> + + <p class="Code"> + It can be any of the valid + language settings for MPC:</p> + + <p class="Code"> + cplusplus csharp java + vb</p> + </li> + </ul> + + <div> + <a name="Custom Types"></a> + + <h6 class="Head5">Custom Types</h6> + + <ul> + <li class="BodyNoLead">To support multiple custom build types, + a special keyword was introduced. The <em class= + "Code">custom_types</em> keyword is used to access the list of + custom types defined by the user. In a <em class= + "Code">foreach</em> context, each custom type can be accessed + through the <em class="Code">custom_type</em> keyword.</li> + + <li class="Body">A variety of information is available from + each <em class="Code">custom_type</em> through the <em class= + "Code">-></em> operator. The input files, input extensions, + command, command output option, command flags, and output file + directory are all accessible through the field names that + correspond to the particular type.</li> + + <li class="Body">The input files associated with the custom + type are accessed through <em class= + "Code">custom_type->input_files</em>. Each input file has a + set of output files associated with it which can be accessed in + a <em class="Code">foreach</em> context through c<em class= + "Code">ustom_type->input_file->output_files</em>. The + custom type fields are those listed in the <a href= + "MakeProjectCreator.html#32899" class="XRef">Define_Custom + Keywords</a> table as well as those listed in the following + table.</li> + + <li style="list-style: none"> + <h6 class="NumberedTableTitle">Custom Type Fields</h6> + + <table border="1" summary="Custom Type Fields"> + <tr> + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Value</p> + </th> + + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Description</p> + </th> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">dependencies</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The files on which the processing + of the custom input file depends.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">gendir</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The output directory associated + with a particular input file. This field has no meaning + when accessed directly through the <em class= + "Code">custom_type</em>. It should always be used + within the context of a <em class= + "Code">flag_overrides</em> (see <a href= + "MakeProjectCreator.html#38037" class="XRef">Template + File Keywords</a>).</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">input_files</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The input files associated with the + custom type.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">inputexts</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The input file extensions + associated with the custom type.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">non_source_output_files</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">All output files generated from the + custom input file that are not considered source code + files by MPC.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">output_files</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">All output files generated from the + custom input file.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">source_output_files</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">All output files generated from the + custom input file that are considered source code files + by MPC.</p> + </td> + </tr> + </table> + </li> + + <li class="Body">The example below, which creates generic + makefile rules for building custom input files, shows basic use + of the custom type and the various fields that can be accessed. + The main limitation with the <em class="Code">custom_types</em> + keyword, as can be seen below, is that the <em class= + "Code">foreach</em> variable cannot be named as stated <a href= + "MakeProjectCreator.html#foreach%20syntax" class= + "XRef">previously</a>.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code"><%if(custom_types)%></p> + + <p class="Code"><%foreach(custom_types)%></p> + + <p class="Code"> + <%foreach(custom_type->input_files)%></p> + + <p class="Code"> + <%foreach(custom_type->input_file->output_files)%></p> + + <p class="Code"> + <%custom_type->input_file->output_file%>: + <%custom_type->input_file%></p> + + <p class="Code"> + <%custom_type->command%> + <%custom_type->commandflags%> $@</p> + + <p class="Code"> </p> + + <p class="Code"><%endfor%></p> + + <p class="Code"><%endfor%></p> + + <p class="Code"><%endfor%></p> + + <p class="Code"><%endif%></p> + + <p class="Code"> </p> + </li> + </ul> + </div> + + <div> + <h6 class="Head5">Grouped Files</h6> + + <ul> + <li class="BodyNoLead">File grouping is part of the syntax of + mpc files. If a set of files are grouped within the mpc file, + they can be accessed as a group within the mpd file.</li> + + <li class="Body">Files (such as <em class= + "Code">Source_Files</em>, <em class="Code">Header_Files</em> ) + can be grouped together as shown <a href= + "MakeProjectCreator.html#MPC%20grouping%20example" class= + "XRef">here</a>. Within the mpd file, the different components + can be accessed by prepending <em class="Code">grouped_</em> to + the component (<em class="Code">grouped_source_files</em>, + <em class="Code">grouped_header_files</em>, etc.)</li> + + <li style="list-style: none"> + <h6 class="NumberedTableTitle">Grouped Files Field Names</h6> + + <table border="1" summary="Grouped Files Field Names"> + <tr> + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Field Name</p> + </th> + + <th rowspan="1" colspan="1"> + <p class="Tbl-Heading">Description</p> + </th> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">files</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The input files associated with the + group.</p> + </td> + </tr> + + <tr> + <td rowspan="1" colspan="1"> + <p class="Tbl-Body"><em class= + "TableCode">component_name</em></p> + </td> + + <td rowspan="1" colspan="1"> + <p class="Tbl-Body">The name of the set of multiple + groups of files.</p> + </td> + </tr> + </table> + </li> + + <li class="Body">The example below, which creates make macros + for each file group, shows basic use of grouping and the fields + that can be accessed. The main limitation with file grouping, + as can be seen below, is that the <em class="Code">foreach</em> + variable cannot be named as stated <a href= + "MakeProjectCreator.html#foreach%20syntax" class= + "XRef">previously</a>. The following example involves source + files, but any of the <a href="MakeProjectCreator.html#16907" + class="XRef">components</a> listed in the mpc and mpb section + can be used.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code"><%if(grouped_source_files)%></p> + + <p class="Code"><%comment(Get back each set of grouped + files)%></p> + + <p class="Code"><%foreach(grouped_source_files)%></p> + + <p class="Code"><%comment(This will provide the name of + the group)%></p> + + <p class="Code"><%grouped_source_file%> = \</p> + + <p class="Code"><%comment(Get all the source files in a + single group)%></p> + + <p class="Code"> + <%foreach(grouped_source_file->files)%></p> + + <p class="Code"> + <%grouped_source_file->file)%><%fornotlast(" + \\")%></p> + + <p class="Code"><%endfor%></p> + + <p class="Code"><%endfor%></p> + + <p class="Code"> </p> + + <p class="Code">ifndef + <%grouped_source_files->component_name%></p> + + <p class="Code"> + <%grouped_source_files->component_name%> = \</p> + + <p class="Code"><%foreach(grouped_source_files)%></p> + + <p class="Code"> + <%grouped_source_file%><%fornotlast(" + \\")%></p> + + <p class="Code"><%endfor%></p> + + <p class="Code">endif</p> + + <p class="Code"><%endif%></p> + + <p class="Code"> </p> + </li> + </ul> + </div> + </div> + + <div> + <h5 class="Head4">Template Input Files (mpt)</h5> + + <ul> + <li class="BodyNoLead">Template input files provide build tool + specific information that is common to all projects, such as + compiler switches, intermediate directories, compiler macros, + etc. Each project type can provide template input files for + dynamic libraries, static libraries, dynamic executables and + static executables. However, none of these are actually required + by MPC.</li> + + <li class="Body">The template input files are more free-form than + the other MPC file types. It is similar to the mpc syntax except + that there is no project definition and there is only one + keyword. The keyword, <em class="Code">conditional_include</em>, + is used to include other mpt files if they can be found in the + MPC include search path. If the name listed in double quotes + after <em class="Code">conditional_include</em> is not found, it + is ignored and no warning is produced. The <em class= + "Code">mpt</em> extension is automatically added to the name + provided.</li> + + <li class="Body">The template input files contain variable + assignments and collections of variable assignments. A variable + assignment is of the form:</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">variable_name = value1 "value 2"</p> + + <p class="Code">variable_name += another_value</p> + + <p class="Code"> </p> + </li> + + <li class="Body">This variable can then be used within the + corresponding mpd file.</li> + + <li class="Body">Variable assignments can be grouped together and + named within the mpt file and used as scoped variables within the + mpd file. The following example shows the use of collections of + variable assignments.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">// mpt file</p> + + <p class="Code">configurations = Release Debug</p> + + <p class="Code">common_defines = WIN32 _CONSOLE</p> + + <p class="Code"> </p> + + <p class="Code">Release {</p> + + <p class="Code"> compile_flags = /W3 /GX /O2 /MD + /GR</p> + + <p class="Code"> defines = NDEBUG</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + + <p class="Code">Debug {</p> + + <p class="Code"> compile_flags = /W3 /Gm /GX /Zi /Od + /MDd /GR /Gy</p> + + <p class="Code"> defines = _DEBUG</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + + <p class="Code">conditional_include "vcfullmacros"</p> + + <p class="Code"> </p> + </li> + + <li class="Body">Below is the portion of the mpd file that would + use the information provided in the mpt file above.</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code"><%foreach(configurations)%></p> + + <p class="Code">Name = <%configuration%></p> + + <p class="Code"><%compile_flags%><%foreach(defines + common_defines)%> /D <%define%>=1<%endfor%></p> + + <p class="Code"> </p> + + <p class="Code"><%endfor%></p> + + <p class="Code"> </p> + </li> + + <li class="Body">The following output is generated from the above + example:</li> + + <li style="list-style: none"> + <p class="Code"> </p> + + <p class="Code">Name = Release</p> + + <p class="Code">/W3 /GX /O2 /MD /GR /D NDEBUG=1 /D WIN32=1 /D + _CONSOLE=1</p> + + <p class="Code"> </p> + + <p class="Code">Name = Debug</p> + + <p class="Code">/W3 /Gm /GX /Zi /Od /MDd /GR /Gy /D _DEBUG=1 /D + WIN32=1 /D _CONSOLE=1</p> + + <p class="Code"> </p> + </li> + + <li class="Body">If a <em class="Code">foreach</em> variable + value corresponds to a variable group name, that variable group + is available within the scope of that <em class= + "Code">foreach</em>.</li> + + <li class="Body"> </li> + </ul> + </div> + </div> + + <div> + <h4 class="Head3">A Simple Example</h4> + + <ul> + <li class="BodyNoLead">We will discuss what it would take to add + support for a fictional build tool throughout this section. The + <a href="MakeProjectCreator.html#Figure%201-2" class= + "XRef">Generating projects with mpc.pl diagram</a> shows the + relationship between the template and project creator discussed + below.</li> + </ul> + + <div> + <h5 class="Head4">Template</h5> + + <ul> + <li class="BodyNoLead">The best thing to do is to start with the + template. The template is the most important piece when adding a + new project type. It basically tells MPC how to lay out all of + the information it gathers while processing an mpc file. The + template file will have a mixture of plain text and the mpd + syntax described in the <a href= + "MakeProjectCreator.html#MPD%20Syntax" class="XRef">Template + Files</a> section. Here is our sample <em class= + "Code">fictional.mpd</em>.</li> + + <li style="list-style: none"> + <p class="Code"> + //=======================================================================</p> + + <p class="Code">// This project has been generated by MPC.</p> + + <p class="Code">// CAUTION! Hand edit only if you know what you + are doing!</p> + + <p class="Code"> + //=======================================================================</p> + + <p class="Code"> </p> + + <p class="Code">// Section 1 - PROJECT OPTIONS</p> + + <p class="Code">ctags:*</p> + + <p class="Code">debugSwitches:-nw</p> + + <p class="Code">//end-proj-opts</p> + + <p class="Code"> </p> + + <p class="Code">// Section 2 - MAKEFILE</p> + + <p class="Code">Makefile.<%project_name%></p> + + <p class="Code"> </p> + + <p class="Code">// Section 3 - OPTIONS</p> + + <p class="Code">//end-options</p> + + <p class="Code"> </p> + + <p class="Code">// Section 4 - TARGET FILE</p> + + <p class="Code"><%if(exename)%></p> + + <p class="Code"><%exename%></p> + + <p class="Code"><%else%></p> + + <p class="Code"><%if(sharedname)%></p> + + <p class="Code"><%sharedname%></p> + + <p class="Code"><%else%></p> + + <p class="Code"><%if(staticname)%></p> + + <p class="Code"><%staticname%></p> + + <p class="Code"><%endif%></p> + + <p class="Code"><%endif%></p> + + <p class="Code"><%endif%></p> + + <p class="Code"> </p> + + <p class="Code">// Section 5 - SOURCE FILES</p> + + <p class="Code"><%foreach(source_files)%></p> + + <p class="Code"><%source_file%></p> + + <p class="Code"><%endfor%></p> + + <p class="Code">//end-srcfiles</p> + + <p class="Code"> </p> + + <p class="Code">// Section 6 - INCLUDE DIRECTORIES</p> + + <p class="Code"><%foreach(includes)%></p> + + <p class="Code"><%include%></p> + + <p class="Code"><%endfor%></p> + + <p class="Code">//end-include-dirs</p> + + <p class="Code"> </p> + + <p class="Code">// Section 7 - LIBRARY DIRECTORIES</p> + + <p class="Code"><%foreach(libpaths)%></p> + + <p class="Code"><%libpath%></p> + + <p class="Code"><%endfor%></p> + + <p class="Code">//end-library-dirs</p> + + <p class="Code"> </p> + + <p class="Code">// Section 8 - DEFINITIONS</p> + + <p class="Code"><%foreach(macros defines)%></p> + + <p class="Code">-D<%macro%></p> + + <p class="Code"><%endfor%></p> + + <p class="Code"><%if(pch_header)%></p> + + <p class="Code"><%foreach(pch_defines)%></p> + + <p class="Code">-D<%pch_define%></p> + + <p class="Code"><%endfor%></p> + + <p class="Code"><%endif%></p> + + <p class="Code">//end-defs</p> + + <p class="Code"> </p> + + <p class="Code">// Section 9 - C FLAGS</p> + + <p class="Code"><%cflags("-g")%></p> + + <p class="Code"> </p> + + <p class="Code">// Section 10 - LIBRARY FLAGS</p> + + <p class="Code"><%libflags%></p> + + <p class="Code"> </p> + + <p class="Code">// Section 11 - SRC DIRECTORY</p> + + <p class="Code">.</p> + + <p class="Code"> </p> + + <p class="Code">// Section 12 - OBJ DIRECTORY</p> + + <p class="Code"><%objdir(".")%></p> + + <p class="Code"> </p> + + <p class="Code">// Section 13 - BIN DIRECTORY</p> + + <p class="Code"> + <%if(install)%><%install%><%else%>.<%endif%></p> + + <p class="Code"> </p> + + <p class="Code">// User targets section. Following lines will + be</p> + + <p class="Code">// inserted into Makefile right after the + generated cleanall target.</p> + + <p class="Code">// The Project File editor does not edit these + lines - edit the .vpj</p> + + <p class="Code">// directly. You should know what you are + doing.</p> + + <p class="Code">// Section 14 - USER TARGETS</p> + + <p class="Code"><%marker(top)%></p> + + <p class="Code"><%marker(macros)%></p> + + <p class="Code"><%marker(local)%></p> + + <p class="Code"><%marker(bottom)%></p> + + <p class="Code">//end-user-targets</p> + + <p class="Code"> </p> + + <p class="Code">// Section 15 - LIBRARY FILES</p> + + <p class="Code"><%foreach(libs lit_libs pure_libs)%></p> + + <p class="Code"><%lib%></p> + + <p class="Code"><%endfor%></p> + + <p class="Code">//end-library-files</p> + + <p class="Code"> </p> + </li> + + <li class="Body">Note that output is generated differently + depending upon whether <em class="Code"><%exename%></em>, + <em class="Code"><%sharedname%></em> or <em class= + "Code"><%staticname%></em> is defined due to the if + statements that were used with relation these variable names. + Also, certain portions of the project file are only generated if + particular variables are set.</li> + </ul> + </div> + + <div> + <h5 class="Head4">Project Creator</h5> + + <ul> + <li class="BodyNoLead">Next, you would write the <em class= + "Code">FictionalProjectCreator.pm</em>. It may be best to start + with a copy of the <em class="Code">MakeProjectCreator.pm</em> + and edit it. Change the package name to <em class= + "Code">FictionalProjectCreator</em> and have it inherit from + <em class="Code">MakeProjectBase</em> and <em class= + "Code">ProjectCreator</em>. Then, override the methods that are + needed for this particular type.</li> + + <li style="list-style: none"> + <p class="Code">package FictionalProjectCreator;</p> + + <p class="Code"> </p> + + <p class="Code"># + ************************************************************</p> + + <p class="Code"># Description : A Fictional Project Creator</p> + + <p class="Code"># Author : Chad Elliott</p> + + <p class="Code"># Create Date : 10/01/2004</p> + + <p class="Code"># + ************************************************************</p> + + <p class="Code"> </p> + + <p class="Code"># + ************************************************************</p> + + <p class="Code"># Pragmas</p> + + <p class="Code"># + ************************************************************</p> + + <p class="Code"> </p> + + <p class="Code">use strict;</p> + + <p class="Code"> </p> + + <p class="Code">use MakeProjectBase;</p> + + <p class="Code">use ProjectCreator;</p> + + <p class="Code"> </p> + + <p class="Code">use vars qw(@ISA);</p> + + <p class="Code">@ISA = qw(MakeProjectBase ProjectCreator);</p> + + <p class="Code"> </p> + + <p class="Code"># + ************************************************************</p> + + <p class="Code"># Subroutine Section</p> + + <p class="Code"># + ************************************************************</p> + + <p class="Code"> </p> + + <p class="Code">sub convert_slashes {</p> + + <p class="Code"> #my $self = shift;</p> + + <p class="Code"> return 0;</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + + <p class="Code"> </p> + + <p class="Code">sub project_file_extension {</p> + + <p class="Code"> #my $self = shift;</p> + + <p class="Code"> return '.fic';</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + + <p class="Code"> </p> + + <p class="Code">sub get_dll_exe_template_input_file {</p> + + <p class="Code"> #my $self = shift;</p> + + <p class="Code"> return 'fictionalexe';</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + + <p class="Code"> </p> + + <p class="Code">sub get_dll_template_input_file {</p> + + <p class="Code"> #my $self = shift;</p> + + <p class="Code"> return 'fictionaldll';</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + + <p class="Code"> </p> + + <p class="Code">sub get_template {</p> + + <p class="Code"> #my $self = shift;</p> + + <p class="Code"> return 'fictional';</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + + <p class="Code">1;</p> + + <p class="Code"> </p> + </li> + + <li class="Body">In our example, we inherit from the + MakeProjectBase which provides some methods that are common to + all “make” based project creators.</li> + + <li class="Body">We override the <em class= + "Code">convert_slashes</em> method to return 0. A zero return + value tells MPC not to convert slashes to back slashes + (converting slashes is useful for Windows related build + tools).</li> + + <li class="Body">We then override the <em class= + "Code">project_file_extension</em> method to return the project + file extension which is used by a method defined in the + MakeProjectBase module.</li> + + <li class="Body">Next, we override the <em class= + "Code">get_dll_exe_template_input_file</em> and <em class= + "Code">get_dll_template_input_file</em> methods. Those methods + return the specific template input file names for a dynamic + executable and dynamic library, respectively.</li> + + <li class="Body">Lastly, we override the <em class= + "Code">get_template</em> method to return the template file name + for our new project type. In our case, the method returns + <em class="Code">fictional</em> which corresponds to the name of + the template file we created earlier.</li> + + <li class="Body">There are many other methods that can be + overridden to change the way MPC generates output. For a complete + list, see the “Virtual Methods To Be Overridden” + section of the <em class="Code">Creator.pm</em> and <em class= + "Code">ProjectCreator.pm</em>.</li> + </ul> + </div> + + <div> + <h5 class="Head4">Workspace Creator</h5> + + <ul> + <li class="BodyNoLead">The last part that you would need to write + is the <em class="Code">FictionalWorkspaceCreator.pm</em>. This + module is usually more code-intensive than its Project Creator + counterpart.</li> + + <li style="list-style: none"> + <p class="Code">package FictionalWorkspaceCreator;</p> + + <p class="Code"> </p> + + <p class="Code"># + ************************************************************</p> + + <p class="Code"># Description : A Fictional Workspace + Creator</p> + + <p class="Code"># Author : Chad Elliott</p> + + <p class="Code"># Create Date : 10/01/2004</p> + + <p class="Code"># + ************************************************************</p> + + <p class="Code"> </p> + + <p class="Code"># + ************************************************************</p> + + <p class="Code"># Pragmas</p> + + <p class="Code"># + ************************************************************</p> + + <p class="Code"> </p> + + <p class="Code">use strict;</p> + + <p class="Code"> </p> + + <p class="Code">use FictionalProjectCreator;</p> + + <p class="Code">use WorkspaceCreator;</p> + + <p class="Code"> </p> + + <p class="Code">use vars qw(@ISA);</p> + + <p class="Code">@ISA = qw(WorkspaceCreator);</p> + + <p class="Code"> </p> + + <p class="Code"># + ************************************************************</p> + + <p class="Code"># Subroutine Section</p> + + <p class="Code"># + ************************************************************</p> + + <p class="Code"> </p> + + <p class="Code">sub workspace_file_name {</p> + + <p class="Code"> my $self = shift;</p> + + <p class="Code"> return + $self->get_modified_workspace_name($self->get_workspace_name(), + '.fws');</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + + <p class="Code"> </p> + + <p class="Code">sub pre_workspace {</p> + + <p class="Code"> my($self, $fh) = @_;</p> + + <p class="Code"> my $crlf = $self->crlf();</p> + + <p class="Code"> </p> + + <p class="Code"> print $fh '<?xml version="1.0" + encoding="UTF-8"?>', $crlf,</p> + + <p class="Code"> + '<!-- + MPC Command -->', $crlf,</p> + + <p class="Code"> + "<!-- + $0 @ARGV -->", $crlf;</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + + <p class="Code"> </p> + + <p class="Code">sub write_comps {</p> + + <p class="Code"> my($self, $fh) = @_;</p> + + <p class="Code"> my $projects = + $self->get_projects();</p> + + <p class="Code"> my @list = + $self->sort_dependencies($projects);</p> + + <p class="Code"> my $crlf = $self->crlf();</p> + + <p class="Code"> </p> + + <p class="Code"> print $fh '<projects>', + $crlf;</p> + + <p class="Code"> foreach my $project (@list) {</p> + + <p class="Code"> print $fh " <project + path=\"$project\"/>$crlf";</p> + + <p class="Code"> }</p> + + <p class="Code"> print $fh + "</projects>$crlf";</p> + + <p class="Code">}</p> + + <p class="Code"> </p> + + <p class="Code"> </p> + + <p class="Code">1;</p> + + <p class="Code"> </p> + + <p class="Code"> </p> + </li> + + <li class="Body">The first method we override from + WorkspaceCreator.pm is the <em class= + "Code">workspace_file_name</em> method. It is used to determine + the output file for the generated workspace.</li> + + <li class="Body">Second, we override the <em class= + "Code">pre_workspace</em> method, which we use to print out the + generic unchanging section of our generated workspace.</li> + + <li class="Body">Lastly, we override the <em class= + "Code">write_comps</em> method. This method is where the bulk of + the work is done in our workspace creator. A workspace creator + has many sets of data available. A reference to the list of + project file names can be obtained through the <em class= + "Code">get_projects</em> method; project-specific information can + be obtained through the <em class="Code">get_project_info</em> + method which returns an array reference where each array element + is an array containing the project name, project dependencies and + a project guid (if applicable).</li> + </ul> + </div> + </div> + </div> + </div> +</body> +</html> diff --git a/ACE/MPC/docs/html/images/OCILOGO_bw_book.eps b/ACE/MPC/docs/html/images/OCILOGO_bw_book.eps Binary files differnew file mode 100644 index 00000000000..708fd10aae9 --- /dev/null +++ b/ACE/MPC/docs/html/images/OCILOGO_bw_book.eps diff --git a/ACE/MPC/docs/html/images/mpc.fig b/ACE/MPC/docs/html/images/mpc.fig new file mode 100644 index 00000000000..34053cba6ee --- /dev/null +++ b/ACE/MPC/docs/html/images/mpc.fig @@ -0,0 +1,74 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +6 150 150 6075 5400 +6 150 150 6075 5400 +6 150 150 6075 5400 +6 4200 2550 4875 2850 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 6 + 4200 2700 4650 2700 4650 2850 4875 2700 4650 2550 4650 2700 +-6 +6 1350 2550 2325 2850 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 6 + 1350 2700 2100 2700 2100 2850 2325 2700 2100 2550 2100 2700 +-6 +6 4875 1875 6075 3525 +2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 + 4875 1875 6075 1875 6075 3525 4875 3525 4875 1875 +4 0 0 50 0 0 16 0.0000 4 225 930 4950 3225 dsp, etc.)\001 +4 0 0 50 0 0 16 0.0000 4 225 735 4950 3000 vcproj,\001 +4 0 0 50 0 0 16 0.0000 4 210 1035 4950 2775 (Makefile,\001 +4 0 0 50 0 0 16 0.0000 4 165 390 5250 2400 File\001 +4 0 0 50 0 0 16 0.0000 4 225 690 5100 2175 Project\001 +-6 +6 2325 2025 4200 3300 +2 4 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5 + 4200 3300 4200 2025 2325 2025 2325 3300 4200 3300 +4 0 0 50 0 0 16 0.0000 4 225 1305 2625 2625 Make Project\001 +4 0 0 50 0 0 16 0.0000 4 165 750 2850 2850 Creator\001 +-6 +6 150 3825 1350 5400 +5 1 0 1 0 7 50 0 -1 0.000 0 1 0 0 750.000 4050.000 150 5175 750 5325 1350 5175 +1 2 0 1 0 7 50 0 -1 0.000 1 0.0000 750 3937 600 112 150 3825 1350 4050 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 150 3975 150 5175 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 1350 3975 1350 5175 +4 0 0 50 0 0 16 0.0000 4 225 930 300 4500 Template\001 +4 0 0 50 0 0 16 0.0000 4 225 960 300 4725 Input File\001 +-6 +6 150 1950 1350 3525 +5 1 0 1 0 7 50 0 -1 0.000 0 1 0 0 750.000 2175.000 150 3300 750 3450 1350 3300 +1 2 0 1 0 7 50 0 -1 0.000 1 0.0000 750 2062 600 112 150 1950 1350 2175 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 150 2100 150 3300 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 1350 2100 1350 3300 +4 0 0 50 0 0 16 0.0000 4 225 930 300 2625 Template\001 +4 0 0 50 0 0 16 0.0000 4 165 390 525 2850 File\001 +-6 +6 150 150 1350 1725 +5 1 0 1 0 7 50 0 -1 0.000 0 1 0 0 750.000 375.000 150 1500 750 1650 1350 1500 +1 2 0 1 0 7 50 0 -1 0.000 1 0.0000 750 262 600 112 150 150 1350 375 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 150 300 150 1500 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 1350 300 1350 1500 +4 0 0 50 0 0 16 0.0000 4 165 390 525 1125 File\001 +4 0 0 50 0 0 16 0.0000 4 165 525 450 900 MPC\001 +-6 +6 1350 900 1650 4575 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 + 1350 900 1650 900 1650 4575 1350 4575 +-6 +-6 +-6 +-6 +4 0 0 50 0 0 12 0.0000 4 15 135 450 2925 \001 +4 0 0 50 0 0 12 0.0000 4 15 45 5025 2775 \001 diff --git a/ACE/MPC/docs/html/images/mpc.gif b/ACE/MPC/docs/html/images/mpc.gif Binary files differnew file mode 100644 index 00000000000..a2b78e7064a --- /dev/null +++ b/ACE/MPC/docs/html/images/mpc.gif diff --git a/ACE/MPC/docs/html/images/mpc_mtiff.eps b/ACE/MPC/docs/html/images/mpc_mtiff.eps Binary files differnew file mode 100644 index 00000000000..925cdb68fc7 --- /dev/null +++ b/ACE/MPC/docs/html/images/mpc_mtiff.eps diff --git a/ACE/MPC/docs/html/images/mwc.fig b/ACE/MPC/docs/html/images/mwc.fig new file mode 100644 index 00000000000..af204e93664 --- /dev/null +++ b/ACE/MPC/docs/html/images/mwc.fig @@ -0,0 +1,46 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +6 225 225 6375 1875 +6 1425 900 2025 1200 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 6 + 1425 1050 1800 1050 1800 1200 2025 1050 1800 900 1800 1050 +-6 +6 4275 900 4875 1200 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 6 + 4275 1050 4650 1050 4650 1200 4875 1050 4650 900 4650 1050 +-6 +6 225 300 1425 1875 +6 225 300 1425 1875 +5 1 0 1 0 7 50 0 -1 0.000 0 1 0 0 825.000 525.000 225 1650 825 1800 1425 1650 +1 2 0 1 0 7 50 0 -1 0.000 1 0.0000 825 412 600 112 225 300 1425 525 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 1425 450 1425 1650 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 225 450 225 1650 +-6 +4 0 0 50 0 0 16 0.0000 4 165 390 600 1275 File\001 +4 0 0 50 0 0 16 0.0000 4 165 630 450 1050 MWC\001 +-6 +6 2025 375 4275 1650 +2 4 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5 + 4275 1650 4275 375 2025 375 2025 1650 4275 1650 +4 0 0 50 0 0 16 0.0000 4 165 750 2775 1200 Creator\001 +4 0 0 50 0 0 16 0.0000 4 225 1710 2325 975 Make Workspace\001 +-6 +6 4875 225 6375 1875 +2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 + 4875 225 6375 225 6375 1875 4875 1875 4875 225 +4 0 0 50 0 0 16 0.0000 4 225 1095 5025 600 Workspace\001 +4 0 0 50 0 0 16 0.0000 4 165 390 5400 825 File\001 +4 0 0 50 0 0 16 0.0000 4 210 1035 5100 1125 (Makefile,\001 +4 0 0 50 0 0 16 0.0000 4 180 915 5100 1425 dsw, sln,\001 +4 0 0 50 0 0 16 0.0000 4 210 480 5100 1650 etc.)\001 +-6 +-6 diff --git a/ACE/MPC/docs/html/images/mwc.gif b/ACE/MPC/docs/html/images/mwc.gif Binary files differnew file mode 100644 index 00000000000..79f3a6c41e5 --- /dev/null +++ b/ACE/MPC/docs/html/images/mwc.gif diff --git a/ACE/MPC/docs/html/images/mwc_mtiff.eps b/ACE/MPC/docs/html/images/mwc_mtiff.eps Binary files differnew file mode 100644 index 00000000000..44002530573 --- /dev/null +++ b/ACE/MPC/docs/html/images/mwc_mtiff.eps diff --git a/ACE/MPC/docs/templates/automake.txt b/ACE/MPC/docs/templates/automake.txt new file mode 100644 index 00000000000..751c764d35c --- /dev/null +++ b/ACE/MPC/docs/templates/automake.txt @@ -0,0 +1,19 @@ +// Current as of 2/2/2007 +// This defines the role of all the template variables specific to the +// 'automake' project type. +// +// Please try to keep this alphabetically sorted. +// +am_release = Provides the value to use with the -release option when creating a shared library. +am_version = Provides an automake'ized version string based on the 'version' project variable. +common_defines = Specifies macros that are common to all target types. +defines = Macros that are specific to a particular configuration. +idl_files = When a Define_Custom(IDL) is used, they will be accessible through this variable name. +includedir = Specifies the include directory for the specific project. +install_headers = If set, header, inline, template, idl, and pidl files will be installed. +install_this_target = If set, script files, executables and library targets will be installed. For libraries, it also determines if it will be dynamic (set) or static (not set). +man_files = When a Define_Custom(MAN) is used, they will be accessible through this variable name. +pidl_files = When a Define_Custom(PIDL) is used, they will be accessible through this variable name. +pkgconfig_files = When a Define_Custom(pkgconfig) is used, they will be accessible through this variable name. +script_files = When a Define_Custom(Script) is used, they will be accessible through this variable name. +use_lib_modifier_for_lit_libs = If this template variable is set, the 'lib_modifier' template variable value will be appended to the library names of those specified by the 'lit_libs' project variable. diff --git a/ACE/MPC/docs/templates/bmake.txt b/ACE/MPC/docs/templates/bmake.txt new file mode 100644 index 00000000000..7fbb49975d2 --- /dev/null +++ b/ACE/MPC/docs/templates/bmake.txt @@ -0,0 +1,32 @@ +// Current as of 9/25/2006 +// This defines the role of all the template variables specific to the +// 'bmake' project type. +// +// Please try to keep this alphabetically sorted. +// +binary_compile_flags = Compiler flags passed to both dynamic libraries and executables +cc = The name of the C++ compiler. +cflags = C compiler flags to be use during compilation and linking. +ccflags = C++ compiler flags specific to a particular compiler. +common_defines = Macros that are common to all configurations. +common_flags = Compiler flags that are common to all configurations. +common_libs = Libraries that are common to all configurations. +compilers = The list of possible compilers. +cppdir = The list of directories to be searched when locating C++ files. This is determined by the BMakeProjectCreator. +debug_macros = Macros that are only set for debug builds. +debug_prj = Indicates that the current template configuration is debug. This is different than negating the 'optimize' template variable. +defines = Macros that are specific to a particular configuration. +dllflags = Linker flags that are required to create a dynamic library. +exeflags = Linker flags that are required to create an executable. +libflags = Flags that are required to create a static library. +link = The name of the tool used to create dynamic libraries and executables. +obj_ext = The extension given to object files. +postlinkrmext = A configuration specific extension applied to the 'exename' and removed during cleanup. +rc = The name of the resource compiler. +rcdir = The list of directories to be searched when locating resource files. This is determined by the BMakeProjectCreator. +startup_letter = The text used during the creation of the startup object file. +thflags = Thread related compiler flags. +tlib = The name of the tool used to create static libraries. +unicode_flags = Compiler flags used to create Unicode targets. +use_vcl = A binary value indicating the use of VCL. +warnflags = Compiler flags to set the warning levels. diff --git a/ACE/MPC/docs/templates/cc.txt b/ACE/MPC/docs/templates/cc.txt new file mode 100644 index 00000000000..ef55abb0913 --- /dev/null +++ b/ACE/MPC/docs/templates/cc.txt @@ -0,0 +1,13 @@ +// Current as of 9/26/2006 +// This defines the role of all the template variables specific to the +// 'cc' project type. +// +// Please try to keep this alphabetically sorted. +// +big_endian = If the target architecture is big endian, set this to 1. +ccversion = The version of Code Composer. +cpufamily = The CPU Family for the project. +defines = Macros that are specific to a particular configuration. +output_dir = The configuration specific directory where output files are placed. +rtti = This boolean variable determines whether RTTI is enabled or not. +target_version = This is the target architecture version. diff --git a/ACE/MPC/docs/templates/common.txt b/ACE/MPC/docs/templates/common.txt new file mode 100644 index 00000000000..84f5b7325a6 --- /dev/null +++ b/ACE/MPC/docs/templates/common.txt @@ -0,0 +1,37 @@ +// +// Document template variables that are common to all or most templates. +// Please try to keep this alphabetically sorted. +// +compile_flags = This holds flags passed to the compiler for source files. +configurations = This determines build configurations (ex. Debug, Release, etc.) +cwd = The current working directory of the project. +delaysign = Set this to true or false to enable delay signing. +dll_ext = The dynamic library extension. The value for this depends on the project type. +exe_ext = The executable extension. The value for this depends on the project type. +forcount = The count of the number of times iteration has occurred within the current foreach loop. The base value is determined by the foreach declaration. +intermediate_dir = A configuration specific location where object files are placed. +language = The MPC language setting at the time of project generation. +lib_ext = The static or impl library extension. The value for this depends on the project type. +lib_modifier = Used to modifier a library name. The value of this is appendend to the library name before the extension is added. +lib_prefix = The dynamic and static library prefix. The value for this depends on the project type. +libname_prefix = This is a prefix that will be prepended to the actual library name (ex. libXY.so where X is libname_prefix and Y is sharedname). +linkflags = Flags that are passed during the creation of dynamic libraries and executables. +macro_for_lib_modifier = A boolean value to determine whether the lib_modifier is added as MPC_LIB_MODIFIER to the compiler flags +make_coexistence = This will be true if the -make_coexistence option was passed to MPC. +need_staticflags = This will be true if the project is a static project. +optimize = Indicate if the project will be optimized or not. +output_dir = A configuration specific output directory for output targets. +pch_defines = C preprocessor macros that indicate that precompiled headers will be used. +platforms = This determines for which platform the project will be built. +prelink = If supported by the build tool, this specifies a command to run prior to linking the target. +project_file = The name of the current project file being created. +project_name = The name of the current project being processed. +stackcommitsize = The Stack Commit Size for Windows executables. +stackreservesize = The Stack Reserve Size for Windows executables. +type_is_binary = This will be true is the project is a dynamic library or an executable. +type_is_dynamic = This will be true if the project is a dynamic library. +type_is_static = This will be true if the project is a static project. +use_lib_modifier = A boolean value to determine whether the 'lib_modifier' setting will be appended to the library name. +use_exe_modifier = A boolean value to determine whether the 'lib_modifier' setting will be appended to the executable name. +win_version = This is a variation of the 'version' project value that has been translated into a value usable on Windows. +windows_style = Controls the location of Debug executables and all installed executables. If it is set, the Debug executable is placed in the Debug directory. diff --git a/ACE/MPC/docs/templates/ghs.txt b/ACE/MPC/docs/templates/ghs.txt new file mode 100644 index 00000000000..0fd8d3ebd94 --- /dev/null +++ b/ACE/MPC/docs/templates/ghs.txt @@ -0,0 +1,14 @@ +bsp = If a bsp is necessary, this variable should be set to the bsp name. +exceptions = This controls whether exceptions are used or not. It is on by default. +libext = Similar to the common lib_ext except that this one is normally left to the default. +no_use_pch = Set this to disable precompiled header support. +os_dir = Set this to the full path of the OS directory (ex. C:\GHS\int507). +postmkdir = Allows arbitrary text after the use of mkdir. +primarytarget = This specifies the primaryTarget value that is placed in the toplevel workspace. Some example values are: ppc_integrity.tgt, ppc_linux.tgt, ppc_standalone.tgt and ppc_vxworks.tgt. +reltop = This is the current directory of the project relative to the top-level directory. +reltop_dllout = Similar to dllout except that it's relative to the top-level directory. +reltop_exeout = Similar to exeout except that it's relative to the top-level directory. +reltop_includes = Similar to includes except that it's relative to the top-level directory. +reltop_libout = Similar to libout except that it's relative to the top-level directory. +reltop_libpaths = Similar to libpaths except that it's relative to the top-level directory. +slash = The value used to separate directories and files. diff --git a/ACE/MPC/docs/templates/make.net.txt b/ACE/MPC/docs/templates/make.net.txt new file mode 100644 index 00000000000..062f59c26cf --- /dev/null +++ b/ACE/MPC/docs/templates/make.net.txt @@ -0,0 +1,40 @@ +// Current as of 8/5/2009 - Happy Birthday Molly! +// This defines the role of all the template variables specific to the +// 'make' project type using the csharp language. +// +// Please try to keep this alphabetically sorted. +// +allowunsafeblocks = Enable/disable the use of the unsafe keyword. +clean = Additional files or directories to be "cleaned" when the clean target is invoked. +compilers = Although it is plural, it holds only a single compiler which is used to determine specific flags. +copy = A utility to copy a file. +def_flag = Compiler specific flag to define a macro. +delete = A utility to delete a file. +devnull = The null device for a particular platform. +exe_flag = Compiler specific flag to create an executable. +expanded_variable_assignment = Used to enable the setting of custom library paths. Be default this is disabled due to lack of support from all make variants. +ico_flag = Compiler specific flag for specifying the icon file. +key_flag = Compiler specific flag to specify the keyfile. +keyfile = Indicate the keyfile to use when signing the assembly. +lib_flag = Compiler specific flag to set the library search paths. +make_include = This allows users to "include" arbitrary files into the generated makefiles. +makedir = A utility to make a directory. +mkbundle = The command to create a native bundled executable. +move = A utility to move a file. +opt_flag = Compiler specific flag to optimize the compilation. +out_flag = Compiler specific flag to specify the output type. +packages = Packages to reference from within the binary target. +pkg_flag = Compiler specific flag to specify the package file. +ref_flag = Compiler specific flag to specify a reference assembly. +resx_flag = Compiler specific flag to specify the resource file. +shared_flag = Compiler specific flag to create a shared library. +slash = The value used to separate directories and files. +supports_include = A boolean value used to indicate whether the version of make supports inclusion of files that do not yet exist. +targetoutdir = Specifies a location for all targets and intermediaries within the makefile. It should always end in a slash. +testdirend = Used in creating intermediate directories. +testdirstart = Used in creating intermediate directories. +trace = If this boolean template variable is set, the TRACE constant will be defined. +type = A utility to display a file on the terminal. +unsafe_flag = Compiler specific flag to enable the use of the unsafe keyword. +winapp = This boolean template variable indicates whether the application target is for the Console or Windows subsystem. +winexe_flag = Compiler specific flag to create a Windows executable. diff --git a/ACE/MPC/docs/templates/make.txt b/ACE/MPC/docs/templates/make.txt new file mode 100644 index 00000000000..4fc01a283ea --- /dev/null +++ b/ACE/MPC/docs/templates/make.txt @@ -0,0 +1,74 @@ +// Current as of 1/14/2010 +// This defines the role of all the template variables specific to the +// 'make' project type. +// +// Please try to keep this alphabetically sorted. +// +ar = The static library creation tool. +arflags = Flags passed to the static library creation tool. +arflags64 = The 64-bit version of flags passed to the static library creation tool. +build64bit = Determine whether this project is built in 64-bit mode. +chmod = A utility to change permissions on a file. +clean = Additional files or directories to be "cleaned" when the clean target is invoked. +compile_option = The option used to specify that the compiler should only compile. +compilerflags = This holds options specific to a particular compiler. +compilerflags64 = The 64-bit specific options passed to a particular compiler. +compilers = Although it is plural, it holds only a single compiler which is used to determine specific flags and default platform. +copy = A utility to copy a file. +cpu = This can be used with the Wind River specific compilers to specify the CPU macro. +cputype = This can be used with the Wind River specific compilers to specify the CPU type. +cxx = Holds the C/C++ compiler. +cxxint = This is Green Hills specific and specifies the type of integration. +delete = A utility to delete a file. +depgen = A utility to generate make dependencies. +depgen_flags = Flags to be passed to the dependency generator utility. +devnull = The null device for a particular platform. +dld = The linker to create dynamic libraries. +dmclink = Used by the dmc compiler, this determines if the dmc special mode of linking is used. +exe_linkflags = Provides additional link flags for binary targets. The value is eval'ed. +expanded_variable_assignment = Used to enable the setting of custom library paths. Be default this is disabled due to lack of support from all make variants. +extraarflags = Additional, platform specific, flags to be passed to the static library creation tool. +extracppflags = Additional, platform specific, flags to be passed to the source file compiler. +genflags = Used to determine the default compile mode (either debug or optimized). +gnumake = Indicates that GNU Make extensions can be used in the generated Makefile. +ld = Used to override the default linker and flags for executables. +ldlibs = Platform specific libraries to be linked into dynamic libraries and executables. +libgenopt = This is used to pass an option, if necessary, to the static library creation tool to specify the library name. +libopt = The option used to specify that a library will be linked into dynamic libraries or executables. +libpathopt = The option used to provide a path to libraries that will be linked into dynamic libraries or executables. +linkflags = Platform specific flags passed during the linking of dynamic libraries and executables. +linkflags64 = The 64-bit version of platform specific flags passed during the linking of dynamic libraries and executables. +make_include = This allows users to "include" arbitrary files into the generated makefiles. +makedir = A utility to make a directory. +move = A utility to move a file. +nm = A utility to generate a symbol listing of an object file or executable. +obj_dir = If specified, object files will be place in this directory. It should always end in a slash. +obj_ext = The object file extension. +output_option = The option used to specify the output location of various parts of a project such as object file, libraries and executables. +pchcreate = Options passed to the source compiler to create a precompiled header binary. +pchext = The extension of the precompiled header binary file. +pchnobj = If set, the creation of the precompiled header binary does not create an object file. +pchstop = An optional setting that some compilers use to indicate the last include file to be considered in creating a precompiled header binary. +pchsupport = Determine if precompiled header support is generated into the makefile. +pchuse = Options passed to the source compiler to specify that a precompiled header binary be used. +pic = The position independent code option for a particular compiler. +postlinkbinary = If specified, the command will be executed at the end of linking a binary executable. +prelinktarget = Specific to VxWorks, this indicates a file that is compiled prior to linking a shared object library or executable. +prelinktargetobj = Specific to VxWork, this indicates the object file that is needed prior to linking a shared object library or executable. +ranlib = A boolean setting to determine if ranlib is needed or not. +rc = The name of the resource file compiler. +res_ext = The extension for compiled resource files. +shflags = Platform specific flags passed during the linking of dynamic libraries. +slash = The value used to separate directories and files. +specialscript = Specific to VxWorks, the text in this value is used as a script to generate the 'prelinktarget' file. +supports_include = A boolean value used to indicate whether the version of make supports inclusion of files that do not yet exist. +targetoutdir = Specifies a location for all targets and intermediaries within the makefile. It should always end in a slash. +tempinc = A compiler specific setting that can be used to dermine a temporary location for template instantiations. +tempincopt = A compiler specific option to indicate the temporary directory specified by 'tempinc'. +testdirend = Used in creating intermediate directories. +testdirstart = Used in creating intermediate directories. +touch = The utility used to create the initial dependency file. +type = A utility to display a file on the terminal. +versupport = A platform specific setting that inidicates if shared library versioning is supported. +visibility = A boolean setting to determine if visibility options are passed to the compiler. +visopt = The compiler specific options to enable symbol visibility. diff --git a/ACE/MPC/docs/templates/vc7.txt b/ACE/MPC/docs/templates/vc7.txt new file mode 100644 index 00000000000..a785b4fe5f6 --- /dev/null +++ b/ACE/MPC/docs/templates/vc7.txt @@ -0,0 +1,55 @@ +// Current as of 8/14/2009 +// This defines the role of all the template variables specific to the +// 'vc7' and 'vc71' project types. +// +// Please try to keep this alphabetically sorted. +// +basicruntimechecks = This corresponds to the C/C++ Code Generation property "Basic Runtime Checks". The numeric value specifies the pull-down value in the IDE. +buffersecuritycheck = This corresponds to the C/C++ Code Generation property "Buffer Security Check". The boolean value specifies the pull-down value in the IDE. +charset = This setting specifies the "Character Set" in the General properties. The values 0, 1, and 2 specify Not Set, Unicode, and Multi-Byte respectively. +common_defines = Specifies macros that are common to all target types. +configuration_type = This corresponds to the General property "Configuration Type". The values 1, 2, 4, and 10 correspond to Application, Dynamic Library, Static Library, and Utility respectively. +culture = This corresponds to the Resources General property "Culture". The numeric value corresponds to the pull-down values in the IDE. +debug_format = This setting specifies the "Debug Information Format" found in the C/C++ General properties. The numeric value specifies the pull-down value in the IDE. +debug_prj = This is an internally used template variable to determine if the configuration originated as "Debug". In the event that the 'optimize' template variable is overridden, debug_prj allows the correct run-time library to be chosen. +defines = Macros that are specific to a particular configuration. +detect64bitportabilityproblems = This corresponds to the C/C++ Code Generation property "Detect 64-bit Portability Issues". The boolean value specifies the pull-down value in the IDE. +disablespecificwarnings = A space separated list of warning numbers to be disabled. +enablefunctionlevellinking = This corresponds to the C/C++ Code Generation property "Enable Function-Level Linking". The boolean value specifies the pull-down value in the IDE. +encoding = Specifies the XML encoding for the generated .vcproj file. +exceptions = This setting corresponds to the C/C++ Code Generation property "Enable C++ Exceptions". The boolean value specifies the pull-down value in the IDE. +fixedbaseaddress = This corresponds to the Linker Advanced property "Fixed Base Address". The values 1 and 2 correspond to Relocatable (not fixed) and Load at a Fixed Address respectively. +forloopscope = This corresponds to the C/C++ Language property "Force Conformance In For Loop Scope". The boolean value specifies the pull-down value in the IDE. +generatemapfile = This corresponds to the Linker Debugging property "Generate Map File". The boolean value specifies the pull-down value in the IDE. +guid = The value for this variable is generated during project generation. +ignore_default_library_names = The value for this is evaluated as a space separated list of default library names to ignore. It corresponds to the Linker Input property "Ignore Specific Library". +ignorealldefaultlibraries = Ignore all default libraries during linking. +inlinefunctionexpansion = This corresponds to the C/C++ Optimization property "Inline Function Expansion". A value of 1 indicates /Ob1 (inline only those designated to be inlined). A value of 2 indicates /Ob2 (inline any suitable function). +link_options = Allows passing arbitrary options to the linker. +linkincremental = This setting corresponds to the Linker General property "Enable Incremental Linking". The values 1 and 2 correspond to NO and YES respectively. +machine = This corresponds to the Linker Advanced property "Target Machine". The numeric value corresponds to the pull-down values in the IDE. +midl_defines = Macros specified here correspond to the MIDL General property "Preprocessor Definitions". +midl_flags = The value for this variable is passed to the MIDL command as "Additional Options". +midl_includes = This correspond to the MIDL General property "Additional Include Directories". +midl_notlb = Suppresses the creation of a type library for the IDL file. +minimalrebuild = This corresponds to the C/C++ Code Generation property "Enable Minimal Rebuild". The boolean value specifies the pull-down value in the IDE. +moduledefinitionfile = This setting corresponds to the Linker Input property "Module Definition File". +opticf = This corresponds to the Linker Optimization property "Enable COMDAT Folding". The value 1 corresponds to "Do Not Remove Redundant COMDATs" and 2 corresponds to "Remove Redundant COMDATs". +optref = This corresponds to the Linker Optimization property "References". The value 1 corresponds to "Keep Unreferenced Data" and 2 corresponds to "Eliminate Unreferenced Data". +output_subdir = This is used in determining the sub-directory under which intermediate files will be placed. +pdbc = If this boolean template variable is set, the C/C++ Output Files property "Program Database File Name" will be set according to the project target. +pdbl = If this boolean template variable is set, the Linker Debugging property "Generate Program Database File" will be set according to the project target. +platform = Specifies the target platform. +rtti = This corresponds to the C/C++ Language property "Enable Run-Time Type Info". The boolean value specifies the pull-down value in the IDE. +runtime_library = This corresponds to the C/C++ Code Generation property "Runtime Library". If the template variable is set, the numeric value will be used. Otherwise, it will be determined based on the target and debug/optimize configuration. The numeric value specifies the pull-down value in the IDE. +stringpooling = This corresponds to the C/C++ Code Generation property "Enable String Pooling". The boolean value specifies the pull-down value in the IDE. +subsystem = This corresponds to the Linker System property "SubSystem". This variable should not be set directly by the user; instead the project should inherit from 'mfc'. +unicode = If this boolean template variable is set, the UNICODE and _UNICODE macros are added to the C/C++ Preprocessor property "Preprocessor Definitions". +unicode_mfc_entry = This corresponds to the Linker Advanced property "Entry Point". This variable should not be set directly by the user; instead the project should inherit from 'mfc'. +use_mfc = This corresponds to the General property "Use of MFC". This variable should not be set directly by the user; instead the project should inherit from 'mfc'. +UseOfATL = This corresponds to the General property "Use of ATL". +vcprojecttype = Specifies the ProjectType setting within the generated .vcproj file. +vcversion = Specifies the version of the generated .vcproj file. This value is determined by the VC7ProjectCreator or the VC71ProjectCreator. +warning_level = This setting corresponds to the C/C++ General property "Warning Level". Valid values are 0 through 4. +wchar_t = This corresponds to the C/C++ Language property "Treat wchar_t as Built-in Type". The boolean value specifies the pull-down value in the IDE. +xml_version = Specifies the XML version for the generated .vcproj file. diff --git a/ACE/MPC/docs/templates/vc7csharp.txt b/ACE/MPC/docs/templates/vc7csharp.txt new file mode 100644 index 00000000000..0be6b878969 --- /dev/null +++ b/ACE/MPC/docs/templates/vc7csharp.txt @@ -0,0 +1,18 @@ +// Current as of 10/26/2006 +// This defines the role of all the template variables specific to the +// 'vc7' and 'vc71' project types with the csharp language. +// +// Please try to keep this alphabetically sorted. +// +allowunsafeblocks = Enable/disable the use of the unsafe keyword. +common_defines = Specifies macros that are common to all target types. +defines = Macros that are specific to a particular configuration. +guid = The value for this variable is generated during project generation. +incremental = This setting corresponds to the Configuration Properties Advanced property "Incremental Build". The boolean values true and false correspond to enabling or disabling the feature in the IDE. +keyfile = Indicate the keyfile to use when signing the assembly. +prversion = This setting specifies the ProductVersion in the generated .csproj file. +scc = This template variable enables or disables the use of Scc. +schemaversion = This setting specifies the SchemaVersion in the generated .csproj file. +startupobject = This corresponds to the Common Properties General property "Startup Object". +trace = This setting corresponds to the Configuration Properties Build property "Conditional Compilation Constants". If this boolean template variable is set, the TRACE constant will be defined. +winapp = This boolean template variable indicates whether the application target is for the Console or Windows subsystem. diff --git a/ACE/MPC/docs/templates/vc7java.txt b/ACE/MPC/docs/templates/vc7java.txt new file mode 100644 index 00000000000..445240f2373 --- /dev/null +++ b/ACE/MPC/docs/templates/vc7java.txt @@ -0,0 +1,18 @@ +// Current as of 11/15/2007 +// This defines the role of all the template variables specific to the +// 'vc7' and 'vc71' project types with the java language. +// +// Please try to keep this alphabetically sorted. +// +allowunsafeblocks = Enable/disable the use of the unsafe keyword. +common_defines = Specifies macros that are common to all target types. +defines = Macros that are specific to a particular configuration. +guid = The value for this variable is generated during project generation. +incremental = This setting corresponds to the Configuration Properties Advanced property "Incremental Build". The boolean values true and false correspond to enabling or disabling the feature in the IDE. +keyfile = Indicate the keyfile to use when signing the assembly. +prversion = This setting specifies the ProductVersion in the generated .vjsproj file. +scc = This template variable enables or disables the use of Scc. +schemaversion = This setting specifies the SchemaVersion in the generated .vjsproj file. +startupobject = This corresponds to the Common Properties General property "Startup Object". +trace = This setting corresponds to the Configuration Properties Build property "Conditional Compilation Constants". If this boolean template variable is set, the TRACE constant will be defined. +winapp = This boolean template variable indicates whether the application target is for the Console or Windows subsystem. diff --git a/ACE/MPC/docs/templates/vc7vb.txt b/ACE/MPC/docs/templates/vc7vb.txt new file mode 100644 index 00000000000..49faae08420 --- /dev/null +++ b/ACE/MPC/docs/templates/vc7vb.txt @@ -0,0 +1,16 @@ +// Current as of 10/26/2006 +// This defines the role of all the template variables specific to the +// 'vc7' and 'vc71' project types with the vb language. +// +// Please try to keep this alphabetically sorted. +// +common_defines = Specifies macros that are common to all target types. +defines = Macros that are specific to a particular configuration. +guid = The value for this variable is generated during project generation. +incremental = This setting corresponds to the Configuration Properties Optimizations property "Enable incremental build". The boolean values true and false correspond to enabling or disabling the feature in the IDE. +prversion = This setting specifies the ProductVersion in the generated .vbproj file. +scc = This template variable enables or disables the use of Scc. +schemaversion = This setting specifies the SchemaVersion in the generated .vbproj file. +startupobject = This corresponds to the Common Properties General property "Startup object". +trace = This setting corresponds to the Configuration Properties Build property "Define TRACE constant". If this boolean template variable is set, the TRACE constant will be defined. +winapp = This boolean template variable indicates whether the application target is for the Console or Windows subsystem. diff --git a/ACE/MPC/docs/templates/vc8.txt b/ACE/MPC/docs/templates/vc8.txt new file mode 100644 index 00000000000..fa6077082d3 --- /dev/null +++ b/ACE/MPC/docs/templates/vc8.txt @@ -0,0 +1,147 @@ +// Current as of 5/30/2008 +// This defines the role of all the template variables specific to the +// 'vc8' project type. +// +// Please try to keep this alphabetically sorted. +// +additionalmanifestdependencies = Specifies the additional XML manifest fragments the linker will put in the manifest file. +additionalusingdirectories = A semi-colon separated list of directories to search for #using files. +addmodulenamestoassembly = Import the specified non-assembly file into the final output. +add_references = If this is set, the project will be generated with project references based on the 'after' keyword setting. +allowisolation = Specifies manifest file lookup behavior for side-by-side assemblies. +assemblerlistinglocation = Specifies the relative path and/or name for the ASM listing file. +assembleroutput = Specifies the contents of the assembly language output file. 0 is "No Listing", 1 is "Assembly-Only Listing", 2 is "Assembly, Machine Code and Source", 3 is "Assembly With Machine Code", and 4 is "Assembly With Source Code". +assemblydebug = Emits the debuggable attribute to the assembly. 0 is "No Debuggable attribute emitted", 1 is "Runtime tracking and disable optimizations", 2 is "No runtime tracking and enable optimizations". +assemblylinkresource = Links a resource file to the output assembly. +assemblyreferences = A space separated list of assembly references. +baseaddress = Specifies the base address for the program. +basicruntimechecks = This corresponds to the C/C++ Code Generation property "Basic Runtime Checks". The numeric value specifies the pull-down value in the IDE. +browseinformation = Specifies the level of browse information in the .bsc file. 0 is "None", 1 is "Include All Browse Information", and 2 is "No Local Symbols". +browseinformationfile = Specifies the optional name for the browser information file. +buffersecuritycheck = This corresponds to the C/C++ Code Generation property "Buffer Security Check". The boolean value specifies the pull-down value in the IDE. +callingconvention = Specifies the default calling convention. 0 is __cdecl, 1 is __fastcall, and 2 is __stdcall. +charset = This setting specifies the "Character Set" in the General properties. The values 0, 1, and 2 specify Not Set, Unicode, and Multi-Byte respectively. +clrimagetype = Specifies the type of a CLR image. 0 is "Default image type", 1 is "Force IJW image", 2 is "Force pure IL image", and 3 is "Force safe IL image". +clrthreadattribute = Specifies the threading attribute for the entry point of your CLR program. 0 is "No threading attribute set", 1 is "MTA threading attribute", and 2 is "STA threading attribute". +common_defines = Specifies macros that are common to all target types. +compileas = Select compile language for .c and .cpp files. 0 is "Default", 1 is "Compile as C Code", and 2 is "Compile as C++ Code". +configurationtype = Specifies the type of output this configuration generates. +cpu_defines = Macros that are specific to a particular CPU platform. +culture = This corresponds to the Resources General property "Culture". The numeric value corresponds to the pull-down values in the IDE. +debug_format = This setting specifies the "Debug Information Format" found in the C/C++ General properties. The numeric value specifies the pull-down value in the IDE. +debug_prj = This is an internally used template variable to determine if the configuration originated as "Debug". In the event that the 'optimize' template variable is overridden, debug_prj allows the correct run-time library to be chosen. +defaultcharisunsigned = If set to true, designates char to be unsigned. +defines = Macros that are specific to a particular configuration. +delayloaddlls = Specifies one or more semi-colon separated DLLs for delayed loading +delaysign = If set to true, indicates whether the output assembly should be delay signed. +detect64bitportabilityproblems = This corresponds to the C/C++ Code Generation property "Detect 64-bit Portability Issues". The boolean value specifies the pull-down value in the IDE. +disablelanguageextensions = If set to true, disables language extensions. +disablespecificwarnings = A space separated list of warning numbers to be disabled. +driver = Specifies the driver for the linker. +embedmanagedresourcefile = Embed the specified .NET resource file. +enablecomdatfolding = Removes redundant COMDAT symbols from the linker output. 0 is "Default", 1 is "Do Not Remove Redundant COMDATs", and 2 is "Remove Redundant COMDATs". +enableenhancedinstructionset = Enable use of instructions found on processors that support enhanced instruction sets. +enablefibersafeoptimizations = Enables memory space optimization when using fibers and thread local storage. +enablefunctionlevellinking = This corresponds to the C/C++ Code Generation property "Enable Function-Level Linking". The boolean value specifies the pull-down value in the IDE. +enableintrinsicfunctions = If set to true, enables intrinsic functions (which contain faster, but possibly larger, code). +enableprefast = If set to true, enables Native Code Analysis. +encoding = Specifies the XML encoding for the generated .vcproj file. +entrypointsymbol = Sets the starting symbol for a .exe file or DLL. +errorreporting = Specifies how internal tool errors should be reported back to Microsoft. 0 is "Default", 1 is "Prompt Immediately", 2 is "Queue For Next Login". +exceptionhandling = Calls destructors for automatic objects during a stack unwind caused by an exception. 0 is "No", 1 is "Yes", and 2 is "Yes With SEH Exceptions". +expandattributedsource = Create listing file with expanded attributes injected into the source file. +favorsizeorspeed = Set to 0 to favor neither size or speed, 1 to favor speed, and 2 to favor size during optimization. +fixedbaseaddress = Specifies if the image must be loaded at a fixed address. 0 is "Default", 1 is "Generate a relocation section", and 2 is "Image must be loaded at a fixed address". +fixedbaseaddress = This corresponds to the Linker Advanced property "Fixed Base Address". The values 1 and 2 correspond to Relocatable (not fixed) and Load at a Fixed Address respectively. +floatingpointexceptions = If set to true, enables floating point exceptions. +floatingpointmodel = Sets the floating point mode. Use 0 for precise, 1 for strict and 2 for fast. +forceconformanceinforloopscope = If set to false, disables for loop variable conformance. +forcedincludefiles = Specifies one or more forced include files. +forcedusingfiles = Specifies one or more forces #using files. +forcesymbolreferences = Force the linker to include a reference to this symbol. +functionorder = Places COMDATs into the image in a predetermined order. This variable must be set to a file name containing the order. +generatedebuginformation = Enables generation of debug information if set to true. +generatemanifest = If set to false, disabled generation of a manifest file. +generatemapfile = This corresponds to the Linker Debugging property "Generate Map File". The boolean value specifies the pull-down value in the IDE. +generatepreprocessedfile = Specifies the preprocessing option for this configuration. 0 is "No", 1 is "With Line Numbers", and 2 is "Without Line Numbers". +generatexmldocumentationfiles = If set to true, specifies that the compiler should generate XML documentation comment files (.XDC). +guid = The value for this variable is generated during project generation. +heapcommitsize = Specifies total heap allocation size in bytes of physical memory. +heapreservesize = Specifies total heap allocation size in bytes of virtual memory. +ignore_default_library_names = The value for this is evaluated as a space separated list of default library names to ignore. It corresponds to the Linker Input property "Ignore Specific Library". +ignorealldefaultlibraries = Ignore all default libraries during linking. +ignoreimportlibrary = Specifies that the import library generated by this project should not be imported into dependent projects. +ignorestandardincludepath = If set to true, the compiler will ignore the standard include path. +importlibrary = Specifies the name of the import library. This allows the override of the default project import library name based on the sharedname project setting. +inlinefunctionexpansion = This corresponds to the C/C++ Optimization property "Inline Function Expansion". A value of 1 indicates /Ob1 (inline only those designated to be inlined). A value of 2 indicates /Ob2 (inline any suitable function). +keepcomments = If set to true, comments are not stripped from the source code. +keycontainer = Specifies the named container of the key for strongly naming the output assembly. +keyfile = Specifies the file that contains the key for strongly naming the output assembly. +language = This template variable is based on the language setting of MPC, except if the 'webapp' project variable is set. In that case, it is 'website'. +largeaddressaware = Enables handling address larger than 2 Gb. 0 is "Default", 1 is "Do Not Support Addresses Larger Than 2 Gigabytes", and 2 is "Support Addresses Larger Than 2 Gigabytes". +link_options = Allows passing arbitrary options to the linker. +linkincremental = This setting corresponds to the Linker General property "Enable Incremental Linking". The values 1 and 2 correspond to NO and YES respectively. +linklibrarydependencies = Disables automatically linking in libraries from project dependencies if set to false. +linktimecodegeneration = Enables link time code generation of objects compiled with Whole Program Optimization. +manifestfile = Specifies the name of the manifest file to generate. +mapexports = Includes exported functions in the map file information if set to true. +mapfilename = Specifies a name for the mapfile. +mergesections = Causes the linker to merge 'from' into section 'to'. The setting must be of the form 'from=to'. +midl_defines = Macros specified here correspond to the MIDL General property "Preprocessor Definitions". +midl_flags = The value for this variable is passed to the MIDL command as "Additional Options". +midl_includes = This correspond to the MIDL General property "Additional Include Directories". +midl_notlb = Suppresses the creation of a type library for the IDL file. +minimalrebuild = This corresponds to the C/C++ Code Generation property "Enable Minimal Rebuild". The boolean value specifies the pull-down value in the IDE. +moduledefinitionfile = This setting corresponds to the Linker Input property "Module Definition File". +objectfile = Specifies a name to override the default object file name. It can be a file or directory name. +omitdefaultlibname = Do not include default library names in .obj files. +omitframepointers = If set to true, suppresses frame pointers. +openmp = If set to true, enables OpenMP 2.0 language extensions. +optimizeforwindows98 = Align code on 4Kb boundaries. +optimizereferences = Enables elimination of functions and/or data that are never referenced. 0 is "Default", 1 is "Keep Unreferenced Data", and 2 is "Eliminate Unreferenced Data". +output_subdir = This is used in determining the sub-directory under which intermediate files will be placed. +pdbc = If this boolean template variable is set, the C/C++ Output Files property "Program Database File Name" will be set according to the project target. +pdbl = If this boolean template variable is set, the Linker Debugging property "Generate Program Database File" will be set according to the project target. +platform_defines = Macros that are specific to a particular platform. +platform = Specifies the target platform. +precompiledheaderfile = Specifies the path and/or name of the generated precompiled header file. +profile = Produce an output file that can be used with the Enterprise Developer performance profiler. +profileguideddatabase = Specifies the database file to use when using profile guided optimizations. +programdatabasefilename = Specifies a name for a compiler-generate .PDB file. This setting is only used if the 'pdbc' template variable is not set. +registeroutput = Specifies whether to register the primary output of this build if set to true. +release_link_options = Allows passing arbitrary options to the linker when making a release build +resourceonlydll = A resource-only DLL will be created if set to true. +runtime_library = This corresponds to the C/C++ Code Generation property "Runtime Library". If the template variable is set, the numeric value will be used. Otherwise, it will be determined based on the target and debug/optimize configuration. The numeric value specifies the pull-down value in the IDE. +runtimetypeinfo = If set to false, disables RTTI. +setchecksum = Enables setting the checksum in the header of a .exe if set to true. +showincludes = Generates a list of include files with compiler output if set to true. +showprogress = Enables detailed display of progress. 0 is "Not Set", 1 is "Display All Progress Messages", and 2 is "Displays Some Progress Messages". +smallertypecheck = Enable checking of conversion to smaller types. +stringpooling = This corresponds to the C/C++ Code Generation property "Enable String Pooling". The boolean value specifies the pull-down value in the IDE. +stripprivatesymbols = Do not put private symbols into the generated .PDB file. +structmemberalignment = Specify 1, 2, 4, 8, or 16-byte boundaries for struct member alignment using the numbers 1, 2, 3, 4, or 5 respectively. +subsystem = This corresponds to the Linker System property "SubSystem". This variable should not be set directly by the user; instead the project should inherit from 'mfc'. +supportunloadofdelayloadeddll = If set to true, allows explicit unloading of the delay loaded DLLs. +suppressstartupbanner = Suppress the display of the startup banner and information messages. +swaprunfromcd = Run the application from the swap location of the CD. +swaprunfromnet = Run the application from the swap location of the network. +targetmachine = Specifies the subsystem for the linker. See vc8platforms.mpt for some of the settings. +terminalserveraware = Enables terminal server awareness. 0 is "Default", 1 is "Not Terminal Server Aware", and 2 is "Application is Terminal Server Aware". +treatwchar_tasbuiltintype = This corresponds to the C/C++ Language property "Treat wchar_t as Built-in Type". The boolean value specifies the pull-down value in the IDE. +turnoffassemblygeneration = If set to true, specifies that no assembly will be generated even though common language runtime information is present in the object files. +undefineallpreprocessordefinitions = Undefine all previously defined preprocessor values. +undefinepreprocessordefinitions = Specifies one or more preprocessor undefines. +unicode = If this boolean template variable is set, the UNICODE and _UNICODE macros are added to the C/C++ Preprocessor property "Preprocessor Definitions". +unicode_mfc_entry = This corresponds to the Linker Advanced property "Entry Point". This variable should not be set directly by the user; instead the project should inherit from 'mfc'. +usefullpaths = Use full paths in diagnostic messages if set to true. +uselibrarydependencyinputs = If set to true, specifies that inputs to the librariant tool are used rather than the library file itself when linking in libraries of project dependencies. +useofatl = Specifies how ATL is used by the configuration. 0 corresponds to "Not using ATL", 1 corresponds to "Static Link to ATL", and 2 corresponds to "Dynamic Link to ATL". +useofmfc = Specifies how MFC is used by the configuration. 0 corresponds to "Use Standard Windows Libraries", 1 corresponds to "Use MFC in a Static Library" and 2 corresponds to "Use MFC in a Shared DLL". +useunicoderesponsefiles = Instructs the project system to generate UNICODE response files when spawning the compiler. +vcprojecttype = Specifies the ProjectType setting within the generated .vcproj file. +vcversion = Specifies the version of the generated .vcproj file. This value is determined by the VC8ProjectCreator. +warnaserror = If set to true, the compiler treats all warnings as errors. +warning_level = This setting corresponds to the C/C++ General property "Warning Level". Valid values are 0 through 4. +wholeprogramoptimization = Specifies that the program will be optimized across .obj boundaries. 0 is "No Whole Program Optimization", 1 is "Use Link Time Code Generation", 2 is "Profile Guided Optimization - Instrument", 3 is "Profile Guided Optimization - Optimize", and 4 is ""Profile Guided Optimization - Update". +xmldocumentationfilename = Specifies the name of the generated XML documentation files. +xml_version = Specifies the XML version for the generated .vcproj file. diff --git a/ACE/MPC/docs/templates/vc8csharp.txt b/ACE/MPC/docs/templates/vc8csharp.txt new file mode 100644 index 00000000000..1768d087711 --- /dev/null +++ b/ACE/MPC/docs/templates/vc8csharp.txt @@ -0,0 +1,20 @@ +// Current as of 10/26/2006 +// This defines the role of all the template variables specific to the +// 'vc8' project type with the csharp language. +// +// Please try to keep this alphabetically sorted. +// +allowunsafeblocks = Enable/disable the use of the unsafe keyword. +common_defines = Specifies macros that are common to all target types. +defines = Macros that are specific to a particular configuration. +guid = The value for this variable is generated during project generation. +keyfile = Indicate the keyfile to use when signing the assembly. +prversion = This setting specifies the ProductVersion in the generated .csproj file. +registerforcominterop = This setting corresponds to the Build Output property "Register for COM interop". The boolean values true and false correspond to enabling or disabling the feature in the IDE. +schemaversion = This setting specifies the SchemaVersion in the generated .csproj file. +startupobject = This corresponds to the Application property "Startup object". +toolsversion = The ToolsVersion attribute of the Project XML element. +trace = This setting corresponds to the Build General property "Conditional Compilation Constants". If this boolean template variable is set, the TRACE constant will be defined. +warning_level = This corresponds to the Build General property "Warning level". Valid values are 0 through 4. +winapp = This boolean template variable indicates whether the application target is for the Console or Windows subsystem. +xmlheader = Enable the <?xml ...?> header.
\ No newline at end of file diff --git a/ACE/MPC/docs/templates/vc8java.txt b/ACE/MPC/docs/templates/vc8java.txt new file mode 100644 index 00000000000..d6b6a3ea790 --- /dev/null +++ b/ACE/MPC/docs/templates/vc8java.txt @@ -0,0 +1,18 @@ +// Current as of 3/05/2007 +// This defines the role of all the template variables specific to the +// 'vc8' project type with the java language. +// +// Please try to keep this alphabetically sorted. +// +allowunsafeblocks = Enable/disable the use of the unsafe keyword. +common_defines = Specifies macros that are common to all target types. +defines = Macros that are specific to a particular configuration. +guid = The value for this variable is generated during project generation. +keyfile = Indicate the keyfile to use when signing the assembly. +prversion = This setting specifies the ProductVersion in the generated .vjsproj file. +registerforcominterop = This setting corresponds to the Build Output property "Register for COM interop". The boolean values true and false correspond to enabling or disabling the feature in the IDE. +schemaversion = This setting specifies the SchemaVersion in the generated .vjsproj file. +startupobject = This corresponds to the Application property "Startup object". +trace = This setting corresponds to the Build General property "Conditional Compilation Constants". If this boolean template variable is set, the TRACE constant will be defined. +warning_level = This corresponds to the Build General property "Warning level". Valid values are 0 through 4. +winapp = This boolean template variable indicates whether the application target is for the Console or Windows subsystem. diff --git a/ACE/MPC/docs/templates/vc8vb.txt b/ACE/MPC/docs/templates/vc8vb.txt new file mode 100644 index 00000000000..1eff924e50b --- /dev/null +++ b/ACE/MPC/docs/templates/vc8vb.txt @@ -0,0 +1,16 @@ +// Current as of 10/26/2006 +// This defines the role of all the template variables specific to the +// 'vc8' project type with the vb language. +// +// Please try to keep this alphabetically sorted. +// +common_defines = Specifies macros that are common to all target types. +defines = Macros that are specific to a particular configuration. +guid = The value for this variable is generated during project generation. +prversion = This setting specifies the ProductVersion in the generated .vbproj file. +registerforcominterop = This setting corresponds to the Compile property "Register for COM interop". The boolean values true and false correspond to enabling or disabling the feature in the IDE. +schemaversion = This setting specifies the SchemaVersion in the generated .vbproj file. +startupobject = This corresponds to the Application property "Startup object". +trace = This setting corresponds to the Compile Advanced Compile Options property "Define TRACE constant". If this boolean template variable is set, the TRACE constant will be defined. +warning_level = This setting corresponds to the Compile property "Disable all warnings". Valid values are 0 and 1. +winapp = This boolean template variable indicates whether the application target is for the Console or Windows subsystem. diff --git a/ACE/MPC/docs/templates/wb26.txt b/ACE/MPC/docs/templates/wb26.txt new file mode 100644 index 00000000000..fa029ae21a9 --- /dev/null +++ b/ACE/MPC/docs/templates/wb26.txt @@ -0,0 +1,12 @@ +// Current as of 3/31/2008 +// This defines the role of all the template variables specific to the +// 'wb26wrproject' template. +// +// Please try to keep this alphabetically sorted. +// +common_defines = Specifies macros that are common to all target types. +defines = Macros that are specific to a particular configuration. +enable_subprojects = Enable the generation of subprojects +link_groups = A boolean template variable that determines if the GNU linker specific --start-group and --end-group options are used. +linkflags = Platform specific flags passed during the linking of dynamic libraries and executables. +standard_build = Specify that you want to use standard build instead of flexible build diff --git a/ACE/MPC/docs/templates/wix.txt b/ACE/MPC/docs/templates/wix.txt new file mode 100644 index 00000000000..d7565bd410b --- /dev/null +++ b/ACE/MPC/docs/templates/wix.txt @@ -0,0 +1,9 @@ +// Current as of 8/10/2009 +// This defines the role of all the template variables specific to the +// 'wix' project type. +// +// Please try to keep this alphabetically sorted. +// +guid = The value for this variable is generated during project generation. +install_location = A space separated list of installation directories. +source_directory = The value of either exeout, dllout, or libout with the variable portion converted to a suitable value for WIX. diff --git a/ACE/MPC/generate_export_header.pl b/ACE/MPC/generate_export_header.pl new file mode 100755 index 00000000000..ef37701a793 --- /dev/null +++ b/ACE/MPC/generate_export_header.pl @@ -0,0 +1,126 @@ +#! /usr/bin/perl +eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' + & eval 'exec perl -w -S $0 $argv:q' + if 0; + +# ****************************************************************** +# Author: Chad Elliott +# Date: 3/1/2006 +# $Id$ +# Description: Generate an export header file for use with various compilers +# ****************************************************************** + +# ****************************************************************** +# Pragma Section +# ****************************************************************** + +use strict; +use FileHandle; +use File::Basename; + +# ****************************************************************** +# Data Section +# ****************************************************************** + +my $version = '1.2'; + +# ****************************************************************** +# Subroutine Section +# ****************************************************************** + +sub generate_export_header { + my($name, $output) = @_; + my $fh = new FileHandle(); + my $status = 0; + + if (open($fh, ">$output")) { + $name = uc($name); + print $fh <<EOM +#ifndef ${name}_EXPORT_H +#define ${name}_EXPORT_H + +#if !defined(${name}_HAS_DLL) +# if defined(${name}_AS_STATIC_LIBS) +# define ${name}_HAS_DLL 0 +# else +# define ${name}_HAS_DLL 1 +# endif +#endif + +#if (${name}_HAS_DLL == 1) +# if defined(__SUNPRO_CC) && (__SUNPRO_CC >= 0x550) +# if defined(${name}_BUILD_DLL) +# define ${name}_Export __symbolic +# else +# define ${name}_Export __global +# endif +# elif defined(WIN32) || defined(UNDER_CE) || defined(__CYGWIN__) +# if defined(${name}_BUILD_DLL) +# define ${name}_Export __declspec(dllexport) +# else +# define ${name}_Export __declspec(dllimport) +# endif +# elif (defined(__GNUC__) && (__GNUC__ >= 4)) +# if defined(${name}_BUILD_DLL) +# define ${name}_Export __attribute__((visibility("default"))) +# else +# define ${name}_Export +# endif +# else +# define ${name}_Export +# endif +#else +# define ${name}_Export +#endif + +#endif +EOM +; + close($fh); + print "Output written to $output\n"; + } + else { + print STDERR "ERROR: Unable to write to $output\n"; + ++$status; + } + + return $status; +} + +sub usageAndExit { + my $str = shift; + + print STDERR "$str\n" if (defined $str); + print STDERR "Generate Export Header v$version\n", + "Usage: ", basename($0), " <library name> [output file]\n"; + exit(0); +} + +# ****************************************************************** +# Main Section +# ****************************************************************** + +my $name = shift; +my $output = shift; + +if (!defined $name) { + usageAndExit(); +} +elsif (index($name, '-') == 0) { + usageAndExit(); +} + +if (!defined $output) { + $output = $name . '_' . ($name =~ /^[A-Z]/ ? 'E' : 'e') . + 'xport.h'; +} + +if ($name =~ s/^\d+//) { + print "WARNING: Removing beginning numbers from export name.\n"; +} +if ($name =~ s/-\s/_/g) { + print "WARNING: Converting dashes and ", + "whitespace to underscores in export name.\n"; +} + +exit(generate_export_header($name, $output)); diff --git a/ACE/MPC/history/ChangeLog-3_1 b/ACE/MPC/history/ChangeLog-3_1 new file mode 100644 index 00000000000..0997fcd8974 --- /dev/null +++ b/ACE/MPC/history/ChangeLog-3_1 @@ -0,0 +1,2088 @@ +Tue Dec 21 06:27:20 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Reverted my change to add more resource file extensions. It would + take template changes to the gnuace, make and nmake project types + to do it right and I don't have the time at this point. + +Mon Dec 20 13:49:42 2004 Chad Elliott <elliott_c@ociweb.com> + + * config/mfc.mpb: + + Fixed the AFX macro. It was _AFX_DLL and should have been + _AFXDLL. + + * modules/ProjectCreator.pm: + + Added more resource file extensions. + +Mon Dec 13 10:27:04 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Added a warning when an mpc file is processed, but no output + project file will be created. If it is an implicit project, the + message is only informational. + + * templates/automake.mpd: + + Made the -stamp file go to the output directory of the generated + files. Also rearranged the libs, lit_libs and pure_libs to be + consistent with other project types. + + * templates/make.mpd: + * templates/makedll.mpt: + + Modifications to add a 'targetoutdir' template variable which + determines the output location of object files, exes and + libraries. By default, this template variable is not set and does + not affect anything. Also rearranged the libs, lit_libs and + pure_libs to be consistent with other project types. + + * templates/bmake.mpd: + * templates/em3vcp.mpd: + * templates/nmake.mpd: + * templates/sle.mpd: + * templates/va4icc.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + + Rearranged the libs, lit_libs and pure_libs to be consistent with + other project types. The order in which they are added to the + project is now libs, lit_libs and then pure_libs. + +Mon Dec 6 09:39:01 2004 Chad Elliott <elliott_c@ociweb.com> + + * config/bison.mpb: + * config/flex.mpb: + * config/lex.mpb: + * config/yacc.mpb: + + Added more possible output extensions. + + * README: + * modules/ProjectCreator.pm: + + Added the ability to get the output file by specific type without + an extension. See the README for more detail. + + * modules/WorkspaceCreator.pm: + + Fixed a bug where exclude blocks always excluded the listing even + if project types were listed and did not match the current project + type. As a result, the exclude block works just as any other + scope if the project type does not match the excluded project + types. + +Wed Dec 1 19:28:19 2004 Marek Brudka <mbrudka@aster.pl> + + * USAGE (Module): + * modules/WorkspaceCreator.pm (Module): + * modules/ProjectCreator.pm (Module): + * modules/Options.pm (Module): + * modules/FeatureParser.pm (Module): + * modules/Driver.pm (Module): + * modules/Creator.pm (Module): + + Added command line option '-features'. Thanks for Kacper Reutt for + the patch. + +Mon Nov 29 11:24:05 2004 Chad Elliott <elliott_c@ociweb.com> + + * templates/automake.mpd: + + Added top, macros and local markers. It already had a bottom + marker. + +Thu Nov 25 06:55:36 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/MakeWorkspaceCreator.pm: + * modules/NMakeWorkspaceCreator.pm: + * modules/WorkspaceCreator.pm: + + Provide target translation to avoid collisions between directory + names and target names. Incidentally Borland Make does not have + this problem, it is able to distinguish between directories and + targets. Thanks to Steve Huston <shuston@riverace.com> for + bringing this to my attention. + + * templates/vc7.mpd: + + Ensure that static libraries and import libraries got to 'libout' + regardless of whether 'dllout' is set or not. Thanks to Marek + Brudka <mbrudka@elka.pw.edu.pl> for reporting this. + +Wed Nov 24 08:17:01 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug where the directory portion would not contain a + trailing slash when using gendir. This would cause some + non-existent file to be added automatically. + + * templates/automake.mpd: + * templates/bmake.mpd: + * templates/em3vcp.mpd: + * templates/ghs.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + * templates/vc7csharp.mpd: + * templates/vc7vb.mpd: + + When gendir is used, attempt to automatically make the specified + directory. + +Tue Nov 23 07:52:03 2004 Chad Elliott <elliott_c@ociweb.com> + + * config/boost_base.mpb: + * config/boost_date_time.mpb: + * config/boost_filesystem.mpb: + * config/boost_prg_exec_monitor.mpb: + * config/boost_regex.mpb: + * config/boost_signals.mpb: + * config/boost_test_exec_monitor.mpb: + * config/boost_thread.mpb: + * config/boost_unit_test_framework.mpb: + + Added initial support for boost. + + * modules/AutomakeProjectCreator.pm: + * modules/AutomakeWorkspaceCreator.pm: + * modules/WorkspaceHelper.pm: + * templates/automake.mpd: + + Fixed a bug dealing with the output_option of a custom build + definition. Added support for library versioning and adding the + includedir setting. + +Fri Nov 19 07:06:11 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/BMakeProjectCreator.pm: + + Added '.' to the directories for cppdir and rcdir. At least one + directory is always necessary due to the way that the template is + set up. + + * templates/bmake.mpd: + + Reverted Johnny's previous change as the CPPDIR and RESDIR + settings always need to be there since they are used by the + automatic targets in the template (regardless of whether there are + cpp and rc files or not). + + Also, added a dummy all target if there is no exe or lib. + +Fri Nov 19 10:05:12 UTC 2004 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/bmake.mpd: + Only generate CPPDIR when cppdir is defined, also only generate + RESDIR when rcdir is defined + +Thu Nov 18 11:56:57 2004 Chad Elliott <elliott_c@ociweb.com> + + * README: + + Document the change to 'dependent'. It now represents the command + upon which generated files are dependent. + + * templates/em3vcp.mpd: + * templates/make.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + + Changed to use the new form of 'dependent'. + + * templates/makedll.mpt: + + Added initial support for the NCC compiler. + +Fri Nov 12 18:17:20 2004 Steve Huston <shuston@riverace.com> + + * templates/automake.mpd: Added a 'bottom' marker. + +Thu Nov 11 10:17:43 2004 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/ProjectCreator.pm: + + Added a new construct (similar to specific) which can only be used + with component lists (Source_Files, Header_Files, etc.). The + construct is called 'conditional' and can be used to conditionally + add or exclude files based on project type. See the README for + more detail. + +Tue Nov 9 12:19:43 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug where generated files that are defaulted may become + "invisible" because of automatic grouping of other non-generated + files of the same type (inline, header, etc.). + +Fri Nov 5 13:42:11 2004 Chad Elliott <elliott_c@ociweb.com> + + * templates/bmake.mpd: + + Added a template variable called debug_macros. The contents of + this variable is included into the compile flags for a debug build + only. Also, fixed the realclean target to check for a value in + GENERATED_DIRTY before attempting to delete it. + +Tue Nov 2 09:43:38 2004 Chad Elliott <elliott_c@ociweb.com> + + * USAGE: + + Added a section to document MPC related environment variables. + + * modules/Options.pm: + + If the argument to -include is a relative path, prepend the + current working directory to the path. Also, removed the + deprecated -static_only option. + +Sun Oct 31 15:40:12 UTC 2004 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/cbx.mpd: + Just exclude the complete Template_Files folder instead of all files + individually + +Fri Oct 29 11:15:12 UTC 2004 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/cbx.mpd: + Set the page size to 4096 by default in a debug build + +Fri Oct 29 09:17:12 UTC 2004 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/cbx.mpd: + Exclude template files from build in MinGW and GCC + +Thu Oct 28 06:23:12 UTC 2004 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/cbx.mpd: + Added needed compiler options and generate the needed include paths + in the bcc32 part, removed generate of $(BCB) includes, these are + not needed. + +Mon Oct 25 12:18:27 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/BMakeWorkspaceCreator.pm: + * modules/NMakeWorkspaceCreator.pm: + + Added the 'generated' target. This target, which exists in the + other make based projects, will generate all generated source + files. + + * templates/automake.mpd: + + Removed unnecessary uses of <%foreach%>. + + * templates/bmake.mpd: + + Corrected the precompiled header support, fixed the pch_postrule + code and added the 'generated' target. + + * templates/ghs.mpd: + + Changed 'cat' and 'mv -f' to be template variables to better + support ghs on Windows. + + * templates/make.mpd: + + Force object files to be built in the same directory as the source + files. This corresponds to the way dependencies are generated by + makedepend and depgen.pl. + + * templates/nmake.mpd: + + Moved many targets and variable assignments outside of the + platform and configurations <%foreach%> sections to avoid + repetition within the generated makefile. + + Also added the 'generated' target. + + * templates/nmakedll.mpt: + + Added a missing slash to the W3 option under the "Static Release" + section. + +Fri Oct 22 08:55:56 2004 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/Creator.pm: + * modules/ProjectCreator.pm: + + Added the ability to specify an "else" clause to a "specific" + section. + + * config/openssl.mpb: + * config/qt.mpb: + * config/zlib.mpb: + + Utilize the new "else" clause. + + * config/xerces.mpb: + + Added a base project for xerces. + +Mon Oct 18 18:03:28 2004 Steve Huston <shuston@riverace.com> + + * modules/AutomakeWorkspaceCreator.pm: When collecting the list of + subdirectories, maintain dependency order so a subdirectory + required before the current directory's projects gets built + in the correct order. + +Mon Oct 18 11:42:28 2004 Steve Huston <shuston@riverace.com> + + * config/openssl.mpb: Added automake to the set of targets that + get lit_libs and includes adjusted. + +Mon Oct 18 08:09:59 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Changed the defaulting behavior for Template_Files. If a template + file resulted from generation, it used to always be added (like + source files). Now, it will only be added if Template_Files is + not supplied (defaulted). + +Thu Oct 7 16:44:29 2004 Steve Huston <shuston@riverace.com> + + * modules/AutomakeWorkspaceCreator.pm: Changed the library relocator + adjustment so it doesn't add the $top_builddir relativity to + libraries being built in the same directory. This allows the + automake/make dependencies to work correctly and have things + built in the right order. + +Thu Oct 7 13:06:54 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/EM3ProjectCreator.pm: + * modules/NMakeProjectCreator.pm: + * modules/VC6ProjectCreator.pm: + * modules/VC7ProjectCreator.pm: + * modules/WinVersionTranslator.pm: + * templates/em3vcp.mpd: + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + + Added a windows version translator to deal with versions that + contain letters and multiple decimal points. See the comment in + WinVersionTranslator for more details. + +Thu Oct 7 13:03:28 2004 Steve Huston <shuston@riverace.com> + + * modules/AutomakeWorkspaceCreator.pm: Fixed the library location + adjuster to adjust more than one library on a line. + +Wed Oct 6 11:35:48 2004 Chad Elliott <elliott_c@ociweb.com> + + * clone_build_tree.pl: + + Added a description of what this script does to the usage. + + * modules/GHSProjectCreator.pm: + * modules/GHSWorkspaceCreator.pm: + * templates/ghs.mpd: + * templates/ghscommon.mpt: + * templates/ghsdll.mpt: + * templates/ghsdllexe.mpt: + * templates/ghslib.mpt: + * templates/ghslibexe.mpt: + + Increased the support for Green Hills Builder. It still isn't + complete as I have only tested it for Integrity. I will need to + test it for different platforms such as Solaris and Windows. + + Due to the way that the builder works, the -hierarchy option does + not work and will never work with the ghs project type. + +Tue Oct 5 10:21:20 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/VC71ProjectCreator.pm: + * modules/VC7ProjectCreator.pm: + * modules/VC8ProjectCreator.pm: + * templates/vc7.mpd: + + For vc7 and vc71, set the ForceConformanceInForLoopScope to TRUE. + For vc8, that setting is deprecated so we do not set it at all. + +Tue Oct 5 08:53:10 2004 Chad Elliott <elliott_c@ociweb.com> + + * config/rpc.mpb: + + Modified to use source_pre_extension instead of just + source_outputext. + + * modules/ProjectCreator.pm: + + Fixed a bug where a generated file (on Windows only) would not be + recognized as already added to the list of files. + + * README: + * modules/TemplateParser.pm: + * templates/automake.mpd: + * templates/bmake.mpd: + * templates/em3vcp.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + * templates/vc7csharp.mpd: + * templates/vc7vb.mpd: + + Added the ability to add to 'postcommand' within the scope of a + custom section (such as IDL_Files, RPC_Files, etc.) In the + process of doing this, I fixed a couple of bugs in + TemplateParser.pm: + + 1) If flag_overrides was used in an <%if()%> and the closing + parenthesis were left off, it would not be recognized as an + error but wouldn't give the expected output. + 2) If pseudo variables were used in a scoped add to commandflags, + they wouldn't get converted. + 3) If a line contained only a tab and then a <%...%> variable, a + new line wouldn't be added to the end. + +Thu Sep 30 11:19:57 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/Driver.pm: + + Use the diagnostic() method instead of print so that when the + MPC_SILENT environment variable is set, the messages do not get + printed. + + * modules/Version.pm: + + Do not print a warning if we are unable to find the beta version, + just set the beta version to ??. + + * modules/BMakeWorkspaceCreator.pm: + * modules/NMakeWorkspaceCreator.pm: + * modules/WorkspaceCreator.pm: + + Warn users when options that are used are unnecessary or have no + effect. + +Thu Sep 30 01:26:41 2004 Ossama Othman <ossama@dre.vanderbilt.edu> + + * modules/AutomakeWorkspaceCreator.pm: + + Updated list of files to be cleaned in generated clean-local + target to match current list used by the MPC generated + GNUmakefiles. + + * templates/automake.mpd: + + Removed line continuation generation code. A line continuation + character was not generated after processing the "libs" list + despite the fact that "pure_libs" or "lit_libs" may be defined + as well. This fix causes all libraries to be listed on one line + rather than be split up across multiple lines. + +Wed Sep 29 06:53:40 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Removed a portion of two regular expessions that were causing perl + warnings. Also, switched to use the warning() method instead of + the perl builtin warn function. + +Wed Sep 29 06:40:50 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Allow callers of the get_modified_workspace_name() method to get a + workspace name that does not have the workspace name attached. + +Tue Sep 28 18:33:22 2004 Steve Huston <shuston@riverace.com> + + * templates/automake.mpd: Removed the dllout/libout path additions from + Mon Sep 27 15:53:18 2004 Steve Huston <shuston@riverace.com>. + Build all libraries into the same relative path in the build tree + as the sources exist in the source tree. This change just inserts + the project's desired library references. The below changes adjust + the references to contain the relative paths in the build tree. + + * modules/ProjectCreator.pm: + * modules/WorkspaceCreator.pm: Changes graciously supplied by Chad + Elliott to add a get_lib_locations() method. It returns a hash + reference where the key is a library name (ACE, TAO, + TAO_PortableServer, etc) and the value will be a relative directory + from where mwc.pl starts. + + * modules/AutomakeWorkspaceCreator.pm: When collecting the projects' + Makefile.<project>.am files together, find all the *_LDADD and + *_LIBADD tokens that look like lib*.la and insert the path + to the library starting with $(top_builddir). This effectively + ignores any dllout/libout directives applied to the libraries + being referenced (for automake targets). Everything builds into + the build tree at the same relative location as its sources in + the source tree. + +Tue Sep 28 09:13:57 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/BMakeWorkspaceCreator.pm: + + Borland Make has a maximum line length of roughly 32767. The + 'all' target could exceed that length given a large amount of + projects within a single workspace. In that case, we have to + create an 'all' target that specifically lists the target commands + and thereby creating a larger workspace makefile, but working + around the Borland Make limitation. + +Mon Sep 27 19:32:42 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Removed code that added -I${top_srcdir} and -I${top_builddir} + to CPPFLAGS. These should be added by project files if they + are needed. + +Mon Sep 27 19:13:31 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Changed to omit executable/library building rules if exename, + sharedname, or staticname is not defined. This is useful for + projects that only contain scripts, manpages, IDL files, etc. + +Mon Sep 27 19:02:51 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Define man_MANS or bin_SCRIPTS if man_files or script_files are + set. + +Mon Sep 27 15:53:18 2004 Steve Huston <shuston@riverace.com> + + * modules/TemplateParser.pm (handle_normalize): Add / $ ( ) to the + characters translated to _ to properly handle full-path names that + may include variables. + + * templates/automake.mpd: Use the dllout/libout settings for placing + libraries. The linker input use of lib names always assumes + libout/lib - this may be too limiting, but not sure how to handle + it otherwise. + +Mon Sep 27 11:56:20 2004 Chad Elliott <elliott_c@ociweb.com> + + * README: + + Document the addition of the <%input_ext%> and <%output_ext%> + pseudo variables that are available to postcommand. + + * config/bison.mpb: + + Added .yy as a possible input extension. + + * config/flex.mpb: + * config/lex.mpb: + + Added .ll as a possible input extension. + + * config/global.features: + + By default disable the zzip feature. + + * config/yacc.mpb: + + Added a yacc base project. Previously it was not possible to + support yacc, but with the postcommand it is now possible. + + * config/zzip.mpb: + + Added a macro (USE_ZZIP) that will be added only if the zzip + feature is enabled. + + * modules/ProjectCreator.pm: + + Multiple bug fixes: + + 1) Support #if 0 and c style comments when looking for an entry + point to determine if the project is an exe or not. + 2) When creating generated file names, we need to remove escape + sequences on the pre_extension and pre_filename portion. + 3) When removing custom input file extensions, we need to loop + through all of the possible extensions to ensure that we get + the right one. + 4) When adding generated files, we need to take into account the + possibility of a pre_filename. + 5) When adding default generated files, we need to look at all of + the valid components (except header and inline) to ensure that + everything that a command generates gets added. + +Wed Sep 22 16:27:39 2004 Steve Huston <shuston@riverace.com> + + * modules/AutomakeWorkspaceCreator.pm: When combining the project + Makefile.<project>.am files, detect usage of automake conditionals + bracketing automake targets and emit blank assignments for those + (i.e. bin_PROGRAMS, lib_LTLIBRARIES, etc.) to have things work + correctly regardless of the condition test at build time. + +Mon Sep 20 11:15:13 2004 Chad Elliott <elliott_c@ociweb.com> + + * README: + + Added documentation about excluding directories and mpc files + within workspaces. + + * templates/nmake.mpd: + + Added support to the template for generation of nmakefiles that + contain both Win32 and Win64 targets. Previously, only one or the + other could be generated. + +Thu Sep 16 09:32:09 2004 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/ProjectCreator.pm: + + If an asterisk is used in the exename, sharedname or staticname + setting, then it (the asterisk) will be replaced with the project + name. Thanks to Martin Corino <mcorino@remedy.nl> for suggesting + this. + +Thu Sep 16 07:45:11 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/BMakeWorkspaceCreator.pm: + * modules/MakeWorkspaceCreator.pm: + * modules/NMakeWorkspaceCreator.pm: + + Added a CUSTOM_TARGETS macro that will allow users to access + custom targets that can be generated with the use of the + 'verbatim' clause in mpc files. + + * templates/nmake.mpd: + + Added markers to allow for the use of 'verbatim' with nmake. + +Wed Sep 15 11:32:57 2004 Chad Elliott <elliott_c@ociweb.com> + + * templates/bmake.mpd: + * templates/nmake.mpd: + + Modified these templates to work correctly if no exe name, shared + or static name is specified by the mpc file. + +Mon Sep 13 12:52:22 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug where if a custom file is in a directory other than + '.' and the 'gendir' setting is used to specify that the generated + output will be in a particular directory, it would be ignored when + determining if generated files were listed. + + * modules/Creator.pm: + * modules/WorkspaceCreator.pm: + + When converting slashes to back slashes (on Windows), only convert + values when the parameter name does not contain 'flags'. Some + custom build executables on Windows require the use of / as + command switches. + +Tue Sep 7 07:08:26 2004 Chad Elliott <elliott_c@ociweb.com> + + * USAGE: + * modules/Creator.pm: + * modules/Driver.pm: + * modules/Options.pm: + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + * modules/WorkspaceCreator.pm: + + Added an option, -expand_env, to replace all $() variables + referenced in MPC with the environment variable equivalent. + + * templates/vc7.mpd: + + Converted all slashes to back-slashes to more closely match the + Windows style. + +Fri Sep 3 09:14:21 2004 Chad Elliott <elliott_c@ociweb.com> + + * templates/em3vcp.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + + Only set up custom groups (in the IDE view) if there are input + files that correspond to the custom type. + +Thu Sep 2 09:11:44 2004 Chad Elliott <elliott_c@ociweb.com> + + * templates/bmake.mpd: + * templates/bmakedll.mpt: + * templates/bmakedllexe.mpt: + * templates/bmakelibexe.mpt: + + Modified the template and template input files to correctly build + libraries and applications. Also, added more support for Unicode + builds. + +Wed Sep 1 12:54:06 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Fixed a bug where the toplevel workspace would be created twice in + the event that the -hierarchy option was used or the subclassed + workspace creator defined the workspace_per_project method to + return 1. + + * modules/WorkspaceHelper.pm: + + Added the base class and factory for all WorkspaceHelpers. It + will dynamically locate, load and allocate the helper based on the + workspace creator type. + + * modules/AutomakeWorkspaceCreator.pm: + + Uncommented the unlink() and split the ACE specific portion into a + helper under ACE_wrappers/bin/MakeProjectCreator/modules. + +Tue Aug 31 08:00:20 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/TemplateParser.pm: + + Fixed a bug where setting a scoped assignment would not apply to a + directory specified within that scope. For example: + + project { + Source_Files { + some_feature = value + src + } + } + + The some_feature setting would not get applied to the files found + in the src directory. + + * USAGE: + * modules/Creator.pm: + * modules/Driver.pm: + * modules/Options.pm: + * modules/ProjectCreator.pm: + * modules/VC6ProjectCreator.pm: + * modules/VC7ProjectCreator.pm: + * modules/VC7WorkspaceCreator.pm: + * modules/WorkspaceCreator.pm: + * templates/make.mpd: + * templates/makedll.mpt: + * templates/vc7csharp.mpd: + * templates/vc7csharp.mpt: + * templates/vc7vb.mpd: + * templates/vc7vb.mpt: + + Added multi-language support to MPC. The default language is C++, + but it now supports C#, Java and Visual Basic. + + An additional bug was fixed in ProjectCreator.pm. If, in a + Define_Custom, the automatic keyword was not set or set to zero + MPC would still automatically add custom files to the project. + +Mon Aug 30 08:07:51 2004 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/ProjectCreator.pm: + + Added the ability to get the input and output file names without + an extension. + + * config/qt_uic.mpb: + + Added support for generating uic interface declarations and + implementations. + +Mon Aug 30 06:45:25 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed another problem with the -apply_project option. When + determining the library name, it is possible to use the project + name. In that case, we need to keep a copy of the non-modified + project name so we can determine the correct library name. + +Fri Aug 27 09:03:12 2004 Chad Elliott <elliott_c@ociweb.com> + + * templates/vc7.mpd: + + Changed the wchar_t setting to FALSE which is the default for new + projects created in Visual C++ 7. It can be changed to TRUE by + passing "-value_template wchar_t=TRUE" to MPC. + +Fri Aug 27 08:35:39 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Fixed a problem with the circular project dependency detection + algorithm. Previously, it could take days to detect a circular + dependency if there were a large number of projects. + +Thu Aug 26 17:38:41 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Fix typos, forgot a leading $. + +Thu Aug 26 09:14:57 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeProjectCreator.pm: + * modules/AutomakeWorkspaceCreator.pm: + + Give proper credit to the authors of these files. + + * modules/ProjectCreator.pm: + * modules/VC6ProjectCreator.pm: + * modules/VC7ProjectCreator.pm: + + Corrected a bug where dependencies would not be placed in the + workspace when the -apply_project option was used (in conjunction + with -name_modifier). + + * modules/WorkspaceCreator.pm: + + Fixed a problem with the group circular dependency detection + algorithm. Previously, it could take days to detect a circular + dependency if there were a large number of directories. + +Wed Aug 18 23:08:35 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Changed to scan the generated project files for the use of + $(ACE_ROOT), $(TAO_ROOT), etc. and provide the appropriate + definition if they are found. While this behavior is ACE/TAO + specific, there isn't much that can be done without something + like a workspace template. + +Wed Aug 18 08:56:01 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Changed to use am_includes, rev_avoids, and rev_requires. + + * modules/AutomakeProjectCreator.pm: + + Changed fill_value to understand am_includes, rev_avoids, and + rev_requires. am_includes prepends $(srcdir) to any relative + include paths; rev_avoids and and rev_requires reverses the + order of the avoids and requires lists. This is useful for + the trailing comments after the "endif" in conditionals. + +Fri Aug 13 18:31:01 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + Use INSTALL_THIS_TARGET to determine whether to use the + noinst_ prefix. + + * template/automakedll.mpt: + Define INSTALL_THIS_TARGET for use by automake.mpd. + +Fri Aug 13 10:53:57 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + Tweak conditionals so that generated files don't have spurious + blank lines. + +Fri Aug 13 10:25:31 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeProjectCreator.pm: + Changed sort_files to return 1. While this is not required by + automake, it makes the resulting Makefile.am's easier to read. + This is important now that we're still hand-editing the MPC + generated files. + + * templates/automake.mpd: + Add pidl_files to headers so they'll be installed. + +Thu Aug 12 09:42:55 2004 Chad Elliott <elliott_c@ociweb.com> + + * clone_build_tree.pl: + + Modified the usage. + + * modules/NMakeProjectCreator.pm: + * modules/ProjectCreator.pm: + * modules/VC6ProjectCreator.pm: + * modules/VC7ProjectCreator.pm: + + Removed code that converted $(...) to %...%. During testing, it + didn't seem necessary and was broken in some instances. I don't + even remember why it was added in the first place. + +Thu Aug 12 03:33:45 UTC 2004 Don Hinton <don.hinton@vanderbilt.edu> + + * templates/vc6dsp.mpd: + * templates/vc6dspdll.mpt: + * templates/vc6dspdllexe.mpt: + * templates/vc6dsplib.mpt: + * templates/vc6dsplibexe.mpt: + * templates/vccommon.mpt: New file. + Added support for midl. It uses midl_includes, midl_defines, + and midl_flags. To use, just add an idl file to your source + files section and define the midl_* variables in the vc6/7 + section. Thanks to Chad Elliott <elliott_c@ociweb.com> and + Krishnakumar B <kitty@dre.vanderbilt.edu> for help with this. + +Wed Aug 11 19:15:10 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeWorkspaceCreator.pm: + * templates/automake.mpd: + Changed header macro from nobase_pkginclude_HEADERS to + nobase_include_HEADERS. + Changed installed library headers to include idl_files. + Added support for EXTRA_DIST with list of resource_files. + +Wed Aug 11 07:45:11 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeProjectCreator.pm: + * modules/AutomakeWorkspaceCreator.pm: + * modules/BMakeProjectCreator.pm: + * modules/BMakeWorkspaceCreator.pm: + * modules/CBXProjectCreator.pm: + * modules/Creator.pm: + * modules/DirectoryManager.pm: + * modules/Driver.pm: + * modules/GHSWorkspaceCreator.pm: + * modules/HTMLProjectCreator.pm: + * modules/MakeWorkspaceCreator.pm: + * modules/NMakeWorkspaceCreator.pm: + * modules/ProjectCreator.pm: + * modules/SLEProjectCreator.pm: + * modules/TemplateParser.pm: + * modules/WorkspaceCreator.pm: + + Encapsulated the VMS changes related to dirname into a single + method (mpc_dirname) that gets called instead dirname. Thanks to + Martin Corino <mcorino@remedy.nl> for verifying my changes. + +Wed Aug 11 10:08:12 UTC 2004 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/bmake.mpd: + Corrected handling of resource files so that we can handle the + resource files in the TAO libraries + +Tue Aug 10 17:10:38 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + Add initial support for automake conditionals with <%requires%> + and <%avoids%>. + Remove extra spaces before backslashes in _CPPFLAGS. + +Tue Aug 10 09:10:36 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/MakeWorkspaceCreator.pm: + * templates/make.mpd: + + Modifications to ensure that generated files get built before + anything else. + +Mon Aug 9 07:50:47 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug in the code that determines which generated files get + added automatically. The array that can exist in the components + list could be undefined and in that case nothing got added + automatically. + + * templates/automakedll.mpt: + + Added a missing conditional include of the common mpt file. + +Mon Aug 9 07:04:12 UTC 2004 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/bmakecommon.mpt: + Use cw32mti.lib instead of cw32mt.lib + +Sat Aug 7 23:19:33 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + Introduce an intermediate dependency between custom input + and output files so that only one instance of the command + is spawned per input file with parallel make. + +Thu Aug 5 14:57:19 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + Use $(srcdir)/<%custom_type->input_file%> instead of $< so + resulting makefile will work on systems where make doesn't + support VPATH. + +Thu Aug 5 11:14:12 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + Check "libout", not "install" to determine whether a library + is to be installed. + +Thu Aug 5 09:14:12 UTC 2004 Johnny Willemsen <jwillemsen@remedy.nl> + + The following changes are from Martin Corino <mcorino@remedy.nl> + + * modules/Creator.pm: + * modules/Driver.pm: + * modules/ProjectCreator.pm: + * modules/WorkspaceCreator.pm: + Added various changes to support autobuild MPC generation on + OpenVMS. + +Wed Aug 4 11:47:06 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + Use technique pioneered in the last checkin to remove the + $(DUMMY_VALUE...) hack from _CPPFLAGS definitions. + +Wed Aug 4 11:23:04 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + The automake documentation recommends that header files for + programs and convienence libraries be listed in _SOURCES and not + _HEADERS. This has been done for programs (as we don't yet have + a way to reliably distinguish between convienence libraries from + installed libraries). I've done this with rather ugly template + macros to avoid having to do the $(DUMMY_VALUE...) hack. This + results in more readable Makefile.am's. + +Wed Aug 4 09:23:03 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeWorkspaceCreator: + * templates/automake.mpd: + Changed to set nobase_pkginstall_HEADERS instead of HEADER_FILES, + INLINE_FILES, and TEMPLATE_FILES in Makefile.<project>.am files. + Extending this will enable us to control installing headers on a + per library basis (all we need is some way to control the prefix + used for _HEADERS). + +Mon Aug 2 09:29:31 2004 Steve Huston <shuston@riverace.com> + + * templates/automake.mpd: For non-installed libraries, generate + noinst_LTLIBRARIES instead of lib_LTLIBRARIES. + For libraries, assume that "libs" are libtool-created libraries + and "lit_libs" are not. + +Mon Aug 2 08:04:27 2004 Chad Elliott <elliott_c@ociweb.com> + + * templates/bmake.mpd: + * templates/bmakecommon.mpt: + + Removed ACE specific portions of the bmake template. They will + need to be supplied on the command line using the -value_template + and -value_project options. + +Sun Aug 1 08:31:49 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + Fix typo, use <%dynamicflag%> instead of <%dynamicflags%> within + foreach loop. + +Sun Aug 1 15:13:12 UTC 2004 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/bmake.mpd: + Use the new ccflags, common_flags and warnflags. Tried to add + some support for unicode builds, this is not complete yet, added + "" around the objfiles, to handle ++ in directory/file names. Added + setting of define ACE_LD_DECORATOR_STR, which is used in ACE to + determine the filename extension of DLL's. Removed the removal + of files with postlinkrmext extenion (is .tds) files after the + link, instead do this with realclean. + + * templates/bmakecommon.mpt: + Updated dllflags, common_defines, added ccflags, + common_flags, and warnflags which have to be passed + to the compiler + + * templates/bmakedll.mpt: + * templates/bmakedllexe.mpt: + * templates/bmakelibexe.mpt: + Set postlinkrmext to .tds in all these files, we should + rework this a little bit more, tds files are needed for + the debugger and we shouldn't remove them after the link. + + The bmake target is not complete yet, things that have to be + improved are startup objects (gperf just cores now), + unicode support, codeguard support, install target, clean target. + +Wed Jul 28 20:01:36 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: Emit a _LDFLAGS definition if linkflags + is defined. + +Wed Jul 28 09:15:02 2004 Chad Elliott <elliott_c@ociweb.com> + + * clone_build_tree.pl: + + Remove backup files before trying to create them and added + information to some error messages. + + * modules/AutomakeWorkspaceCreator.pm: + + Cleaned up the code a bit. + + * templates/automakedll.mpt: + * templates/automakeexe.mpt: + + The automakedll.mpt defines linkflags for use within + automake.mpd. automakeexe.mpt just includes automakedll.mpt. + +Fri Jul 23 14:32:54 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeWorkspaceCreator.pm: + Parse generated Makefile.<project>.am files as their contents + are being inserted into the workspace Makefile.am, converting + the first instance where a macro is appended to (+=) into a + simple assignment (=). This results in a Makefile.am that is + closer to what would be written by hand, and automake will often + generate smaller Makefile.in files since it won't be tricked + into pulling in boilerplate for macros that were defined and not + used. + +Thu Jul 22 17:39:41 2004 Steve Huston <shuston@riverace.com> + + * modules/AutomakeWorkspaceCreator.pm: When writing + configure.ac.Makefiles, insert entries for project-less directories + between project-containing directories. Allows the bootstrap + procedure to find and make the needed Makefiles to traverse the + entire build tree. + + + * templates/automake.mpd: Changed _LIBADD to _LDADD for programs. + +Thu Jul 22 12:52:39 2004 Steve Huston <shuston@riverace.com> + + * modules/AutomakeWorkspaceCreator.pm: If there's no local project + info for the current Makefile.am, don't put the initial bin_PROGRAMS, + lib_LTLIBRARIES, etc. If there are local projects, add "." to the + SUBDIRS. + + * templates/automake.mpd: Add _LIBADD settings to pick up needed + libraries. + +Wed Jul 21 19:34:46 2004 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeProjectCreator.pm: + Override expand_variables_from_template_values. + + * modules/AutomakeWorkspaceCreator.pm: Don't emit SUBDIRS + definition if there aren't any subdirectories. + + * templates/automake.mpd: Simplify so that _CPPFLAGS, etc. + settings are not duplicated for programs and libraries, + grouped and non-grouped source files, etc. + +Wed Jul 21 18:02:31 2004 Steve Huston <shuston@riverace.com> + + * templates/automake.mpd: Added the _CPPFLAGS setting to the + non-grouped library section. + +Wed Jul 21 17:04:39 2004 Steve Huston <shuston@riverace.com> + + * modules/AutomakeWorkspaceCreator.pm: In write_comps(), combine all + of the current directory level's Makefile.<project>.am files into + the directory's Makefile.am file and delete the individual files. + Write only the Makefile.am file paths into the configure.ac.Makefiles + list. This is because the previous loop-through-current-Makefile + scheme sent make into an infinite loop, consuming all process + slots very quickly. The generated Makefiles always like to start + again at the top Makefile to check its updatedness, even if + a specific Makefile.<project> file was specified to make. Moved the + general cleanup text from automake.mpd to here. + + * templates/automake.mpd: For non-project-specific info (bin, lib, + etc.) use += rather than = to allow multiple per-project files to + be combined into one file later. Removed the general cleanup + directives and put them in the workspace generator, above. J.T. + Conklin also supplied changes for the following: + + - Append list of custom_type outfiles to BUILT_SOURCES + + - Append list of custom_type outfiles to CLEANFILES + + - Emit explicit rules for building custom type outfiles. Note that + unlike some of the other makefile templates, I've used $< instead + of <%custom_type->input_file%> so that the file will be found via + vpath. + + - Removed global setting of INCLUDES. Include paths are now handled + by per library/program _CPPFLAGS. + +Fri Jul 16 12:24:36 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Added a method to get the current output file name. + +Thu Jul 15 14:02:04 2004 Chad Elliott <elliott_c@ociweb.com> + + * clone_build_tree.pl: + + Cleaned up the code a bit. + + * modules/AutomakeWorkspaceCreator.pm: + + Used a parameter passed into write_comps to determine if we are + writing the top level workspace. + + * modules/ProjectCreator.pm: + + Ignore project names that are set in a base project. It doesn't + make sense and I can't think of a practical use of this. + + * modules/WorkspaceCreator.pm: + + Fixed a bug where an excluded name could be partially matched and + possibly exclude something that wasn't meant to be. + +Thu Jul 8 14:09:49 2004 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/ProjectCreator.pm: + + Added a new wild card syntax ('^') similar to the '!' that works + best for excluding generated files from component lists. See the + README for more details. + +Thu Jul 8 09:16:21 2004 Chad Elliott <elliott_c@ociweb.com> + + * README: + + Added documentation about the wild card support in MPC. + + * modules/ProjectCreator.pm: + + If grouping is used in source files, put automatically added files + in corresponding groups. + + * templates/vc7.mpd: + + Use <%ucw()%> for the custom_type which looks better in the + graphical interface. + +Tue Jul 6 11:29:07 2004 Chad Elliott <elliott_c@ociweb.com> + + * README: + + Added documentation for new pseudo template variables for use + within the command, commandflags, postcommand and output_option + settings. + + * modules/ProjectCreator.pm: + + Fixed a bug where mixing grouped and non-grouped files would cause + the non-grouped files to be ignored. + + Added new pseudo template variables for the null device, >, <, && + and ||. + + * modules/VC7ProjectCreator.pm: + + Override defaults for the >, < and && values to correctly support + these within the XML projects. + + * templates/em3vcp.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + + Added support for grouping header, inline, template, resource and + documentation files. + +Fri Jul 2 10:27:03 2004 Chad Elliott <elliott_c@ociweb.com> + + * templates/vc7.mpd: + + Default the machine setting to X86. + +Fri Jul 2 08:17:48 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + + Return the same kind of crlf on OS/2 as we do on Windows. Just in + case someone tries to use MPC on OS/2. + + * modules/ProjectCreator.pm: + + When returning the list of grouped source files, convert the + slashes if it is necessary. + + * templates/vc7.mpd: + + The above change allows us to use file grouping for vc7. + Previously, files would have a forward slash in the name (if they + were in sub-directories) which confused vc7 and would cause link + errors. + +Thu Jul 1 09:35:27 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/MakeWorkspaceCreator.pm: + + Added a .PHONY: target for sub targets. This only has an effect + when using GNU make, but does not have an adverse effect when + using other versions of make. + + * README: + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + * templates/bmake.mpd: + * templates/em3vcp.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + + Added support for a new custom build keyword 'postcommand'. The + postcommand can be used to run arbitrary commands after the main + custom command is run. See the README for more details. + +Thu Jul 1 10:16:38 2004 Steve Huston <shuston@riverace.com> + + * modules/AutomakeWorkspaceCreator.pm (write_comps): Write a + configure.ac.Makefiles entry for the top-level workspace as + well, else there's no starting point in the configured tree. + + * modules/TemplateParser.pm: Added new template <%normalize%> + that takes a exename as a parameter. Converts '-' to '_' to + make the name palatable prepended to a special automake name + such as _SOURCES. + + * templates/automake.mpd: Applied a patch from Chad that makes + grouped sources work better. Also, added <%normalize%> to + exename_SOURCES generation so exe names with '-' in them get + changed to '_' for their SOURCES. This is the same normalization + Automake will do when trying to find the SOURCES for a bin_ target. + Removed the support for being able to select library subsets to + build at configure time. It didn't work right, and the subset + selection capability is not in the MPC-generated GNUmakefiles + either. It can be (re)attempted later if needed, but the longer-term + goal in ACE land seems to be to find other ways to reduce footprint. + Also changed the _PROGRAMS generation to switch between bin_ and + noinst_ depending on presence of an 'install' directive. + +Tue Jun 22 20:53:12 2004 Ossama Othman <ossama@dre.vanderbilt.edu> + + * modules/AutomakeWorkspaceCreator.pm (AUTOMAKE_OPTIONS): + + Removed generation of this make variable. All Automake options + should generally be set via the AM_INIT_AUTOMAKE autoconf macro + in the application's `configure.ac' file. + +Tue Jun 22 20:35:36 2004 Ossama Othman <ossama@dre.vanderbilt.edu> + + * templates/automake.mpd (AUTOMAKE_OPTIONS): + + Removed this make variable. All Automake options should + generally be set via the AM_INIT_AUTOMAKE autoconf macro in the + application's `configure.ac' file. + + (pkginclude_HEADERS): + + Corrected make variable for template files. + "$(INLINE_FILES)" -> "$(TEMPLATE_FILES)". + +Tue Jun 15 07:02:12 2004 Chad Elliott <elliott_c@ociweb.com> + + * USAGE: + * modules/Options.pm: + + Updated the usage information to provide more details on using the + -base option. + + * modules/ProjectCreator.pm: + + We need to ensure that macros only get expanded to environment + variables when converting source file, header file, etc. related + macros. Thanks to Phil Mesnier <mesnier_p@ociweb.com> for + reporting this. + +Thu Jun 10 08:33:08 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/Driver.pm: + * modules/Options.pm: + + Moved the usage out of the Driver and into the Options module. + + * modules/ProjectCreator.pm: + * modules/VC6ProjectCreator.pm: + + Added support for replacing $(...) with an environment variable. + This is not necessary for 'make' based project types and is not + supported by Visual C++ 7 or higher. So, it is used by the em3 + and vc6 types. + +Tue Jun 8 17:14:29 2004 Steve Huston <shuston@riverace.com> + + * modules/AutomakeWorkspaceCreator.pm: Fixed string writing to write + a tab to the generated file where desired, not a '\t'. + +Tue Jun 8 12:29:19 2004 Steve Huston <shuston@riverace.com> + + * modules/AutomakeWorkspaceCreator.pm (write_comps): Get automake + trees to generate. It now relies on this scheme: + * Each project goes in its own Makefile.<project>.am file (this is + not a change from previous versions). + * Each Makefile.am has a list of local project Makefiles added to + it and has all-local, clean-local, and distclean-local targets + added that cycle through all the local projects and do sub-makes. + * At autoconf/automake (bootstrap) time, all of the + Makefile[.<proj>].am files get processed into Makefile[.<proj>].in + files. This list is directed by the configure.ac.Makefiles list + that should be included into configure.ac. + * At configure time, all of the .in files get processed into + Makefiles. All the local targets that MPC put in the Makefile.am + files should go through to the Makefiles at each level, and + direct the build. + + Made these changes: + - Only generate a configure.ac.Makefiles at the starting directory + level; not at each level. When adding entries, don't keep the + ".am" suffix; this was a mistake. + - The configure.ac.Makefile also needs an entry for the Makefile at + each directory level with a project. + - The top-level Makefile.am has the "ACLOCAL = @ACLOCAL@" and + "AC_LOCAL_AMFLAGS = -I m4" lines added to the end to pass the + flags along properly when running autoconf. + +Tue Jun 8 11:30:15 2004 Chad Elliott <elliott_c@ociweb.com> + + * templates/vc7.mpd: + + Added the ability to add additional compiler options through the + use of the compile_flags template value. + +Fri May 28 14:03:13 2004 Chad Elliott <elliott_c@ociweb.com> + + * LICENSE: + + Added a license file with the content from the MPC section of + http://theaceorb.com/product/license.html. + + * config/openssl.mpb: + * templates/automake.mpd: + * templates/bmake.mpd: + * templates/makedll.mpt: + + Removed trailing white space. + +Fri May 28 13:06:01 2004 Chad Elliott <elliott_c@ociweb.com> + + * templates/em3vcplib.mpt: + * templates/em3vcplibexe.mpt: + * templates/vc7lib.mpt: + * templates/vc7libexe.mpt: + + Consistently name static project configurations across all Windows + based project types (excluding NMake since it has both dynamic and + static in a single makefile). + +Wed May 26 17:17:29 2004 Steve Huston <shuston@riverace.com> + + * modules/AutomakeWorkspaceCreator.pm: In write_comps(), when writing + the SUBDIRS list, only list next-level directories - SUBDIRS is + only allowed to list them, and not anything below. + +Mon May 24 13:44:13 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Print out the projects involved when warning about circular + dependencies. + +Mon May 24 07:35:39 2004 Chad Elliott <elliott_c@ociweb.com> + + * config/zzip.mpb: + + Added a base project to support the zzip library. + + * modules/BMakeWorkspaceCreator.pm: + * modules/NMakeWorkspaceCreator.pm: + + Removed unused variables. + + * modules/AutomakeWorkspaceCreator.pm: + * modules/CBXWorkspaceCreator.pm: + * modules/GHSWorkspaceCreator.pm: + * modules/SLEWorkspaceCreator.pm: + * modules/VA4WorkspaceCreator.pm: + + Removed an extra unused parameter to the sort_dependencies method. + + * modules/Version.pm: + + Modified the code to only read the ChangeLog if we are going to + display the version number. + + * USAGE: + * modules/Creator.pm: + * modules/DirectoryManager.pm: + * modules/Driver.pm: + * modules/Options.pm: + * modules/Parser.pm: + * modules/ProjectCreator.pm: + * modules/WorkspaceCreator.pm: + + Added support for generating the workspace and project files + into an alternate directory tree. This can not be used to build + code outside of the source tree, only to generate the workspace + and project files to make it easier to package up these files for + distribution. + +Sat May 22 17:28:31 2004 Steve Huston <shuston@riverace.com> + + * modules/AutomakeWorkspaceCreator.pm: Changed AUTOMAKE_OPTIONS to + "1.7 foreign" to match what's used at the project level. + +Tue May 18 19:48:33 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Remove escape sequences from extensions while generating the list + of possible file names from custom inputs instead of doing it after + the fact and possibly removing back slashes from parts of the + generated file path. + +Tue May 18 09:37:29 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/Version.pm: + + Added code to automatically determine the beta version number at + run-time. This number is determined by the manipulating the total + number of ChangeLog entries. + + * mpc.pl: + * mwc.pl: + + Provide a getBasePath() function to allow MPC to determine the + location of the ChangeLog. + +Tue May 18 07:22:53 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + When parsing the component list, convert any $(...) to relative + paths if possible. + +Fri May 14 06:45:14 2004 Chad Elliott <elliott_c@ociweb.com> + + * MPC version 3.1 released. + +Wed May 12 08:14:00 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/BMakeProjectCreator.pm: + + Sort the directories when forming the cppdir value. We need to + ensure that '.' comes first. Borland make attempts to generate + source files in each CPPDIR directory until it is successful + which explains multiple invocations of custom build tools. + +Tue May 11 11:36:00 2004 Chad Elliott <elliott_c@ociweb.com> + + * templates/em3vcp.mpd: + * templates/em3vcpdll.mpt: + * templates/em3vcpdllexe.mpt: + * templates/em3vcplib.mpt: + * templates/em3vcplibexe.mpt: + + Added support for ARM v4. Thanks to Jonathan Pollack + <pollack_j@ociweb.com> for providing the patches. Also, I fixed a + bug where the precompiled header output was going to the wrong + directory. + +Tue May 11 10:53:11 2004 Chad Elliott <elliott_c@ociweb.com> + + * USAGE: + * modules/Driver.pm: + * modules/Options.pm: + + Added a -version option to print the MPC version and exit. + + * modules/ProjectCreator.pm: + + Added libraries and executables to the install script generation. + + * prj_install.pl: + + Added support for installation of libraries and executables. + +Fri May 7 07:41:55 2004 Chad Elliott <elliott_c@ociweb.com> + + * templates/bmakelib.mpt: + * templates/bmakelibexe.mpt: + * templates/em3vcplib.mpt: + * templates/em3vcplibexe.mpt: + * templates/vc6dsplib.mpt: + * templates/vc6dsplibexe.mpt: + + Consistently name the intermediate and output directories across + all Windows based templates. + +Thu May 6 10:50:53 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug dealing with generated files that used the 'gendir' + setting. If the generated files were listed, but did not match up + exactly with what was expected, they would be listed twice in the + generated project. + +Thu May 6 09:21:59 2004 Chad Elliott <elliott_c@ociweb.com> + + * templates/em3vcp.mpd: + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + + Added a template name, link_options, to allow users to inject MS + linker options into the generated projects. + +Wed May 5 12:34:51 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + * modules/ProjectCreator.pm: + + Changed the way that duplication additions for libpaths, includes + and libs are handled. We now silently ignore duplicate additions + and maintain original assignment order. This fixes problems with + static linking on UNIX. + +Tue May 4 07:40:02 2004 Chad Elliott <elliott_c@ociweb.com> + + * README: + + Updated information about the use of 'gendir' without + 'output_option' set in a custom file definition. + +Mon May 3 23:12:37 2004 Ossama Othman <ossama@dre.vanderbilt.edu> + + * config/openssl.mpb: + + Some Linux OpenSSL installations compile in Kerberos support. + Add the Kerberos include path to preprocessor include path. + +Mon May 3 12:17:10 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + By default, refer to the dll based template input files for static + template input. If the template supports generating static + projects, then the project creator module will have overridden + the methods to return the correct template input files. + + * templates/bmake.mpd: + * templates/em3vcp.mpd: + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + + These template files have been changed in a similar fashion to + Justin Michel's changes from Sat May 1 15:20:00 2004. + +Mon May 3 10:49:28 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed yet another bug in the relative replacement code section. + If a portion of the current path was found in the replacement + value, it would assume that the whole thing was to be replaced. + This is obviously wrong and has been corrected. + +Sat May 1 15:20:00 2004 Justin Michel <michel_j@ociweb.com> + + * templates/vc7.mpd: + * templates/vc7dll.mpt: + * templates/vc7lib.mpt: + + Resource Files are only for exe or dll binaries, not for static + libs. Added a check for type_is_static, so that the resource files + section is not created. type_is_* should be defined outside of the + individual configurations. This change allows checking + type_is_static from outside of a particular configuration. + +Thu Apr 30 14:50:00 2004 Justin Michel <michel_j@ociweb.com> + + * templates/nmake.mpd: + + Added a new DEPENDCHECK target that either prints the "Using x.dep" + or "Warning : cannot find x.dep". This way, the warning is not + displayed when generating dependencies. + +Fri Apr 30 11:47:48 2004 Chad Elliott <elliott_c@ociweb.com> + + * README: + + Fixed spelling errors. + + * config/mfc.mpb: + + Added a non-ACE specific version of the mfc base project. + + * modules/Creator.pm: + * modules/Driver.pm: + * modules/Options.pm: + * modules/ProjectCreator.pm: + + Made modifications to avoid Perl warnings when working with + version 5.005 or earlier. + + * prj_install.pl: + + Added additional information to the usage that describes the + default set of install tags. + + * templates/cbx.mpd: + + Removed ACE specific lines. + +Thu Apr 29 14:50:00 2004 Justin Michel <michel_j@ociweb.com> + + * templates/nmake.mpd: + + The custom build output should be the first thing listed for + the ALL target, to ensure that any generated files are available + for the rest of the commands. + +Mon Apr 26 09:55:25 2004 Chad Elliott <elliott_c@ociweb.com> + + * templates/em3vcplibexe.mpt: + * templates/vc6dsplib.mpt: + * templates/vc6dsplibexe.mpt: + + Switched to using MFC as a shared dll even in static libraries and + executables. There is no need to statically link in the MFC + libraries. + +Fri Apr 23 11:06:10 2004 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/ProjectCreator.pm: + + Added additional functionality to fix RT #3816 and RT #3847. Both + issues dealt with custom generated files not being cleaned up + properly. The real issue was that there was no way to represent, + in MPC, what was being generated by the custom command. + Additional custom definition keywords have been added that allow + users to represent what the custom command actually generates. + + * modules/Version.pm: + + Increment the minor version number. + + * templates/vc7.mpd: + + This change fixes RT #3856. The vc7 template (which is being used + by the vc8 project type) did not work quite correctly in Visual + C++ 8. Multi-lined custom commands were changed to be compatible + with vc7, vc71 and vc8. + +Thu Apr 22 08:32:20 2004 Chad Elliott <elliott_c@ociweb.com> + + * config/openssl.mpb: + * config/qt.mpb: + * config/zlib.mpb: + + Added the vc8 type to the 'specific' sections that have vc71 in + them. + +Wed Apr 21 08:50:01 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/VC8ProjectCreator.pm: + + Corrected some bugs in this module. + + * modules/VC8WorkspaceCreator.pm: + + Removed some redundant methods that are inherited from the + VC71WorkspaceCreator. + +Wed Apr 21 13:27:43 UTC 2004 Johnny Willemsen <jwillemsen@remedy.nl> + + * USAGE: + Added vc8. + +Wed Apr 21 13:06:44 UTC 2004 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/VC8ProjectCreator.pm: + * modules/VC8WorkspaceCreator.pm: + * modules/MWC.pm: + * modules/MPC.pm: + Added Visual C++ 8 MPC template. This is for the Microsoft + Visual Studio 8 Whidbey March 2004 Preview. + +Mon Apr 19 13:44:16 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + * modules/ProjectCreator.pm: + + When subtracting values from mapped keywords, we must expand + template values in order to ensure that the values that are being + subtracted are actually removed. This has a side effect of + expanding template values during subtraction even if the project + creator type does not normally expand template values. + +Fri Apr 16 08:05:19 2004 Chad Elliott <elliott_c@ociweb.com> + + * prj_install.pl: + + This script reads .ins files generated by MPC and installs + portions of a project into a user specified location. + +Thu Apr 15 13:16:03 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Fixed a bug where generating the hierarchical workspace would have + the wrong build ordering. It was a subtle bug that had to do with + the way projects were sorted. + +Wed Apr 14 07:41:58 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Modified the file exclusion behavior to work correctly with + grouped files within components. + +Tue Apr 13 13:46:14 2004 Chad Elliott <elliott_c@ociweb.com> + + * README: + * USAGE: + + Removed ACE specific references and documentation. + + * modules/ProjectCreator.pm: + + Added wildcard support (*?[]) for component lists and the ability + to exclude files from the component lists by preceding the name + with '!'. + + ex. + project { + Source_Files { + // Get every source file, except foo.cpp + !foo.cpp + } + } + + project { + Source_Files { + // Get every cpp file that starts with RT + RT*.cpp + } + } + + * modules/Parser.pm: + * modules/TemplateParser.pm: + + Added the ability for the TemplateParser to cache the contents of + a template to avoid opening and reading the project template over + and over again. + +Mon Apr 12 11:38:29 2004 Chad Elliott <elliott_c@ociweb.com> + + * clone_build_tree.pl: + + Added more file types to exclude during cloning. + + * modules/Creator.pm: + + We still need to maintain the real set of files added for + generation of the workspace. + + * modules/WorkspaceCreator.pm: + + Added more information to the error message when duplicate + projects are found within a workspace. + +Mon Apr 12 10:00:56 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + + Switched the files_written structure to a hash array instead of an + array to make searches within that structure faster. + + * modules/WorkspaceCreator.pm: + + When generating workspaces, only write out the workspace if it is + the main workspace that corresponds to an mwc file or it hasn't + been written out yet. + + * templates/vc7.mpd: + * templates/vc7dll.mpt: + * templates/vc7exe.mpt: + * templates/vc7lib.mpt: + * templates/vc7libexe.mpt: + + Removed the 'debug' template keyword. It was unnecessary and + conflicted with the Debug configuration now that these are + case-insensitive. + +Fri Apr 9 21:19:34 2004 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/Creator.pm: + * modules/ProjectCreator.pm: + + Added a new keyword, 'recurse', that causes MPC to recurse into + directories listed under componets such as Source_Files, + Header_Files, etc. + +Fri Apr 9 13:51:47 2004 Chad Elliott <elliott_c@ociweb.com> + + * clone_build_tree.pl: + + Added a script that works similarly to create_ace_build.pl except + that it does not restrict the location of the cloned build tree + and works with any tree structure, not just ACE_wrappers. + +Fri Apr 9 12:38:15 2004 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + When replacing $() with template variables, we need to ensure that + if what it is replaced with also contains a $() construct, then + that too will be replaced with relative definitions. + +Thu Apr 8 09:51:28 2004 Chad Elliott <elliott_c@ociweb.com> + + * templates/make.mpd: + + Corrected a problem with the pch_postrule commands. I forgot that + $$ was interpreted by make, so what I really wanted was $$$$ to + get $$ passed out to the shell. + +Thu Apr 8 07:02:25 2004 Chad Elliott <elliott_c@ociweb.com> + + * USAGE: + * modules/Driver.pm: + + Removed the documentation stating that new name value template + pairs could not be added using -value_template. This is no longer + the case. + + * modules/Options.pm: + * modules/ProjectCreator.pm: + * modules/TemplateInputReader.pm: + * modules/TemplateParser.pm: + + Support replacing $() constructs with template values of the same + name. By default all project creators will do this. Overriding + the expand_variables_from_template_values method is the way to + modify this behavior. + +Wed Apr 7 06:49:16 2004 Chad Elliott <elliott_c@ociweb.com> + + * templates/bmake.mpd: + * templates/em3vcp.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + + Finished support for the 'pch_postrule' of the Define_Custom which + post edits generated source files and places the #include for the + precompiled header at the top of the file. + +Mon Apr 5 10:43:03 2004 Chad Elliott <elliott_c@ociweb.com> + + * README: + * USAGE: + * mpc.pl: + * mwc.pl: + * config/bison.mpb: + * config/default.rel: + * config/flex.mpb: + * config/global.features: + * config/global.mpb: + * config/lex.mpb: + * config/openssl.mpb: + * config/qt.mpb: + * config/qt_moc.mpb: + * config/rpc.mpb: + * config/zlib.mpb: + * modules/AutomakeProjectCreator.pm: + * modules/AutomakeWorkspaceCreator.pm: + * modules/BMakeProjectCreator.pm: + * modules/BMakeWorkspaceCreator.pm: + * modules/CBXProjectCreator.pm: + * modules/CBXWorkspaceCreator.pm: + * modules/Creator.pm: + * modules/Driver.pm: + * modules/EM3ProjectCreator.pm: + * modules/EM3WorkspaceCreator.pm: + * modules/FeatureParser.pm: + * modules/GHSProjectCreator.pm: + * modules/GHSWorkspaceCreator.pm: + * modules/GUID.pm: + * modules/HTMLProjectCreator.pm: + * modules/HTMLWorkspaceCreator.pm: + * modules/MPC.pm: + * modules/MWC.pm: + * modules/MakeProjectCreator.pm: + * modules/MakeWorkspaceCreator.pm: + * modules/NMakeProjectCreator.pm: + * modules/NMakeWorkspaceCreator.pm: + * modules/Options.pm: + * modules/OutputMessage.pm: + * modules/Parser.pm: + * modules/ProjectCreator.pm: + * modules/SLEProjectCreator.pm: + * modules/SLEWorkspaceCreator.pm: + * modules/StringProcessor.pm: + * modules/TemplateInputReader.pm: + * modules/TemplateParser.pm: + * modules/VA4ProjectCreator.pm: + * modules/VA4WorkspaceCreator.pm: + * modules/VC6ProjectCreator.pm: + * modules/VC6WorkspaceCreator.pm: + * modules/VC71ProjectCreator.pm: + * modules/VC71WorkspaceCreator.pm: + * modules/VC7ProjectCreator.pm: + * modules/VC7WorkspaceCreator.pm: + * modules/Version.pm: + * modules/WorkspaceCreator.pm: + * templates/automake.mpd: + * templates/bmake.mpd: + * templates/bmakecommon.mpt: + * templates/bmakedll.mpt: + * templates/bmakedllexe.mpt: + * templates/bmakelib.mpt: + * templates/bmakelibexe.mpt: + * templates/cbx.mpd: + * templates/cbxdll.mpt: + * templates/cbxexe.mpt: + * templates/common.mpt: + * templates/em3vcp.mpd: + * templates/em3vcpdll.mpt: + * templates/em3vcpdllexe.mpt: + * templates/em3vcplib.mpt: + * templates/em3vcplibexe.mpt: + * templates/ghs.mpd: + * templates/html.mpd: + * templates/make.mpd: + * templates/makedll.mpt: + * templates/makeexe.mpt: + * templates/nmake.mpd: + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + * templates/sle.mpd: + * templates/sledll.mpt: + * templates/sleexe.mpt: + * templates/va4icc.mpd: + * templates/va4iccdll.mpt: + * templates/va4iccdllexe.mpt: + * templates/va4icclib.mpt: + * templates/va4icclibexe.mpt: + * templates/vc6dsp.mpd: + * templates/vc6dspdll.mpt: + * templates/vc6dspdllexe.mpt: + * templates/vc6dsplib.mpt: + * templates/vc6dsplibexe.mpt: + * templates/vc7.mpd: + * templates/vc7dll.mpt: + * templates/vc7exe.mpt: + * templates/vc7lib.mpt: + * templates/vc7libexe.mpt: + + Created a new repository for MPC. + +Local Variables: +add-log-time-format: current-time-string +End: diff --git a/ACE/MPC/history/ChangeLog-3_2 b/ACE/MPC/history/ChangeLog-3_2 new file mode 100644 index 00000000000..4541dd9bca5 --- /dev/null +++ b/ACE/MPC/history/ChangeLog-3_2 @@ -0,0 +1,2053 @@ +Mon Aug 22 07:11:37 2005 Chad Elliott <elliott_c@ociweb.com> + + * prj_install.pl: + + Added options to override the installation location for a + particular tag. + + * templates/make.mpd: + * templates/makedll.mpt: + + Added support for the GHS Integrity OS. + +Fri Aug 12 12:30:19 2005 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/FeatureParser.pm: + * modules/ProjectCreator.pm: + + Added a new type of feature file that is specific to the project + type. If a file of the form <type>.features is located in the + config directory, it is read after global.features but before the + file specified by -feature_file (if any). See the README for more + details. + +Fri Aug 12 11:44:23 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/make.mpd: + * templates/makedll.mpt: + + Reworked the way that 64 and 32 bit builds are specified. 64 bit + is still the default, however to build 32 bit requires that the + user set the template variable build64bit to empty. + +Thu Aug 11 13:30:07 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug where a directory used as input for a custom file type + would not result in any input files when automatic is set to zero. + +Thu Aug 11 06:42:33 2005 Chad Elliott <elliott_c@ociweb.com> + + * README: + + Updated the Defaulting Behavior section. + + * USAGE: + * modules/Options.pm: + + Fixed poorly worded portions of the usage. + + * clone_build_tree.pl: + + Added an option to link build related files (Makefile, .dsw, + .etc). + + * combine_dsw.pl: + + Fixed a spelling error. + + * modules/AutomakeWorkspaceCreator.pm: + + Added calls for modifying the library path with the + WorkspaceHelper. + + * modules/Creator.pm: + + Fixed a bug where using * in the 'after' setting wouldn't always + be expanded. + + * modules/Driver.pm: + + The minimum version of perl needs to be 5.6 since + File::Spec::canonpath is used in Options.pm. + + * modules/ProjectCreator.pm: + * modules/WorkspaceCreator.pm: + + Only call fill_type_name if the name has a * in it. + + * modules/WorkspaceHelper.pm: + + Added the hooks for modifying the library path. + + * templates/automake.mpd: + + Cosmetic change for spacing. + +Mon Jul 18 10:26:15 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Ignore whitespace when excluding files. Also, fixed an issue with + setting sharedname to empty and not setting staticname. It should + have defaulted the staticname and leave sharedname emtpy. + + * modules/WorkspaceCreator.pm: + + Ignore whitespace when negating project types. + + * templates/nmake.mpd: + + Fixed a bug in this template where the OUTDIR was not correctly + set to 'libout' in static projects. + +Mon Jul 11 13:26:52 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + + Switch from /GX to /EHs (which is supported by vc6) to avoid build + warnings using the Visual Studio 8 compiler with nmake. + + * templates/vc8.mpd: + + Changed the default character set to 0 instead of 1. This is now + the same as the vc7 template. + +Fri Jul 8 11:47:37 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Modified code using a hash reference within a hash reference to + work correctly with Perl 5.6.1. + +Thu Jul 7 14:05:44 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/MakeProjectBase.pm: + * modules/ProjectCreator.pm: + + Factor code out of MakeProjectBase into ProjectCreator which will + allow for less code in future Make based modules. + + * templates/make.mpd: + + Modified to generate Makefiles that do not have lines that end in + spaces. + +Wed Jul 6 13:00:22 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/Options.pm: + + Support - or -- as option specifiers. + + * templates/automake.mpd: + + Removed grouped file support as it can not work correctly with + this project type. Since all of the project files for a single + directory are combined into one, the same group names could be + used (in different projects) and cause conflicts once they are + combined. + +Wed Jul 6 10:33:21 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Corrected negated wildcard matching where the pattern contained a + directory name. The negated wildcard was always being applied to + the files in the current directory. + +Wed Jul 6 08:25:25 2005 Chad Elliott <elliott_c@ociweb.com> + + * README: + + Corrected some minor documentation mistakes. + + * modules/ProjectCreator.pm: + + Added support for automatic grouping of generated files based on + the group name of the custom input file. + + * templates/bmake.mpd: + + Added Codeguard support. + +Tue Jul 5 10:25:18 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/automake.mpd: + + Added macros and compile_flags to outter if check to allow these + to be part of the CPPFLAGS (if none of the other variables in the + if are not defined). + +Tue Jul 5 07:23:07 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/vc7.mpd: + * templates/vc8.mpd: + + Correctly support the 'custom_only' keyword by utilizing the + "Utility" project type. This project type does not perform + anything but custom build rules which is exactly what we needed. + +Sat Jul 2 10:57:13 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/GHSProjectCreator.pm: + + Corrected a problem with determining the reltop value. + + * modules/ProjectCreator.pm: + + Fixed specific and conditional where multiple negated project types + are used. It would only look at the first type and decide that + the current project type wasn't negated. + + When '!' was combined with a wildcard, MPC wasn't adding the files + that didn't match if the user had specified at least one file (in + addition to the negated wildcard). + + * templates/bmake.mpd: + * templates/make.mpd: + + Moved the local marker to a location after the all target. + + * templates/ghs.mpd: + + Fixed custom build support. + + * templates/nmake.mpd: + + Correctly support the use of dllout. + +Fri Jul 1 10:03:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/bmake.mpd: + Added support for StackReserveSize and StackCommitSize + template variables. + +Wed Jun 29 12:15:46 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug where mapped keywords within the scope of a 'specific' + section would not be processed. + + * templates/ghs.mpd: + + Fixed the dependency and pch_postrule sections. + +Wed Jun 29 06:55:10 2005 Chad Elliott <elliott_c@ociweb.com> + + * README: + + Modified the documentation for 'specific' and 'conditional'. + + * modules/WorkspaceCreator.pm: + + Remove ./ from the beginning of located files and directories to + ensure that workspaces that change directory back to the original + go back to the correct directory. + + * templates/make.mpd: + + Only create the $(LTARGETDIR) rule if the project is not an exe. + +Tue Jun 28 11:33:07 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Sort custom type's output files so output is easier to inspect + when hand-tweaking MPC output. + + Add Pkgconfig_Files output to CLEANFILES. + +Tue Jun 28 07:39:34 2005 Ming Xiong <mxiong@tango.dre.vanderbilt.edu> + + * config/ziparchive.mpb + + Added a .mpb file to support ziparchive feature which is needed by + DAnCE/ComponentPackager. + +Tue Jun 28 07:20:08 2005 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/ProjectCreator.pm: + + Added the functionality to negate the project type in 'specific' + and 'conditional' clauses. + +Tue Jun 28 06:31:26 2005 Chad Elliott <elliott_c@ociweb.com> + + * config/zlib.mpb: + * config/zzip.mpb: + + Changed to use 'libs' instead of lit_libs for some project types. + +Mon Jun 27 07:25:08 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + My previous checkin uncovered a serious bug in MPC dealing with + features that weren't enabled and used the specific/else + construct. + +Mon Jun 27 06:28:54 2005 Chad Elliott <elliott_c@ociweb.com> + + * config/zzip.mpb: + + Developers insist on naming libraries differently for Windows. + So, for UNIX related projects we use zzip and for all others we + use zziplib. + +Fri Jun 24 12:47:06 2005 Chad Elliott <elliott_c@ociweb.com> + + * PROBLEM-REPORT-FORM: + + Adding a problem report form with requirements for submitting a + support request. + + * modules/EM3ProjectCreator.pm: + * modules/VC6ProjectCreator.pm: + + Removing the implementation of the get_template method since I + have renamed the templates for these project types. + + * modules/MakeWorkspaceCreator.pm: + + Removed the setting of PWD since it isn't used in the project + makefiles anymore. + + * templates/make.mpd: + + Fixed a problem where the output directory wouldn't be created for + exe or library targets if it didn't exist. + + * templates/em3.mpd: + * templates/vc6.mpd: + * templates/em3vcp.mpd: + * templates/vc6dsp.mpd: + + Renamed vc6dsp.mpd to vc6.mpd and em3vcp.mpd to em3.mpd. + +Fri Jun 24 08:39:56 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/em3vcp.mpd: + * templates/em3vcpdll.mpt: + * templates/em3vcpdllexe.mpt: + * templates/em3vcplib.mpt: + * templates/em3vcplibexe.mpt: + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + + Added support for setting the stack size. Use StackReserveSize + and StackCommitSize template variables to set this. + + * templates/make.mpd: + + Continue processing the 'depend' target even if one depend fails. + +Thu Jun 23 16:24:16 2005 Justin Michel <michel_j@ociweb.com> + + * templates/vc7.mpd: + + Added support for setting the stack size. This was already in + vc8.mpd. + +Thu Jun 23 13:44:58 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/make.mpd: + * templates/makedll.mpt: + + Simplified the generic make template and corrected support for + IRIX, MinGW, and Mac OS X. + +Wed Jun 22 12:43:34 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeProjectCreator.pm: + * modules/BMakeProjectCreator.pm: + * modules/CBXProjectCreator.pm: + * modules/GHSProjectCreator.pm: + * modules/HTMLProjectCreator.pm: + * modules/MakeProjectCreator.pm: + * modules/NMakeProjectCreator.pm: + * modules/ProjectCreator.pm: + * modules/SLEProjectCreator.pm: + + Implement the get_template method in ProjectCreator to return the + type name. This allows me to remove the get_template method from + many of the sub classes of ProjectCreator (but not all). + + * templates/em3vcp.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + * templates/vc8.mpd: + + Fixed a bug where a custom command that generates multiple output + files and defines the output_option would not have the right + build rules. + +Wed Jun 22 10:04:44 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/Options.pm: + + Convert back slashes to slashes after calling canonpath(). On + Windows, it converts slashes to backslashes which fouls up + generation of non-Windows based project types. + + * modules/ProjectCreator.pm: + + Remove extra spaces when processing '<<' and '>>'. + +Wed Jun 22 07:43:33 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + When adding generated files (and no generated file is listed), + only add those that match the default extension. + + * modules/TemplateParser.pm: + + When generating static projects, override the template settings + for the type_is_static, need_staticflags, type_is_dynamic, + type_is_binary variables. + + * templates/nmake.mpd: + + Fixed a bug where a custom command that generates multiple output + files and defines the output_option would not have the right + build rules. + + * templates/ghs.mpd: + * templates/vc8.mpd: + + Support the compile_flags template variable. + +Tue Jun 21 11:55:38 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/BMakeProjectCreator.pm: + + Double ampersand, &&, means something special to Borland Make. + So, we override the get_and_symbol method to return a string that + Borland Make can handle. + + * modules/BMakeWorkspaceCreator.pm: + + Added -$(MAKEFLAGS) to each sub-make call so that options passed + to the original make are propagated down. Thanks to Johnny for + informing me about this. + + * modules/MakeProjectBase.pm: + + Added an environment variable *for testing purposes only* that + forces Make based projects to be sorted. + + * modules/ProjectCreator.pm: + + If we are to sort files, the output files (used with custom_types + in templates) need to be sorted. + + * modules/TemplateParser.pm: + + Attempt to preserve the original order of template variables when + the values of the template variables refer to scoped template + variables. This isn't always possible, but in most cases it is. + + * prj_install.pl: + + Added pidl_files to the list of default installed files. + + * templates/bmake.mpd: + * templates/bmakecommon.mpt: + + Support multiple compilers (cbx and bcc) from within a single + makefile. + + * templates/em3vcpdll.mpt: + * templates/em3vcpdllexe.mpt: + * templates/em3vcplib.mpt: + * templates/em3vcplibexe.mpt: + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + * templates/vc6dspdll.mpt: + * templates/vc6dspdllexe.mpt: + * templates/vc6dsplib.mpt: + * templates/vc6dsplibexe.mpt: + * templates/vc7csharp.mpt: + * templates/vc7dll.mpt: + * templates/vc7exe.mpt: + * templates/vc7lib.mpt: + * templates/vc7libexe.mpt: + * templates/vc7vb.mpt: + * templates/vc8dll.mpt: + * templates/vc8exe.mpt: + * templates/vc8lib.mpt: + * templates/vc8libexe.mpt: + + Alphabetically sort 'configurations' and 'platforms'. + +Mon Jun 20 20:53:50 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Provide better error messages for certain situations. + Fixed a bug where setting sharedname to empty did not convert the + project to a static library (when staticname was set). + Always do a case insensitive search for resource files. + Fixed a bug where generated files wouldn't be added correctly if + some source files existed in the directory. + Fixed a bug where the 'postcommand' wouldn't be applied if there + was more than one output file per input file. + + * templates/automake.mpd: + + Fixed a bug where gendir wasn't applied correctly to output files. + + * modules/TemplateParser.pm: + * templates/bmake.mpd: + * templates/em3vcp.mpd: + * templates/ghs.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + * templates/vc7csharp.mpd: + * templates/vc7vb.mpd: + * templates/vc8.mpd: + + Fixed a bug where the 'postcommand' wouldn't be applied if there + was more than one output file per input file. + Also, correctly support static projects that come from setting + sharedname to empty. + +Thu Jun 16 10:21:09 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/bmake.mpd: + * templates/em3vcp.mpd: + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + * templates/vc8.mpd: + + Upon Johnny Willemsen's suggestion, I have reversed the order of + libraries for Windows based project types. This helps ACE and TAO + with static initialization issues. + +Wed Jun 15 07:33:24 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm (remove_duplicate_addition): + + In order to ensure that duplicates are correctly removed, we need + to make sure that addition values have the "right" slashes. + Thanks to Johnny Willemsen for bringing this to my attention. + +Tue Jun 14 14:21:16 2005 Justin Michel <michel_j@ociweb.com> + + * modules/TemplateParser.pm: + + Chad added a new function to make it easier to compare strings for + equality. + + * templates/vc7.mpd: + * templates/vc8.mpd: + + Updated to put default_group files into the top level group. For + example, any source_files that aren't part of a specified group + will now be placed directly under source_files in the ide. + +Tue Jun 14 12:30:16 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Fixed a bug where excluding based on type caused those that + weren't excluded to be added to the workspace (which is not the + function of exclude). + +Tue Jun 14 07:15:09 2005 Chad Elliott <elliott_c@ociweb.com> + + * config/global.mpb: + + Set libpaths to '.' since libout is set to '.' as well. + + * modules/Creator.pm: + * modules/WorkspaceCreator.pm: + + Corrected support for scoping and exclusion from within an + aggregated workspace. + +Fri Jun 10 06:36:02 2005 Chad Elliott <elliott_c@ociweb.com> + + * USAGE: + * modules/OutputMessage.pm: + * modules/Parser.pm: + + Added a 'details' logging message and switched the "Skipping" + message to it. + + * modules/ProjectCreator.pm: + + Fixed a bug with the '<<' and '>>' operators and Windows based + projects that have custom input files within subdirectories. + Also, fixed a bug where exe's and lib's that have spaces in the + names were not escaped even if a project type implemented the + escape_spaces() method. + + * templates/make.mpd: + + Fixed support for spaces in file names. + + * templates/makedll.mpt: + + Changed the ln setting for mingw32 to 'move /y' instead of 'mv'. + +Tue May 31 15:45:44 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/TemplateParser.pm: + + Support using flag_overrides() within the context of a foreach. + + * templates/em3vcp.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + * templates/vc8.mpd: + + Interpret flag_overrides of the custom_types->dependent setting + as an array instead of a string. This makes things consistent + with non-overridden values of dependent. + +Tue May 31 09:46:49 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/vc7.mpd: + * templates/vc8.mpd: + + Exclude all documentation files from the build. Certain + extensions are automatically excluded, but that isn't good enough + to cover all possible documentation extensions. + +Fri May 27 10:24:25 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/em3vcp.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + * templates/vc8.mpd: + + Interpret custom_types->dependent as an array instead of a string. + This is completely backward compatible since a string is just a + one element array in the template language. + +Fri May 27 07:56:11 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug where explicitly specified output files would get + mixed with implicit output files if an input file were shared by + two different custom types. + + * modules/TemplateParser.pm: + + Fixed a bug where flag_overrides() functions that were parameters + to functions within an if would not be processed correctly. + + * templates/em3vcp.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + * templates/vc8.mpd: + + When setting up additional dependencies through the dependent + setting of custom types, don't append .exe if the command is a + perl script. This is not a generic solution, but most of the time + commands are either an exe or a perl script. + +Tue May 24 13:57:42 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeProjectCreator.pm: + + Removed unnecessary sort method. It implemented the default. + + * modules/GHSProjectCreator.pm: + + Call escape_regex_special() before using the starting directory as + a regular expression. + + * templates/bmake.mpd: + * templates/bmakedll.mpt: + * templates/bmakedllexe.mpt: + * templates/bmakelibexe.mpt: + + Support Unicode builds by checking the UNICODE make/environment + variable. + +Tue May 17 13:54:12 2005 Justin Michel <michel_j@ociweb.com> + + * templates/vc7.mpd: + + Default to enabling wchar_t as a native type. This should now work + correctly given my recent changes to ACE. + + * templates/vc8.mpd: + + Remove an extra "/>" that was inadvertently left in the template. + Strangely this did not cause an error when opening the solution in + the IDE, but only showed up in the nightly builds. + +Tue May 17 12:40:35 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/WinProjectBase.pm: + + Check for paths with drive letters during dirname validation. + + * templates/em3vcp.mpd: + * templates/vc6dsp.mpd: + + Brought over the duplicate_index changes from vc7.mpd. + +Tue May 17 11:47:45 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + + Fixed a bug where a template variable default would not be used if + the user set the template variable to empty. + +Tue May 17 08:46:33 2005 Chad Elliott <elliott_c@ociweb.com> + + * clone_build_tree.pl: + + Avoid linking patch reject files. + + * templates/vc8.mpd: + + 1) Added vcprojecttype default similar to vc7.mpd. + 2) Changed all occurrances of Optimization to optimize. + 3) Added the 'dependencies' settings as was done for vc7.mpd. + + * templates/vc8dll.mpt: + + Changed all occurrances of Optimization to optimize. + +Tue May 17 06:48:59 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/VC7ProjectCreator.pm: + * templates/vc7.mpd: + + After suggesting a simplification to Johnny for the previous + change, I relized that it could be simplified even more by setting + the default in the mpd and not modifying any code. + + * templates/make.mpd: + + Added support for source files with spaces in the name. + + * templates/nmake.mpd: + + Added support for 'install' settings with spaces in the name. + +Mon May 16 18:47:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc7.mpd: + * modules/VC7ProjectCreator.pm: + For Visual C++ the project type is Visual C++, but the Intel compiler + can also be integrated into Visual Studio and then uses the same + template but just a different project type. Made it possible to + generate a different project type with an Intel C++ geneator we + are working on. + +Mon May 16 11:36:29 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/Driver.pm: + + Modified the time printout to just print the amount of time taken + at the end of each file or project type and then the total time at + the end. + + * modules/ProjectCreator.pm: + + Do not attempt to use the language setting if it hasn't been set. + This only happens when the -recurse option is used with mpc.pl. + + * modules/TemplateParser.pm: + * modules/VC71WorkspaceCreator.pm: + * modules/VC7ProjectCreator.pm: + * modules/VC7WorkspaceCreator.pm: + * modules/VC8ProjectCreator.pm: + * modules/VC8WorkspaceCreator.pm: + * templates/vc7.mpd: + * templates/vc8.mpd: + * templates/vc8dll.mpt: + * templates/vc8exe.mpt: + * templates/vc8lib.mpt: + * templates/vc8libexe.mpt: + + Committing Justin Michel's <michel_j@ociweb.com> changes for + better support for Visual Studio 8 and streamlining changes for + the Visual Studio 7 project files. + +Mon May 16 06:47:57 2005 Chad Elliott <elliott_c@ociweb.com> + + * USAGE: + * modules/Parser.pm: + + Removed the MPC_INFORMATION environment variable and added + MPC_LOGGING which can be used to control all aspects of logging + (informational, warning and diagnostic). + + * README: + * modules/ProjectCreator.pm: + * templates/automake.mpd: + * templates/bmake.mpd: + * templates/em3vcp.mpd: + * templates/ghs.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + + Added a new operator, '<<', to allow user to specify additional + dependencies for only custom input files. See the README for more + details. + +Tue Apr 26 11:29:57 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug where when excluded files were listed in Source_Files + those that didn't match were no longer being added. + +Mon Apr 25 10:31:48 2005 Chad Elliott <elliott_c@ociweb.com> + + * config/xerces.mpb: + + Set Debug::xerceslib in addition to xerceslib to ensure that the + debug version of xerces is linked into Debug configurations for + Visual C++. Linking the optimized version into debug applications + has been reported to cause run-time issues. + + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + + Fixed a bug where the scope name of a template variable being + expanded from $(...) was not taken into account. + +Mon Apr 18 13:16:52 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/em3vcp.mpd: + + Fixed a bug in the implib location. It should have contained the + <%machine%> setting in the path. + +Mon Apr 18 06:56:20 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/nmake.mpd: + + Updated to work with multiple resource files. + +Mon Apr 18 10:19:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/bmakecommon.mpt: + Removed -D_MT, it is ACE specific and not needed anymore in ACE + +Thu Apr 14 09:07:41 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Changed the option evaluation code to match the option exactly + instead of a portion of it. + +Thu Apr 14 07:27:11 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeProjectCreator.pm: + + Changed the default back to using relative definitions. You must + now use -noreldefs if you do not want automatic relative + definitions. + + * modules/ProjectCreator.pm: + + Support && and || within the 'optional' clause of a Define_Custom. + + * modules/Creator.pm: + * modules/TemplateParser.pm: + + Support scoped variables which will allow users to modify project + and template variables based on foreach values. For example, if + you wanted to set 'lit_libs' for only Debug builds with vc6 you + could do this: + + project { + specific(vc6) { + Debug::lit_libs += foolib + } + } + + * templates/nmake.mpd: + + Use forward slashes in the DEPGEN setting to work with both Active + State Perl and Cygwin Perl. + +Wed Apr 13 07:18:59 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/TemplateParser.pm: + + Rewrote the tp_dirname() method to use the builtin rindex function + instead of character iteration. + + * templates/nmake.mpd: + + Simplified this template to use dirname() instead of multiple + contains(). + +Mon Apr 11 08:46:56 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/nmake.mpd: + + Corrected a bug dealing with source files containing ..\ where the + explicit rules did not have the correct path. + +Fri Apr 8 12:14:02 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/WinProjectBase.pm: + + Since a directory with ..\ in it will cause the object files + to be created outside of the intermediate directory, + no Windows based project can have ..\ in the intermediate + directory name. + + * templates/automake.mpd: + * templates/automakedll.mpt: + + Added support for the 'postbuild' setting. + +Wed Apr 6 06:43:51 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/TemplateParser.pm: + + Added new template functions, 'ends_with' and 'contains', which + work similarly to 'starts_with'. The function names are self + explanatory. + +Mon Apr 4 13:02:59 2005 Chad Elliott <elliott_c@ociweb.com> + + * config/xerces.mpb: + + Change libs to lit_libs to ensure that there are no library + decorator issues (especially with static builds). + +Mon Apr 4 12:27:14 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/TemplateParser.pm: + + Added a new template function, 'starts_with', that takes two + parameters. The first parameter is a template variable and the + second is a literal string. If the value of the template variable + starts with the literal string, then starts_with evaluates to + true. + +Fri Apr 1 12:39:12 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/em3vcp.mpd: + * templates/vc6dsp.mpd: + + Specify the /implib option to be consistent with the nmake and vc7 + templates. This allows the user to control where it goes with the + 'libout;' setting. + +Fri Apr 1 07:30:50 2005 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + + For some project keywords, the project value will be appended to + the template input variable of the same name (if there is one). + See the "Project Variable and Template Input Variable Interaction" + section of the README for more details. + + * templates/vc7.mpd: + + Only use 'link_options' if it's set. + +Thu Mar 31 10:23:39 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + If -global is used and the file does not contain a path, we will + search the include path for it. + +Thu Mar 31 06:53:14 2005 Chad Elliott <elliott_c@ociweb.com> + + * combine_dsw.pl: + + Added a new script to combine multiple dsw's into one. + + * modules/CBXProjectCreator.pm: + + Inherit from WinProjectBase to pick up the validated_directory + method. + + * modules/VC6ProjectCreator.pm: + * modules/WinProjectBase.pm: + + Moved the validated_directory method out of VC6ProjectCreator and + into WinProjectBase. Since $(...) could contain a drive letter, + no Windows based project can have $(...) in the intermediate + directory name. + +Tue Mar 29 07:56:08 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + + Fixed a bug in the subtraction code that would remove a portion of + an entry if only part of the existing value matched the string + being subtracted. + + * README: + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + * templates/bmake.mpd: + * templates/em3vcp.mpd: + * templates/html.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + + Added support for the new postbuild keyword. + + * templates/cbxdll.mpt: + * templates/cbxexe.mpt: + * templates/em3vcpdll.mpt: + * templates/em3vcpdllexe.mpt: + * templates/em3vcplib.mpt: + * templates/em3vcplibexe.mpt: + * templates/ghs.mpd: + * templates/ghscommon.mpt: + * templates/ghsdll.mpt: + * templates/ghslib.mpt: + * templates/makedll.mpt: + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + * templates/sle.mpd: + * templates/sledll.mpt: + * templates/sleexe.mpt: + * templates/unixcommon.mpt: + * templates/vc6dspdll.mpt: + * templates/vc6dspdllexe.mpt: + * templates/vc6dsplib.mpt: + * templates/vc6dsplibexe.mpt: + * templates/vc7csharp.mpd: + * templates/vc7csharp.mpt: + * templates/vc7dll.mpt: + * templates/vc7exe.mpt: + * templates/vc7lib.mpt: + * templates/vc7libexe.mpt: + * templates/vc7vb.mpt: + * templates/windowscommon.mpt: + + Consistently use the template variables found in unixcommon.mpt + and windowscommon.mpt for library prefix and extensions and + executable extensions. + +Tue Mar 29 06:23:03 2005 Chad Elliott <elliott_c@ociweb.com> + + * config/xerces.mpb: + + Account for the many different names that the xerces library can + have by using a template variable that can be overridden by the + user if necessary. + +Fri Mar 25 18:37:52 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeWorkspaceCreator.pm: + + *_HEADERS processing was broken when I added regular expression + to match all automake primaries. + +Fri Mar 25 10:59:10 2005 Chad Elliott <elliott_c@ociweb.com> + + * config/xerces.mpb: + + Changed libs to lit_libs to avoid putting the library decorator on + the xerces-c library under windows. + +Thu Mar 24 08:38:59 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeProjectCreator.pm: + * modules/MakeProjectCreator.pm: + * modules/ProjectCreator.pm: + * modules/StringProcessor.pm: + * modules/TemplateParser.pm: + * templates/automake.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + + Added better support for building projects with files that have + spaces in the names. + +Thu Mar 17 08:03:31 2005 Chad Elliott <elliott_c@ociweb.com> + + * config/openssl.mpb: + + Added support for Shining Light Productions prepackaged OpenSSL. + + * modules/AutomakeProjectCreator.pm: + * modules/ProjectCreator.pm: + + Made it so the automake project type does not perform relative + replacement. So, -noreldefs is not necessary for that type + anymore. + + * modules/Creator.pm: + * modules/Parser.pm: + * modules/TemplateParser.pm: + + Speed improvements which improve generation times by ~15%. + Also, in the template parser, I fixed a bug that allowed an if + statement to have multiple else's and removed two deprecated + sections of code. + +Wed Mar 16 22:04:35 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Only emit empty primary definition if the first instance seen in + the project Makefile.am's is not unconditional. + +Wed Mar 16 14:44:51 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Fix stray assignment that was marking all primaries as + "seen". + +Wed Mar 16 13:59:13 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Only emit empty primary definition if it is found in more + than one conditional or if it is found in both conditional + and unconditional contexts. + + Fixes unexpected consequences of earlier change to use += + instead of = for _MANS, _SCRIPTS, and _HEADERS. + +Wed Mar 16 12:53:13 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Don't add libraries to _LIBADD for convenience libraries. + +Wed Mar 16 12:31:52 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Don't add -version-number to LDFLAGS for convenience libraries. + +Wed Mar 16 10:42:45 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Use += instead of = for _MANS, _SCRIPTS, and _HEADERS. + +Fri Mar 11 07:56:49 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/nmakeexe.mpt: + + Debug and Release xecutable were getting the 'staticflags' due to + a side effect of the way scoping works in the TemplateParser. The + solution is to set 'need_staticflags' to empty in the Release and + Debug sections. + +Fri Mar 11 07:03:04 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/nmake.mpd: + + Fixed a bug in the intermediate directory for the precompiled + header object file. Also, move some targets around such that + 'all' is the first target in the generated makefile. + +Thu Mar 10 21:08:24 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Emit the RCS/CVS Id in the boilerplate at the beginning of the + workspace Makefile.am in three separate substrings so that it's + not expanded each time this file is changed. + +Thu Mar 10 20:13:58 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Scan project Makefile.am's for pkgconfig_DATA, if it is present + emit "pkgconfigdir = @libdir@/pkgconfig" at the begining of the + workspace Makefile.am. This will help avoid typos like the ACE + pkgconfigdir definition in 5.4.4. + +Wed Mar 9 08:53:39 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Remove duplicate 'macros' when adding or subtracting. + + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + + Set the defaults for 'optimize_flags' and 'debug_flags' to + /O2 and /Ob0 respectively. They can be overridden with 'specific' + or the -value_template option. + +Tue Mar 8 12:57:52 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/em3vcp.mpd: + * templates/vc6dsp.mpd: + + Fixed a bug introduced Fri Mar 4 12:03:48 2005. A different /Fo + option is needed for each different configuration. + +Tue Mar 8 07:21:11 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + * modules/VC6ProjectCreator.pm: + + vc6 and em3 do not deal with $(...) correctly when compiling + source into an alternate intermediate directory (it doesn't expand + $(...) inside the /Fo option). + +Mon Mar 7 10:01:34 2005 Chad Elliott <elliott_c@ociweb.com> + + * README: + + Documented both changes below. + + * modules/ProjectCreator.pm: + + Added a new operator, '>>', to allow user to specify multiple + unrelated (file name wise) output files based on a custom input + file. + + * templates/em3vcp.mpd: + * templates/ghs.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + + If a custom defintion does not have an output extension specified, + you can list custom input files, but they will not be compiled + or processed. In the above graphical tools they will be + listed/displayed and excluded from the build. + +Fri Mar 4 12:03:48 2005 Chad Elliott <elliott_c@ociweb.com> + + * config/boost_regex.mpb: + + Turn off Windows automatic linking. + + * config/global.features: + * modules/FeatureParser.pm: + + Fixed the comment about the -features option. + + * modules/TemplateParser.pm: + + Added the ability to use 'dirname' in an if statement + and 'noextension' and 'normalize' in a foreach statement. + + * templates/bmake.mpd: + * templates/em3vcp.mpd: + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + + Added the ability to have multiple cpp files with the same name + (in different directories) in a project. Now, if an input source + file has a directory, the object file is placed in a similar + directory structure underneath the intermediate file directory. + + * templates/makedll.mpt: + + Changed the default for SunCC, aCC, xlC_r and SGICC to 64-bit. + Provided a 32-bit version of each of these. + +Thu Mar 3 12:14:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/bmake.mpd: + Only use mkdir to create a directory when it not exist yet. + +Fri Feb 25 08:13:09 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/bmake.mpd: + + Reworked the realclean target to avoid the long command lines and + situations where "del" was invoked with no file name arguments. + +Thu Feb 24 06:44:30 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/automakedll.mpt: + + Removed the setting of 'am_version' for two reasons. One, it's + not necessary to set the template variable in order to use it in + a template anymore. And two, it causes the 'version' conversion in + AutomakeProjectCreator.pm never to be used if a user sets + 'version' but does not set the 'am_version' template variable. + +Wed Feb 23 20:36:31 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Remove trailing whitespace after version number if no + linkflags were specified. + + Rename pkgconfigdata_DATA to pkgconfig_DATA. + +Wed Feb 23 20:34:58 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Remove trailing whitespace after project Makefile.am name. + +Wed Feb 23 19:43:10 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Emit extra crlf after null variable definitions. + +Wed Feb 23 14:05:23 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Revert last change. Multi-line output is more ugly than I + thought it would be. + +Wed Feb 23 13:56:42 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Rework linkflags handling so output is more like what a human + might write. + + * templates/automakedll.mpt: + + Added am_version definition. + +Wed Feb 23 15:34:12 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/bmake.mpd: + + Changed the realclean target to delete files with /q instead of + checking for generated files and then deleting them if they exist. + In situations where a large number of files are generated, it + could have failed because the command was too long. + + * modules/AutomakeWorkspaceCreator.pm: + + Generate a configure.ac if one doesn't already exist. + + * modules/WorkspaceCreator.pm: + + Remove whitespace only if the dependency is defined and not an + empty string. + + * modules/TemplateParser.pm: + * templates/automake.mpd: + * templates/bmakelib.mpt: + * templates/bmakelibexe.mpt: + * templates/cbxdll.mpt: + * templates/cbxexe.mpt: + * templates/em3vcpdll.mpt: + * templates/em3vcpdllexe.mpt: + * templates/em3vcplib.mpt: + * templates/em3vcplibexe.mpt: + * templates/ghs.mpd: + * templates/ghsdll.mpt: + * templates/ghslib.mpt: + * templates/ghslibexe.mpt: + * templates/make.mpd: + * templates/nmake.mpd: + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + * templates/sledll.mpt: + * templates/sleexe.mpt: + * templates/vc6dspdll.mpt: + * templates/vc6dspdllexe.mpt: + * templates/vc6dsplib.mpt: + * templates/vc6dsplibexe.mpt: + * templates/vc7dll.mpt: + * templates/vc7exe.mpt: + * templates/vc7lib.mpt: + * templates/vc7libexe.mpt: + + Standardized the type_is_static, type_is_dynamic, type_is_binary + and need_staticflags template variables and set them from within + the TemplateParser so that each mpt does not have to set them. + +Fri Feb 18 09:43:08 2005 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/ProjectCreator.pm: + + Added pseudo variables: mkdir, input_basename and output_basename. + +Thu Feb 17 11:36:22 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/TemplateInputReader.pm: + * modules/TemplateParser.pm: + + In order to avoid conflicts between template hash names and + template variable values, template hash names now need to match + case-sensitively. Thanks to Thomas Rothfuss for reporting this. + +Thu Feb 17 10:09:21 2005 Chad Elliott <elliott_c@ociweb.com> + + * LICENSE: + + Corrected a spelling error. + + * templates/automake.mpd: + * templates/make.mpd: + * templates/makedll.mpt: + * templates/sle.mpd: + + Added the 'compile_flags' template variable. This variable + already exists in other templates. + +Tue Feb 15 08:29:47 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/bmake.mpd: + * templates/bmakedll.mpt: + * templates/bmakedllexe.mpt: + * templates/bmakelib.mpt: + * templates/bmakelibexe.mpt: + * templates/em3vcp.mpd: + * templates/em3vcpdll.mpt: + * templates/em3vcpdllexe.mpt: + * templates/em3vcplib.mpt: + * templates/em3vcplibexe.mpt: + * templates/nmake.mpd: + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + * templates/sle.mpd: + * templates/sledll.mpt: + * templates/sleexe.mpt: + * templates/vc6dsp.mpd: + * templates/vc6dspdll.mpt: + * templates/vc6dspdllexe.mpt: + * templates/vc6dsplib.mpt: + * templates/vc6dsplibexe.mpt: + * templates/vc7.mpd: + * templates/vc7dll.mpt: + * templates/vc7exe.mpt: + * templates/vc7lib.mpt: + * templates/vc7libexe.mpt: + + Renamed the 'use_modifier' template variable to 'use_exe_modifier' + which determines if the 'lib_modifier' is added to the end of the + executable name. + + Added the 'use_lib_modifier' template variable which determines is + the 'lib_modifier' is added to the end of the library output name. + Note that 'lib_modifier' is always added to the input libraries + specified in the MPC project keyword 'libs'. + +Mon Feb 14 16:10:32 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeProjectCreator.pm: + + Removed the implementation of + expand_variables_from_template_values to get the default + implementation which returns 1. + + * templates/em3vcp.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + + Support spaces in custom input files. Not all project types can + support spaces in file names, so use them at your own risk. + +Sat Feb 12 10:48:29 2005 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/ProjectCreator.pm: + + Changed attributes of 'dependent' to allow users to use <%...%> + pseudo variables. Also fixed a bug where 'gendir' would not be + recognized when $(...) variables were converted into windows style + paths. + +Fri Feb 11 13:25:02 2005 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/ProjectCreator.pm: + * modules/VC7ProjectCreator.pm: + + Added a new pseudo variable, 'quote', that will provide a + project specific representation of a double quote character. + RT #5125 + + * clone_build_tree.pl: + + Aesthetic change to print only Updating if updating a build and + Creating if creating a build. + +Fri Feb 11 06:58:04 2005 Chad Elliott <elliott_c@ociweb.com> + + * config/mfc.mpb: + * templates/em3vcp.mpd: + * templates/em3vcpdll.mpt: + * templates/em3vcpdllexe.mpt: + * templates/em3vcplib.mpt: + * templates/em3vcplibexe.mpt: + * templates/nmake.mpd: + * templates/nmakeexe.mpt: + * templates/vc6dsp.mpd: + * templates/vc6dspdllexe.mpt: + * templates/vc6dsplibexe.mpt: + * templates/vc7.mpd: + * templates/vc7exe.mpt: + * templates/vc7libexe.mpt: + + Provided a new template variable, unicode, which when set will + change the entry point for any MFC related executable to + wWinMainCRTStartup and set the UNICODE and _UNICODE preprocessor + macros. RT #5106 + +Mon Feb 7 09:51:10 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/em3vcp.mpd: + * templates/vc6dsp.mpd: + + If pdbl is not set, then specify /pdb:none. This option is no + longer supported in later versions of MS LINK, so it is not used + in then nmake or vc7 templates. + +Thu Feb 3 12:53:37 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/em3vcp.mpd: + * templates/em3vcpdll.mpt: + * templates/em3vcpdllexe.mpt: + * templates/em3vcplib.mpt: + * templates/em3vcplibexe.mpt: + * templates/nmake.mpd: + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + * templates/vc6dsp.mpd: + * templates/vc6dspdll.mpt: + * templates/vc6dspdllexe.mpt: + * templates/vc6dsplib.mpt: + * templates/vc6dsplibexe.mpt: + * templates/vc7.mpd: + * templates/vc7dll.mpt: + * templates/vc7exe.mpt: + * templates/vc7lib.mpt: + * templates/vc7libexe.mpt: + + Make the use of pdb related options consistent across all vc + related project types. Thanks to Thomas Rothfuss for suggesting + this. + +Tue Feb 1 10:31:00 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed the following bugs: + + 1) Not supplying a location to verbatim would not result in an + error. + 2) Adding non-grouped files after adding grouped files would + result in an error. + 3) Characters trailing closing curly braces would not be + recognized as an error. + 4) Some generated files could be added more than once depending on + the similarity of other generated files. For example, + Source.idl and SourceControl.idl would cause SourceControlC.cpp + to be added more than once. + + Thanks to Thomas Rothfuss for reporting #4. + + * modules/TemplateInputReader.pm: + + Simplified an if/else clause. + + * modules/TemplateParser.pm: + + Fixed a bug where mixed (HASH and SCALAR) foreach SCALAR values + would not be removed. It was originally dependent upon the order. + + Again, thanks to Thomas Rothfuss for reporting this. + + * modules/WorkspaceCreator.pm: + + Fixed a bug where characters trailing closing curly braces would + not be recognized as an error. + + * templates/em3vcp.mpd: + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + + Do not default the version value. Only provide version + information if the user specifically provided it. + +Thu Jan 27 12:40:12 2005 Chad Elliott <elliott_c@ociweb.com> + + * config/boost_base.mpb: + * config/global.features: + + Added requires += boost to the boost_base project and defaulted + boost to zero in the global features file. + + * modules/MakeWorkspaceCreator.pm: + + Fixed a bug where a project that was dependent upon a project that + had a translated name, would have the untranslated name as the + dependency. + + * templates/make.mpd: + + Removed an unnecessary foreach loop under the clean target. + +Wed Jan 26 13:52:36 2005 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/WorkspaceCreator.pm: + + Allow the user to negate project types in 'exclude' clauses + within mwc files. + + * templates/make.mpd: + * templates/makedll.mpt: + + Provide precompiled header support for gcc. + +Tue Jan 25 12:38:57 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/em3vcpdll.mpt: + * templates/em3vcpdllexe.mpt: + * templates/em3vcplib.mpt: + * templates/em3vcplibexe.mpt: + + Replaced some compiler options that had been removed ~2 years ago + (including /GR to enable RTTI). + +Tue Jan 25 10:44:07 2005 Chad Elliott <elliott_c@ociweb.com> + + * clone_build_tree.pl: + + Added .cvsignore to the list of files to exclude. + + * templates/em3vcpdll.mpt: + * templates/vc6dspdll.mpt: + + Explicitly set the type_description and type_code instead of + getting a default in the template file. + + * templates/nmake.mpd: + + Don't run the $(DEPGEN) command if there are no source files. + + * README: + * modules/ProjectCreator.pm: + * templates/bmake.mpd: + * templates/em3vcp.mpd: + * templates/make.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + * templates/vc7csharp.mpd: + * templates/vc7vb.mpd: + + Added support for a new keyword called 'custom_only'. If it is + set in an mpc file, the generated project will only contain custom + generation targets. It will not contain source files, header + files, etc. + +Mon Jan 24 16:45:31 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Fixed pkgconfigdata definition: config.status is found in + ${top_builddir}, not ${top_srcdir}. Also fixed a tab that had + been converted to spaces by mistake. + +Sun Jan 23 00:15:31 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Restore CLEANFILES and EXTRA_DIST to conditionals since these + two macros don't match the general form of automake primaries. + +Sat Jan 22 23:59:00 2005 Marek Brudka <mbrudka@aster.pl> + + * config/qt_uic.mpb (Module): + * config/qt_moc.mpb (Module): + * config/qt.mpb (Module): + * config/global.features: + + Merged REACTOR_SEPARATION branch with the main trunk. Below is + the list of more detailed changes. + + Thu Dec 9 20:00:39 2004 Marek Brudka <mbrudka@aster.pl> + + * config/qt_uic.mpb (Module): + * config/qt_moc.mpb (Module): + These files are empty now. + + * config/qt.mpb (Module): + Qt became project which provides MOC and UIC rules. + + Sat Dec 4 14:29:51 2004 Marek Brudka <mbrudka@aster.pl> + + * config/global.features: + Added comment about -features option. + + Fri Dec 3 23:56:20 2004 Marek Brudka <mbrudka@aster.pl> + + * config/qt.mpb (Module): + qt based projects requires now qt features to be set. + +Sat Jan 22 23:20:57 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Use new "sort" feature to sort list of header, inline, + template, etc. files for _HEADERS primary. + +Sat Jan 22 23:12:53 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Changed to touch "stamp" file only if custom file type + generates multiple files. + +Fri Jan 21 17:16:04 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Changed conditionals which matched a set of specific automake + primaries to use a single regular expression that matches the + general form of all automake primaries. We shouldn't have to + change this any more when adding support for additional auto- + make features. + +Fri Jan 21 11:07:56 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/BMakeWorkspaceCreator.pm: + + Cosmetic changes. + + * modules/TemplateParser.pm: + + Provide new functionality for modifying lists within the context + of 'foreach' and 'if' statments. Four functions are provided: + 'multiple', 'reverse', 'sort', 'uniq'. + + 'multiple' returns true if the parameter give has more than one + element when evaluated in a list context. + + 'reverse' returns the list in reverse order. + + 'sort' returns the list in sorted order. + + 'uniq' return the list in sorted order with duplicates removed. + + * modules/AutomakeProjectCreator.pm: + + Removed 'rev_requires' and 'rev_avoids' and used the new 'reverse' + modifier. + + * templates/automake.mpd: + + Use the new modifiers provide by the TemplateParser. + +Thu Jan 20 07:13:43 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Changed to append <%pkgconfig_files%> to EXTRA_FILES. + Changed to append to pkgconfigdata_DATA. + +Wed Jan 19 11:20:42 2005 Chad Elliott <elliott_c@ociweb.com> + + * USAGE: + * modules/Creator.pm: + * modules/Driver.pm: + * modules/Options.pm: + * modules/ProjectCreator.pm: + * modules/WorkspaceCreator.pm: + + Split the functionality of -expand_env into two options, -use_env + and -expand_vars. + + If the -use_env option is supplied to mwc.pl or mpc.pl, then MPC + will use environment variable to replace $() instances instead of + the values provided by -relative. + + If the -expand_vars option is used, then MPC will expand $() + variables to the exact value as found in the environment or the + -relative settings (depending on the use of the -use_env option). + + Also, the -relative option can now accept relative paths. + +Tue Jan 18 09:29:09 2005 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/ProjectCreator.pm: + * templates/automake.mpd: + * templates/bmake.mpd: + * templates/em3vcp.mpd: + * templates/ghs.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + * templates/vc7csharp.mpd: + * templates/vc7vb.mpd: + + Added the ability to modify 'command' and 'dependent' within the + scope of a custom section (such as IDL_Files, RPC_Files, etc.) + +Tue Jan 18 07:34:32 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + * modules/ProjectCreator.pm: + * modules/WorkspaceCreator.pm: + + Factored code common to the Project and Workspace creator dealing + with the -into option into a method on the Creator for use in other + modules. + + * modules/AutomakeWorkspaceCreator.pm: + * modules/GHSWorkspaceCreator.pm: + * modules/VC7WorkspaceCreator.pm: + + Honor the -into option by prefixing each open and unlink with the + correct output directory determined by the new method on the + Creator. + +Mon Jan 17 07:54:36 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/Options.pm: + * modules/ProjectCreator.pm: + + Allow multiple modifications of the same template variable. Also, + fixed a bug where not having an inputext would cause generated + files not to be added. + + * modules/TemplateInputReader.pm: + + Allow redefintion of template input variables. + + * templates/automakedll.mpt: + * templates/automakeexe.mpt: + * templates/bmakedll.mpt: + * templates/bmakedllexe.mpt: + * templates/bmakelib.mpt: + * templates/bmakelibexe.mpt: + * templates/cbxdll.mpt: + * templates/cbxexe.mpt: + * templates/em3vcpdll.mpt: + * templates/em3vcpdllexe.mpt: + * templates/em3vcplib.mpt: + * templates/em3vcplibexe.mpt: + * templates/ghsdll.mpt: + * templates/ghsdllexe.mpt: + * templates/ghslib.mpt: + * templates/ghslibexe.mpt: + * templates/makedll.mpt: + * templates/makeexe.mpt: + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + * templates/sledll.mpt: + * templates/sleexe.mpt: + * templates/vc6dspdll.mpt: + * templates/vc6dspdllexe.mpt: + * templates/vc6dsplib.mpt: + * templates/vc6dsplibexe.mpt: + * templates/vc7csharp.mpt: + * templates/vc7dll.mpt: + * templates/vc7exe.mpt: + * templates/vc7lib.mpt: + * templates/vc7libexe.mpt: + * templates/vc7vb.mpt: + + Added a conditional include to each mpt file in of the following + form: + + conditional_include "user_XXXXXX" + + where XXXXXX is the name of the current mpt file (without the + extension). This will allow a user to place custom configurations + in an mpt file that will automatically be included during project + generation, assuming that the file is located through the -include + specification. + +Mon Jan 10 13:58:37 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + If 'inputext' is not used in a Define_Custom, still create the + custom type but provide no extensions. This will not cause a + warning when used when "automatic = 1", but nothing will be + automatically added since no input extension was provide. + + Also, fixed a bug where if gendir is set for a particular file + type in one scope, it would be applied to all files even in + different scopes. + + * templates/make.mpd: + + Fixed a bug where the template repository directory wouldn't get + created when necessary. + +Mon Jan 10 10:55:51 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Added support for pkgconfig_files. + + * modules/AutomakeWorkspaceCreator.pm: + + Added pkgconfigdata_DATA to list of automake primaries we detect + for converting = to +=. + +Mon Jan 10 06:27:33 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Before using the project name as a regular expression, we must + escape all of the regular expression specific characters. + +Fri Jan 7 13:59:31 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + * modules/StringProcessor.pm: + + Moved the crlf and windows_crlf method into StringProcessor and + finally fixed the problem with cygwin. Now cygwin perl can be + used with MPC. + + * modules/ProjectCreator.pm: + + Cache the contents of the template input files to avoid reading + them multiple times. Also, search for resource files that differ + only in case from the project name. + + * modules/FeatureParser.pm: + + Cache the contents of the feature file to avoid reading it + multiple times. + + * modules/Parser.pm: + * modules/TemplateParser.pm: + + Took the file caching code out of TemplateParser and moved it into + Parser so that more classes can use cached file reads than just + the TemplateParser. + + +Wed Jan 5 11:24:36 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/nmake.mpd: + + Fixed precompiled header problems where the pch source isn't in + the current directory. Also, changed the location of the + intermediate files to use the project name instead of the project + file without the extension. + +Wed Jan 5 07:08:57 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeProjectCreator.pm: + * modules/BMakeProjectCreator.pm: + * modules/CBXProjectCreator.pm: + * modules/EM3ProjectCreator.pm: + * modules/GHSProjectCreator.pm: + * modules/HTMLProjectCreator.pm: + * modules/MakeProjectBase.pm: + * modules/MakeProjectCreator.pm: + * modules/NMakeProjectCreator.pm: + * modules/ProjectCreator.pm: + * modules/SLEProjectCreator.pm: + * modules/TemplateParser.pm: + * modules/VC6ProjectCreator.pm: + * modules/VC7ProjectCreator.pm: + * modules/VCProjectBase.pm: + * modules/WinProjectBase.pm: + * templates/em3vcp.mpd: + * templates/vc6dsp.mpd: + + Refactored much repeated code into 3 distinct base modules. There + is now a MakeProjectBase, WinProjectBase and VCProjectBase. Each + contain methods that are common to Make base projects, Windows + based projects and Visual C++ project types, respectively. + + Also, the 'win_version' template variable was factored out of the + ProjectCreator subclasses and into the TemplateParser. + + * templates/automake.mpd: + + Only emit the library or exe setting if source files are provided. + Thanks to Stephen Torri <storri@cse.wustl.edu> for suggesting + this. + +Tue Jan 4 09:52:13 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/WinVersionTranslator.pm: + + Truncate minor version numbers to 65535 or under as Visual C++ 6.0 + can't handle anything larger. + +Tue Jan 4 07:48:20 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Added code to support the use of nobase_include_HEADERS and + nobase_pkginclude_HEADERS in the case where 'includedir' isn't + set. + +Mon Jan 3 13:12:23 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeWorkspaceCreator.pm: + * templates/automake.mpd: + * templates/automakedll.mpt: + + Added support for an 'includedir' template variable that can be + used to override the default includedir setting determined by + AutomakeWorkspaceCreator. In order for header files for a + particular project to be "installed", the 'install_headers' + template variable needs to be set to 1. Thanks to Stephen Torri + <storri@cse.wustl.edu> for providing this functionality. + +Mon Jan 3 11:11:35 2005 Chad Elliott <elliott_c@ociweb.com> + + * USAGE: + * modules/MPC.pm: + * modules/MWC.pm: + + Removed support for Visual Age 4. It was incomplete, out-of-date + and most likely didn't work at all. + + * modules/VA4ProjectCreator.pm: + * modules/VA4WorkspaceCreator.pm: + * templates/va4icc.mpd: + * templates/va4iccdll.mpt: + * templates/va4iccdllexe.mpt: + * templates/va4icclib.mpt: + * templates/va4icclibexe.mpt: + + Removed these files. + +Mon Jan 3 09:18:13 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + * templates/em3vcp.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + * templates/vc6dsp.mpd: + * templates/vc7.mpd: + + Added the ability to generate projects that only contain resource + files. + +Wed Dec 22 12:47:02 2004 Chad Elliott <elliott_c@ociweb.com> + + * MPC version 3.2.0 released. + +Local Variables: +add-log-time-format: current-time-string +End: diff --git a/ACE/MPC/history/ChangeLog-3_3 b/ACE/MPC/history/ChangeLog-3_3 new file mode 100644 index 00000000000..604c8172b6f --- /dev/null +++ b/ACE/MPC/history/ChangeLog-3_3 @@ -0,0 +1,1985 @@ +Thu Jul 20 14:49:21 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Fixed a bug where an invalid project name would be used during the + generation of implicit project dependencies. + +Tue Jul 18 19:07:02 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + + Do not perform slash conversion on the 'prebuild' and 'postbuild' + settings. + + * templates/vc8csharp.mpd: + + Keep the 'prebuild' and 'postbuild' settings on the same line as + vc8 does. + +Tue Jul 18 14:38:01 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Modified the library location code to accept libraries that + happen to be built in the very top-most directory. + +Tue Jul 18 13:49:01 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Corrected a logic error in the processing of the 'optional' + section. The '||' was not being handled properly. + +Fri Jul 14 17:25:16 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + When expanding variables, through the 'expand' mechanism, escape + back slashes when generating a project for a project type that + requires slash conversion. + +Fri Jul 14 01:10:35 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * config/qt.mpb: + + Split the UIC into UIC and UIC_Impl. The header is generated by + the UIC custom definition and the source file generated by the + UIC_Impl custom definition. + + * config/qt4_core.mpb: + * config/qt4_designer.mpb: + * config/qt4_designercomponents.mpb: + * config/qt4_gui.mpb: + * config/qt4_network.mpb: + * config/qt4_opengl.mpb: + * config/qt4_sql.mpb: + * config/qt4_svg.mpb: + * config/qt4_test.mpb: + * config/qt4_xml.mpb: + + Added support for Qt4. + + * config/qt_moc.mpb: + * config/qt_uic.mpb: + + Removed these files. They have been deprecated long enough. + +Thu Jul 13 16:29:33 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * templates/bmake.mpd: + * templates/bmakedllexe.mpt: + * templates/bmakelibexe.mpt: + * templates/em3.mpd: + * templates/em3vcpdllexe.mpt: + * templates/nmake.mpd: + * templates/nmakeexe.mpt: + * templates/vc6.mpd: + * templates/vc6dspdllexe.mpt: + * templates/vc7.mpd: + * templates/vc7csharp.mpd: + * templates/vc7exe.mpt: + * templates/vc7vb.mpd: + * templates/vc8.mpd: + * templates/vc8csharp.mpd: + * templates/vc8exe.mpt: + + Added a template variable named 'windows_style' that controls the + location of Debug executables and all installed executables. If + 'windows_style' not set, which is the default, a Debug executable + is placed in the same directory as the project (default setting + for 'output_dir'). If it is set, the Debug executable is placed + in the Debug directory. + + Similarly, if 'windows_style' is not set, installed executables + are placed in the directory determined by the 'install' project + variable. If it is set, it is placed in the directory determined + by the 'install' project variable plus the 'output_dir' template + variable. + + This only applies to the following project types: bmake, em3, vc6, + vc7, vc71 and vc8. + +Tue Jul 11 14:23:41 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * USAGE: + * modules/VC8ProjectCreator.pm: + + It has been determined that when building static projects with + vc8, the inter-project dependencies between static libraries are + handled correctly. The dependee is not included in the dependent + as is done in em3, vc6, vc7 and vc71. + +Tue Jul 11 11:42:25 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * USAGE: + * config/.cvsignore: + * modules/ConfigParser.pm: + * modules/Creator.pm: + * modules/Driver.pm: + * modules/OutputMessage.pm: + * modules/Parser.pm: + * modules/WorkspaceCreator.pm: + + Added the ability for MPC to be configured via two configuration + files. The first configuration file, codebase.cfg, controls where + MPC looks for the second configuration file, MPC.cfg. By default + it will look in $MPC_ROOT/config/MPC.cfg. This configuration file + will replace all (but one) environment variables and allow for more + things to be controlled. + + Use of the deprecated environment variables will result in + messages be printed to that effect. + + * modules/AutomakeWorkspaceCreator.pm: + * templates/automake.mpd: + + Added the 'libpaths' setting to the automake template. This also + required a code change due to the strictness of automake. If the + libpath does not exist, the make will fail so I added the libpaths + as dependencies and we attempt to make the directories if they + don't exist. + + * modules/TemplateParser.pm: + * templates/em3.mpd: + * templates/ghs.mpd: + * templates/vc6.mpd: + * templates/vc7.mpd: + * templates/vc8.mpd: + + Fixed additional dependencies specified by the custom definition + 'dependent' setting. Previously, if a dependent did not end in + .pl or .pm a .exe was appended. Now, if the dependent does not + have an extension a .exe is appended. + + Also, for vc*.mpd, if multiple commands make up a custom command + (through postcommand or pch_postrule) they are chained together + with && to ensure that all commands are run. + + * templates/vc7csharp.mpd: + * templates/vc7vb.mpd: + * templates/vc8csharp.mpd: + + Added or modified the custom section such that custom defintions + without commands are still added to the project. + +Tue Jul 11 00:48:01 UTC 2006 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc7.mpd: + Added support for ModuleDefinitionFile + +Thu Jul 6 14:54:01 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + A problem could arise when generating the default component lists. + It all depended upon the order of a 'keys' call for the valid + component types. I first noticed this in 2004, but with Perl 5.8, + the keys always came out such that everything just worked. + However, with Perl 5.6.1 the keys do not come out as required. + This requirement is that user defined component types must be + processed before built-in types, most importantly Source_Files. I + now sort the keys such that the user defined component types are + processed before built-in types. + +Wed Jul 5 17:11:28 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + There was a difference in the way that MPC dealt with a defaulted + Source_Files section and a Source_Files section that was just a + list of directories. Generated files were treated differently in + the defaulted case. This change corrects that problem. + + Additionally, files listed with >> and << did not receive slash + conversion when being output to a generated project when the + project type required it. This has also been corrected. + +Fri Jun 30 15:32:12 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug re-introduced by my change from Tue Jun 27 17:33:59 + UTC 2006. If gendir = . is used in a custom build rule, the + generated files would not have the needed ./ prepended to the file + name. + + * modules/VC8WebWorkspaceCreator.pm: + + Removed invalid configurations for the web workspace. + +Thu Jun 29 16:33:13 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/ProjectCreator.pm: + * modules/XMLProjectBase.pm: + + Fixed a bug where a backslash was added to the front of a double + quote when the <%quote%> pseudo variable is used. If an escaped + double quote is required, use <%equote%> (as described in the + README). + +Tue Jun 27 17:33:59 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * PROBLEM-REPORT-FORM: + + Added a spot for the operating system and shell. + + * modules/ProjectCreator.pm: + + When creating the list of generated files, retain the original + file extension. If the original input file extension does not + match the first extension listed in the custom definition inputext + setting, the extension will be lost and file specific settings + will not be applied correctly. + + * modules/WorkspaceCreator.pm: + + When adding implicit project dependencies, for the gnuace project + type only, keep track of the indirect dependencies that have been + followed to avoid infinite recursion. + +Thu Jun 22 12:24:51 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/VC7WorkspaceCreator.pm: + + Modified the mixed language output so that VC8 does not want to + save after the first load of the generated solution. + +Wed Jun 21 14:16:22 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/VC7WorkspaceCreator.pm: + + Yet another bug fix for mixed language workspaces. When a C++ + project is dependent upon another C++ project and a C# project, + the dependee C++ project would be skipped. Now, non-C++ projects + will be built when the platform is changed to anything other than + 'Any CPU' or .NET. + +Tue Jun 20 13:53:05 2006 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Tweak "code" that emits -stamp dependency to work with stamp + files in subdirectories. + +Tue Jun 20 18:31:35 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * templates/vc8csharp.mpd: + + Added the ability to set the RegisterForComInterop setting as a + template variable. + +Tue Jun 20 17:06:50 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + + Fixed a bug where mixing C++ and C# projects in a single workspace + would result in invalid projects due to the fact that a project + creator would have only one TemplateInputReader which would read + the template input file for the first projects language and all + other projects would receive the same template input. + + Additionally, the configuration/platform combination would only be + updated if the platform is a non-empty string. + + And finally, the ability to nest template functions (like reverse, + sort, etc.) not in the context of a foreach has been added to the + template parser. + +Tue Jun 20 12:45:30 UTC 2006 James H. Hill <hillj@isis.vanderbilt.edu> + + * modules/VC8WebWorkspaceCreator.pm: + + Changed the location of the web project from the cwd to + '.'. + +Tue Jun 20 12:41:49 UTC 2006 James H. Hill <hillj@isis.vanderbilt.edu> + + * templates/vc8csharp.mpd: + + Removed the aspx_files variable since web projects assume all + files located in the directory of the solution is part of the + project. + +Fri Jun 16 00:37:06 UTC 2006 James H. Hill <hillj@isis.vanderbilt.edu> + + * modules/VC7WorkspaceCreator.pm: + + Added the web project guid to the rest of the GUIDs. This + allows use to resue the the default VC workspace generator + to generate web projects. + + * modules/MPC.pm: + * modules/MWC.pm: + * modules/VC8WebProjectCreator.pm: + * modules/VC8WebWorkspaceCreator.pm: + + Created a new module for generating web projects for VC8. + In VC8, web projects are based on the directory that contains. + the solutions. This means a web project does not have a "project" + file like C++, C# and VB projects. Therefore, a new module + was needed to automatically create a web project in a solution + since we can't specify this using a MWC file. + + To create a web project, just run MWC as follows: + + mwc.pl -type vc8web + + The following are the language -> scripting mappings: + cpluplus -> C# + csharp -> C# + java -> J# + vb -> Visual Basic + +Fri Jun 09 14:49:25 2006 Steve Huston <shuston@riverace.com> + + * modules/AutomakeProjectCreator.pm (fill_value): Reverted: + Tue May 23 16:49:22 2006 Steve Huston <shuston@riverace.com> + since it's not always correct to prefix to $srcdir. Sometimes + it needs to be relative to the build directory. This restores the + behavior put in place by: + Thu Dec 22 13:56:14 2005 J.T. Conklin <jtc@acorntoolworks.com> + Thanks to J.T. for pointing this out. + +Fri Jun 9 07:00:13 2006 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Tweak so that _LDFLAGS isn't defined if am_version is defined, + but library is not intended to be installed. + +Wed Jun 7 12:56:17 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * templates/vc8.mpd: + + Modified this template to use 'libout' again such that .lib files + do not go into the location specified by 'dllout' (if it was + specified). Thanks to Kitty B. for recognizing this situation and + bringing it to my attention. + +Tue May 30 12:21:54 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/Driver.pm: + + Removed the run-time check for the minimum perl version. + + * mpc.pl: + * mwc.pl: + + Added a load-time check for the minimum perl version (5.6). + +Tue May 23 16:49:22 2006 Steve Huston <shuston@riverace.com> + + * modules/AutomakeProjectCreator.pm (fill_value): If an include + path begins with ".." (a relative path), prefix it with $(srcdir) + to make it work properly when the build dir is not the same as the + source dir. + +Thu May 11 11:46:45 2006 Steve Huston <shuston@riverace.com> + + * templates/automake.mpd: Allow an am_release variable to set + a installable library's -release option. This allows users to + choose whether to use libtool's -version-info option (with the + am_version variable) or the -release option (with am_release). + +Fri May 5 12:00:12 UTC 2006 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/BDSWorkspaceCreator.pm: + Generate missing </BorlandProject> + +Wed May 3 01:43:46 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * USAGE: + + Documented the -gendot option which generates input files for + Graphvis. + + * modules/BMakeProjectCreator.pm: + * modules/Creator.pm: + * modules/DirectoryManager.pm: + * modules/Driver.pm: + * modules/FeatureParser.pm: + * modules/GUID.pm: + * modules/Options.pm: + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + * modules/VC7ProjectCreator.pm: + * modules/WorkspaceCreator.pm: + + Adding various performance improvements. + + * templates/makedll.mpt: + + Changing the order of the rt and pthread libraries to avoid + possible linking problems when statically linking. + +Tue Apr 25 13:18:06 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * clone_build_tree.pl: + + Print error messages in the event that an error actually occurs. + + * prj_install.pl: + + Added a missing option from the usage. + + * templates/nmake.mpd: + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + + By default, pass the /Zc:wchar_t option to the compiler. If you + plan on using nmake with Visual C++ 6.0, you must unset the + 'TreatWChar_tAsBuiltInType' template variable to avoid compiler + warnings about unknown options. + + * templates/vc7.mpd: + + Allow the user to modify the inline expansion through the + 'InlineFunctionExpansion' template variable. + + * templates/vc7csharp.mpd: + * templates/vc8csharp.mpd: + + Support the 'prebuild' setting. + +Thu Apr 20 13:29:13 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * templates/em3.mpd: + * templates/em3vcpdll.mpt: + * templates/em3vcpdllexe.mpt: + * templates/em3vcplib.mpt: + * templates/em3vcplibexe.mpt: + + Fixed a bug where /debug was being added to the link flags even + though it was a Release configuration. Thanks to Wallace Zhang + <zhangw@ociweb.com> for finding this. + +Fri Mar 31 13:25:32 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Fixed a bug in the group dependency sorter. The circular + dependencies are checked but as a group moves in order, it was + assumed that the dependencies were already checked for the group + when in reality it hadn't. This could cause an infinite loop. + + Also, $() type variables can be used in workspaces. + +Mon Mar 27 17:00:31 UTC 2006 James H. Hill <hillj@isis.vanderbilt.edu> + + * modules/ProjectCreator.pm: + + Added support of ASP.NET project files (.aspx files) to both + Visual Basic and C# project. + + * templates/vc7vb.mpd: + + - Changed default extension for resx files from .cs to .vb + - Added template code to correctly handle .aspx files + + * templates/vc7csharp.mpd: + * templates/vc8csharp.mpd: + + - Added template code to correctly handle .aspx files + +Thu Mar 23 14:56:12 UTC 2006 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/bds.mpd: + If linkflags contains -aa then generate option.aa.enabled as 1. + +Thu Mar 23 14:51:12 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * templates/vc7.mpd: + * templates/vc8.mpd: + + Added the missing UNICODE and _UNICODE macros to the resource file + compile line if the 'unicode' template variable is set. + +Thu Mar 23 14:30:00 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/Driver.pm: + + Convert all back slashes to slashes before calling mpc_basename(). + + * templates/makedll.mpt: + + Added -ldl to the vxworks_rtp platform section. + + * templates/vc7.mpd: + + Moved the ProgramDataBaseFileName down after the precompiled + header section to more closely match the way visual studio + produces project files. + +Thu Mar 23 12:11:12 UTC 2006 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/bmake.mpd: + If linkflags are available, generate them into the project + file + +Thu Mar 16 17:58:37 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/VC8ProjectCreator.pm: + + Fixed a bug where the SUPER version of the translate_value() + wasn't called at the end of the local translate_value() method. + This was causing problems when the -name_modifier and + -apply_project options were used together. + + * templates/makedll.mpt: + + Fixed support for VxWorks. + +Wed Mar 15 18:44:03 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * generate_export_header.pl: + + Print an error if the script is unable to write to the output + file. + + * modules/MakeProjectCreator.pm: + * templates/makedll.mpt: + + Moved the default 'compilers' setting from the mpt to the perl + module to allow the default compiler to change based on the + language setting. Currently, the default is 'java' if the + language is set to java otherwise it is set to 'gcc' as it was + previously. + + * README: + * modules/AutomakeWorkspaceCreator.pm: + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + * templates/automake.mpd: + * templates/bmake.mpd: + * templates/em3.mpd: + * templates/ghs.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + * templates/vc6.mpd: + * templates/vc7.mpd: + * templates/vc8.mpd: + + Implemented a new project keyword that can only be used within the + scope of Source_Files. The 'buildflags' setting can be used to + specify additional build flags as source files are being compiled. + This can be used to build a particular subset of source files with + different compiler options. + +Tue Mar 14 14:19:03 2006 Steve Huston <shuston@riverace.com> + + * templates/vc8platforms.mpt: For WinCE 4-based platforms, add + EnableFunctionLevelLinking="true". This works around a link-time + warning LNK1166 for ARM processors. This prevented ACEd.dll (and + some other examples/test programs) from creating the resultant + binary dll/exe file. + +Mon Mar 13 17:53:45 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/Driver.pm: + + If global.features, default.features, global.mpb or default.rel + are not found in the path relative to the location of mwc.pl (or + mpc.pl), look for them in the config directory found underneath + MPC. This only matters when working in conjunction with ACE. + +Fri Mar 10 18:59:34 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/BMakeWorkspaceCreator.pm: + * modules/Creator.pm: + * modules/DirectoryManager.pm: + * modules/Driver.pm: + * modules/FeatureParser.pm: + * modules/HTMLProjectCreator.pm: + * modules/MakeWorkspaceCreator.pm: + * modules/NMakeWorkspaceCreator.pm: + * modules/WorkspaceCreator.pm: + + Implemented a new function, mpc_basename, that is more efficient + than the one provided by File::Basename. + + * modules/ProjectCreator.pm: + + Moved code outside of add_corresponding_component_files that was + executed twice. The result could not possibly change, so it is + executed once and the result is passed into + add_corresponding_component_files. + + * modules/TemplateParser.pm: + + Optimized code to avoid using substr() in parse_line(). + +Thu Mar 9 16:20:24 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/CBXProjectCreator.pm: + * modules/CBXWorkspaceCreator.pm: + * templates/cbx.mpd: + * templates/cbxdll.mpt: + * templates/cbxexe.mpt: + + Removed these files. + + * USAGE: + * config/boost_date_time.mpb: + * config/boost_filesystem.mpb: + * config/boost_iostreams.mpb: + * config/boost_prg_exec_monitor.mpb: + * config/boost_program_options.mpb: + * config/boost_regex.mpb: + * config/boost_serialization.mpb: + * config/boost_signals.mpb: + * config/boost_test_exec_monitor.mpb: + * config/boost_thread.mpb: + * config/boost_wave.mpb: + * config/xerces.mpb: + * modules/MPC.pm: + * modules/MWC.pm: + + Removed the cbx project type. The format is dead and has been + replaced by the bds format. + + * README: + * templates/bmake.mpd: + * templates/html.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + * templates/vc7.mpd: + * templates/vc8.mpd: + * modules/ProjectCreator.pm: + + Added partial support for prebuild. Some project types can't or + can't easily support this concept. + + * modules/DirectoryManager.pm: + * modules/WinProjectBase.pm: + + Moved a portion of the code to remove the current working + directory from WinProjectBase's version of translate_directory() + into DirectoryManager's version. + +Mon Mar 6 18:09:36 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * config/qt.mpb: + + The qt library can have a variety of suffixes (depending on + platform and version). This base project was changed such that + there is no 'specific' section for for the qt library name. It is + added to 'lit_libs' as qt-mt$(QT_VERSION). + + * generate_export_header.pl: + + This is a new script that will generate an export header file that + can be used (not in conjunction with ACE) to support symbol + visibility using a variety of compilers. + + * modules/BMakeProjectCreator.pm: + * modules/BMakeWorkspaceCreator.pm: + * modules/Creator.pm: + * modules/DirectoryManager.pm: + * modules/Driver.pm: + * modules/HTMLProjectCreator.pm: + * modules/NMakeWorkspaceCreator.pm: + * modules/Options.pm: + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + * modules/VC7WorkspaceCreator.pm: + * modules/WinProjectBase.pm: + * modules/WorkspaceCreator.pm: + + The majority of the changes to these files are performance + related. However, two bug fixes are included (one pertaining to + file grouping and the other pertaining to directory translation of + a directory only containing ".."). + + * templates/make.mpd: + + Three modifications: + + 1) Only set PICFLAGS if the dll_ext template variable is defined. + 2) Allow the user to override the 'chmod' template variable. + 3) Removed the .<%slash%> in front of the call to "specialscript" + + * templates/makedll.mpt: + + Added -mthreads -mminimal-toc compiler flags for LynxOS. + + * templates/vc7.mpd: + * templates/vc8.mpd: + + Fixed whitespace for default grouped files. + +Mon Feb 27 17:35:55 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * config/zlib.mpb: + + Changed the Windows section of the zlib library to use libs + instead of lit_libs. It is necessary to match up debug to + debug and release to release when linking an application with this + library. + +Fri Feb 24 00:23:57 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Removed calls to escape_regex_special() before calling + generated_filenames(). This was breaking when files with regular + expression special characters (like .) were listed. + +Thu Feb 23 10:33:25 2006 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Added "compile_flags" to conditional which caused a needed + backslash not to be emitted in somewhat rare circumstances. + +Thu Feb 23 14:10:30 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * README: + + Added a paragraph explaining that MPC expects *all* file names + that contain a directory portion to use forward slashes regardless + of what the platform natively uses. + + * modules/ProjectCreator.pm: + + Corrected two bugs pertaining to automatic file addition. The + first happens when two different custom file sections have the + same group name; the second group would overwrite the first. The + second bug would only happen on Windows based project types if the + 'gendir' setting contained a slash, MPC wouldn't be able to match + up the generated files (this was introduced with my change from + Mon Feb 13 11:15:04 2006). + +Wed Feb 22 23:58:03 2006 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Fix typo which caused compile_flags to be emitted for each + individual compile_flag. + +Wed Feb 22 20:06:00 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * combine_dsw.pl: + + Support combining .vcw files too. They are almost identical to + .dsw files. + + * modules/ProjectCreator.pm: + + Removed the $rmesc parameter from the generated_filenames() and + generated_filename_arrys() methods. We will always remove the + escape sequences from the generated file names. In the one place + where the escapes are needed, we use escape_regex_special() to + ensure that the whole file name (including the path) is escaped. + + * modules/VC6WorkspaceCreator.pm: + + Sort the projects so that the generated workspace will be + deterministic. + + * modules/WinProjectBase.pm: + + Modified translate_directory() to remove the current working + directory from the directory passed in and then limit the length + of that to avoid issues with maximum directory/file length on + NTFS. + + * templates/bmake.mpd: + * templates/bmakecommon.mpt: + * templates/bmakedll.mpt: + * templates/bmakedllexe.mpt: + * templates/bmakelibexe.mpt: + + Support building with VCL. Also, add the custom_type libpath + setting to the PATH variable. + + * templates/make.mpd: + * templates/makedll.mpt: + + Added support for visibility attributes. They are off by default, + so set the 'visibility' template variable to 1 to then them on. + Also, when generating the clean target, clean the extra + directories relative to the output location of the makefile + target. + +Tue Feb 21 18:14:21 2006 Steve Huston <shuston@riverace.com> + + * templates/vc8.mpd: Put .lib files with .dll files in $(OutDir). + When emitting AdditionalLibraryDirectories and there is a specified + output_subdir, append output_subdir to each libpath, then the + plain libpath. This picks up output_subdir specs and hopefully + won't hurt anything for libpaths that don't have the subdirs. + +Thu Feb 16 21:36:37 UTC 2006 Wallace Zhang <zhangw@ociweb.com> + + * highlight_template.pl: + + Added a newline at the end of the file which is required + by fuzz.pl. + +Thu Feb 16 19:53:13 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * highlight_template.pl: + + Added a tool which can be helpful in debugging MPC template code. + This utility will color highlight an MPC template and output html. + + * modules/Driver.pm: + + Perl 5.8.8 has a "feature" where basename('') returns './' instead + of '' as all other versions do. In the case where we may call + basename() with an empty string, avoid calling basename() and just + use '' instead. Thanks to Johnny Willemsen for helping me debug + this one. + + * modules/HTMLWorkspaceCreator.pm: + + Output the projects in build order instead of alphabetical order. + + * templates/make.mpd: + + Greatly simplified this template by removing many little foreach's + and enclose most of the template in two big foreach's. + +Wed Feb 15 19:41:59 2006 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Process header_files, inline_files, template_files, idl_files, + and pidl_files even if we're not building a executable or lib. + This ensures the files will be listed in the Makefile.am (for + "make distcheck" and/or for "make install"). + +Wed Feb 15 17:56:02 2006 Steve Huston <shuston@riverace.com> + + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: Changed WinX86_64 platform name to x64 to be + consistent with vc8platforms.mpt. Also set _M_AMD64 in cpu_defines, + not _M_AXP64 to be consistent with what Microsoft headers are + expecting; also added _AMD64_ to ensure it gets set - windows.h + sets it, but if including winnt.h first, it doesn't get set. + Thanks to Johnny Willemsen for motivating this change. + +Wed Feb 15 18:42:30 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/ProjectCreator.pm: + + Added two new pseudo variables 'cmp' for a platform non-specific + way to compare files and 'os' which provides the type of operating + system the project is suited for (win32 or unix). + + * registry.pl: + + Register .mpb files just as .mpc files are registered. + +Wed Feb 15 16:03:06 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * config/boost_base.mpb: + + Added an include path for $(BOOST_ROOT). + + * config/bzip2.mpb: + * config/global.features: + + Added a bzip2 feature project and set the bzip2 feature to zero by + default. + + * config/zlib.mpb: + + Switch from libs to lit_libs so that no decorator is added to the + library name. + + * modules/ProjectCreator.pm: + + Accept .ipp as inline files. + + * templates/make.mpd: + * templates/makedll.mpt: + + Provide library versioning on platforms that support it. Added + initial support for the intel compiler on Linux. + + * templates/vc7.mpd: + + Allow switching off exception handling. + +Tue Feb 14 17:06:40 2006 Steve Huston <shuston@riverace.com> + + * templates/vc8platforms.mpt: Changed the WinX86_64 platform to be + x64 to match what VC8 generates itself and expects. Also added + x64 to the platforms generated by default. + +Mon Feb 13 11:15:04 2006 Chad Elliott <elliott_c@ociweb.com> + + * config/global.features: + + Set the swig_perl, swig_java and python features to zero. + + * config/python.mpb: + + Added a base project for building against the python library. + + * config/swig_java.mpb: + + Added a requires += swig_java. + + * config/swig_perl.mpb: + + Added a requires += swig_perl. + + * modules/ProjectCreator.pm: + + Fixed a problem where if a file is automatically generated and + gendir is set to '.', the file name may be added twice to a + project. + + When automatically adding files specified by >>, take into account + the gendir setting. + + Added a post project creation hook so that sub-classes of + ProjectCreator can perform an action after a project file is + created. + + * modules/TemplateParser.pm: + + Renamed the basename() function to tp_basename(). + + * modules/VC8ProjectCreator.pm: + + Use the post file creation hook to remove the .user files created + by VC8. The .user file will only be removed if the project file + is different than what was created by prior runs of MPC. + + * README: + * modules/WorkspaceCreator.pm: + + Allow the user of -genins within a workspace. + + * templates/bmake.mpd: + + Put double quotes around gendir related files just in case gendir + has a directory with spaces in the name. Also, prefix all del and + rmdir commands with - to continue on if there is an error. + + * templates/make.mpd: + * templates/makedll.mpt: + + Changed the way that the 'configurations' template variable is used. + The existing use has been renamed to 'compilers' and the + 'configurations' template variable is now used as it is in many of + the other project types, as Debug or Release. + +Fri Feb 10 06:36:59 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/Options.pm: + + Fixed a bug where a -exclude argument with a comma in it would not + be split. + + * modules/ProjectCreator.pm: + + Reverted a change that affected the way files were listed in + templates when gendir = . was used. + + * templates/ghs.mpd: + * templates/ghscommon.mpt: + + Changed libdecorator to lib_modifier to be consistent with all of + the other templates. + +Fri Feb 10 11:26:12 UTC 2006 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc8platforms.mpt: + For x86_64 specify an explicit link option + + * templates/nmake.mpd: + Added platform_defines to the list of defines being generated, + this is as with the normal vc templates + + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + Added platform_defines and updated cpu_define to the same + value used as with the normal vc templates for WinX86_64 + +Thu Feb 9 12:50:52 2006 Chad Elliott <elliott_c@ociweb.com> + + * config/boost_iostreams.mpb: + * config/boost_program_options.mpb: + * config/boost_python.mpb: + * config/boost_serialization.mpb: + * config/boost_wave.mpb: + + Added support for other boost libraries. + + * modules/DirectoryManager.pm: + * modules/Options.pm: + + Added support for wildcards when using the -exclude option. + + * modules/ProjectCreator.pm: + + When the Define_Custom has the automatic flag set to 1, + automatically add the files generated that are specified by the >> + operator. + + Fixed a bug where <% %> variables used within a 'specific' section + were not translated. + + * modules/TemplateParser.pm: + + Fixed a bug where errors within a <%foreach%> would be silently + ignored. + + * modules/WorkspaceCreator.pm: + + Added support for wildcards. + + * templates/bmake.mpd: + * templates/bmakedll.mpt: + * templates/bmakedllexe.mpt: + * templates/bmakelib.mpt: + * templates/bmakelibexe.mpt: + + Fixed a bug where debug_flags was being placed in all + configurations, not just debug. And modified these, so that debug + flags are only emitted in a debug configuration (when optimze is + overriden to be zero). + + * templates/em3.mpd: + * templates/em3vcpdll.mpt: + * templates/em3vcpdllexe.mpt: + * templates/em3vcplibexe.mpt: + + EVC 4.0 doesn't support "utility" projects, so when custom_only is + set to 1, just create a DLL project that has no target. Also, + fixed link issues for the emulator and x86 targets. And, sort the + grouped files so that a project can be reproduced consistently. + + * templates/vc6.mpd: + * templates/vc7.mpd: + * templates/vc8.mpd: + + Sort the grouped files so that a project can be reproduced + consistently. + +Thu Feb 2 07:02:19 2006 Chad Elliott <elliott_c@ociweb.com> + + * clone_build_tree.pl: + + Do not clone the .svn directory. It's administrative just like + the CVS directory. + + * modules/ProjectCreator.pm: + + There was a bug where file with a path specified using the '>>' + operator would not be processed correctly on Windows based project + types. Thanks to Thomas Rothfuss for reporting this. + +Mon Jan 30 12:07:35 2006 Chad Elliott <elliott_c@ociweb.com> + + * PROBLEM-REPORT-FORM: + + Added a section to provide the Perl version. + + * README: + + Updated the valid command line options for workspaces with the + -language option. + + * USAGE: + + Documented the -value_template option and provided an example + where spaces needed to be retained. + + * modules/XMLProjectBase.pm: + * modules/BDSProjectCreator.pm: + * modules/CBXProjectCreator.pm: + * modules/HTMLProjectCreator.pm: + * modules/SLEProjectCreator.pm: + * modules/VC7ProjectCreator.pm: + + Created a new project base for XML based project creators. The + trend in projects seem to be going toward XML so we can minimize + the amount of repeated code by using the XMLProjectBase. + + * modules/BDSWorkspaceCreator.pm: + * modules/CBXWorkspaceCreator.pm: + * modules/GHSWorkspaceCreator.pm: + * modules/SLEWorkspaceCreator.pm: + + Tell the sort_dependencies() method that we do not want sorting + by directory groups. + + * modules/BMakeProjectCreator.pm: + + Removed an unnecessary check of convert_slashes(). + + * modules/ProjectCreator.pm: + + Provided support for use of <% %> variables within all of MPC + project keywords. The list of valid variables only includes the + pseudo variables listed under 'postbuild' in the README. + + * templates/bmake.mpd: + + Utilize the 'transdir' template function to fully support files + with .. in the path name. + + * templates/vc7.mpd: + * templates/vc7dll.mpt: + * templates/vc7exe.mpt: + * templates/vc7lib.mpt: + * templates/vc7libexe.mpt: + * templates/vc8.mpd: + * templates/vc8dll.mpt: + * templates/vc8exe.mpt: + * templates/vc8lib.mpt: + * templates/vc8libexe.mpt: + + Added two new configurations (not generated by default) called + 'Memcheck Debug' and 'Memcheck Release'. These configurations + provide settings that are amenable to external memory checking + tools. + +Wed Jan 25 11:40:37 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Return an array reference from the get_validated_ordering() method + instead of a string. In every place get_validated_ordering() was + called, the return value was immediately converted to an array. + + * modules/VC6WorkspaceCreator.pm: + * modules/VC71WorkspaceCreator.pm: + * modules/VC7WorkspaceCreator.pm: + + Use the returned array instead of converting the string into an + array. + +Wed Jan 25 09:02:34 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/DirectoryManager.pm: + * modules/TemplateParser.pm: + * modules/WinProjectBase.pm: + + Added a new template function called transdir which will translate + a directory portion of a filename into a "usable" object file + directory. It entails changing .. into the word 'dotdot' and for + windows based projects it will also change drive letters and $() + variables. + + * templates/nmake.mpd: + + Use the new transdir function to deal with relative directories + and other problematic directory names. + +Mon Jan 23 13:05:12 2006 Chad Elliott <elliott_c@ociweb.com> + + * templates/nmake.mpd: + + Added a rule back in that was removed by my change on + Mon Jan 9 08:30:14 2006. + +Mon Jan 23 12:08:25 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/BMakeWorkspaceCreator.pm: + * modules/MakeWorkspaceCreator.pm: + * modules/NMakeWorkspaceCreator.pm: + + Tell the number_target_deps() method that we do not want sorting + by directory groups. + + * modules/VC6WorkspaceCreator.pm: + * modules/VC71WorkspaceCreator.pm: + * modules/VC7WorkspaceCreator.pm: + + No need to check for circular dependencies here, it is now done + when validating the dependencies. + + * modules/WorkspaceCreator.pm: + + Re-wrote the circular directory dependency detection code in order + to detect multi-directory (3 or more) dependencies. This slowed + things down a bit, so I had to find performance in other locations + throughout the workspace creator. + +Thu Jan 19 12:59:55 2006 Chad Elliott <elliott_c@ociweb.com> + + * USAGE: + * modules/Driver.pm: + * modules/Options.pm: + + Added a new option, -gfeature_file, to specify the global feature + file. + +Thu Jan 19 12:30:18 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/VC71ProjectCreator.pm: + * modules/VC7ProjectCreator.pm: + + Moved a static hash table out of a method and into the local + namespace (for performace reasons). + + * modules/VC7WorkspaceCreator.pm: + * templates/vc7csharp.mpd: + * templates/vc7vb.mpd: + + Removed the code that added references for csharp or vb. This was + not necessary and in fact broke the projects. + + * modules/VC8ProjectCreator.pm: + * templates/vc8csharp.mpd: + * templates/vc8csharp.mpt: + + Added support for the vc8 style projects for csharp. Previously, + the vc7 version for csharp was used and required conversion within + vc8. + +Wed Jan 18 15:12:40 2006 Chad Elliott <elliott_c@ociweb.com> + + * templates/nmake.mpd: + + Modified the clean rule to just use del /s/f/q instead of listing + out each object file. Thanks to Johnny Willemsen for debugging + this. + +Wed Jan 18 13:04:27 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/NMakeWorkspaceCreator.pm: + * modules/TemplateParser.pm: + * modules/VC7ProjectCreator.pm: + * modules/VC7WorkspaceCreator.pm: + + We need to keep track of the language for each project processed. + This allows the VC7, VC71 and VC8 WorkspaceCreator's to put the + right GUID in for the individual projects. + +Tue Jan 17 07:25:29 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/FeatureParser.pm: + + The previous change included a change to make features + case-insensitive. This change was not complete and has been + corrected. + +Mon Jan 16 11:17:45 2006 Chad Elliott <elliott_c@ociweb.com> + + * MPC.ico: + + Modified the MPC project icon to have the (P) on the left side + instead of the right so that it looks better with Tortoise. + + * modules/Creator.pm: + * modules/WorkspaceCreator.pm: + + Added support for using -language within a workspace. Previously, + this was disallowed but there was no real reason for that. + + * modules/FeatureParser.pm: + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + + Added support for accessing MPC features and their values. + + * templates/html.mpd: + + Added all of the MPC project keywords. + + * templates/nmake.mpd: + + Added the -i parameter to the depgen.pl script. + + * templates/vc6dspdll.mpt: + + Added the _WINDLL and _AFXDLL macros for the MFC configurations. + + * templates/vc7.mpd: + + Added the ability to set the GenerateMapFile setting. Thanks to + David Hauck for providing the modification. + + * templates/vc7csharp.mpd: + * templates/vc7vb.mpd: + + Added the ReferencePath setting so that libraries can be located + (if referenced) and ensured that the 'install' setting worked as + it does in all other templates. Thanks to Dan Troesser for + providing the ReferencePath setting and pointing out the 'install' + discrepancy. + +Tue Jan 10 16:30:32 2006 Ossama Othman <ossama@dre.vanderbilt.edu> + + From Russell Mora <russell_mora at symantec dot com> + * templates/nmake.mpd: + + Add to manifest files, if `.manifest' file exists. + +Mon Jan 9 08:30:14 2006 Chad Elliott <elliott_c@ociweb.com> + + * templates/nmake.mpd: + + Corrected a bug reported by Johnny Willemsen where object files + were not getting cleaned up if they contained a relative path with + ".." in the name. In the process, I cleaned up the template a bit + which should allow this type to be generated slightly faster. + +Thu Jan 5 09:45:54 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + * modules/DirectoryManager.pm: + * modules/ProjectCreator.pm: + + Made MPC more tolerant of file systems that are case insensitive. + This will help with the relative path replacement on Windows and + others that have this problematic type of file system. + +Wed Jan 4 08:09:20 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug where adding a grouped set of source files that are + generated using a wildcard would cause a duplicate of the default + group if files were added to a different after the generated + group. + +Tue Jan 3 08:26:34 2006 Chad Elliott <elliott_c@ociweb.com> + + * USAGE: + * modules/Options.pm: + + Added the possible language settings to the help message. + + * templates/make.mpd: + * templates/makedll.mpt: + + Allow control of the 'genflags' setting with the 'optimize' + template variable. This changes the default 'genflags' setting + from -g to -O. + + * templates/vc7.mpd: + * templates/vc7dll.mpt: + * templates/vc7exe.mpt: + * templates/vc7lib.mpt: + * templates/vc7libexe.mpt: + * templates/vc8.mpd: + * templates/vc8dll.mpt: + * templates/vc8exe.mpt: + * templates/vc8lib.mpt: + * templates/vc8libexe.mpt: + + Introduced a new template variable, 'debug_prj', which helps + control which run-time library is used during linking. + Previously, this was controled by the 'optimize' template + variable, but building a "Release" configuration with 'optimize' + turned off did not work where inline functions were used in other + libraries (being linked in) where 'optimize' was left on. + +Mon Dec 26 21:02:36 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/vc7.mpd: + * templates/vc8.mpd: + + Set the run-time library to a static version if either template + variables type_is_static or need_staticflags are set. + +Thu Dec 22 13:56:14 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeProjectCreator.pm: + + Disable code that prefixed include paths with "$(srcdir)/". In + some cases an include path should be relative to the source dir, + in others it should be relative to the build dir, and sometimes + it should be relative to both. Since it is impossible to guess + which is the correct choice, require the *.mpc file to specify + it correctly. + +Thu Dec 22 15:17:30 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/vc7csharp.mpd: + + Added a missing <%endif%>. + +Thu Dec 22 08:30:56 2005 Chad Elliott <elliott_c@ociweb.com> + + * USAGE: + + Update the usage to contain the 'bds' type. + + * modules/Creator.pm: + + Fixed a feature where $() variables were automatically expanded + during a subtraction. Now, we only expand the $() variable if we + could not find the subtraction value in the name value. + + * templates/bds.mpd: + + Modified the includes foreach to set the forcount base. + + * templates/bdsdll.mpt: + * templates/bdsexe.mpt: + + Include the user_bds* file instead of the user_cbx* file. + +Wed Dec 21 19:17:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc8platforms.mpt: + Set the TargetMachine when building for EM64T + +Wed Dec 21 18:55:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/bds.mpd: + * templates/bdsdll.mpt: + * templates/bdsexe.mpt: + * modules/BDSProjectCreator.pm: + * modules/BDSWorkspaceCreator.pm: + Initial version of Borland Developer Studio template. Work is + being done for the C++ personality. All files, compiler flags + and libs are generated but some more work has to be done to + use these for a full build. Now they are already useful for + debugging apps that are build from the command line. + + * modules/MPC.pm: + * modules/MWC.pm: + Added BDS files + +Wed Dec 21 06:28:04 2005 Chad Elliott <elliott_c@ociweb.com> + + * MPC.ico: + * registry.pl: + + Added the ability to register the .mpc and .mwc file types as well + as create context menus within the Windows explorer. + + * PROBLEM-REPORT-FORM: + + Fixed the URL for the MPC FAQ. + + * README: + * modules/TemplateParser.pm: + + Added the ability to set the base for the <%forcount%> variable. + See the README for details as to how to use this. Also, added + code to only check for mixed values (scalars and hash maps) if the + foreach value is not the name of an MPC project keyword. + + * config/swig_java.mpb: + + Added support for using SWIG with Java. + + * modules/AutomakeProjectCreator.pm: + * modules/Driver.pm: + * modules/GHSProjectCreator.pm: + * modules/HTMLProjectCreator.pm: + * modules/MakeProjectCreator.pm: + + Removed the convert_slashes() method. And use the default from + DirectoryManager.pm. + + * modules/Creator.pm: + + Use File::Spec to determine file system capabilities to give the + right warning message. Also added the ability to determine if any + files were excluded when generating the default file list. + + * modules/DirectoryManager.pm: + + Corrected problems with using Cwd::getcwd() on VMS as it always + leaves a trailing slash on the end which no other implementation + does. Also, switched the convert_slashes() method to return zero + as the default (which will require slightly less code overall in + MPC). + + * modules/HTMLWorkspaceCreator.pm: + * templates/html.mpd: + + Make the HTML acceptable by WC3 standards. + + * modules/MakeWorkspaceCreator.pm: + + Added a .PHONY: target for each named target. This will only work + with GNU Make and won't hurt with other versions of make. + + * modules/ProjectCreator.pm: + + 1) Check for case insensitivity (from a new method) when checking + whether we should use upper or lower case in the + expand_variables() method. + 2) Added an is_keyword() method to allow the TemplateParser to + determine if a variable is an MPC project keyword or not. + 3) When adding the built-in OS compatibility methods, check the + base class to see if it's a WinProjectBase to determine if the + project type will be used on Windows or not. + + * modules/WinProjectBase.pm: + + For Windows based project types, define the convert_slashes() and + case_insensitive() methods. + + * modules/WorkspaceCreator.pm: + + Fixed a bug where file exclusions given on the command line + wouldn't work because somewhere down the line MPC would change + directory and nothing would match up. Also, fixed a related bug + where if all of the .mpc files normally contained within a + workspace were excluded a default workspace would then be used + possibly adding unwanted .mpc files. + + * mpc.pl: + * mwc.pl: + + Finally corrected support for VMS. FindBin doesn't work on VMS if + you use a relative directory, so we just use rel2abs() on the + dirname of $0 in this situation. + + * templates/bmake.mpd: + * templates/bmakedll.mpt: + * templates/bmakedllexe.mpt: + * templates/bmakelibexe.mpt: + + Modified these to move the binary compile flags into the template + such that correct makefiles would be created if the user set the + staticname to a valid name and set sharedname to empty. + + * templates/ghs.mpd: + * templates/ghsdll.mpt: + * templates/ghsdllexe.mpt: + * templates/ghslib.mpt: + + Modified these to move the library extensions into the template + such that correct build files would be created if the user set the + staticname to a valid name and set sharedname to empty. + + * templates/make.mpd: + + Moved the output file to the last part of the link command line. + Made "all" the default target for libraries. Parameterized the + pch extension. Added better support for precompiled headers. + + * templates/makedll.mpt: + + Set the default pch extension to .gch. Renamed the cxx + configuration to cxx_tru64. Added precompiled header support for + SunCC (which was there as of SunCC 5.5). For SunCC 5.4 and below, + use -value_template pchsupport= to turn off precompiled header + support. + + * templates/vc7.mpd: + * templates/vc7dll.mpt: + * templates/vc7exe.mpt: + * templates/vc7lib.mpt: + * templates/vc7libexe.mpt: + * templates/vc8.mpd: + * templates/vc8dll.mpt: + * templates/vc8exe.mpt: + * templates/vc8lib.mpt: + * templates/vc8libexe.mpt: + + Modified the RuntimeLibrary setting to choose the right value for + static/dynamic configurations. + +Tue Dec 6 06:36:27 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Fixed a bug where MPC would go into an infinite loop (while + generating an intermediate workspace) if there were duplicate + project names within a single workspace. The sort_by_groups() + method is being called prior to the method that checks for + duplicate projects. + +Mon Dec 5 14:17:35 2005 William Otte <wotte@dre.vanderbilt.edu> + + * config/boost_unit_test_framework.mpb + + Automatic linking is not supported for the unit test + framework, see http://boost.org/more/getting_started.html#auto-link. + +Tue Nov 29 10:11:14 2005 William Otte <wotte@dre.vanderbilt.edu> + + * config/boost_date_time.mpb: + * config/boost_filesystem.mpb: + * config/boost_prg_exec_monitor.mpb: + * config/boost_regex.mpb: + * config/boost_signals.mpb: + * config/boost_test_exec_monitor.mpb: + * config/boost_thread.mpb: + * config/boost_unit_test_framework.mpb: + + Corrected a problem with my previous commit that broke boost + on platforms other than gnuace and windows. Thanks to Chad + Elliott and Kitty B. for pointing out the problem and suggesting + a fix. + +Mon Nov 21 15:23:40 2005 William Otte <wotte@dre.vanderbilt.edu> + + * config/boost_filesystem.mpb: + * config/boost_regex.mpb: + + Scoped the lit_libs directive inside of a gnuace specific + block to take advantage of automatic library resolution provided + by the Windows version of boost. + +Mon Nov 21 09:26:35 2005 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/Creator.pm: + * modules/ProjectCreator.pm: + + Added a new clause (expand) that can be used to set the expansion + values of a particular variable. This lets users define to what + $(VAR_NAME) gets expanded within an mpc file. See the README for + more information. + + * mpc.pl: + * mwc.pl: + * modules/DirectoryManager.pm: + * modules/WorkspaceCreator.pm: + * templates/make.mpd: + * templates/makedll.mpt: + + Added better support for OpenVMS. This mainly entailed dealing + with the .dir extension on directories and [] within wildcard + specifications (as the OpenVMS glob() function does not handle + these). + +Wed Nov 16 08:30:51 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + * modules/ProjectCreator.pm: + + Fixed a bug where adding or subtracting a value with spaces would + not work as expected. When adding, the value would be split at + each whitespace. When subtracting, the value would never be + removed. + + Setting a variable with spaces worked correctly. + +Mon Nov 14 12:06:15 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/nmake.mpd: + + Corrected a problem in the realclean target where .dll, .lib and + .exp files would not be deleted unless pdbc or pdbl template + variables were defined. + +Mon Nov 14 09:50:38 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Fixed a bug where a project name that conflicts with a directory + name would not get mapped in cases where the directory had + multiple levels. + +Mon Nov 14 07:40:19 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Fixed a bug where sorting the projects (with a circular + dependency) would run infinitely. This was identical to the + problem fixed on Thu Apr 15 13:16:03 2004 just in a different + scenario. + +Thu Nov 10 12:23:43 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/TemplateParser.pm: + + When checking for duplicate source files in duplicate_index(), + always use lowercase (since this is currently only used on + Windows). + +Thu Nov 10 09:01:25 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/automake.mpd: + * templates/bmake.mpd: + * templates/em3.mpd: + * templates/ghs.mpd: + * templates/html.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + * templates/sle.mpd: + * templates/vc6.mpd: + * templates/vc7.mpd: + * templates/vc7csharp.mpd: + * templates/vc7vb.mpd: + * templates/vc8.mpd: + + Added a template variable, libname_prefix, that can be set to + prefix all library names (sharedname, staticname and libs). Note + that lit_libs and pure_libs are not affected. + +Mon Nov 7 10:15:31 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug where a given custom input file does not match the + custom defined input extensions and no source files are + given, the generated source file name would still have the input + file extension in the name (with an escaped period). + +Mon Nov 7 13:59:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/boost_prg_exec_monitor.mpb: + * config/boost_test_exec_monitor.mpb: + * config/boost_unit_test_framework.mpb: + Added borland + +Fri Oct 28 14:58:59 2005 William Otte <wotte@dre.vanderbilt.edu> + + * config/global.features: + * config/xerces.mpb: + + Added a xerces feature to the xerces base project, similar to + boost/zlib/zzip to allow disabling xerces specific projects. + +Fri Oct 28 11:43:52 2005 Chad Elliott <elliott_c@ociweb.com> + + * config/swig_perl.mpb: + + Added $(PERL5_INCLUDE) to the 'libpaths' as well as the 'includes'. + + * templates/vc8.mpd: + + Corrected two instances of subdir_output which only show up if you + set the template variable 'pdbc'. + +Sun Oct 23 08:14:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/bmake.mpd: + Generate also includes for the resource compiler + +Wed Oct 19 10:06:50 2005 Chad Elliott <elliott_c@ociweb.com> + + * config/boost_date_time.mpb: + * config/boost_filesystem.mpb: + * config/boost_prg_exec_monitor.mpb: + * config/boost_regex.mpb: + * config/boost_signals.mpb: + * config/boost_test_exec_monitor.mpb: + * config/boost_thread.mpb: + * config/boost_unit_test_framework.mpb: + + Added a $(BOOST_STATIC_LIB_PREFIX) to the library name for all + boost libraries. For some reason, they insist on prepend 'lib' to + the name of all static libraries on Windows. For + unit_test_framework, prg_exec_monitor and test_exec_monitor, 'lib' + is always prepended on Windows since these are currently always + static. Thanks to Kevin Heifner for pointing this out. + +Thu Oct 13 17:24:21 2005 Steve Huston <shuston@riverace.com> + + * modules/VC8WorkspaceCreator.pm: Add the 3 magic bytes to the start + of the .sln file that allow double-clicking on the .sln file's icon + to auto-start Visual Studio. + +Mon Oct 10 07:02:30 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/TemplateParser.pm: + + Fixed a bug where mixed case template variables within a foreach + context were not being evaluated case insensitively. This made it + appear that these variables were not being set. + + * templates/vc8.mpd: + + Moved an endif to the correct location pertaining to precompiled + headers. Too much was being included within an if which depended + upon the pch_header setting. + + Thanks to Thomas Rothfuss for reporting both of these bugs. + +Fri Oct 7 13:50:49 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Change the way RCS/CVS Id is emitted so it's the same as how it + is expanded in souces checked out with -kk option. This allows + us to regenerate ACE and TAO's Makefile.am files and only see + the "real" differences. + +Fri Oct 7 09:33:41 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Add support for custom file dependents. + +Thu Oct 6 17:52:41 2005 Steve Huston <shuston@riverace.com> + + * templates/vc8.mpd: + * templates/vc8dll.mpt: + * templates/vc8exe.mpt: + * templates/vc8lib.mpt: + * templates/vc8libexe.mpt: + * templates/vc8platforms.mpt (new file): + Added support for building Windows CE/Mobile from Visual Studio 2005. + By default, only the regular desktop Win32 configurations will be + generated, as before. The CE/mobile platform names can be specified + using -value_templates platforms="....". The possible platform + names are listed in vc8platforms.mpt. + + To avoid overwriting outputs when building multiple platforms in + the same ACE_wrappers directory, a platform can supply an + output_subdir setting (see vc8platforms.mpt). If specified, vc8.mpd + will use this in the Intermediate/OutputDirectory entries. + +Tue Oct 4 06:35:13 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/vc7.mpd: + * templates/vc8.mpd: + + Improved MIDL support by adding generated files to the generated + project to ensure that these generated files get cleaned up. + +Fri Sep 30 07:46:54 2005 Chad Elliott <elliott_c@ociweb.com> + + * modules/BMakeWorkspaceCreator.pm: + * modules/NMakeWorkspaceCreator.pm: + + Corrected the directory changing code to take 2 or more deep + relative paths into account. Thanks to Johnny Willemsen + <jwillemsen@remedy.nl> for reporting this. + + * templates/automake.mpd: + + Optimized this template with respect to checking a variable before + using foreach. The foreach already does this, so checking the + variable before hand is a waste of time. + +Mon Sep 26 07:10:17 2005 Chad Elliott <elliott_c@ociweb.com> + + * README: + * modules/ProjectCreator.pm: + + Added generic_pre_extension and generic_pre_filename custom build + settings. + + * templates/vc7.mpd: + * templates/vc8.mpd: + + Added support for the builtin Visual Studio MIDL. + + * templates/vccommon.mpt: + + Added a comment that this file is not common to Visual C++, just + vc6. + +Thu Sep 22 12:43:43 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Changed to output libs, lit_libs, and pure_libs on separate + lines. + +Tue Sep 20 08:47:21 2005 Chad Elliott <elliott_c@ociweb.com> + + * config/swig_perl.mpb: + + Added an include for $(PERL5_INCLUDE). + + * modules/TemplateInputReader.pm: + + Allow "()." in scope names within .mpt files. + + * modules/WorkspaceCreator.pm: + + Provide the user with more information as to why workspace + creation failed. + + * templates/makedll.mpt: + + Shared libraries are created on Solaris using the -G option (not + -shared). + +Mon Sep 12 10:47:28 2005 Justin Michel <michel_j@ociweb.com> + + * clone_build_tree.pl: + + Prevent cloning of .pch files, which are precompiled headers when + using VC++. + +Thu Sep 8 08:06:18 2005 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Changed to output compile_flags on separate lines. + + Changed to sort lists of source, header, and inline files + to make output more deterministic. + +Tue Sep 6 10:34:24 2005 Chad Elliott <elliott_c@ociweb.com> + + * config/swig_perl.mpb: + + Added a base project for using SWIG with perl. + + * templates/automake.mpd: + * templates/bmake.mpd: + * templates/em3.mpd: + * templates/ghs.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + * templates/vc6.mpd: + * templates/vc7.mpd: + * templates/vc7csharp.mpd: + * templates/vc7vb.mpd: + * templates/vc8.mpd: + + Change the position of the use of custom 'output_option' setting. + Ensure that the input file is the last thing on the command line. + +Mon Aug 29 08:52:15 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/vc7.mpd: + + Enabled incremental linking as the default. + + * templates/vc7dll.mpt: + * templates/vc7exe.mpt: + + Disable incremental linking in release mode as was done in + Justin's change on Fri Aug 26 13:46:47 2005. + +Mon Aug 29 12:41:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + Added WinX86_64 as platform. This is Windows 64bit on EMT64. + +Mon Aug 29 11:48:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/nmake.mpd: + Made it possible to overrule cc, link and rc when generating the + nmake project files + +Fri Aug 26 14:32:48 2005 Justin Michel <michel_j@ociweb.com> + + * clone_build_tree.pl: + + Updated to prevent cloning of .suo files, which are used to store + solution settings for VC++ 7+. + +Fri Aug 26 13:46:47 2005 Justin Michel <michel_j@ociweb.com> + + * templates/vc7libexe.mpt: + * templates/vc8libexe.mpt: + + It is invalid to enable incremental linking on release builds, + because we also enabled comdat folding and reference optimization. + +Mon Aug 22 11:57:03 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/vc8.mpd: + + Fixed a bug in the template that caused static projects to have + incorrect project settings. + +Mon Aug 22 07:17:17 2005 Chad Elliott <elliott_c@ociweb.com> + + * MPC version 3.3.0 released. + +Local Variables: +add-log-time-format: current-time-string +indent-tabs-mode: nil +End: diff --git a/ACE/MPC/history/ChangeLog-3_4 b/ACE/MPC/history/ChangeLog-3_4 new file mode 100644 index 00000000000..804b4e7e5f9 --- /dev/null +++ b/ACE/MPC/history/ChangeLog-3_4 @@ -0,0 +1,1718 @@ +Thu May 17 16:56:54 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Provide more opportunities for the WorkspaceHelper to add more + information to the generated workspace Makefile.am. + +Thu May 17 13:36:33 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * config/global.mpb: + + Don't add '.' to libpaths for automake. It isn't necessary. + + * docs/README: + + Modified *_pre_extension descriptions to be consistent with the + *_pre_filename descriptions. + + * modules/TemplateParser.pm: + + Provide warnings when templates use the scope function + incorrectly. + +Tue May 15 19:05:59 2007 Steve Huston <shuston@riverace.com> + + * templates/vc8platforms.mpt: Added iphlpapi.lib to the lit_libs for + Windows Mobile 5.0 Smartphone SDK (ARMV4I) to pick up + GetAdaptersAddresses. + +Thu May 10 05:13:56 UTC 2007 James H. Hill <hillj@isis.vanderbilt.edu> + + * templates/vc7.mpd: + + Somehow the UseOfATL was missing a endif statement. + +Wed May 9 19:16:24 UTC 2007 James H. Hill <hillj@isis.vanderbilt.edu> + + * docs/templates/vc7.txt: + * templates/vc7.mpd: + + Added support to configuring the usage of Active Template + Library (ATL) in vc7 projects. It uses the template variable + UseOfATL. + +Wed Apr 18 09:27:12 UTC 2007 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/qt.mpb: + Added custom QRC. Thanks to Roland Sun <rolandsun at gmail dot com> + for delivering the patch. This is part of bugzilla 2870 + +Mon Apr 16 15:00:49 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/MakeProjectCreator.pm: + * modules/ProjectCreator.pm: + * templates/make.mpd: + * templates/makedll.mpt: + + Added support for using gcj with the 'java' language type. + +Thu Apr 5 19:09:47 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + + Fixed a bug where $() vars that appeared after other $() vars + would not be expanded with template values. + + Also, added a performance enhancement when replacing $() vars. + +Thu Mar 29 13:40:30 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + + Fixed a bug where $() vars would not be expanded with template + values if no relative replacement values were supplied (either + implicitly through default.rel or explicitly through -relative). + +Mon Mar 26 16:22:00 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Added additional code to detect circular dependencies. Without + this, there are situations where MPC will go into an infinite + loop. + + * templates/nmake.mpd: + + Change to look for the dependency generator in MPC_ROOT first and + then the other places. Also modified the message to point the + user to MPC instead of svn for a dependency generator. + +Thu Mar 22 17:48:27 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Fixed a bug where using the -name_modifier would end up causing + the workspace file names to contain previous workspace names. + +Thu Mar 22 14:36:53 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * depgen.pl: + * modules/Depgen/DependencyEditor.pm: + * modules/Depgen/DependencyGenerator.pm: + * modules/Depgen/DependencyWriter.pm: + * modules/Depgen/DependencyWriterFactory.pm: + * modules/Depgen/Driver.pm: + * modules/Depgen/MakeDependencyWriter.pm: + * modules/Depgen/MakeObjectGenerator.pm: + * modules/Depgen/NMakeDependencyWriter.pm: + * modules/Depgen/NMakeObjectGenerator.pm: + * modules/Depgen/ObjectGenerator.pm: + * modules/Depgen/ObjectGeneratorFactory.pm: + * modules/Depgen/Preprocessor.pm: + + Brought over my dependency generator from ACE. The core of this + dependency generator will be used by the ACE specific version + (just like the core of MPC). + + * modules/Driver.pm: + + Don't perform relative replacement for MPC_ROOT ever. + + * templates/make.mpd: + + Use the new dependency generator instead of makedepend. + +Wed Mar 21 16:54:06 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + + Document the way multiple feature names work in feature projects. + + * templates/make.mpd: + * templates/makedll.mpt: + + Support multiple configurations within a single makefile. + +Thu Mar 15 13:25:09 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/DirectoryManager.pm: + * modules/WorkspaceCreator.pm: + + Fixed a bug where a full path to a mpc file specified in an + aggregated workspace would not be handled properly. Thanks to + Sumant Tambe <sutambe at dre dot vanderbilt dot edu> for reporting + this. + + * modules/VC71WorkspaceCreator.pm: + + Reverted my change from Wed Mar 14 19:20:48 UTC 2007. It turns + out that is wasn't necessary and didn't benefit anyone. + +Wed Mar 14 19:20:48 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + When setting the 'static_libs_only' feature, use zero if + get_static() returns undef. + + * modules/VC71WorkspaceCreator.pm: + + Added a ProjectSection for WebsiteProperties that is desired by + Visual Studio 2005 SP1. It does not negatively affect Visual + Studio 2003 or Visual Studio 2005 (without SP1). + +Mon Mar 13 00:22:33 UTC 2007 Ossama Othman <ossama_othman at symantec dot com> + + From Russell Mora + * templates/nmake.mpd: + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + + This option use to be /GX which is now equivalent to /EHsc: + + /GR[-] enable C++ RTTI /GX[-] enable C++ EH (same as /EHsc) + /EHs enable C++ EH (no SEH exc) /EHa enable C++ EH (w/ SEH exc) + /EHc extern "C" defaults to nothrow + + Mon Jul 11 13:26:52 2005 Chad Elliott <elliott_c@ociweb.com> + + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + + Switch from /GX to /EHs (which is supported by vc6) to + avoid build warnings using the Visual Studio 8 compiler + with nmake. + + I don't see why it was changed to /EHs as opposed to /EHsc so + changing it to what appears to be correct. + +Fri Mar 9 13:43:25 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Set the 'static_libs_only' feature based on whether or not the + -static option is used. + +Thu Mar 08 19:55:44 2007 Steve Huston <shuston@riverace.com> + + * templates/vc8dll.mpt: + * templates/vc8exe.mpt: + * templates/vc8lib.mpt: + * templates/vc8libexe.mpt: Replace _CRT_SECURE_NO_DEPRECATE with + _CRT_NONSTDC_NO_WARNINGS. We shouldn't defeat the security-related + warnings by default, but the _CRT_NONSTDC_NO_WARNINGS are for name + changes only (generally a prefixed _) and have no affect on + function. + +Mon Mar 5 13:31:24 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * docs/templates/vc8java.txt: + + Added documentation for the vc8java template. + + * modules/WorkspaceCreator.pm: + + Fixed a bug where relative paths would come back in "windows" + style when generating projects for a windows based project type. + All file names need to be in the UNIX style for workspaces. + +Fri Mar 2 18:14:56 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * docs/USAGE: + * modules/Driver.pm: + * modules/MakeWorkspaceBase.pm: + * modules/Options.pm: + * modules/ProjectCreator.pm: + * modules/WorkspaceCreator.pm: + + Added a new option, -for_eclipse, which is useful only to make + based project types. It creates files at the top level that + indicate a project to Eclipse. It is used by importing an + existing project into the workspace. + +Fri Mar 2 15:57:34 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + + Fixed a bug in subtraction where if the element to be subtracted + is the first element it would not be removed. + +Wed Feb 28 13:50:41 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Since the top-level Makefile is always added to + configure.ac.Makefiles, we need to mark '.' as beeing seen so that + ./Makefile is not added too. + + * modules/Options.pm: + + Recognize -help so that an error is not printed, but the usage + still is. + + * modules/WorkspaceCreator.pm: + + Ignore option errors with no message (in case -help is used on the + command line within a workspace). + +Tue Feb 27 15:17:35 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * devtools/document_template.pl: + + Modified this script to look one directory up from the templates + directory for docs/templates to find documentation for templates + that do not reside in the MPC tree. + +Tue Feb 27 13:33:42 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + + Avoid an infinite loop when processing -value_template foo=$(FOO). + Thanks to Steve Huston for reporting this. + +Mon Feb 26 17:30:03 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/BDS4WorkspaceCreator.pm: + * modules/BMakeWorkspaceCreator.pm: + * modules/CCWorkspaceCreator.pm: + * modules/NMakeWorkspaceCreator.pm: + * modules/VC6WorkspaceCreator.pm: + * modules/VC7WorkspaceCreator.pm: + * modules/WinWorkspaceBase.pm: + + Added a Windows Workspace base module to override methods that are + used in Creator::expand_variables(). + + * modules/Options.pm: + + Reverted my change from Wed Jan 24 19:04:58 UTC 2007. It turns + out that the "extra parameter" was still needed. + + * modules/ProjectCreator.pm: + + Corrected a comment about sorting template variable values. + +Mon Feb 26 13:09:44 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + + Moved the Modify_Custom section down to the end of the + Define_Custom section. + + * modules/Creator.pm: + + Fixed a bug in subtraction where a partial subtraction would occur + if an element contained the subtracted element plus other text. + + * prj_install.pl: + + Added the -l option to use symbolic links instead of copies. + +Fri Feb 16 19:56:13 UTC 2007 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/openssl.mpb: + Added support for borland template so that we can use the + borland template with openssl + +Mon Feb 12 13:33:13 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * modules/ProjectCreator.pm: + * templates/nmake.mpd: + * templates/vc7.mpd: + * templates/vc8.mpd: + + Changed the source component specific keyword, managed, to be + allowed as a project level setting as well. Also, the value of the + 'managed' setting can determine different managed c++ levels for + vc8 only. + +Thu Feb 8 19:45:54 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * config/global.features: + + By default, disable the ziparchive feature. + + * docs/README: + * modules/ProjectCreator.pm: + * templates/nmake.mpd: + * templates/vc7.mpd: + * templates/vc8.mpd: + + Added a new source component specific keyword, managed, which + indicates that the source files within the scope of this setting + are to be treated as Managed C++ (a Microsoft extension). + + * docs/templates/vc8.txt: + * modules/VC8WorkspaceCreator.pm: + + If the 'add_references' template variable is set, the vc8 C++ + projects will have project references inserted into them based on + the 'after' keyword setting. + +Fri Feb 2 17:47:09 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * config/swig_php.mpb: + + Added /. after $(PHP_INCLUDE) in the includes setting. In case + the PHP_INCLUDE environment variable is not set, something is + still passed to the -I option. + + * config/ziparchive.mpb: + + Added /. after $(ZIPARCHIVEROOT) in the includes setting. In case + the ZIPARCHIVEROOT environment variable is not set, something is + still passed to the -I option. + + And switched to lit_libs. + + * config/zzip.mpb: + + For non-Windows based project types, use lit_libs instead of libs. + + * docs/templates/automake.txt: + + Documented the automake template variables. + + * docs/templates/common.txt: + + Added the definition of the forcount template variable. + + * modules/AutomakeProjectCreator.pm: + * templates/automake.mpd: + + Replaced the am_includes template variable with the includes + project variable. In the past, these were different but now they + are exactly the same. + +Thu Feb 1 18:29:19 UTC 2007 James H. Hill <hillj@isis.vanderbilt.edu> + + * docs/templates/vc7.txt: + * docs/templates/vc8.txt: + * templates/vc7.mpd: + * templates/vc8.mpd: + + Added new template variable midl_notlb to suppress the + creation of type libraries. + +Wed Jan 24 19:04:58 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/CCWorkspaceCreator.pm: + + Fixed a bug in the dependency code that would make the wrong + directory when the -into option was used. + + * modules/ConfigParser.pm: + + Provide diagnostic information when an environment variable is + used in the configuration file, but is not defined by the user. + + * modules/Driver.pm: + + Keep one more directory level when printing out the configuration + file. + + * modules/Options.pm: + + Removed an extra parameter when setting the template variable + overrides. It was no longer necessary due to my change from Fri + Jan 12 15:24:27 UTC 2007. + + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + + Fixed a bug where a scoped assignment would make the original + assignment disappear completely. The original assignment needs to + be maintained so that when the assignment is used outside of a + scope it has the value specified by the user. + + * modules/VC8WorkspaceCreator.pm: + * modules/WorkspaceCreator.pm: + * templates/vc8csharp.mpd: + * templates/vc8java.mpd: + * templates/vc8vb.mpd: + + Provide project references based on the 'after' keyword setting + for c#, vb and java projects only. + + * registry.pl: + + Added commands to process .mpc files. + + * templates/cc.mpd: + + Only output the dependency tag if the 'after' keyword has been + set. + + * templates/make.mpd: + * templates/makedll.mpt: + + Changed the way that output directories are made. The targets no + longer depend on the output directory, they are made on the fly. + +Fri Jan 19 15:34:17 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/TemplateParser.pm: + + Fixed a bug where the foreach variable names were not processed + correctly if they were mixed case. + +Thu Jan 18 19:57:42 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/TemplateParser.pm: + + Provide a new tmeplate function, remove_from, that will find a + particular name in any of the valid component sets (e.g., + source_files, header_files, etc.) and remove it from the list. + This is used in the change below. + + * templates/vc8csharp.mpd: + + If a source file is of the 'subtype' Form or Component, there may + be corresponding .Designer.cs and .resx files that are dependent + upon the source file. If this is the case, the .Designer.cs and + .resx files will automatically be marked as dependent upon the + originating source file. In order for this to happen though, the + .Designer.cs and .resx files must be in the MPC project either + implicitly or explicitly. + +Thu Jan 18 16:44:51 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + + Fixed a bug when subtracting a value, the value was escaped for + use as a regular expression before calling subtraction_core(). It + should only happen inside of Creator::subtraction_core(). + + * templates/vc8.mpd: + + The DisableSpecificWarnings template variable value should be + semi-colon separated. I'm sure others that will need to change in + this same way. + +Thu Jan 18 14:24:07 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * config/swig_perl.mpb: + + Added a specific section for Windows based project types to add + $(PERL5_LIB) to lit_libs. + + * modules/ProjectCreator.pm: + + Fixed a bug where output extensions of custom definitions that + contain text before the extension (e.g, _i.cpp) would cause files + to be skipped instead of automatically added. + + * modules/TemplateParser.pm: + + When splitting parameters, make sure that we match the regular + expression at the beginning of the line. + +Fri Jan 12 18:24:26 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * templates/vc8csharp.mpd: + + Modified the template to use the basename of LastGenOutput and + DependentUpon settings. Also, when a .settings file is listed as + a resx file it will have the SettingsSingleFileGenerator instead + of the ResXFileCodeGenerator when the generates_source template + variable is set. + +Fri Jan 12 15:24:27 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + * modules/ProjectCreator.pm: + + Fixed a bug where mixing project variables and scoped project + variables would result in only the values set as scoped project + variables being used. + +Thu Jan 11 19:19:55 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * config/swig_php.mpb: + * config/swig_python.mpb: + * config/swig_ruby.mpb: + * config/swig_tcl.mpb: + + Added SWIG base projects for php, python, ruby, and tcl. + + * generate_export_header.pl: + + Simplified code to determine the output file name. + + * modules/ProjectCreator.pm: + + Fixed a bug where when the -ti option is used within a workspace, + subsequent uses of -ti are ignored. + +Mon Jan 8 13:39:23 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeWorkspaceCreator.pm: + + During post processing, remove any duplicate targets. Duplicate + targets show up as build warnings from automake. + +Fri Jan 05 19:06:52 2007 Steve Huston <shuston@riverace.com> + + * templates/vc7dll.mpt: + * templates/vc7exe.mpt: + * templates/vc7lib.mpt: + * templates/vc7libexe.mpt: Added Pharlap ETS configuration sections + to allow generation of Pharlap ETS configurations with VC7.1. + Thank you to David Hauck for contributing these changes. + +Thu Jan 4 16:08:51 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * devtools/document_template.pl: + + Changed the table style for the html output. + + * docs/templates/vc7.txt: + + Added the output_subdir definition. + + * docs/templates/vc8.txt: + + Began documenting the vc8 template. + + * docs/MPC.sgml: + * docs/USAGE: + * modules/AutomakeWorkspaceCreator.pm: + * modules/BDS4WorkspaceCreator.pm: + * modules/Driver.pm: + * modules/EM3WorkspaceCreator.pm: + * modules/HTMLWorkspaceCreator.pm: + * modules/MakeWorkspaceBase.pm: + * modules/Options.pm: + * modules/ProjectCreator.pm: + * modules/VC6WorkspaceCreator.pm: + * modules/VC71WorkspaceCreator.pm: + * modules/VC7WorkspaceCreator.pm: + * modules/VC8WorkspaceCreator.pm: + * modules/WorkspaceCreator.pm: + + Added an option, -nocomments, which causes MPC to generate + workspaces without comments at the top. + +Tue Jan 2 20:07:32 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug where exclusion of more than one file would result in + only the last file listed being excluded. + +Tue Jan 2 18:05:52 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * config/zzip.mpb: + + Since zzip requires zlib, inherit from the zlib base project and + and have requires += zlib. + + * modules/Driver.pm: + + Simplified determination of workspace or project creators. + + * modules/VC7ProjectCreator.pm: + * modules/VC7WorkspaceCreator.pm: + * modules/VC8ProjectCreator.pm: + * templates/vc7java.mpd: + * templates/vc7java.mpt: + * templates/vc8java.mpd: + * templates/vc8java.mpt: + + Added java support for vc7, vc71 and vc8. + +Wed Dec 20 13:02:13 2006 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/BDS4ProjectCreator.pm: + * modules/BDS4WorkspaceCreator.pm: + Some more rename of bds to bds4 + +Wed Dec 20 09:25:13 2006 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/BDSProjectCreator.pm: + * modules/BDSWorkspaceCreator.pm: + * templates/bds.mpd: + * templates/bdsdll.mpt: + * templates/bdsexe.mpt: + Renamed to bds4, this is for Borland Developer Studio 4 + + * config/boost_date_time.mpb: + * config/boost_filesystem.mpb: + * config/boost_iostreams.mpb: + * config/boost_prg_exec_monitor.mpb: + * config/boost_program_options.mpb: + * config/boost_regex.mpb: + * config/boost_serialization.mpb: + * config/boost_signals.mpb: + * config/boost_test_exec_monitor.mpb: + * config/boost_thread.mpb: + * config/boost_wave.mpb: + * config/xerces.mpb: + * docs/MPC.sgml: + * docs/USAGE: + Updated bds to bds4 + +Tue Dec 19 11:37:13 2006 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Further whitespace fix so that _SOURCES will be correctly + terminated. + +Tue Dec 19 10:37:10 2006 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Fix extra whitespace in generated Makefile.am's to match + what was generated before multiple configuration support + was added. + +Tue Dec 19 18:02:21 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * templates/automake.mpd: + + Fixed a bug where exe LDFLAGS would be overwritten with the + LDFLAGS_COMMON even when configurations weren't used. + + Also minimized some of the blank line emissions. + + * templates/vc7.mpd: + * templates/vc7dll.mpt: + * templates/vc7exe.mpt: + * templates/vc7lib.mpt: + * templates/vc7libexe.mpt: + * templates/vc8platforms.mpt: + + Unified the intermediate directories for nmake, vc7 and vc8 for + the various machine types (x86, x64, etc.). + +Tue Dec 19 07:41:59 2006 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + If not building separate configurations, define *_CPPFLAGS, + *_SOURCES, *_LDFLAGS, etc. directly instead of defining + *_CPPFLAGS_COMMON, *_SOURCES_COMMON, *_LDFLAGS_COMMON, etc. and + then defining the former in terms of the latter. This results + in generated Makefile.am's closer to what MPC generated before + configurations support was added (there are some whitespace + differences that still need to be tracked down), and closer + to what a hand-written Makefile.am would look like. + +Tue Dec 19 03:38:49 2006 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Fix conditional nesting in *_LDFLAGS* definition so that an + empty one isn't emitted. + +Tue Dec 19 03:01:22 2006 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Move configuration-specific definition for *_DEPENDENCIES + to immediate follow the definition for *_DEPENDENCIES_COMMON. + +Tue Dec 19 02:28:46 2006 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Extend conditional around the *_PROGRAMS and *_LTLIBRARIES + definitions to to include the *_CPPFLAGS*, *_SOURCES*, and + *_LDFLAGS*. This fixes Makefile.am generation for projects that + don't build executables or libraries, such as those that compile + *.idl files. + +Tue Dec 19 02:21:30 2006 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Move configuration-specific definitions for *_CPPFLAGS, + *_SOURCES, and *_LDFLAGS to immediately follow the definitions + for *_CPPFLAGS_COMMON, *_SOURCES_COMMON, and *_LDFLAGS_COMMON, + as makes the resultant Makefile.am easier to read, and makes + it easier to add conditionals that effect both configuration- + specific and common definitions. + +Tue Dec 19 01:29:01 2006 J.T. Conklin <jtc@acorntoolworks.com> + + * templates/automake.mpd: + + Fix template conditionals around *_LDFLAGS_COMMON definition. + When "configurations" support was added, this was mangled and + no definition was emitted for library projects. + +Mon Dec 18 13:48:15 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * config/cppunit.mpb: + + Added a comment with a dollar Id. + + * modules/AutomakeWorkspaceCreator.pm: + + Sort the features when creating the configure.ac file for + repeatability. + + * modules/NMakeWorkspaceCreator.pm: + + Change the workspace extension from .nmak to .mak. This is only + used when -make_coexistence is used on the command line. + + * modules/ProjectCreator.pm: + + When checking to see if a feature is enabled, we will now + explicitly set the feature in the feature parser for later use + within the AutomakeWorkspaceCreator. + +Fri Dec 15 19:38:00 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * config/cppunit.mpb: + + Added a base project for cppunit. Set the CPPUNIT_ROOT + environment variable before processing. + + * modules/Creator.pm: + * modules/ProjectCreator.pm: + + Fixed a few bugs. + + 1) If -feature_file was used in a 'cmdline' setting within a .mwc + file, it was silently ignored. + 2) When setting certain 'cmdline' options within a .mwc file, they + would persist outside of the scope in which they were set. + 3) If the file specified by -feature_file did not contain a full + path, it would not be used unless it was in the current + directory. The MPC include paths are now searched if it does + not contain a path. + +Thu Dec 14 14:30:58 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * PROBLEM-REPORT-FORM: + + Changed to ask for the Operating System and Shell. + + * modules/Creator.pm: + + When expanding variables, warn the user if the value returned from + adjust_value() is a hash table. When this happens, it means that + a template scope name collides with a variable name contained + within $(). + + * templates/make.mpd: + + Added support to perform a post link processing command. + + * templates/makedll.mpt: + + Added a post link processing command to perform the integrate step + for Green Hills on Integrity. + +Wed Dec 13 17:05:29 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * config/zlib.mpb: + + Modified this base project to use an intermediate template + variable, zlibname, for Windows based project types. The default + remains zlib, but can be overridden on the command line or after + this base project has been included. For instance, the dynamic + version of this library is named zdll and would require that the + user of such library change the zlibname template variable. + + * modules/Options.pm: + + Provide indication when template variables are set on the command + line. + + Also, warn users when -value_template is used for a project + keyword. + + * modules/ProjectCreator.pm: + + Modified the evaluation of template variables such that values set + on the command line take precedence over those set in projects. + +Tue Dec 12 19:46:17 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/MPC.sgml: + * docs/USAGE: + * modules/Driver.pm: + * modules/OutputMessage.pm: + * modules/Parser.pm: + * modules/WorkspaceCreator.pm: + + Removed deprecated environment variables. All functionality + provided by the environment variables was moved into the MPC + configuration file long ago. + +Tue Dec 12 14:32:51 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * modules/ProjectCreator.pm: + * templates/vc8csharp.mpd: + + Added three new C# specific scoped keywords (dependent_upon, + generates_source and subtype). See docs/README for more details. + +Mon Dec 11 19:36:13 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * config/yacc.mpb: + + Fixed the postcommand for the custom rule so that both source and + header file are created correctly. + + * modules/ProjectCreator.pm: + + Fixed a bug where defaults source files for custom definitions may + result in incorrect file addition if the generated source file is + not the default extension (.cpp). + +Wed Dec 6 18:08:49 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * modules/ProjectCreator.pm: + * templates/em3.mpd: + * templates/nmake.mpd: + * templates/vc6.mpd: + * templates/vc7.mpd: + * templates/vc8.mpd: + + Added a new source component level setting, no_pch. When set, it + specifies that precompiled headers should not be used for the + source files listed within the scope of it's setting. + +Tue Dec 5 03:29:14 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/MPC.sgml: + * docs/USAGE: + * modules/Driver.pm: + * modules/MPC.pm: + * modules/MWC.pm: + * modules/Options.pm: + * mpc.pl: + * mwc.pl: + + Removed the default project type and simplified the addition of + new project/workspace creators. Now, you must specify a type on + the command line or a default type in the MPC.cfg. + +Mon Dec 4 16:02:43 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/Driver.pm: + + If no MPC.cfg exists in MPC/config, search the config path from + the starting point for mwc.pl (e.g., $ACE_ROOT/bin/mwc.pl). This + precludes the removal of $ACE_ROOT/bin/mwc.pl. + + * config/base.cfg: + + Removed this file. It is no longer necessary to provide the + search paths for ACE related projects. + +Mon Dec 4 15:08:19 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * config/base.cfg: + + Provide default MPC.cfg search paths for ACE related projects. + + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + + Fixed a bug where grouped generated files would be duplicated due + to a problem matching up the generated files when gendir is set to + '.'. + +Thu Nov 30 15:31:55 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Fixed bugs where nested scopes and nested workspace aggregation + would either not use workspace assignments or not have the right + workspace assignments. Thanks to James Hill + <hillj@isis.vanderbilt.edu> for pointing this out. + +Wed Nov 29 19:47:15 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/BMakeWorkspaceCreator.pm: + * modules/MakeWorkspaceBase.pm: + * modules/MakeWorkspaceCreator.pm: + * modules/NMakeWorkspaceCreator.pm: + + Factored much of the common code in these workspace types into a + single base module. + + * modules/BDSWorkspaceCreator.pm: + * modules/CCWorkspaceCreator.pm: + * modules/EM3WorkspaceCreator.pm: + * modules/HTMLWorkspaceCreator.pm: + * modules/SLEWorkspaceCreator.pm: + * modules/VC6WorkspaceCreator.pm: + * modules/VC7WorkspaceCreator.pm: + * modules/WorkspaceCreator.pm: + + Factored out the workspace_file_name method into the + WorkspaceCreator. + +Wed Nov 29 19:07:38 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/MPC.sgml: + * docs/USAGE: + * modules/MPC.pm: + * modules/MWC.pm: + * modules/VC8WebProjectCreator.pm: + * modules/VC8WebWorkspaceCreator.pm: + + Removed the vc8web project type. It has been replace with the + 'webapp' project keyword in combination with the vc8 projec type. + +Wed Nov 29 18:18:54 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Fixed a bug where an aggregated workspace with scopes (other than + exclude) would not be parsed properly. Thanks to James Hill + <hillj@isis.vanderbilt.edu> for bringing this to my attention. + +Wed Nov 29 12:52:04 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * templates/automake.mpd: + + Moved the compile_flags portion out of the CPPFLAGS_COMMON section + into the specific _CPPFLAGS settings to allow users to put + compile_flags settings inside the configuration definitions. + +Tue Nov 28 17:37:31 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeWorkspaceCreator.pm: + * templates/automake.mpd: + + Added the ability to set 'configurations' (as is done for vc6, + vc7, etc.) so that different versions of executables and libraries + can be built from the same Makefile.am. By default, the + 'configurations' template variable is not set. Thanks to + Friedhelm Wolf <Friedhelm.Wolf at homag dot de> for providing the + automake template modifications. + +Mon Nov 27 16:58:31 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Convert all output files from custom commands if the project type + requires slash conversion. + + * templates/vc7csharp.mpd: + * templates/vc7vb.mpd: + * templates/vc8csharp.mpd: + * templates/vc8vb.mpd: + + Made resource files not dependent upon any particular source file. + Also, re-removed the .aspx support in the vc8 templates. See the + modification from Tue Jun 20 12:41:49 UTC 2006. + +Wed Nov 22 18:07:56 2006 Steve Huston <shuston@riverace.com> + + * templates/vc8platforms.mpt: Corrected macros and libs for Smartphone + WinCE configurations. + +Wed Nov 22 20:40:58 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + * templates/vc8csharp.mpd: + * templates/vc8vb.mpd: + + Added support for resource files (.resx or .resources) and .aspx + files for both csharp and vb for the vc8 project type. + +Wed Nov 22 19:54:01 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/VC8WorkspaceCreator.pm: + + The adjustment of the website project name wasn't correct. It + needed to be the dirname of the project name instead of the + basename. + +Wed Nov 22 19:34:29 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * modules/ProjectCreator.pm: + * modules/VC7ProjectCreator.pm: + * modules/VC7WorkspaceCreator.pm: + * modules/VC8ProjectCreator.pm: + * modules/VC8WebWorkspaceCreator.pm: + * modules/VC8WorkspaceCreator.pm: + * modules/WorkspaceCreator.pm: + + Removed the scope keyword, webapp, from the workspace and added a + new project keyword named webapp. If webapp is set to 1 in the + project, it will be considered a Web Application, will not have a + project file written for it and will be included in the workspace + all if the project type supports Web Applications. Currently, + only the vc8 project type supports them. + +Wed Nov 22 13:44:33 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/MPC.sgml: + * docs/USAGE: + * modules/Driver.pm: + + Added the ability to set the default type in the MPC + configuration file. + + * docs/README: + * modules/VC7WorkspaceCreator.pm: + * modules/VC8WebWorkspaceCreator.pm: + * modules/VC8WorkspaceCreator.pm: + * modules/WorkspaceCreator.pm: + + Added a new scope keyword, webapp, to allow users to specify web + application directories. Any directory specified within a webapp + scope will be considered as a web application directory. + Currently only the vc8 project type supports web application + directories. + + * modules/ConfigParser.pm: + + Disallow empty names within the base configuration file (i.e., + $VAR that evaluates to empty). + +Wed Nov 22 10:34:12 2006 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/BMakeWorkspaceCreator.mpc: + Give the workspace a .bmak extension when using make_coexistence and + simplified workspace_file_name() + + * templates/bmake.mpd: + * templates/bmakecommon.mpt: + Removed support for the cbx compiler type which was the preview + compiler shipped with CBuilderX. + +Thu Nov 16 13:34:26 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * modules/ProjectCreator.pm: + + Added a new feature, Modify_Custom, that can be used to customize + an existing Define_Custom. + +Thu Nov 16 12:25:18 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * config/global.features: + * config/xalanc.mpb: + + Added support for Xalan-C++. The xalanc feature is off by + default. + + * modules/ConfigParser.pm: + + Support shell and make style environment variables. + +Fri Nov 10 16:48:14 UTC 2006 Kevin Heifner <heifner_k@ociweb.com> + + * docs/templates/vc7csharp.txt: + * docs/templates/vc8csharp.txt: + * templates/vc7csharp.mpd: + * templates/vc8csharp.mpd: + + Added a new template variable, 'keyfile', to support assembly + signing. + +Thu Nov 9 13:25:05 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/GHSWorkspaceCreator.pm: + + Removed the -I. from the default project and added + --one_instantiation_per_object. + +Mon Nov 6 19:27:44 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/CCProjectCreator.pm: + + Code Composer checks the timestamp on the project file. So, we + need to compare the output to ensure that we don't update a + project file that doesn't need to be. + + * modules/ProjectCreator.pm: + + Fixed a bug where generated headers, inline files or template + files would not be automatically added in the event that the user + provided input for those types (i.e., Header_Files, Inline_Files, + or Template_Files) that corresponds to a directory. Now, + specifying the following: + + Header_Files { + some_dir_name + } + + works as if the Header_Files section was not supplied, which is + equivalent to the following: + + Header_Files { + . + } + + This pertains to automatic addition of generated files. + +Mon Nov 6 15:11:47 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug where unrecognized lines in 'specific' sections would + not be flagged as an error. + + * modules/StringProcessor.pm (parse_assignment): + + Since template variable scopes can have spaces in the names, we + must allow scopes to have spaces in the names here as well. + + * modules/Creator.pm: + * modules/WorkspaceCreator.pm: + + Put quotes around the variable name when displaying an invalid + assignment name. This allows spacing to be taken into account. + + * templates/make.mpd: + + The implementation for the 'targetoutdir' template variable was + incorrect. 'targetoutdir' was not taken into account for the + 'libpaths' setting. + +Thu Oct 26 15:45:18 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/templates/common.txt: + * docs/templates/make.txt: + * templates/make.mpd: + * templates/makedll.mpt: + + Renamed the prelink template variable to prelinktarget to avoid + conflicting with prelink used in other templates. + + * docs/templates/vc7.txt: + * docs/templates/vc7csharp.txt: + * docs/templates/vc7vb.txt: + * docs/templates/vc8csharp.txt: + + Documented the template variables for these existing project types + and language combinations. + + * docs/templates/vc8vb.txt: + * modules/VC8ProjectCreator.pm: + * templates/vc8vb.mpd: + * templates/vc8vb.mpt: + + Added initial support for Visual Basic with vc8. + + * templates/bmake.mpd: + * templates/nmake.mpd: + + Support the prelink template variable as is done in vc7 and vc8. + + * templates/vc7.mpd: + + Modified the template to use PreprocessorDefinitions for + midl_defines under the VCMIDLTool section instead of + AdditionalOptions. + + * templates/vc7csharp.mpd: + * templates/vc7csharp.mpt: + * templates/vc7vb.mpd: + * templates/vc7vb.mpt: + * templates/vc8csharp.mpd: + * templates/vc8csharp.mpt: + + Changed the way the 'trace' template variable worked to be + consistent between both vb and csharp with vc7 and vc8. + +Thu Oct 19 17:29:08 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/GHSWorkspaceCreator.pm: + + Modified to create an integrate file (for Integrity projects) and + use it during the integration step. + +Mon Oct 16 13:33:46 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeWorkspaceCreator.pm: + * modules/BDSWorkspaceCreator.pm: + * modules/BMakeWorkspaceCreator.pm: + * modules/EM3WorkspaceCreator.pm: + * modules/HTMLWorkspaceCreator.pm: + * modules/MakeWorkspaceCreator.pm: + * modules/NMakeWorkspaceCreator.pm: + * modules/VC6WorkspaceCreator.pm: + * modules/VC71WorkspaceCreator.pm: + * modules/VC7WorkspaceCreator.pm: + * modules/VC8WorkspaceCreator.pm: + + Use the create_command_line_string() method instead of printing + the command line directly. This opens the door for disabling this + functionality. + + * mpc.pl: + * mwc.pl: + + Removed the unused Config module. + + * templates/makedll.mpt: + + For wrsppc, wrspentium, and ghsppc compilers, use $(CPUTYPE) + instead of hard-coding the processor type. + + * templates/vc8.mpd: + + Remove the 'output_subdir' template value from all library and + executable output paths. + +Wed Oct 4 17:08:21 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/GHSWorkspaceCreator.pm: + + For Integrity, a bsp file can not be added to the "Program" + project, it must be added to the "INTEGRITY Application" project. + So, for the ghs project type only, add .bsp files as documentation + in the project and the bsp documentation files will be added as bsp + files when the integrate project is created. + +Tue Oct 3 11:38:34 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + * modules/ProjectCreator.pm: + * modules/WorkspaceCreator.pm: + + Factored out the relative replacement code from the ProjectCreator + into the Creator. This required the addition of two template + methods to get different sets of data for relative replacement to + maintain the same functionality in the ProjectCreator and similar + functionality in WorkspaceCreator. + + * modules/TemplateParser.pm: + + Fixed a bug where a previous scope of a foreach would hang around + even when the scope went away. This could cause strange results + when nesting foreach's. + +Tue Sep 26 21:02:46 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/templates/bmake.txt: + + Documented the template variables used by the bmake template. + + * templates/automake.mpd: + * templates/bmake.mpd: + * templates/em3.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + * templates/vc6.mpd: + * templates/vc7.mpd: + * templates/vc7csharp.mpd: + * templates/vc7vb.mpd: + * templates/vc8.mpd: + * templates/vc8csharp.mpd: + + If a custom definition has an 'output_option' set, the order of + listing the input file changes such that it is listed before the + output_option setting in the build rule. + +Tue Sep 26 11:49:52 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * devtools/document_template.pl: + + Fixed bugs where complex foreach's (with functions) would not be + recognized and default template variable values would be + lowercased. + + * docs/README: + + Clarified the 'exclude' usage. + + * docs/USAGE: + * docs/templates/cc.txt: + * docs/templates/common.txt: + * modules/CCProjectCreator.pm: + * modules/CCWorkspaceCreator.pm: + * modules/MPC.pm: + * modules/MWC.pm: + * modules/ProjectCreator.pm: + * modules/WorkspaceCreator.pm: + * templates/cc.mpd: + * templates/cccommon.mpt: + * templates/ccexe.mpt: + * templates/cclib.mpt: + + Added complete support for Code Composer 2.0. This is an embedded + application IDE for Windows only. + +Fri Sep 22 14:00:10 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/GHSWorkspaceCreator.pm: + * docs/templates/ghs.txt: + * templates/ghs.mpd: + * templates/ghscommon.mpt: + + Fixed a couple of issues: + + 1) Exceptions were hard-coded to be on for all projects. It is + now controlled by the 'exceptions' template variable and is on + by default. + 2) If the primary target is Integrity, Program projects need an + intermediate INTEGRITY Application project to perform the + integration properly. + + * modules/TemplateParser.pm: + + Fixed a bug where getting the default value of a template variable + was not case-insensitive as it should have been. + +Wed Sep 20 16:26:48 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * config/bison.mpb: + * config/flex.mpb: + * config/lex.mpb: + * config/yacc.mpb: + + Added a 'requires' setting for each base project matching the file + name (e.g requires += bison in bison.mpb). + + * config/ziparchive.mpb: + + Removed an extraneous comment. + + * templates/ghs.mpd: + + Changed the default primaryTarget to ppc_integrity.tgt and added + <%exe_ext%> to <%exename%>. + +Tue Sep 19 13:04:15 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/MPC.sgml: + * docs/USAGE: + * docs/templates/ghs.txt: + * modules/GHSProjectCreator.pm: + * modules/GHSWorkspaceCreator.pm: + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + * templates/ghs.mpd: + * templates/ghscommon.mpt: + + Modified the ghs project type to support the 4.x version of the + Multi IDE. With this, the old .bld format has been removed. This + version assumes that Multi is being run on Windows. If this is + not the case, set the MPC_GHS_UNIX environment variable. + + * config/mfc.mpb: + + Used an else on the subsystem specific section instead of + explicitly listing out the later versions of Visual C++. When vc9 + is released, this file may not need to be modified. + + * config/openssl.mpb: + + Added nmake to the section related to Visual C++. + + * devtools/document_template.pl: + + Fixed a bug where template parser functions were seen as template + variables to be documented. + + * docs/README: + + Clarified how the value for 'pure_libs' is interpreted. + + * templates/makedll.mpt: + + Updated support for the GHS compiler. + +Wed Sep 13 15:24:45 UTC 2006 Phil Mesnier <mesnier_p@ociweb.com> + + * templates/em3.mpd: + Fix typo in the base address supplied to the linker. This is + necessary to debug WinCE applications. + +Wed Sep 6 16:20:27 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Backward compatibility was not complete for the 'install' keyword + when scoped in a specific section. The resolve_alias() method did + not take scoping into account. + +Thu Aug 31 23:18:57 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * devtools/document_template.pl: + + Fixed a bug where variables found within a <%if()%> were not taken + into account. + + * docs/templates/common.txt: + + Added some missing common template variable definitions. + + * docs/templates/make.txt: + + Defined all of the template variables specific to the make + template. + + * modules/ProjectCreator.pm: + + Fixed a bug where target output directories (exeout, dllout, + libout) were not escaped if they included spaces. + + * templates/make.mpd: + * templates/makedll.mpt: + + Renamed dependencies to suppports_include which indicates whether + a native version of make supports including files the may not + exist at the time of make invocation. + + * templates/bmake.mpd: + * templates/em3.mpd: + * templates/ghs.mpd: + * templates/nmake.mpd: + * templates/sle.mpd: + * templates/vc6.mpd: + * templates/vc7.mpd: + * templates/vc8.mpd: + + Fixed a bug where the lib modifier was still applied to libraries + specified by the 'libs' project variable even if the + 'use_lib_modifier' template variable was unset. + + * templates/bmakedll.mpt: + * templates/bmakedllexe.mpt: + * templates/bmakelib.mpt: + * templates/bmakelibexe.mpt: + * templates/common.mpt: + * templates/em3vcpdll.mpt: + * templates/em3vcpdllexe.mpt: + * templates/em3vcplib.mpt: + * templates/em3vcplibexe.mpt: + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + * templates/sledll.mpt: + * templates/sleexe.mpt: + * templates/vc6dspdll.mpt: + * templates/vc6dspdllexe.mpt: + * templates/vc6dsplib.mpt: + * templates/vc6dsplibexe.mpt: + * templates/vc7dll.mpt: + * templates/vc7exe.mpt: + * templates/vc7lib.mpt: + * templates/vc7libexe.mpt: + * templates/vc8dll.mpt: + * templates/vc8lib.mpt: + + Factored out the 'use_lib_modifier' and 'use_exe_modifier' + template variables into common.mpt. + +Mon Aug 28 12:09:16 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/MPC.sgml: + * docs/README: + * docs/USAGE: + * modules/Options.pm: + + Updated incorrect documentation and added missing information. + + * modules/Driver.pm: + + Added a warning about the impending default type removal when no + type is specified. + + * templates/make.mpd: + + Added the ability to force object files into a specific directory + and added the ability to provide a "make include" file to override + or augment makefile rules. + + * templates/vc7.mpd: + * templates/vc8.mpd: + + Converted whitespace to tabs as Visual Studio would used. + +Mon Aug 21 09:12:12 UTC 2006 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/ProjectCreator.pm (get_command_subs): + Added crlf to the list, this can then be used in for example the + prelink to have a multiline command. Thanks to Kees van Marle + <kvmarle at remedy dot nl> for adding this. + +Sat Aug 19 17:50:12 UTC 2006 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc7.mpd: + * templates/vc8.mpd: + Added prelink as template variable, thanks to Kees van Marle + <kvmarle at remedy dot nl> for adding this. + +Sat Aug 19 01:22:51 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/MPC.sgml: + + Added this SGML document provided by Thomas Girard. It contains + information similar to that which is found in the USAGE file. + + * docs/USAGE: + * modules/Options.pm: + + Cosmetic changes to the usage output. + + * modules/Driver.pm: + + Fixed a bug where an MPC configuration file that didn't exist + would be chosen from the code base configuration file. + +Wed Aug 16 22:22:31 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/USAGE: + + Added information to the logging section about the debug setting. + + * modules/WorkspaceCreator.pm: + * modules/WorkspaceHelper.pm: + + Added a method, perform_custom_processing, to WorkspaceHelper to + allow users to be able to inject data into the workspace. + +Tue Aug 15 23:50:48 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/USAGE: + + Fixed a minor typo. + + * modules/NMakeWorkspaceCreator.pm: + + Prefix the calls to cd with @ so that they are not printed during + a make. + + * docs/README: + * modules/Creator.pm: + * modules/Options.pm: + * modules/ProjectCreator.pm: + * modules/StringProcessor.pm: + * templates/bmake.mpd: + * templates/em3.mpd: + * templates/ghs.mpd: + * templates/html.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + * templates/sle.mpd: + * templates/vc6.mpd: + * templates/vc7.mpd: + * templates/vc7csharp.mpd: + * templates/vc7vb.mpd: + * templates/vc8.mpd: + * templates/vc8csharp.mpd: + + Deprecated the 'install' keyword. It has been replaced with + 'exeout' to be consistent with 'dllout' and 'libout'. The use of + 'install' will still be accepted. + +Wed Aug 9 15:11:23 2006 Chris Cleeland <cleeland_c@ociweb.com> + + * modules/ProjectCreator.pm (expand_variables): + + Corrected a problem where "pre/" and "post/" include slashes + were being changed to have the wrong type of slash. + +Wed Aug 9 01:14:54 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * devtools/document_template.pl: + + Corrected a bug where multiple variables used within a <%foreach%> + would not be recognized correctly. + + * docs/USAGE: + + Clarified the documentation dealing with the MPC configuration + files. + + * modules/AutomakeWorkspaceCreator.pm: + + Print out AM_CONDITIONAL's for all of the features known to the + FeatureParser. + + * modules/BMakeWorkspaceCreator.pm: + * modules/NMakeWorkspaceCreator.pm: + + Fixed a bug where an assumption is made that projects in different + directories were assumed to be relative. When absolute + directories are used, the Makefile would get confused about how to + get back to the original directory. + + * modules/Driver.pm: + + Compare directories case-insensitively when running on a system + that does not support case-sensitive file systems while searching + for the correct MPC.cfg. + + * modules/Creator.pm: + * modules/DirectoryManager.pm: + * modules/Options.pm: + * modules/ProjectCreator.pm: + * modules/StringProcessor.pm: + * modules/WorkspaceCreator.pm: + + Factored out and simplified code dealing with parsing assignments. + + * templates/nmake.mpd: + + Corrected information about getting a dependency generator for + nmake. + +Thu Aug 3 02:45:12 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/templates: + * docs/templates/common.txt: + * devtools/document_template.pl: + + The script can be used to document all template variables found + within a project template (.mpd file). Currently, only the + template variables that are common to most templates are + documented. + + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + + Added methods to get keywords for use within the devtools scripts. + + * highlight_template.pl: + * devtools/highlight_template.pl: + + Moved this file into the devtools directory. + +Fri Jul 28 15:13:01 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Corrected a bug introduced by my change from Fri Jul 14 17:25:16 + UTC 2006. The original change was intended to deal with Windows' + inability to have empty environment variables. I have changed it + to have a special case where then environment variable value of "" + is interpreted as the users intent to have an empty string. + +Wed Jul 26 22:35:28 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * docs/LICENSE: + * docs/README: + * docs/USAGE: + + Moved these files from the root directory into the newly created + docs directory. + + * modules/TemplateParser.pm: + * templates/automake.mpd: + + Added a new template function, keyname_used, that is used in the + automake template to handle the situation where a custom input + file is used with more than one custom defined type. If the + custom input file caused more than one file to be generated in + each custom defintion, the stamp file would be duplicated causing + build errors. + +Tue Jul 25 15:36:29 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * MPC version 3.4.0 released. + +Local Variables: +add-log-time-format: current-time-string +indent-tabs-mode: nil +End: diff --git a/ACE/MPC/history/ChangeLog-3_5 b/ACE/MPC/history/ChangeLog-3_5 new file mode 100644 index 00000000000..d27ed1c3967 --- /dev/null +++ b/ACE/MPC/history/ChangeLog-3_5 @@ -0,0 +1,1397 @@ +Fri May 30 15:48:49 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * docs/templates/vc8.txt: + + Document the template variables used by the vc8 (and vc9) + template. + + * templates/vc8.mpd: + + Modified the 'ImportLibrary' template variable to override the + setting of the ImportLibrary instead of duplicating the + ImportLibrary setting which is controled by the 'type_is_dynamic' + template variable and the 'sharedname' project setting. + +Wed May 21 11:43:19 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * clone_build_tree.pl: + + Removed cloned directories that had files previously, but have now + become empty. + + * prj_install.pl: + + Added support for installing MinGW libraries. + +Mon May 19 18:53:21 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Added dependencies so that the executable gets relinked when + one of the libraries change + +Mon May 19 14:29:21 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Build subdirs before subprojects + +Wed May 14 18:32:10 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26.mpd: + * templates/wb26wrproject.mpd: + Limit the cases subprojects are used + +Tue May 13 18:32:10 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Removed SUB_OBJECTS again, it only works when the libs are specified + with a full path + + * templates/wb26wrmakefile.mpd: + Generate DEPLIBS, should be added to the dependencies of the + partialImage but we have to figure out where to plug this into + the workbench + +Tue May 13 16:47:10 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Improved clean speed + +Tue May 13 14:28:10 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + When generating with standard_build set SUB_OBJECTS to PARTIAL_LIBS + this way an executable is dependent on its libs, when the libs + change the executable gets relinked. Also moved some settings + to the global settings instead of storing them per build spec + +Sun May 11 19:38:10 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * docs/templates/wb26.txt: + * templates/wb26.mpd: + * templates/wb26wrproject.mpd: + Added enable_subprojects which has to be set as value_template + to turn on the generation of subprojects because subprojects + can cause long compile/clean times when using standard + build support + +Wed May 7 13:30:37 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/WB26WorkspaceCreator.pm: + + Removed unnecessary and repeated code. + +Wed May 7 08:01:10 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WB26WorkspaceCreator.pm: + Improved getting the location of the .project/.wrproject file + at the moment environment variables are used + +Tue May 6 18:05:10 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WB26WorkspaceCreator.pm: + When we find MPC ADD DIRECTIVES set write to 1 so that when a + project has no dependencies we remove this MPC ADD DIRECTIVES + from the generated files + + * templates/wb26.mpd: + Use tabs instead of space + +Tue May 6 13:40:10 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WB26WorkspaceCreator.pm + * templates/wb26.mpd: + Also generate the referenced projects in the .project file + +Tue May 6 12:26:09 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/WB26WorkspaceCreator.pm: + + Updated the code to work with the .wrproject. + + * templates/wb26wrproject.mpd: + + Added the lines to allow MPC to add dependencies after the + workspace has been created. + +Tue May 6 07:12:10 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WB26WorkspaceCreator.pm: + Added helper to create subprojects + +Mon May 5 15:45:04 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * config/mpich.mpb: + + Use MPI_ROOT instead of MPICH_ROOT. This is in keeping with the + generic-ness of the environment variables to allow drop-in + replacements for different implementations. + + * config/openmpi.mpb: + + Added "requires += mpi". + + * modules/ProjectCreator.pm: + + Fixed a bug where files added through a directory would not be + removed as duplicate if the generated files had the 'gendir' value + set on them with one or more slash. This only affected Windows + project types. + + * registry.pl: + + Fixed the registry value remove option. + +Mon May 5 07:40:10 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * clone_build_tree.pl: + Don't clone wb26/vxtest generated files, .d files and Makefiles + in subdirectories + +Fri May 2 11:57:32 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26dll.mpt: + Added PPC85XXgnu buildspec + +Thu May 1 14:32:09 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Added a template method to allow project creators to disable the + "no useful targets" warning. + +Wed Apr 30 18:59:45 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * config/openmpi.mpb: + + Added a very simple base project for Open MPI. + + * templates/make.mpd: + + Add the .NOTPARALLEL target if there is multiple files generated + by a custom command. + +Wed Apr 30 11:36:17 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed two different bugs: + + 1) Using ^ with a wildcard did not function properly if the + generated files were not already there. Now, the wildcard + expansion (prefixed by ^) is not done until the end and + performed on the list of added files instead of the file + system. + + 2) Flag overrides, such as recurse, gendir, etc., specified for + directories were not propagated to the files located within + that directory. Now, they are copied over to files found + within the traversed directory. + +Sun Apr 27 18:49:45 UTC 2008 Abdullah Sowayan <abdullah.sowayan@lmco.com> + + * templates/wb26wrproject.mpd: + + Minor change to the following commit: + Sun Apr 27 18:15:32 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + Make sure the quote is closed after it is opened. Workbench complains + otherwise. + +Sun Apr 27 18:15:32 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Set correct tool with standard build + +Fri Apr 25 19:05:59 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * clone_build_tree.pl: + + Added a -s option that allows the user to specify a starting + directory instead of using the current directory. Thanks to + Hubert Talbot <Hubert dot Talbot at criq dot qc dot ca> for + providing the idea and original implementation. + + * docs/USAGE: + + Document the default logging settings. + +Fri Apr 25 09:12:00 UTC 2008 Simon Massey <sma at pristmech dot com> + + * config/global.features: + * config/unicode.mpb: + Feature name "uses_wchar" already used within ACE/TAO. Replaces + the "unicode" feature name. Template / project name within MPC + still named unicode. + +Thu Apr 24 09:55:00 UTC 2008 Simon Massey <sma at pristmech dot com> + + * config/unicode.mpb: + Dose not depend upon MFC. Use together if needed for Unicode MFC apps. + +Thu Apr 24 07:06:32 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + With a custom only project set the PROJECT_TARGET value so that + the custom rules are triggered + +Wed Apr 23 14:36:32 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26.mpd: + * templates/wb26wrproject.mpd: + Added support for source_dirs + +Wed Apr 23 14:31:32 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + Merging in the changes from the wb26 branch + + * docs/templates/common.txt: + Document the new make_coexistence + + * docs/templates/wb26.txt: + * docs/templates/wb26wrproject.txt: + Renamed wb26wrproject to wb26 + + * modules/ProjectCreator.pm: + Changed from Chad Elliott to make the make_coexistence + commandline flag available in the template + + * modules/WB26ProjectCreator.pm: + Use make_coexistence and added template input files + + * modules/WB26WorkspaceCreator.pm: + Supports make_coexistence + + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt + Removed _M_AMD64, this is a define that is set by the + compiler + + * templates/vc8platforms.mpt: + Removed _M_IX86_, this is set by the msvc compiler, we shouldn't + set this. This fixes bugzilla 3293, thanks to David Highley + <dhighley at highley-recommended dot com> for reporting this + + * templates/wb26.mpd: + * templates/wb26dll.mpt: + * templates/wb26exe.mpt: + * templates/wb26wrmakefile.mpd: + * templates/wb26wrproject.mpd: + By default we now generate the project files in the same + directory as the mpc file, this means you can only have one + project in a directory. If you don't want this, use + -make_coexistence on the commandline. Also support + -value_template standard_build=1 to support a standard build, + but this support is not ready yet. + +Mon Mar 7 08:24:46 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * docs/templates/wb26wrproject.txt: + Added linkflags + +Fri Apr 4 17:42:43 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * docs/templates/vc7.txt: + * docs/templates/vc8.txt: + + Added documentation for the IgnoreAllDefaultLibraries template + variable. + + * templates/vc7.mpd: + + Added a template variable, IgnoreAllDefaultLibraries, as is + provided in the vc8 template to set this property in the project. + Thanks to Terry Cordes <terry dot cordes at gmail dot com>. + +Fri Apr 4 11:26:34 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * config/boost_unit_test_framework.mpb: + + Committing this on behalf of Kevin Heifner <heifnerk@ociweb.com>. + + Starting with Boost 1.34 unit_test has had auto linking on + Windows. Starting with Boost 1.35 having the explicit along with + the auto linking caused crashing on exit of compiled applications. + This change removes the explict lib for most Window compilers. + vc6 and vc7 will still use explicit linking on the grounds that + they will likely be using a pre-1.34 version of Boost. + + * modules/WorkspaceCreator.pm: + + When printing the MPC options into the workspace, enclose the + parameter in double quotes if it contains a '*' charater too. + +Thu Mar 3 07:02:46 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Don't add -ansi to the cflags + +Wed Apr 2 14:48:51 UTC 2008 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/xsc_base.mpb: + * config/xsc_cxx.mpb: + * config/xsc_idl.mpb: + * config/xscrt.mpb: + * config/xscrt_utils.mpb: + + Moved these files to XSC distribution. + +Wed Mar 2 18:58:46 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Added support for linkflags + +Mon Mar 31 13:46:46 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + + Modified expand_variables() to convert back slashes to forward + slashes if the the 'convert_slashes' or the + 'requires_forward_slashes' data members are set to true. This is + the case for the wb26 project type. + +Mon Mar 31 12:36:58 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * docs/templates/wb26wrproject.txt: + + Added documentation for the template variables for the + wb26wrproject template. + +Fri Mar 28 15:30:00 UTC 2008 Simon Massey <simon dot massey at prismtech dot com> + + * config/unicode.mpb: + * config/global.features: + Allow for the already built-in unicode feature support to be recognised. + +Tue Mar 25 14:35:19 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Added support for link_group + +Tue Mar 25 11:43:40 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + + Documented the new third and optional parameter to verbatim which + allows the addition of verbatim sections instead of overwriting. + + * modules/ProjectCreator.pm: + + Require a parameter to verbatim to enable the verbatim addition + feature. Some existing ACE and TAO MPC files rely on the + overwriting behavior of verbatim. + +Mon Mar 24 17:10:23 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Changed 'verbatim' to add to existing verbatim settings instead of + overwritting them. + +Mon Mar 24 15:18:28 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * docs/USAGE: + + Document the 'main_functions' configuration file setting. + + * modules/Driver.pm: + * modules/ProjectCreator.pm: + + Support the ability to specify additional "main" functions to work + with automatic executable project recognition. + +Fri Mar 21 16:06:00 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/MakeWorkspaceBase.pm: + + Fixed the post_workspace() parameters. The file handle (which is + unused in the method) was not shifted. + + * modules/WorkspaceCreator.pm: + + Provide a mechanism for creating multiple output files per + workspace. + + * modules/WB26WorkspaceCreator.pm: + + Use the above mechanism for the wb26projects.lst file. + +Thu Mar 20 15:23:06 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * modules/ProjectCreator.pm: + + A project will now be marked custom_only if it contains no source + or resource files, but does contain custom input files. + +Thu Mar 20 13:29:19 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + No need to use full_path for the includes. Within the workbench + we can define the environment variables + +Thu Mar 20 13:26:19 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Convert slashes on values provided to back_to_variable() to ensure + that they match the relative values supplied implicitly through + environment variables or explicitly through the -relative option. + +Thu Mar 20 12:46:46 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + * modules/ProjectCreator.pm: + + Moved the recursive_includes and recursive_libpaths functionality + out of Creator and into ProjectCreator. In the process, I fixed + the following bugs: + + 1) Setting and subtracting from recursive_* would cause the value + to be added instead of the performing desired function. + 2) When values are added in the form of $(VAR)/dir, they are + expanded, recursed and then the recursed values are turned back + into the form of $(VAR)/... + + * modules/DirectoryManager.pm: + + Changed function parameter code from shifting off of the + default array to assigning from the default array. + + * modules/TemplateParser.pm: + + Modified to use the DirectoryManager::path_is_relative() function + instead of rolling my own regular expression to check for relative + paths. + +Wed Mar 19 14:19:14 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Fixed a bug where filenames or paths were used directly within a + regular expression. Thanks to Thomas Girard + <thomas dot g dot girard at free dot fr> for reporting it and + providing a patch. + +Wed Mar 19 13:47:47 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * modules/ProjectCreator.pm: + + Added the ability to use <%gendir%> in custom sections. This + variable will contain the 'gendir' setting if provided and '.' if + it is not. + + * modules/TemplateParser.pm: + + Fixed a bug where the 'full_path' function would use the current + directory if the value passed to it was a Windows style path. + + * templates/wb26wrproject.mpd: + + Added the 'full_path' usage back now that the function has been + fixed. + +Wed Mar 19 12:27:53 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug where multiple projects within a single MPC file and a + project type with multiple templates would cause problems due to + project information being updated for each template. The fix is + to only update project info for the visible template. + + * modules/TemplateParser.pm: + + Modified the 'full_path' template function to allow relative paths + to be converted to full paths even if they don't exist. Relative + paths are assumed to be relative from the current working + directory (which is the directory of the MPC file). + + * modules/WorkspaceCreator.pm: + + Added a comment about the progress indicator. + +Tue Mar 18 18:56:35 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Modified to write out N files per MPC project. Now, a file will + be written out per template file associated with the project type. + However, the workspace can only "know" about one project file + (which is determined by the sub-classed project creator). + + * modules/WB26ProjectCreator.pm: + * modules/WB26WorkspaceCreator.pm: + + Combined all of the functionality from WB26WR* into these modules. + The project creator causes 3 files per project to be written and 2 + files per workspace. + + * modules/WB26WRMAKEFILEProjectCreator.pm: + * modules/WB26WRMAKEFILEWorkspaceCreator.pm: + * modules/WB26WRPROJECTProjectCreator.pm: + * modules/WB26WRPROJECTWorkspaceCreator.pm: + + Removed these files. + +Fri Mar 14 16:43:24 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + + Update documentation on which options can not be used with + 'cmdline'. + + * modules/Driver.pm: + * modules/Options.pm: + + Renamed the option data member from 'coexistence' to + 'make_coexistence' to be consistent with the option name. + + * modules/WorkspaceCreator.pm: + + Fixed a bug where -into passed to the 'cmdline' setting could + cause serious problems for the resulting generated project files. + + Also, simplified the code used for warning about ignored options + provided to 'cmdline'. + +Thu Mar 13 14:49:45 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/Creator.pm: + + Fixed an incorrect comment. + + * modules/Driver.pm: + + Changed to add command line options to the front of the argument + array so that options provided at the end by the user that require + a parameter (but are not given one) do not gobble up the added + options. + +Thu Mar 13 02:07:59 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * config/global.features: + + Disable the java feature. + + * config/xsc_base.mpb: + + Removed the empty source_outputext setting. + + * modules/ProjectCreator.pm: + + Allow the setting of *_outputext to empty to have output files + that are similar to the input name, but without an extension. + + Also, changed function parameter code from shifting off of the + default array to assigning from the default array. + +Sun Mar 9 19:31:25 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/ProjectCreator.pm: + Also _t.* files are template files, needed for the VMS build + +Sun Mar 9 07:54:25 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WB26WRPROJECTWorkspaceCreator.pm: + Make sure we always generate a full path for the project files + +Sat Mar 8 06:59:25 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WorkspaceCreator.pm: + Reverted the changes to make the workspace creator case + insensitive, it doesn't work for all case, probably because + part of the lookup is done on hashed values. I am going to + explicitly list a project name in the files that cause + the problems on VMS + +Fri Mar 7 20:27:25 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Don't use fullpath for includes + + * modules/WB26WRPROJECTWorkspaceCreator.pm: + Generate a wb26projects.lst that lists the projects that are + generated + +Fri Mar 7 18:17:25 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WorkspaceCreator.pm: + When we give a warning, make sure we present the user the + mixed case name, thanks to Adam Mitz for noticing this + +Fri Mar 7 14:51:25 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WorkspaceCreator.pm: + Only retrieve the onVMS value only once. Made the handling + of the after keyword case insensitive. If you have a project + idl and after += IDL this will work now. This is needed + because on OpenVMS all filenames are returned lower case by perl + and the after specified by the user is mixed case which + resulted in the fact that the after just didn't work + on OpenVMS. Thanks to Chad Elliott for reviewing the patches + and point out the possible performance problems of my + original changes + +Thu Mar 6 15:16:25 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WorkspaceCreator.pm: + Use method from base class to check whether we run on VMS or not + +Wed Mar 5 14:40:20 UTC 2008 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/xsc_base.mpb: + * config/xsc_cxx.mpb: + * config/xsc_idl.mpb: + * config/xscrt.mpb: + * config/xscrt_utils.mpb: + + Base projects for using XSC. + +Mon Mar 3 14:19:25 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/log4cplus.mpb: + Added base project for log4cplus + +Sat Feb 29 11:51:25 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/Creator.pm: + Strip out ^ from filenames on OpenVMS. + +Fri Feb 28 13:36:25 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WorkspaceCreator.pm: + Strip out ^ from directory names on OpenVMS. Fixes bugzilla + 3237. + +Wed Feb 27 14:09:25 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/Driver.pm: + On OpenVMS all filenames are returned lower case. The dynamic loading + of creators then fails. Addressed this by opening the creator file + and read the first line, it normally starts with package and after + that the package name. Thanks to Chad Elliott for this idea and + reviewing the proposed change. + +Fri Feb 22 14:49:25 UTC 2008 Adam Mitz <mitza@ociweb.com> + + * modules/TemplateParser.pm: + + Added a new template function, <%full_path()%>, which will expand + environment variables and resolve relative paths to absolute paths. + Template authors should only use this when the target build system + requires it, since it limits the MPC user's flexibility in deciding + when and how env vars are expanded, and removes "portability" of + generated project files (by which I mean the ability to move them + around in a filesystem, or even move them to different machines). + + * templates/wb26.mpd: + * templates/wb26wrproject.mpd: + + Made use of the new <%full_path()%> function. Thanks to Johnny and + Chad for testing and reviewing this work. This resolves the + enhancement request documented in bugzilla bug# 3218. + +Mon Feb 11 15:21:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * docs/README: + * docs/USAGE: + * modules/Driver.pm: + * modules/Options.pm: + * modules/ProjectCreator.pm: + * modules/WorkspaceCreator.pm: + Extend MPC with a -relative_file commandline argument. By default + the default.rel file is loaded which specific which environment + variables are expanded. With -relative_file the user can specify + that a differnt file has to be loaded. This fixes bugzilla + 3224 + +Mon Feb 11 06:23:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Make sure libs are installed correctly + +Sun Feb 10 19:44:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Don't depend on windriver make variables for the postbuild and + clean step, just generate our own + +Fri Feb 8 19:50:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Corrected clean of installed executables and libraries + +Fri Feb 8 09:35:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Generate custom clean commands. Now IDL generated files will + be removed as part of the clean step + +Thu Feb 7 19:02:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Also generate the post build and clean steps when we generate a + static project + +Thu Feb 7 18:49:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Generate a clean step which removes an installed library of executable + +Sun Feb 3 19:10:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Replaced some spaces with a tab to fix GNU make errors + +Fri Feb 1 14:39:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * configs/build_files.mpb: + Also add mwc files to the build files section. + +Fri Feb 1 09:37:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Corrected copying of the library/executable to their location + +Wed Jan 30 19:28:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * configs/build_files.mpb: + New base project to add mpc/mpb files to a project as build + files. + +Sat Jan 26 07:10:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WB26WRMAKEFILEProjectCreator.pm: + * modules/WB26WRPROJECTProjectCreator.pm: + Cleanup + +Thu Jan 24 20:36:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Further improvements for partial image support + +Thu Jan 24 19:51:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Added a second build target when building an executable. We + first build a partial image which we then link with all + the other libraries. This matches more the way we build + using the GNU makefiles. At the end we want to get rid of + the libraries as project contents but that still seems to + be needed. + +Thu Jan 24 19:07:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + When building an executable also add the libraries used to the + project contents. Only at that moment they are also added to + the list of files that need to be munched. The other option + would be to use the ADDED_OBJECTS in the .wrmakefile file but + to nmppc we have to pass the full path of all the libraries + and we don't have that information. + +Thu Jan 24 16:11:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Fixed contents generation because the project name got changed + +Thu Jan 24 16:01:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WB26ProjectCreator.pm: + * modules/WorkspaceCreator.pm: + Committed fix of Chad Elliott so that the generation of the build + order for the wb26 project type does work. + + * modules/WB26WorkspaceCreator.pm: + Fixed comment about location of the file + +Thu Jan 24 13:46:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WB26WorkspaceCreator.pm: + The build order is stored in an eclipse file, generate this + file so that we can control the build order easily. By + placing this file in the following workspace directory + .metadata\.plugins\org.eclipse.core.runtime\.settings + +Thu Jan 24 12:49:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Corrected order of the generated libs + +Wed Jan 23 14:58:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Added support for custom only projects + +Wed Jan 23 14:15:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26.mpd: + Use project_name, that is also set for projects that only generate + IDL files + +Wed Jan 23 08:45:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WB26WRMAKEFILEProjectCreator.pm: + Also the wrmakefile requires paths to use forward slashes + + * templates/wb26wrmakefile.mpd: + Go to the real directory where the commands should be started. + The workbench sets a subdirectory as current directory + +Tue Jan 22 20:26:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Generate custom build commands which are for example used for + triggering the IDL compiler + +Tue Jan 22 19:47:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Generate a post build command that copies the libraries and + executables to the location specified through the mpc file + +Tue Jan 22 19:34:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26.mpd: + Also generate inline, header, and template files into the project + +Tue Jan 22 08:48:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/Creator.pm: + * modules/ProjectCreator.pm: + * modules/WB26WRPROJECTProjectCreator.pm: + * modules/WB26WRPROJECTWorkspaceCreator.pm: + * modules/WinWorkspaceBase.pm: + * modules/WorkspaceCreator.pm: + The WindRiver workbench requires all paths to have forward slashes, + also on Windows. Added a requires_forward_slashes method so that + the project creator can indicate that forward slashes has to be + used. Thanks to Chad Elliott for helping with this, this fixes + bugzilla 3201 + +Tue Jan 22 08:27:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/Creator.pm: + Fixed recursive_includes and recursive_libs + +Mon Jan 21 15:36:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Add -mlongcall to CC_ARCH_SPEC + +Mon Jan 21 14:51:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Added missing -mlongcall flags + +Mon Jan 21 14:45:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Give libraries a lib prefix + +Mon Jan 21 14:30:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WB26WorkspaceCreator.pm: + * modules/WB26WRMAKEFILEWorkspaceCreator.pm: + * modules/WB26WRPROJECTWorkspaceCreator.pm: + Use different base + + * templates/wb26wrproject.mpd: + Improved support for building libraries and executables + +Mon Jan 21 06:25:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WB26WorkspaceCreator.pm: + No workspace can be generated for the wb26 at this moment + + * modules/WB26WRMAKEFILEProjectCreator.pm: + * modules/WB26WRMAKEFILEWorkspaceCreator.pm: + * modules/WB26WRPROJECTProjectCreator.pm: + * modules/WB26WRPROJECTWorkspaceCreator.pm: + For the wb26 type we need to have multiple files generated but + MPC can only generate one file for a type at this moment. Added + two generators so that we just can generate the files for the + wb26 with 3 generations. When MPC has been extended these + files will go away. + +Sun Jan 13 18:34:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Use a different workbench project type when building a shared + or static library + +Wed Jan 9 20:05:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Use the Librarian tool when building a library + +Wed Jan 9 19:53:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WB26ProjectCreator.pm: + The workbench needs unix style paths + +Wed Jan 9 19:34:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Generate include paths, do note that for the moment you must + use -expand_vars when generating the project files, the full + path must be generated + +Wed Jan 9 19:23:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Generate information for the linker + +Wed Jan 9 19:12:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Template for the .wrmakefile needed for the VxWorks Workbench + +Wed Jan 9 10:31:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + Added generation of libpaths and libs + +Wed Jan 9 09:10:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrproject.mpd: + New file, first version of the generator of the .wrproject file + needed for the WindRiver workbench + + * modules/WB26ProjectCreator.pm: + Overruled get_template so that we easily can enable the + wb26wrproject file + +Mon Jan 7 15:16:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/WB26ProjectCreator.pm: + * modules/WB26WorkspaceCreator.pm: + * templates/wb26.mpd: + First initial commit for a new generator for VxWorks 6.4/Workbench 2.6. + A lot of more work has to be done on this generator before it is + complete, but this is the first starting point. Because the Workbench + has the restriction that the project file always has to be named + .project for each project in a directory we create a subdirectory + and in this directory we place the .project file. Then for each + source file we use the linked file feature of the workbench. This + has the current restriction that it must be a full path, no relative + paths are supported. + + * docs/MPC.sgml: + * docs/USAGE: + Added missing vc9 and new wb26 + +Mon Jan 7 14:59:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/.cvsignore: + Removed, we are not using cvs anymore + +Mon Jan 7 14:57:12 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * registry.pl: + Added vc9 + +Tue Dec 18 20:21:28 UTC 2007 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/mpich.mpb: + + Added a requires statement to the base project. + +Thu Dec 13 16:48:51 UTC 2007 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/mpich.mpb: + + The import libraries on Windows are different than the + libraries on non-Windows systems. + +Wed Dec 12 02:03:59 UTC 2007 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/mpich.mpb: + + Base project that will set the necessary project settings + for using MPICH, a freely available implementation of the + Message Passing Interface (MPI). + +Tue Dec 11 21:36:44 UTC 2007 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/odbc.mpb: + + Base project that will set the necessary project settings + for using ODBC. On non-Windows systems, the base project + supports UnixODBC and iODBC. + +Tue Dec 11 17:56:47 UTC 2007 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/gacutil.mpb: + + Base project that will register .NET binaries, i.e., + executables and shared libraries, with the Global Assembly + Cache (GAC) after creation. This is very useful if you + need to creating stand-alone assemblies that reference + each other, but have no way of adding their dependency, + such as a web application. + +Thu Nov 29 00:13:52 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Modified the 'optional' syntax to allow assignments in addition to + additon assignments. This is mainly useful in Modify_Custom's. + +Tue Nov 27 13:12:55 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/VC9ProjectCreator.pm: + * modules/VC9WorkspaceCreator.pm: + + Removed duplicated code. It will be inherited from + VC8ProjectCreator and VC8WorkspaceCreator respectively. + +Tue Nov 27 12:23:48 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/WorkspaceCreator.pm: + + Fixed a bug in number_target_deps() where project types with + dependency names are not the same as file names would not be + numbered. + +Thu Nov 22 19:25:54 UTC 2007 Johnny Willemsen <jwillemsen@remedy.nl> + + * Modules/VC9WorkspaceCreator.pm: + Corrected generation + +Thu Nov 22 15:48:54 UTC 2007 Johnny Willemsen <jwillemsen@remedy.nl> + + * Modules/VC9WorkspaceCreator.pm: + Corrected generation + +Thu Nov 22 13:35:54 UTC 2007 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/boost_date_time.mpb: + * config/boost_filesystem.mpb: + * config/boost_iostreams.mpb: + * config/boost_prg_exec_monitor.mpb: + * config/boost_program_options.mpb: + * config/boost_regex.mpb: + * config/boost_serialization.mpb: + * config/boost_signals.mpb: + * config/boost_test_exec_monitor.mpb: + * config/boost_thread.mpb: + * config/boost_wave.mpb: + * config/openssl.mpb: + * config/swig_perl.mpb: + * config/xerces.mpb: + * docs/README: + * modules/VC9ProjectCreator.pm: + * modules/VC9WorkspaceCreator.pm: + Added support for vc9 + +Thu Nov 15 13:18:35 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * docs/templates/vc7csharp.txt: + * docs/templates/vc7java.txt: + * docs/templates/vc8csharp.txt: + * docs/templates/vc8java.txt: + + Documented the AllowUnsafeBlocks template variable. + + * templates/vc7csharp.mpd: + * templates/vc7java.mpd: + * templates/vc8csharp.mpd: + * templates/vc8java.mpd: + + Added the ability to set the AllowUnsafeBlocks attribute for + csharp and java projects through the 'AllowUnsafeBlocks' template + variable. + +Tue Nov 6 13:01:54 UTC 2007 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/Creator.pm: + * modules/ProjectCreator.pm: + * docs/README: + Added support for recursive_libpaths and recursive_includes. + These can be used like libpaths and includes, but they recursively + add also all subdirectories to libpaths/includes. Thanks + to Chad Elliott for assisting with the implementation of these + features. + +Mon Oct 22 12:11:13 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + + Documented variable scopes. + + * modules/ProjectCreator.pm: + + Fixed a bug where any type of error in a base feature project + would be reported as if the end of the feature project was not + found. + + Also, fixed a bug where a scoped template variable addition would + be evaluated multiple times resulting in a repeition of the added + value. + +Thu Oct 11 17:42:54 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * templates/vc8csharp.mpd: + + Fixed a problem where too many .resx files were being grouped to a + "matching" 'Form' source file. + +Thu Oct 11 15:34:23 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + + Document a requirement of a <%foreach%> that uses a function call + with commas. In this case a variable name and base count is + necessary. + + * docs/templates/make.txt: + + Documented missing template variables. + + * modules/TemplateParser.pm: + + Modified the 'remove_from' template function to work in a foreach + and to allow better string manipulation. + + * templates/vc8csharp.mpd: + + Use the 'remove_from' function to group .resx files that fully or + partially match a 'Form' source file. + +Tue Sep 25 16:03:41 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * templates/vc8csharp.mpd: + + Changed the way generates_source works. See the README for more + details. + +Thu Sep 13 18:02:23 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * create_base.pl: + + Added a script to create base projects based on MPC library + projects. + + * modules/ProjectCreator.pm: + + Changed an informational message to provide more data. + +Wed Sep 12 18:55:35 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * config/qwt.mpb: + + Added a base project for Qwt. + + * modules/WorkspaceCreator.pm: + + Fixed a bug where a perl undefined value warning could occur when + duplicate project names are encountered. + +Wed Sep 12 13:13:52 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * config/mysql.mpb: + * config/mysqlpp.mpb: + + Added base projects for MySQL and MySQL++. + +Fri Sep 7 13:41:43 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + * modules/TemplateParser.pm: + + Fixed a bug where using two different custom types in the same + project, both with 'commandflags' mapped to a new keyword, would + cause scoped settings from one project type to be applied to the + other project type. + +Tue Aug 21 15:27:52 UTC 2007 James H. Hill <hillj@isis.vanderbilt.edu> + + * templates/vc8.mpd: + * templates/vc8platforms.mpt: + + Added support for the Windows Mobile 6 platform. This platform + is targeted specifying the "Windows Mobile 6 Standard SDK (ARMV4I)" + platform. + +Thu Aug 16 12:01:28 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * prj_install.pl: + + Fixed a bug where copying an executable didn't set the execute + permissions on the new file. Also, unnecessary intermediate + directories are no longer made during installation. + +Fri Aug 10 18:15:22 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * docs/USAGE: + * modules/Options.pm: + + Fixed the misspelling of Graphviz. + + * modules/AutomakeWorkspaceCreator.pm: + + Fixed a couple of issues: + + 1) Makefile.am is no longer overwritten if the only difference is + in a comment. + 2) The existing configure.ac is edited to contain all of the new + Makefiles. If configure.ac doesn't exist, it is created and + the Makefile list is written out to configure.ac.Makefiles. + 3) @NAME@ substitutions now only happen in the top-level + workspace. + + * modules/ConfigParser.pm: + + Only warn the user once about each undefined environment variable. + + * modules/Creator.pm: + * modules/ProjectCreator.pm: + * modules/WorkspaceCreator.pm: + + Factored the file comparison out into a single method on the + Creator base class. + +Wed Aug 8 15:18:04 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Set the required automake version back to 1.9. + + * modules/Creator.pm: + + When subtracting, split the subtracted value into elements so that + they can be removed in any order. + +Wed Aug 8 12:29:46 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeWorkspaceCreator.pm: + + Added a code to handle a special associate key to support + conditional substitutions in the SUBDIRS setting. + +Fri Aug 3 13:49:08 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug where adding to a mapped keyword as a scoped template + variable would wipe out the original setting instead of adding to + it. + +Fri Aug 3 11:53:48 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * config/global.mpb: + * config/mpb.mpb: + + Removed the MPB Define_Custom out of global and into it's own base + project. Users can have their base projects inherit from mpb if + they want to use it. + +Tue Jul 31 13:57:54 UTC 2007 Adam Mitz <mitza@ociweb.com> + + * docs/README: + + Fixed a few instances where mpd was mistakenly used in place of mpt. + +Mon Jul 30 13:47:13 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * config/global.mpb: + + Added a define custom to allow users to explicitly list .mpb files + in their projects. + + * prj_install.pl: + + By default, install all .mpb files. + +Mon Jul 30 11:33:43 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Support setting a mapped custom defined keyword as a scoped + template variable. + +Wed Jul 11 14:52:02 UTC 2007 Adam Mitz <mitza@ociweb.com> + + * templates/nmake.mpd: + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + + Moved the default libraries advapi32.lib and user32.lib out of the + template and into the template-input files using the variable name + systemlibs. This allows -value_template systemlibs+=FOO to work. + +Fri Jun 29 18:24:22 UTC 2007 Adam Mitz <mitza@ociweb.com> + + * modules/Depgen/Driver.pm: + + Removed assigment of () to %types since it was sometimes + clobbering the value already there (from the BEGIN block). + + * modules/Depgen/NMakeObjectGenerator.pm: + * depgen.pl: + + Generate dependencies targeting object files instead of cpp files. + This matches how it's done for GNU make. + + * modules/NMakeWorkspaceCreator.pm: + + Provide output regarding which projects are being built. + + * templates/nmake.mpd: + + Changed how intermediate and ouptut directories are handled, to + match the change to make.mpd in: + Wed Jan 24 19:04:58 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + +Wed Jun 27 11:28:50 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * config/boost_base.mpb: + + Use a new environment variable, BOOST_ROOT_LIB, to determine the + location of boost libraries. If this isn't set, it will be + expanded to $(BOOST_ROOT)/lib which is the default location. + + * docs/README: + * modules/WorkspaceCreator.pm: + + Added a new workspace feature, associate, that associates a name + with one or more directories. It does not add directories to the + workspace, it only makes an association. + + * modules/AutomakeWorkspaceCreator.pm: + + Utilize the associate feature to allow conditional building of + groups of directories. + + * docs/USAGE: + * modules/Options.pm: + + Document the fact that the directory parameter for the -into + option should be a full path. + + * modules/ProjectCreator.pm: + + Removed duplicate code from the add_explicit_output() method. + +Wed Jun 27 06:27:11 UTC 2007 Johnny Willemsen <jwillemsen@remedy.nl> + + * docs/USAGE: + * modules/BCB2007ProjectCreator.pm: + * modules/BCB2007WorkspaceCreator.pm: + * templates/bcb2007.mpd: + * templates/bcb2007dll.mpt: + * templates/bcb2007exe.mpt: + New template for C++Builder 2007 + +Fri May 18 11:17:11 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * MPC version 3.5.0 released. + +Local Variables: +mode: change-log +add-log-time-format: (lambda () (progn (setq tz (getenv TZ)) (set-time-zone-rule UTC) (setq time (format-time-string %a %b %e %H:%M:%S %Z %Y (current-time))) (set-time-zone-rule tz) time)) +indent-tabs-mode: nil +End: diff --git a/ACE/MPC/history/ChangeLog-3_6 b/ACE/MPC/history/ChangeLog-3_6 new file mode 100644 index 00000000000..2ca55abedb4 --- /dev/null +++ b/ACE/MPC/history/ChangeLog-3_6 @@ -0,0 +1,1248 @@ +Sun May 24 18:43:56 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * devtools/document_template.pl: + + Added code to convert less than and greater than signs into html + friendly codes. + +Fri May 22 07:51:05 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc8platforms.mpt: + Added some more WinCE SDKs + +Wed May 13 18:03:05 UTC 2009 Adam Mitz <mitza@ociweb.com> + + * modules/VC9ProjectCreator.pm: + * templates/vc8csharp.mpd: + * docs/templates/vc8csharp.txt: + + Added support for Visual C# with -type vc9 (Visual Studio 2008). + +Thu May 7 21:12:17 UTC 2009 Adam Mitz <mitza@ociweb.com> + + * modules/Driver.pm: + + Removed a debugging print statement. + +Thu May 7 19:18:24 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * modules/ConfigParser.pm: + * modules/Driver.pm: + + Modified the locate_dynamic_directories code to only warn the user + if the path doesn't contain environment variables or the + environment variables that it does contain are set. + + * modules/ProjectCreator.pm: + + Fixed a perl warning about an uninitialized variable. + +Thu May 7 15:39:17 UTC 2009 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * modules/BCB2007ProjectCreator.pm: + * modules/BDS4ProjectCreator.pm: + * modules/BMakeProjectCreator.pm: + * modules/BorlandProjectBase.pm: + * modules/GHSProjectCreator.pm: + * modules/MakeProjectBase.pm: + * modules/NMakeProjectCreator.pm: + * modules/ProjectCreator.pm: + * modules/VCProjectBase.pm: + * modules/WinProjectBase.pm: + + Modified the 'specific' clause to accept "properties" in addition + to project types. Maintaining project type lists within the base + projects was getting out of hand. A simpler approach is to apply + properties to groups of project types, such as project types that + are only used on Windows. These properties are referenced within + the 'specific' clause instead of project types. See the README + for more details. + + * config/boost_date_time.mpb: + * config/boost_filesystem.mpb: + * config/boost_iostreams.mpb: + * config/boost_prg_exec_monitor.mpb: + * config/boost_program_options.mpb: + * config/boost_regex.mpb: + * config/boost_serialization.mpb: + * config/boost_signals.mpb: + * config/boost_system.mpb: + * config/boost_test_exec_monitor.mpb: + * config/boost_thread.mpb: + * config/boost_unit_test_framework.mpb: + * config/boost_wave.mpb: + * config/bzip2.mpb: + * config/lzo1.mpb: + * config/mpich.mpb: + * config/nddslib.mpb: + * config/odbc.mpb: + * config/openssl.mpb: + * config/splicelib.mpb: + * config/sqlite3.mpb: + * config/swig_perl.mpb: + * config/udm.mpb: + * config/xerces.mpb: + * config/zlib.mpb: + * config/zzip.mpb: + + Modified all of these base projects to use properties instead of + project types within the 'specific' clauses. + + * modules/VC10ProjectCreator.pm: + * modules/VC10WorkspaceCreator.pm: + * modules/VC9WorkspaceCreator.pm: + + Removed duplicated code. + +Tue May 5 17:37:29 UTC 2009 Jeff Parsons <j.parsons@vanderbilt.edu> + + * config/splicelib.mpb: + + Added verbatim line for gnuace that turns off visibility + discrimination. OpenSpliceDDS doesn't yet support versions + of g++ that handle hidden visibility. + +Fri May 1 14:09:49 UTC 2009 Adam Mitz <mitza@ociweb.com> + + * clone_build_tree.pl: + + Don't skip directories ending in .d since ACE now contains rc.d + and init.d directories. + +Wed Apr 29 11:39:32 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc8platforms.mpt: + Add eBox 2300 and 4300 Windows CE 6 + +Fri Apr 24 20:37:40 UTC 2009 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/udm.mpb: + + Changed 'automatic' to 1. + +Fri Apr 17 15:20:32 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * docs/fm/*: + Added FrameMaker 8 files for the MPC pdf file. When making changes + make sure track changes is enabled. + + This documentation is based on original work contributed by + Object Computing, Inc. (OCI), St. Louis, MO, USA, + http://www.ociweb.com. + +Thu Apr 9 21:37:52 UTC 2009 Phil Mesnier <mesnier_p@ociweb.com> + + * config/udm.mpb: + + Fuzz fix. + +Thu Apr 9 16:57:57 UTC 2009 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/udm.mpb: + + Mapped 'commandflags' -> 'udmflags' + +Thu Apr 9 16:48:31 UTC 2009 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/udm.mpb: + + Bug fix in the project specification. + +Thu Apr 9 16:42:43 UTC 2009 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/udm.mpb: + + UDM base project. + +Tue Apr 7 09:33:22 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/qt4_core.mpb: + * config/qt4_designer.mpb: + * config/qt4_designercomponents.mpb: + * config/qt4_gui.mpb: + * config/qt4_network.mpb: + * config/qt4_opengl.mpb: + * config/qt4_qt3support.mpb: + * config/qt4_sql.mpb: + * config/qt4_svg.mpb: + * config/qt4_test.mpb: + * config/qt4_xml.mpb: + All Qt4libs are appended with 4 + +Wed Apr 1 16:10:22 UTC 2009 Ciju John <johnc at ociweb dot com> + + * config/qt4_core.mpb: + Wrong include path got checked in. This fixes it. + +Wed Apr 1 15:56:35 UTC 2009 Ciju John <johnc at ociweb dot com> + + * config/qt4_core.mpb: + * config/qt4_gui.mpb: + Qt4 libs are appended with '4'. + +Thu Mar 26 12:48:22 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * docs/MakeProjectCreator.pdf: + First updates applied + +Mon Mar 16 21:33:14 UTC 2009 Steven Stallion <stallions@ociweb.com> + + * config/erlang.mpb: + + Updated erlang base project to default to typical gnuace + behavior for generated artifacts. + +Sun Mar 15 19:36:54 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/lzo1.mpb: + Fixed lib names + +Wed Mar 11 13:51:08 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * docs/MakeProjectCreator.pdf: + This work is based on the TAO 1.4a TAO Developers Guide chapter + on MPC published by OCI. The goal is to improve this + document with time to serve as the authoritative reference/documentation + for MPC users. + + Thanks to OCI for making this chapter publicly available and allowing + us to modify it. + +Wed Mar 11 09:15:08 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/bzip2.mpb: + * config/lzo1.mpb: + Fixed these base projects so that they also work with gnuace + +Tue Mar 10 13:34:36 UTC 2009 Adam Mitz <mitza@ociweb.com> + + * modules/GUID.pm: + + Fixed a bug where 64-bit implementations of Perl would generate + duplicate GUID values. (Bugzilla #3614) + +Mon Mar 9 07:04:08 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/bzip2.mpb: + * config/lzo1.mpb: + * config/lzo2.mpb: + * config/zlib.mpb: + On windows we need some different library names + +Sat Mar 7 18:55:08 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/lzo1.mpb: + Added lzo1 base project + +Sat Feb 28 03:46:19 UTC 2009 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/pcre.mpb: + * config/pcreposix.mpb: + + Base projects for using PCRE. + +Tue Feb 24 04:23:34 UTC 2009 William R. Otte <wotte@dre.vanderbilt.edu> + + * config/xerces.mpb: + + Added !xerces2, !xerces3 feature to disable xerces dependent builds + if neither feature is present. + +Mon Feb 23 16:03:15 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/qt4_qt3support.mpb: + Added base project for qt4_qt3support + +Tue Feb 17 13:17:28 UTC 2009 William R. Otte <wotte@dre.vanderbilt.edu> + + * config/xerces3.mpb: + + Removed this file. + +Wed Feb 11 16:21:48 UTC 2009 William R. Otte <wotte@dre.vanderbilt.edu> + + * config/global.features: + * config/xerces.mpb: + + Disabled xerces{2,3} by default and removed the requires lines + from the xerces features. Thanks to Adam Mitz for pointing this out. + +Tue Feb 10 20:36:47 UTC 2009 William R. Otte <wotte@dre.vanderbilt.edu> + + * config/xerces.mpb: + + Split this base project into two features - xerces2 and xerces3 + to allow support for both versions. + +Mon Jan 19 22:30:47 UTC 2009 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/iiopnet.mpb: + + Base project for using IIOP.NET. + +Mon Jan 12 11:10:09 UTC 2009 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/nddslib.mpb: + Added vc10 + +Sun Jan 11 17:26:09 UTC 2009 Abdullah Sowayan <sowayan@gmail.com> + + * config/nddslib.mpb: + + Minor enhancement. + +Sun Jan 11 17:21:17 UTC 2009 Abdullah Sowayan <sowayan@gmail.com> + + * config/nddslib.mpb: + + Added Visual Studio 2010 (vc10) support + +Sun Jan 11 17:09:44 UTC 2009 Abdullah Sowayan <sowayan@gmail.com> + + * config/ndds_ts_defaults.mpb: + * config/nddsexe.mpb: + * config/nddsexe_with_idl.mpb: + * config/nddslib.mpb: + * config/nddslib_with_idl.mpb: + + New files, base projects for using RTI's NDDS + C++ DDS implementation. + +Sat Jan 3 22:02:02 UTC 2009 Steven Stallion <stallions@ociweb.com> + + * config/erlang.mpb: + + Updated base project type for erlang projects. + +Wed Dec 31 23:01:33 UTC 2008 Steven Stallion <stallions@ociweb.com> + + * config/erlang_otp.mpb: + + Dropped default -I include from erlang_otp projects. + +Tue Dec 30 23:23:03 UTC 2008 Steven Stallion <stallions@ociweb.com> + + * config/erlang.mpb: + * config/erlang_otp.mpb: + + Updated Erlang support. Output is now propertly cleaned when + the clean target is called on gnuace platforms. + +Wed Dec 24 22:20:40 UTC 2008 Steven Stallion <stallions@ociweb.com> + + * config/erlang.mpb: + * config/erlang_otp.mpb: + + Added support for Erlang. Two new projects are available: + erlang, and erlang_otp. erlang provides basic Erlang support, + and erlang_otp provides support for projects which use the otp + layout. + +Thu Dec 18 21:39:03 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/MakeWorkspaceCreator.pm: + + Fixed a bug with my change yesterday relating to the "bundle" + target. + + * templates/make.net.mpd: + + Added a strip command to the bundle commands. + +Thu Dec 18 09:29:36 UTC 2008 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/xerces3.mpb: + + Base project for Xerces-C 3.x + +Tue Dec 16 02:54:55 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * docs/MPC.sgml: + * docs/README: + * docs/USAGE: + + Updated documentation. + + * modules/Options.pm: + + Sort project types keeping like types in numerical order. + + * modules/MakeWorkspaceCreator.pm: + * templates/make.net.mpd: + * templates/make.net.mpt: + + Added a bundle target for C# to bundle an executable into a native + application. + +Fri Nov 28 10:55:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Don't copy the lib/exe when we need to install them in the current + directory + +Mon Nov 17 10:50:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/nmake.mpd: + * templates/vc7.mpd: + * templates/vc8.mpd: + Added escape charachter to MPC_LIB_MODIFIER value + +Mon Nov 17 08:33:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * docs/templates/common.txt: + * templates/nmake.mpd: + * templates/vc7.mpd: + * templates/vc8.mpd: + Add macro_for_lib_modifier. Whis template variable is set the + vc7/vc8/vc9/vc10/nmake templatess add MPC_LIB_MODIFIER to the + compiler flags with the current lib_modifier as value + +Tue Nov 11 10:40:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/boost_base.mpd: + Use $(BOOST_ROOT)/. again + +Mon Nov 10 10:45:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/boost_date_time.mpb: + * config/boost_filesystem.mpb: + * config/boost_iostreams.mpb: + * config/boost_prg_exec_monitor.mpb: + * config/boost_program_options.mpb: + * config/boost_regex.mpb: + * config/boost_serialization.mpb: + * config/boost_signals.mpb: + * config/boost_system.mpb: + * config/boost_test_exec_monitor.mpb: + * config/boost_thread.mpb: + * config/boost_unit_test_framework.mpb: + * config/boost_wave.mpb: + * config/gacutil.mpb: + * config/mpich.mpb: + * config/odbc.mpb: + * config/openssl.mpb: + * config/splicelib.mpb: + * config/sqlite3.mpb: + * config/swig_perl.mpb: + * config/xerces.mpb: + * docs/README: + * docs/USAGE: + * modules/VC10ProjectCreator.pm: + * modules/VC10WorkspaceCreator.pm: + Added Visual Studio 2010 (vc10) support + +Fri Nov 7 18:39:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + * templates/wb26wrproject.mpd: + Improved standard build support + +Fri Nov 7 13:00:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + The OBJECTS variable is dependent on the project name + +Thu Nov 6 18:41:58 UTC 2008 Abdullah Sowayan <abdullah.sowayan@lmco.com> + + * templates/wb26wrmakefile.mpd: + + Fixed pre_build rule by using SUB_OBJECTS instead of OBJECTS_example. + Thanks to Laszlo Morocz <laszlo dot morocz at lmco dot com) for providing the fix. + +Thu Nov 6 15:42:06 UTC 2008 Jeff Parsons <j.parsons@vanderbilt.edu> + + * config/splice_ts_defaults.mpb: + * config/spliceexe.mpb: + * config/spliceexe_with_idl.mpb: + * config/splicelib.mpb: + * config/splicelib_with_idl.mpb: + + New files, base projects for using PrismTech's OpenSplice + C++ DDS implementation. Currently, the files are specialized + for using OpenSplice integrated with a CORBA implementation, + and assume that OpenSplice's custom library for this purpose + (in $OSPL_HOME/custom_lib/ccpp) has been compiled after + installation. + +Thu Nov 6 10:54:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + * templates/wb26wrproject.mpd: + Put all object names in a file and pass these to the Librarian to + prevent a long command when a lot of objects are linked together + +Tue Nov 4 10:01:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/bmake.mpd: + Reverted change of yesterday, breaks other things + + * config/boost_base.mpd: + Use $(BOOST_ROOT) instead of $(BOOST_ROOT)/., it confused CodeGear + C++ + +Mon Nov 3 21:50:41 UTC 2008 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/sqlite3.mpb: + Added a 'requires' statement to the base project. + +Mon Nov 3 19:51:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/bmake.mpd: + Use '' around include paths so that we can handle directories + with spaces in the name + +Sun Oct 26 17:09:42 UTC 2008 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/sqlite3.mpb: + + Base project for using SQLite. For Windows-based projects, you + will need to use LIB to generate the import library for the + .dll. + +Thu Oct 23 13:01:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/bmake.mpd: + Don't print all clean commands on the console + +Fri Oct 17 19:07:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * modules/BCB2009ProjectCreator.pm + * modules/BCB2009WorkspaceCreator.pm + * templates/bcb2009.mpd + * templates/bcb2009dll.mpt + * templates/bcb2009exe.mpt + New generator for C++ Builder 2009 + + * templates/bcb2007.mpd + Fixed bug in resource_file generation + +Wed Oct 15 15:03:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc8platforms.mpt: + SuperSonic also uses unicode + + * config/openssl.mpb: + * config/xerces.mpb: + Removed reference to borland template which has been removed + + * config/qt3.mpb: + Added this file. Just derived on qt but makes it easier to + explicitly derive from qt3 or qt4 + +Tue Oct 14 11:47:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc8platforms.mpt: + Updated SuperSonic SDK settings + +Fri Oct 10 08:58:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc8platforms.mpt: + Add iphlpapi to WinCE6 + +Thu Oct 9 15:14:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc8platforms.mpt: + Define UNDER_CE as $(CEVER) with WinCE6 + +Thu Oct 9 09:28:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/vc8platforms.mpt: + Added Windows Mobile 6 Professional SDK (ARMV4I) + +Tue Oct 7 14:08:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + Revert change below, doesn't work as expected + + Tue Oct 7 13:55:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + Include vc8platforms so that we can easily generate nmake projects for + WinCE platforms + +Tue Oct 7 13:55:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/nmakedll.mpt: + * templates/nmakeexe.mpt: + Include vc8platforms so that we can easily generate nmake projects for + WinCE platforms + + * templates/vc8platforms.mpt: + Added new WinCE mobile platform + +Sat Oct 4 20:52:22 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * config/qt.mpb: + + Added support for building 64-bit. + + * modules/ProjectCreator.pm: + + Fixed a bug where Source_File scoped specific variable setting was + broken for any language but C++. + + * templates/make.net.mpd: + + Added macro settings for cat, cp, mv and /dev/null. + +Mon Sep 29 13:34:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/bmake.mpd: + * templates/bmakecommon.mpt: + Added a unicode modifier so that the libs do get a u in the name + when we build with unicode + +Wed Sep 17 02:40:00 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + + Fixed a spelling error. + + * modules/MakeProjectCreator.pm: + * templates/make.net.mpd: + * templates/make.net.mpt: + + Changed the default csharp compiler to gmcs and added support for + the libs keyword and the packages template variable. + + * modules/ProjectCreator.pm: + + Always write the project if the user has provided a verbatim + within the project. + +Tue Sep 16 21:18:01 UTC 2008 Phil Mesnier <mesnier_p@ociweb.com> + + * modules/NMakeWorkspaceCreator.pm: + * modules/TemplateParser.pm: + * modules/VC7WorkspaceCreator.pm: + * templates/vc8.mpd: + + These changes all improve support for building cross-compiled + WinCE projects using Visual Studio. This specifically allows + for the exclusion of native-only apps, such as TAO_IDL from + building and deployment on cross compile targets. Also improves + the establishment of the correct WinCE 5 or WinCE 6 entry point + and sets the character set flag correctly. + +Tue Sep 16 08:35:19 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/ruby.mpb: + New base project for Ruby. + + * modules/BMakeWorkspaceCreator.pm: + Make sure we get unique names when we generate bmake with other + project types in one tree + + * templates/bmakedll.mpt: + * templates/bmakedllexe.mpt: + * templates/bmakelib.mpt: + * templates/bmakelibexe.mpt: + Changed extensions to get unique names with the bmake + so that we don't try to load a msvc dll when it also exists + +Mon Sep 15 20:50:19 UTC 2008 Adam Mitz <mitza@ociweb.com> + + * modules/Driver.pm: + + Added quotes around 'dynamic_types' in the diagnostic message. + +Sat Sep 13 15:50:22 UTC 2008 Adam Mitz <mitza@ociweb.com> + + * modules/Driver.pm: + + Change a warning to a non-warning diagnostic when a dynamic_types + path (from MPC.cfg) can't be found. This is a normal condition when + the dynamic_types path is based on an environment variable that may + not be set. + +Fri Sep 12 12:56:15 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + Reverted change below, brakes VMS support + + Tue Sep 9 18:46:15 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + * mwc.pl: + * mpc.pl: + Use FindBin::RealScript to get the real script name, that also + works when we have a symbolic link with a different name to + one of these scripts. This fixes bugzilla 3407 + +Tue Sep 9 18:46:15 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * mwc.pl: + * mpc.pl: + Use FindBin::RealScript to get the real script name, that also + works when we have a symbolic link with a different name to + one of these scripts. This fixes bugzilla 3407 + +Fri Aug 22 07:04:17 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * mwc.pl: + * mpc.pl: + Use RealBin to get the location of this script, that gives the + real location also in case we use a symbolic link to these + scripts. + +Wed Aug 20 19:19:17 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * devtools/document_template.pl: + * devtools/highlight_template.pl: + Added missing shebang lines to fix rpm packaging warnings + +Wed Aug 20 08:33:17 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * clone_build_tree.pl: + * combine_dsw.pl: + * create_base.pl: + * depgen.pl: + * generate_export_header.pl: + * mpc.pl: + * mwc.pl: + * prj_install.pl: + * registry.pl: + * vs_postclean.pl: + Added missing shebang lines to fix rpm packaging warnings + +Wed Aug 13 19:31:17 UTC 2008 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/gacutil.mpb: + + Bug fix where the path of the assembly to register, i.e., + the sharedname, was incorrect. This was resolved by using the + absolute pathname for the assembly instead of the relative + pathname. + +Wed Jul 30 14:52:28 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/lzo2.mbp: + Base project for lzo2 compression library + +Wed Jul 30 14:43:28 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * templates/wb26wrmakefile.mpd: + Convert a few environment variables to use / instead of \ + +Wed Jul 23 10:19:28 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl> + + * config/gsl.mpb: + Added base project for GNU Scientific Library + +Fri Jul 18 19:09:10 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/Driver.pm: + * modules/FeatureParser.pm: + * modules/ProjectCreator.pm: + * modules/VC8ProjectCreator.pm: + * modules/WorkspaceCreator.pm: + + More non-functional code cleanup changes. + +Fri Jul 18 18:22:41 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug with the 'output_basename' template variable. For + Windows based project types, the input file used back-slashes and + taking basename() of that sort of text on UNIX will not result in + the expected value. We must ensure that the text passed to + basename() always has forward slashes. + +Fri Jul 18 17:58:58 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * templates/make.net.mpd: + + Fixed a bug where TARGETDIR was not set if there was no exeout set + and the project was an executable. + + * templates/automake.mpd: + * templates/bmake.mpd: + * templates/cccommon.mpt: + * templates/nmake.mpd: + * templates/vc7.mpd: + * templates/vc8vb.mpd: + * templates/wb26wrmakefile.mpd: + + Removed trailing white-space. + +Fri Jul 18 17:22:56 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug with the 'output_dirname' template variable. For + Windows based project types, the input file used back-slashes and + taking dirname() of that sort of text on UNIX will not result in + the expected value. We must ensure that the text passed to + dirname() always has forward slashes. + +Fri Jul 18 16:03:52 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * clone_build_tree.pl: + * combine_dsw.pl: + * create_base.pl: + * prj_install.pl: + * registry.pl: + * vs_postclean.pl: + * devtools/document_template.pl: + * devtools/highlight_template.pl: + * generate_export_header.pl: + * modules/AutomakeProjectCreator.pm: + * modules/AutomakeWorkspaceCreator.pm: + * modules/BCB2007ProjectCreator.pm: + * modules/BCB2007WorkspaceCreator.pm: + * modules/BDS4ProjectCreator.pm: + * modules/BDS4WorkspaceCreator.pm: + * modules/BMakeProjectCreator.pm: + * modules/BMakeWorkspaceCreator.pm: + * modules/CCProjectCreator.pm: + * modules/CCWorkspaceCreator.pm: + * modules/ConfigParser.pm: + * modules/Creator.pm: + * modules/DirectoryManager.pm: + * modules/Driver.pm: + * modules/EM3ProjectCreator.pm: + * modules/EM3WorkspaceCreator.pm: + * modules/FeatureParser.pm: + * modules/GHSProjectCreator.pm: + * modules/GHSWorkspaceCreator.pm: + * modules/HTMLProjectCreator.pm: + * modules/HTMLWorkspaceCreator.pm: + * modules/MPC.pm: + * modules/MWC.pm: + * modules/MakeProjectBase.pm: + * modules/MakeProjectCreator.pm: + * modules/MakeWorkspaceBase.pm: + * modules/MakeWorkspaceCreator.pm: + * modules/NMakeProjectCreator.pm: + * modules/NMakeWorkspaceCreator.pm: + * modules/Options.pm: + * modules/OutputMessage.pm: + * modules/Parser.pm: + * modules/ProjectCreator.pm: + * modules/SLEProjectCreator.pm: + * modules/SLEWorkspaceCreator.pm: + * modules/StringProcessor.pm: + * modules/TemplateInputReader.pm: + * modules/TemplateParser.pm: + * modules/VC6ProjectCreator.pm: + * modules/VC6WorkspaceCreator.pm: + * modules/VC71ProjectCreator.pm: + * modules/VC71WorkspaceCreator.pm: + * modules/VC7ProjectCreator.pm: + * modules/VC7WorkspaceCreator.pm: + * modules/VC8ProjectCreator.pm: + * modules/VC8WorkspaceCreator.pm: + * modules/VCProjectBase.pm: + * modules/WB26ProjectCreator.pm: + * modules/WB26WorkspaceCreator.pm: + * modules/WinProjectBase.pm: + * modules/WinWorkspaceBase.pm: + * modules/WorkspaceCreator.pm: + * modules/WorkspaceHelper.pm: + * modules/XMLProjectBase.pm: + + Cleaned up the code and added comments. There were no functional + changes made. + +Thu Jul 17 15:10:48 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + We need to pass the 'commandflags' setting to the command helper, + not the hash map containing all of the type settings. + +Thu Jul 17 13:50:33 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug where a command helper returns output files for a + particular component type and file, but they were not taken into + account within the project. + + Also, fixed another bug relating to the group determiniation of + automatically added files. In doing so, the components for other + component types were being defined but set to an empty set which + was causing problems with automatically adding file to these + components. + +Wed Jul 16 16:11:33 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/CommandHelper.pm: + + Fixed a comment. + + * modules/ProjectCreator.pm: + + Delay replacing <%...%> that contain project keywords until they + are used by the template. Doing this allows the values to be used + regardless of the order in which keywords are processed within the + project. + +Tue Jul 15 16:08:40 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/CommandHelper.pm: + + Extended the interface to allow the helper to provide "tied" + custom files. + + * modules/ProjectCreator.pm: + + Made the following changes: + + 1) Added an optimization to generated_source_listed() to avoid + attempting to add custom generated files if they couldn't + possibly be generated. + 2) Added the ability for a command helper to "tie" files together + so that they are processed closely together. + 3) Fixed a bug where an output file could end up being listed more + than once in the custom output files value. + +Fri Jul 11 18:13:36 UTC 2008 Adam Mitz <mitza@ociweb.com> + + * vs_postclean.pl: + + " becomes ", not '. + +Fri Jul 11 15:18:27 UTC 2008 Adam Mitz <mitza@ociweb.com> + + * docs/README: + + Cleaned up some typos (stray semicolons) + + * vs_postclean.pl: + + Restore current directory after changing it. + Translate &, etc. + Added support for solutions, all referenced projects will be cleaned. + +Fri Jul 11 14:56:44 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * modules/ProjectCreator.pm: + + Added a pseudo template variable, rmdir, which will be defined + depending upon the project type. It will be 'rmdir /s/q' on + Windows and 'rm -rf' on UNIX. + + * modules/AutomakeWorkspaceCreator.pm: + + Fixed a bug where the configure.ac.Makefiles did not contain the + correct names if the -name_modifier option was used. + + * modules/WorkspaceCreator.pm: + + Reduced op code count. + +Fri Jul 11 14:30:53 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * modules/ProjectCreator.pm: + + Added a pseudo template variable, slash, which will be defined + depending upon the project type. + + * templates/make.net.mpt: + * templates/makedll.mpt: + + Rely on the slash psuedo template variable instead of defining one + in these template input files. + +Fri Jul 11 11:10:00 UTC 2008 Simon Massey <sma at prismtech dot com> + + * templates/make.net.mpt: + + Added dollar-Id-dollar to appease a non-MPC related script that, for + some reason, insists on applying it's influence on MPC. + +Thu Jul 10 22:34:12 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * vs_postclean.pl: + + Added a script to perform the postclean step for Visual Studio + projects. + +Thu Jul 10 19:03:14 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/Depgen/DependencyEditor.pm: + * modules/Depgen/DependencyGenerator.pm: + * modules/Depgen/DependencyWriter.pm: + * modules/Depgen/DependencyWriterFactory.pm: + * modules/Depgen/Driver.pm: + * modules/Depgen/MakeDependencyWriter.pm: + * modules/Depgen/MakeObjectGenerator.pm: + * modules/Depgen/NMakeDependencyWriter.pm: + * modules/Depgen/NMakeObjectGenerator.pm: + * modules/Depgen/ObjectGenerator.pm: + * modules/Depgen/ObjectGeneratorFactory.pm: + * modules/Depgen/Preprocessor.pm: + + Cleaned up the code and reduced op code count. + + * templates/vc7.mpd: + * templates/vc8.mpd: + + Added a VCPostCleanEventTool, which doesn't exist in Visual + Studio, to hold the 'postclean' settings. This is mainly here to + enable another script to come along and perform the postclean + function. + +Thu Jul 10 18:28:33 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * modules/ProjectCreator.pm: + + Added a new feature, pre_dirname, which is similar to pre_filename + except that the value is prepended to the output directory for + generated files. If a separate directory is desired, the + pre_dirname setting should end in a slash. + +Thu Jul 10 15:28:50 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * devtools/document_template.pl: + + Fixed a bug where template variables used within template + functions were ignored. + + * docs/README: + * modules/ProjectCreator.pm: + + Added the ability to utilize project settings within the + Define_Custom command, commandflags, dependent, output_option, + and postcommand settings. + +Thu Jul 10 14:29:44 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/MakeProjectCreator.pm: + * templates/make.net.mpd: + * templates/make.net.mpt: + * docs/templates/make.net.txt: + + Added support for compiling C# code using Mono. + + * modules/Creator.pm: + * modules/ProjectCreator.pm: + * modules/StringProcessor.pm: + * modules/TemplateParser.pm: + * modules/VC9ProjectCreator.pm: + * modules/VC9WorkspaceCreator.pm: + + Decreased op code count. + +Wed Jul 9 13:46:02 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/AutomakeProjectCreator.pm: + * modules/MakeProjectBase.pm: + * modules/Parser.pm: + + Reduce op code count. + + * modules/CommandHelper.pm: + + Added a debug message to assist users in figuring out why their + helper isn't being picked up. + + * modules/Creator.pm: + + Modified recursive_directory_list() to skip .svn and CVS + directories. + + * modules/ProjectCreator.pm: + + Fixed a very old and incorrect assumption that output file names + generated as part of a custom definition had to be longer than the + length of the input file name. + +Tue Jul 8 15:35:29 UTC 2008 Steve Huston <shuston@riverace.com> + + * templates/vc8.mpd: Allow a project to be a "make output" type using + the VCNMakeTool section instead of the usual compile, link, etc. + sections. This allows one to drive nmake-type projects from a + VC project. Also, enable setting the DebugInformationFormat even + when doing an optimize/Release build. Thanks to Kelly Hickel for + contributing these. + +Tue Jul 8 13:09:22 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed a bug in my change from Thu Jul 3 11:46:23 UTC 2008. Files + were not being automatically added when they didn't exist on the + file system. + +Mon Jul 7 17:00:33 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * modules/ProjectCreator.pm: + + MPC had always assumed that output files went into the same + directory as the input file (unless specified otherwise through + gendir). Now, in the Define_Custom for the command, this + assumption can be modified. If 'output_follows_input' is set to + 0, it will assume that output files go into the same directory as + the project (unless specified otherwise through gendir). + +Mon Jul 7 13:10:46 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Modified the behavior of adding to prebuild, postbuild, and + postclean. Values that are added are now separated via the + command separator for the project type. This will assure that + multiple commands are executed separately (and unconditionally). + +Thu Jul 3 16:36:30 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * docs/README: + * modules/Creator.pm: + * modules/ProjectCreator.pm: + + Added a new keyword, postclean, which is similar to postbuild + except that it is executed during the realclean target. + + * templates/bmake.mpd: + * templates/html.mpd: + * templates/make.mpd: + * templates/nmake.mpd: + + Added the use of postclean. + +Thu Jul 3 14:49:52 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + For the previous change to generate_default_components(), we only + need to do this if the list of component tags was not provided to + the method. + +Thu Jul 3 11:46:23 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/ProjectCreator.pm: + + Fixed an issue where a chain of three or more Custom_Define's + would not have the right default input/output. + +Wed Jul 2 16:35:22 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/CommandHelper.pm: + * modules/ProjectCreator.pm: + + Modified the helper to be keyed off of the define custom name + instead of the define custom command name. + +Wed Jul 2 14:04:39 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/CommandHelper.pm: + * modules/ProjectCreator.pm: + + Added a command helper that can be dynamically loaded to assist + the project creator in determining which files will be generated + by a command. This is useful when the output of a file can not be + represented by the usual Define_Custom syntax. + +Mon Jun 30 14:55:51 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * modules/StringProcessor.pm: + + Added a simple fgrep function that will find a string in an array + reference. + + * modules/ProjectCreator.pm: + + Fixed a bug where custom defines that generate output that can be + used as automatic input to other custom defines did not work + properly. Now, they are automatically added when possible. + +Fri Jun 27 12:59:39 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * config/ixml.mpb: + * config/upnp.mpb: + + Added base projects for use with the open source project Linux SDK + for UPnP Devices. + + * docs/README: + * modules/ProjectCreator.pm: + + Split the functionality of the 'automatic' keyword into to two. + 'automatic_in' now specifies that input files are automatically + added and 'automatic_out' specifies that generated output files + are automatically added to the project. These both default to + true as 'automatic' did. 'automatic' is still accepted, but + deprecated. + +Wed Jun 25 21:38:16 UTC 2008 Adam Mitz <mitza@ociweb.com> + + * docs/README: + + Documented the following changes. + + * modules/ProjectCreator.pm: + * modules/VC7ProjectCreator.pm: + * modules/WinProjectBase.pm: + + Added the <%cmdsep%> pseudovariable that can be used in prebuild, + postbuild, and postcommand. It works like <%and%> and <%or%> but it + unconditionally runs the right-hand side command. + For postcommand, added <%input_dirname%> and <%output_dirname%> which + work like their <%*_basename%> counterparts but return the directory + portion of the file name. + +Thu Jun 19 01:27:55 UTC 2008 James H. Hill <hillj@isis.vanderbilt.edu> + + * config/boost_system.mpb: + + Base project for using the Boost system library. + +Tue Jun 17 17:16:07 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * docs/templates/make.txt: + + Document the 'depgen_flags' template variable. + + * combine_dsw.pl: + * create_base.pl: + * depgen.pl: + * generate_export_header.pl: + * mpc.pl: + * mwc.pl: + * prj_install.pl: + * registry.pl: + * modules/ConfigParser.pm: + * modules/Creator.pm: + * modules/DirectoryManager.pm: + * modules/Driver.pm: + * modules/FeatureParser.pm: + * modules/GUID.pm: + * modules/MakeWorkspaceBase.pm: + * modules/Options.pm: + * modules/OutputMessage.pm: + * modules/Parser.pm: + * modules/ProjectCreator.pm: + * modules/StringProcessor.pm: + * modules/TemplateInputReader.pm: + * modules/TemplateParser.pm: + * modules/VCProjectBase.pm: + * modules/Version.pm: + * modules/WinProjectBase.pm: + * modules/WinWorkspaceBase.pm: + * modules/WorkspaceCreator.pm: + * modules/WorkspaceHelper.pm: + + Removed unnecessary parenthesis around variable declarations. + This provides a very minor performance increase due to reduced + perl op codes. + +Tue Jun 10 14:45:18 UTC 2008 Adam Mitz <mitza@ociweb.com> + + * templates/make.mpd: + * templates/makedll.mpt: + + Enhanced support for MinGW with "-type make". + +Fri May 30 15:54:22 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * MPC version 3.6.0 released. + +Local Variables: +mode: change-log +add-log-time-format: (lambda () (progn (setq tz (getenv TZ)) (set-time-zone-rule UTC) (setq time (format-time-string %a %b %e %H:%M:%S %Z %Y (current-time))) (set-time-zone-rule tz) time)) +indent-tabs-mode: nil +End: diff --git a/ACE/MPC/modules/AutomakeProjectCreator.pm b/ACE/MPC/modules/AutomakeProjectCreator.pm new file mode 100644 index 00000000000..2be84c51205 --- /dev/null +++ b/ACE/MPC/modules/AutomakeProjectCreator.pm @@ -0,0 +1,62 @@ +package AutomakeProjectCreator; + +# ************************************************************ +# Description : A Automake Project Creator +# Author : J.T. Conklin & Chad Elliott +# Create Date : 2/26/2003 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use MakeProjectBase; +use ProjectCreator; + +use vars qw(@ISA); +@ISA = qw(MakeProjectBase ProjectCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub escape_spaces { + #my $self = shift; + return 1; +} + + +sub fill_value { + my($self, $name) = @_; + my $value; + + if ($name eq 'am_version') { + $value = $self->get_assignment('version'); + $value .= ':0' if (defined $value && ($value =~ tr/./:/) < 2); + } + + return $value; +} + + +sub project_file_extension { + #my $self = shift; + return '.am'; +} + + +sub get_dll_exe_template_input_file { + #my $self = shift; + return 'automakeexe'; +} + + +sub get_dll_template_input_file { + #my $self = shift; + return 'automakedll'; +} + + +1; diff --git a/ACE/MPC/modules/AutomakeWorkspaceCreator.pm b/ACE/MPC/modules/AutomakeWorkspaceCreator.pm new file mode 100644 index 00000000000..e3cdf9c6048 --- /dev/null +++ b/ACE/MPC/modules/AutomakeWorkspaceCreator.pm @@ -0,0 +1,778 @@ +package AutomakeWorkspaceCreator; + +# ************************************************************ +# Description : A Automake Workspace (Makefile) creator +# Author : J.T. Conklin & Steve Huston +# Create Date : 5/13/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; +use File::Copy; + +use AutomakeProjectCreator; +use WorkspaceCreator; +use WorkspaceHelper; + +use vars qw(@ISA); +@ISA = qw(WorkspaceCreator); + +# ************************************************************ +# Data Section +# ************************************************************ + +my $acfile = 'configure.ac'; +my $acmfile = 'configure.ac.Makefiles'; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub compare_output { + return 1; +} + + +sub files_are_different { + my($self, $old, $new) = @_; + my $diff = 1; + if (-r $old) { + my $lh = new FileHandle(); + my $rh = new FileHandle(); + if (open($lh, $old)) { + if (open($rh, $new)) { + my $done = 0; + my $lline; + my $rline; + + $diff = 0; + do { + $lline = <$lh>; + $rline = <$rh>; + if (defined $lline) { + if (defined $rline) { + $lline =~ s/#.*//; + $rline =~ s/#.*//; + $diff = 1 if ($lline ne $rline); + } + else { + $done = 1; + } + } + else { + $diff = 1 if (defined $rline); + $done = 1; + } + } while(!$done && !$diff); + close($rh); + } + close($lh); + } + } + return $diff; +} + + +sub workspace_file_name { + return $_[0]->get_modified_workspace_name('Makefile', '.am'); +} + + +sub workspace_per_project { + #my $self = shift; + return 1; +} + + +sub pre_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + $self->print_workspace_comment($fh, + '## Process this file with automake to create Makefile.in', $crlf, + '##', $crlf, + '## ', '$', 'Id', '$', $crlf, + '##', $crlf, + '## This file was generated by MPC. Any changes made directly to', $crlf, + '## this file will be lost the next time it is generated.', $crlf, + '##', $crlf, + '## MPC Command:', $crlf, + '## ', $self->create_command_line_string($0, @ARGV), $crlf, $crlf); +} + + +sub write_comps { + my($self, $fh, $creator, $toplevel) = @_; + my $projects = $self->get_projects(); + my @list = $self->sort_dependencies($projects); + my $crlf = $self->crlf(); + my %unique; + my @dirs; + my @locals; + my %proj_dir_seen; + my $have_subdirs = 0; + my $outdir = $self->get_outdir(); + my $cond = '--'; + + ## This step writes a configure.ac.Makefiles list into the starting + ## directory. The list contains of all the Makefiles generated down + ## the tree. configure.ac can include this to get an up-to-date list + ## of all the involved Makefiles. + my $mfh; + my $makefile; + if ($toplevel) { + my $need_acmfile = 1; + if (! -e "$outdir/$acfile") { + my $acfh = new FileHandle(); + if (open($acfh, ">$outdir/$acfile")) { + print $acfh "AC_INIT(", $self->get_workspace_name(), ", 1.0)$crlf", + "AM_INIT_AUTOMAKE([1.9])$crlf", + $crlf, + "AC_PROG_CXX$crlf", + "AC_PROG_CXXCPP$crlf", + "AC_PROG_LIBTOOL$crlf", + $crlf; + + my $fp = $creator->get_feature_parser(); + my $features = $fp->get_names(); + my %assoc = %{$self->get_associated_projects()}; + foreach my $feature (sort @$features) { + print $acfh 'AM_CONDITIONAL(BUILD_', uc($feature), + ', ', ($fp->get_value($feature) ? 'true' : 'false'), + ')', $crlf; + delete $assoc{$feature}; + } + foreach my $akey (keys %assoc) { + print $acfh 'AM_CONDITIONAL(BUILD_', uc($akey), ', true)', $crlf + if ($akey ne $cond); + } + + print $acfh $crlf, + "m4_include([$acmfile])$crlf", + $crlf, + "AC_OUTPUT$crlf"; + close($acfh); + } + } + else { + $self->information("$acfile already exists."); + $need_acmfile = !$self->edit_config_ac("$outdir/$acfile", \@list); + } + + if ($need_acmfile) { + unlink("$outdir/$acmfile"); + $mfh = new FileHandle(); + open($mfh, ">$outdir/$acmfile"); + ## The top-level is never listed as a dependency, so it needs to be + ## added explicitly. + $makefile = $self->mpc_basename($self->get_current_output_name()); + $makefile =~ s/\.am$//; + print $mfh "AC_CONFIG_FILES([ $makefile ])$crlf"; + $proj_dir_seen{'.'} = 1; + } + } + + ## If we're writing a configure.ac.Makefiles file, every seen project + ## goes into it. Since we only write this at the starting directory + ## level, it'll include all projects processed at this level and below. + foreach my $dep (@list) { + if ($mfh) { + ## There should be a Makefile at each level, but it's not a project, + ## it's a workspace; therefore, it's not in the list of projects. + ## Since we're consolidating all the project files into one workspace + ## Makefile.am per directory level, be sure to add that Makefile.am + ## entry at each level there's a project dependency. + my $dep_dir = $self->mpc_dirname($dep); + if (!defined $proj_dir_seen{$dep_dir}) { + $proj_dir_seen{$dep_dir} = 1; + ## If there are directory levels between project-containing + ## directories (for example, at this time in + ## ACE_wrappers/apps/JAWS/server, there are no projects at the + ## apps or apps/JAWS level) we need to insert the Makefile + ## entries for the levels without projects. They won't be listed + ## in @list but are needed for make to traverse intervening directory + ## levels down to where the project(s) to build are. + my @dirs = split /\//, $dep_dir; + my $inter_dir = ""; + foreach my $dep (@dirs) { + $inter_dir .= $dep; + if (!defined $proj_dir_seen{$inter_dir}) { + $proj_dir_seen{$inter_dir} = 1; + print $mfh "AC_CONFIG_FILES([ $inter_dir/$makefile ])$crlf"; + } + $inter_dir .= '/'; + } + print $mfh "AC_CONFIG_FILES([ $dep_dir/$makefile ])$crlf"; + } + } + + ## Get a unique list of next-level directories for SUBDIRS. + ## To make sure we keep the dependencies correct, insert the '.' for + ## any local projects in the proper place. Remember if any subdirs + ## are seen to know if we need a SUBDIRS entry generated. + my $dir = $self->get_first_level_directory($dep); + if (!defined $unique{$dir}) { + $unique{$dir} = 1; + unshift(@dirs, $dir); + } + if ($dir eq '.') { + ## At each directory level, each project is written into a separate + ## Makefile.<project>.am file. To bring these back into the build + ## process, they'll be sucked back into the workspace Makefile.am file. + ## Remember which ones to pull in at this level. + unshift(@locals, $dep); + } + else { + $have_subdirs = 1; + } + } + close($mfh) if ($mfh); + + # The Makefile.<project>.am files append values to build target macros + # for each program/library to build. When using conditionals, however, + # a plain empty assignment is done outside the conditional to be sure + # that each append can be done regardless of the condition test. Because + # automake fails if the first isn't a plain assignment, we need to resolve + # these situations when combining the files. The code below makes sure + # that there's always a plain assignment, whether it's one outside a + # conditional or the first append is changed to a simple assignment. + # + # We should consider extending this to support all macros that match + # automake's uniform naming convention. A true perl wizard probably + # would be able to do this in a single line of code. + + my %seen; + my %conditional_targets; + my %unconditional_targets; + my %first_instance_unconditional; + my $installable_headers; + my $installable_pkgconfig; + my $includedir; + my $project_name; + + ## To avoid unnecessarily emitting blank assignments, rip through the + ## Makefile.<project>.am files and check for conditions. + if (@locals) { + my $pfh = new FileHandle(); + foreach my $local (reverse @locals) { + if ($local =~ /Makefile\.(.*)\.am/) { + $project_name = $1; + } + else { + $project_name = 'nobase'; + } + + if (open($pfh, "$outdir/$local")) { + my $in_condition = 0; + my $regok = $self->escape_regex_special($project_name); + my $inc_pattern = $regok . '_include_HEADERS'; + my $pkg_pattern = $regok . '_pkginclude_HEADERS'; + while (<$pfh>) { + # Don't look at comments + next if (/^#/); + + $in_condition++ if (/^if\s*/); + $in_condition-- if (/^endif\s*/); + + if ( /(^[a-zA-Z][a-zA-Z0-9_]*_(PROGRAMS|LIBRARIES|LTLIBRARIES|LISP|PYTHON|JAVA|SCRIPTS|DATA|SOURCES|HEADERS|MANS|TEXINFOS|LIBADD|LDADD|DEPENDENCIES))\s*\+=\s*/ + || /(^CLEANFILES)\s*\+=\s*/ + || /(^EXTRA_DIST)\s*\+=\s*/ + ) { + + if ($in_condition) { + $conditional_targets{$1}++; + } else { + if (! $seen{$1} ) { + $first_instance_unconditional{$1} = 1; + } + $unconditional_targets{$1}++; + } + $seen{$1} = 1; + + $installable_pkgconfig= 1 if (/^pkgconfig_DATA/); + $installable_headers = 1 + if (/^$inc_pattern\s*\+=\s*/ || /^$pkg_pattern\s*\+=\s*/); + } + elsif (/includedir\s*=\s*(.*)/) { + $includedir = $1; + } + } + + close($pfh); + $in_condition = 0; + } + else { + $self->error("Unable to open $local for reading."); + } + } + } + + # + # Clear seen hash + # + %seen = (); + + ## Print out the Makefile.am. + my $wsHelper = WorkspaceHelper::get($self); + my $convert_header_name; + if ((!defined $includedir && $installable_headers) + || $installable_pkgconfig) { + if (!defined $includedir && $installable_headers) { + my $incdir = $wsHelper->modify_value('includedir', + $self->get_includedir()); + if ($incdir ne '') { + print $fh "includedir = \@includedir\@$incdir$crlf"; + $convert_header_name = 1; + } + } + if ($installable_pkgconfig) { + print $fh "pkgconfigdir = \@libdir\@/pkgconfig$crlf"; + } + + print $fh $crlf; + } + + if (@locals) { + my($status, $error) = $wsHelper->write_settings($self, $fh, @locals); + if (!$status) { + $self->error($error); + } + } + + ## Create the SUBDIRS setting. If there are associated projects, then + ## we will also set up conditionals for it as well. + if ($have_subdirs == 1) { + my $assoc = $self->get_associated_projects(); + my @aorder; + my %afiles; + my $entry = " \\$crlf "; + print $fh 'SUBDIRS ='; + foreach my $dir (reverse @dirs) { + my $found; + foreach my $akey (keys %$assoc) { + if (defined $$assoc{$akey}->{$dir}) { + if ($akey eq $cond) { + if ($toplevel) { + print $fh $entry, '@', $dir, '@'; + $found = 1; + } + } + else { + push(@aorder, $akey); + push(@{$afiles{$akey}}, $dir); + $found = 1; + } + last; + } + elsif ($toplevel && defined $$assoc{$akey}->{uc($dir)} && + $akey eq $cond) { + print $fh $entry, '@', uc($dir), '@'; + $found = 1; + last; + } + } + print $fh $entry, $dir if (!$found); + } + print $fh $crlf; + my $second = 1; + foreach my $aorder (@aorder) { + if (defined $afiles{$aorder}) { + $second = undef; + print $fh $crlf, + 'if BUILD_', uc($aorder), "\n", + 'SUBDIRS +='; + foreach my $afile (@{$afiles{$aorder}}) { + print $fh " $afile"; + } + delete $afiles{$aorder}; + print $fh $crlf, 'endif', $crlf; + } + } + print $fh $crlf if ($second); + } + + ## Now, for each target used in a conditional, emit a blank assignment + ## and mark that we've seen that target to avoid changing the += to = + ## as the individual files are pulled in. + if (%conditional_targets) { + my $primary; + my $count; + + while ( ($primary, $count) = each %conditional_targets) { + if (! $first_instance_unconditional{$primary} + && ($unconditional_targets{$primary} || ($count > 1))) + { + print $fh "$primary =$crlf"; + $seen{$primary} = 1; + } + } + + print $fh $crlf; + } + + ## Take the local Makefile.<project>.am files and insert each one here, + ## then delete it. + if (@locals) { + my $pfh = new FileHandle(); + my $liblocs = $self->get_lib_locations(); + my $here = $self->getcwd(); + my $start = $self->getstartdir(); + my %explicit; + foreach my $local (reverse @locals) { + if (open($pfh, "$outdir/$local")) { + print $fh "## $local", $crlf; + + my $look_for_libs = 0; + my $prev_line; + my $in_explicit; + + while (<$pfh>) { + # Don't emit comments + next if (/^#/); + + # Check for explicit targets + if ($in_explicit) { + if (/^\t/) { + next; + } + else { + $in_explicit = undef; + } + } + elsif (/^([\w\/\.\-\s]+):/) { + my $target = $1; + $target =~ s/^\s+//; + $target =~ s/\s+$//; + if (defined $explicit{$target}) { + $in_explicit = 1; + next; + } + else { + $explicit{$target} = 1; + } + } + + if ($convert_header_name) { + if ($local =~ /Makefile\.(.*)\.am/) { + $project_name = $1; + } + else { + $project_name = 'nobase'; + } + my $regok = $self->escape_regex_special($project_name); + my $inc_pattern = $regok . '_include_HEADERS'; + my $pkg_pattern = $regok . '_pkginclude_HEADERS'; + if (/^$inc_pattern\s*\+=\s*/ || /^$pkg_pattern\s*\+=\s*/) { + $_ =~ s/^$regok/nobase/; + } + } + + if ( /(^[a-zA-Z][a-zA-Z0-9_]*_(PROGRAMS|LIBRARIES|LTLIBRARIES|LISP|PYTHON|JAVA|SCRIPTS|DATA|SOURCES|HEADERS|MANS|TEXINFOS|LIBADD|LDADD|DEPENDENCIES))\s*\+=\s*/ + || /(^CLEANFILES)\s*\+=\s*/ + || /(^EXTRA_DIST)\s*\+=\s*/ + ) { + if (!defined ($seen{$1})) { + $seen{$1} = 1; + s/\+=/=/; + } + } + + ## This scheme relies on automake.mpd emitting the 'la' libs first. + ## Look for all the libXXXX.la, find out where they are located + ## relative to the start of the MPC run, and relocate the reference + ## to that location under $top_builddir. Unless the referred-to + ## library is in the current directory, then leave it undecorated + ## so the automake-generated dependency orders the build correctly. + if ($look_for_libs) { + my @libs = /\s+(lib(\w+).la)/gm; + my $libcount = @libs / 2; + for(my $i = 0; $i < $libcount; ++$i) { + my $libfile = $libs[$i * 2]; + my $libname = $libs[$i * 2 + 1]; + my $reldir = $$liblocs{$libname}; + + ## If we could not find a relative directory for this + ## library, it may be that it is a decorated library name. + ## We will search for an approximate match. + if (!defined $reldir) { + my $tmpname = $libname; + while($tmpname ne '') { + $tmpname = substr($tmpname, 0, length($tmpname) - 1); + if (defined $$liblocs{$tmpname}) { + $reldir = $$liblocs{$tmpname}; + $self->warning("Relative directory for $libname " . + "was approximated with $tmpname."); + last; + } + } + } + + if (defined $reldir) { + my $append = ($reldir eq '' ? '' : "/$reldir"); + if ("$start$append" ne $here) { + my $mod = $wsHelper->modify_libpath($_, $reldir, $libfile); + if (defined $mod) { + $_ = $mod; + } + else { + s/$libfile/\$(top_builddir)$append\/$libfile/; + } + } + } + else { + my $mod = $wsHelper->modify_libpath($_, $reldir, $libfile); + if (defined $mod) { + $_ = $mod; + } + else { + $self->warning("No reldir found for $libname ($libfile)."); + } + } + } + $look_for_libs = 0 if ($libcount == 0); + } + $look_for_libs = 1 if (/_LDADD = \\$/ || /_LIBADD = \\$/); + + ## I have introduced a one line delay so that I can simplify + ## the automake template. If our current line is empty, then + ## we will remove the trailing backslash before printing the + ## previous line. Automake is horribly unforgiving so we must + ## avoid this situation at all cost. + if (defined $prev_line) { + $prev_line =~ s/\s*\\$// if ($_ =~ /^\s*$/); + print $fh $prev_line; + } + $prev_line = $_; + } + ## The one line delay requires that we print out the previous + ## line (if there was one) when we reach the end of the file. + if (defined $prev_line) { + $prev_line =~ s/\s*\\$//; + print $fh $prev_line; + } + + close($pfh); + unlink("$outdir/$local"); + print $fh $crlf; + } + else { + $self->error("Unable to open $local for reading."); + } + } + } + + ## If this is the top-level Makefile.am, it needs the directives to pass + ## autoconf/automake flags down the tree when running autoconf. + ## *** This may be too closely tied to how we have things set up in ACE, + ## even though it's recommended practice. *** + if ($toplevel) { + my $m4inc = '-I m4'; + print $fh $crlf, + 'ACLOCAL = @ACLOCAL@', $crlf, + 'ACLOCAL_AMFLAGS = ', + (defined $wsHelper ? + $wsHelper->modify_value('amflags', $m4inc) : $m4inc), $crlf, + 'AUTOMAKE_OPTIONS = foreign', $crlf, $crlf, + (defined $wsHelper ? + $wsHelper->modify_value('extra', '') : ''); + } + + ## Finish up with the cleanup specs. + if (@locals) { + ## There is no reason to emit this if there are no local targets. + ## An argument could be made that it shouldn't be emitted in any + ## case because it could be handled by CLEANFILES or a verbatim + ## clause. + + print $fh '## Clean up template repositories, etc.', $crlf, + 'clean-local:', $crlf, + "\t-rm -f *~ *.bak *.rpo *.sym lib*.*_pure_* core core.*", + $crlf, + "\t-rm -f gcctemp.c gcctemp so_locations *.ics", $crlf, + "\t-rm -rf cxx_repository ptrepository ti_files", $crlf, + "\t-rm -rf templateregistry ir.out", $crlf, + "\t-rm -rf ptrepository SunWS_cache Templates.DB", $crlf; + } +} + + +sub get_includedir { + my $self = shift; + my $value = $self->getcwd(); + my $start = $self->getstartdir(); + + ## Take off the starting directory + $value =~ s/\Q$start\E//; + return $value; +} + + +sub edit_config_ac { + my($self, $file, $files) = @_; + my $fh = new FileHandle(); + my $status = 0; + + if (open($fh, $file)) { + my $crlf = $self->crlf(); + my @in; + my @lines; + my $assoc = $self->get_associated_projects(); + my $indent = ''; + my %proj_dir_seen; + my $in_config_files = 0; + + while(<$fh>) { + my $line = $_; + push(@lines, $line); + + ## Remove comments and trailing space + $line =~ s/\bdnl\s+.*//; + $line =~ s/\s+$//; + + if ($line eq '') { + } + elsif ($line =~ /^\s*if\s+test\s+["]?([^"]+)["]?\s*=\s*\w+;\s*then/) { + ## Entering an if test, save the name + my $name = $1; + $name =~ s/\s+$//; + $name =~ s/.*_build_//; + push(@in, $name); + } + elsif ($line =~ /^\s*if\s+test\s+-d\s+(.+);\s*then/) { + ## Entering an if test -d, save the name + my $name = $1; + $name =~ s/\s+$//; + $name =~ s/\$srcdir\///; + push(@in, $name); + } + elsif ($line =~ /^\s*fi$/) { + pop(@in); + } + elsif ($line =~ /^(\s*AC_CONFIG_FILES\s*\(\s*\[)/) { + ## Entering an AC_CONFIG_FILES section, start ignoring the entries + pop(@lines); + push(@lines, "$1\n"); + $indent = ' '; + if ($lines[$#lines] =~ /^(\s+)/) { + $indent .= $1; + } + $in_config_files = 1; + } + elsif ($in_config_files) { + if ($line =~ /(.*)\]\s*\).*/) { + ## We've reached the end of the AC_CONFIG_FILES section + my $olast = pop(@lines); + if ($olast =~ /^[^\s]+(\s*\]\s*\).*)/) { + $olast = $1; + } + ## Add in the Makefiles for this configuration + if ($#in < 0 && !defined $proj_dir_seen{'.'}) { + push(@lines, $indent . 'Makefile' . $crlf); + $proj_dir_seen{'.'} = 1; + } + + foreach my $dep (@$files) { + ## First things first, see if we've already seen this + ## project's directory. If we have, then there's nothing + ## else we need to do with it. + my $dep_dir = $self->mpc_dirname($dep); + if (!defined $proj_dir_seen{$dep_dir}) { + my $ok = 1; + my @dirs = split(/\//, $dep_dir); + my $base = $dep; + + if ($base =~ s/\/.*//) { + my $found = 0; + foreach my $akey (keys %$assoc) { + if (defined $$assoc{$akey}->{$base} || + defined $$assoc{$akey}->{uc($base)}) { + if ($#in >= 0) { + if (index($base, $in[0]) >= 0) { + if ($#in >= 1) { + $found = 1; + for(my $i = 0; $i <= $#in; $i++) { + if (!defined $dirs[$i] || + index($dirs[$i], $in[$i]) < 0) { + $found = 0; + last; + } + } + } + else { + ## We need to see into the future here. :-) + ## If the second element of @dirs matches an + ## association key, we'll guess that there will + ## be a "build" section devoted to it. + if (!defined $dirs[1] || + !defined $$assoc{$dirs[1]}) { + $found = 1; + } + } + } + } + else { + $found = 1; + } + last; + } + } + if ($#in >= 0) { + $ok = $found; + } + else { + $ok = !$found; + } + } + + if ($ok) { + $proj_dir_seen{$dep_dir} = 1; + my $inter_dir = ''; + foreach my $dep (@dirs) { + $inter_dir .= $dep; + if (!defined $proj_dir_seen{$inter_dir}) { + $proj_dir_seen{$inter_dir} = 1; + push(@lines, $indent . $inter_dir . "/Makefile$crlf"); + } + $inter_dir .= '/'; + } + push(@lines, $indent . $dep_dir . "/Makefile$crlf"); + } + } + } + push(@lines, $olast); + $in_config_files = 0; + } + else { + ## Ignore the entry + pop(@lines); + } + } + } + close($fh); + + ## Make a backup and create the new file + my $backup = $file . '.bak'; + if (copy($file, $backup)) { + my @buf = stat($file); + if (defined $buf[8] && defined $buf[9]) { + utime($buf[8], $buf[9], $backup); + } + if (open($fh, ">$file")) { + foreach my $line (@lines) { + print $fh $line; + } + close($fh); + $status = 1; + } + } + else { + $self->warning("Unable to create backup file: $backup"); + } + } + return $status; +} + +1; diff --git a/ACE/MPC/modules/BCB2007ProjectCreator.pm b/ACE/MPC/modules/BCB2007ProjectCreator.pm new file mode 100644 index 00000000000..298a09a9a6e --- /dev/null +++ b/ACE/MPC/modules/BCB2007ProjectCreator.pm @@ -0,0 +1,50 @@ +package BCB2007ProjectCreator; + +# ************************************************************ +# Description : The Borland C++ Builder 2007 Project Creator +# Author : Johnny Willemsen +# Create Date : 14/12/2005 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use ProjectCreator; +use BorlandProjectBase; +use XMLProjectBase; + +use vars qw(@ISA); +@ISA = qw(XMLProjectBase BorlandProjectBase ProjectCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub crlf { + #my $self = shift; + return "\n"; +} + + +sub project_file_extension { + #my $self = shift; + return '.cbproj'; +} + + +sub get_dll_exe_template_input_file { + #my $self = shift; + return 'bcb2007exe'; +} + + +sub get_dll_template_input_file { + #my $self = shift; + return 'bcb2007dll'; +} + + +1; diff --git a/ACE/MPC/modules/BCB2007WorkspaceCreator.pm b/ACE/MPC/modules/BCB2007WorkspaceCreator.pm new file mode 100644 index 00000000000..50a31cf7d89 --- /dev/null +++ b/ACE/MPC/modules/BCB2007WorkspaceCreator.pm @@ -0,0 +1,123 @@ +package BCB2007WorkspaceCreator; + +# ************************************************************ +# Description : A BCB2007 Workspace Creator +# Author : Johnny Willemsen +# Create Date : 14/12/2005 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use BCB2007ProjectCreator; +use WinWorkspaceBase; +use WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(WinWorkspaceBase WorkspaceCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub crlf { + #my $self = shift; + return "\n"; +} + + +sub compare_output { + #my $self = shift; + return 1; +} + + +sub workspace_file_extension { + #my $self = shift; + return '.groupproj'; +} + + +sub pre_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + ## This identifies it as a Borland C++Builder 2007 file + print $fh '<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">', $crlf; + + ## Optionally print the workspace comment +# $self->print_workspace_comment($fh, +# '<!-- $Id$ -->', $crlf, +# '<!-- MPC Command -->', $crlf, +# '<!-- ', $self->create_command_line_string($0, @ARGV), ' -->', +# $crlf); +} + + +sub write_comps { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + my $project_info = $self->get_project_info(); + my @projects = $self->sort_dependencies($self->get_projects(), 0); + + ## Print GUID and personality information + print $fh ' <PropertyGroup>', $crlf, + ' <ProjectGuid>{1946f85e-487f-46b6-8e41-159cd446db35}</ProjectGuid>', $crlf, + ' </PropertyGroup>', $crlf, + ' <ItemGroup />', $crlf, + ' <ItemGroup />', $crlf, + ' <ProjectExtensions>', $crlf, + ' <Borland.Personality>Default.Personality</Borland.Personality>', $crlf, + ' <Borland.ProjectType />', $crlf, + ' <BorlandProject>', $crlf, + ' <BorlandProject xmlns=""> <Default.Personality> </Default.Personality> </BorlandProject></BorlandProject>', $crlf, + ' </ProjectExtensions>', $crlf; + + ## Print the project targets + foreach my $project (@projects) { + my $name = $$project_info{$project}->[0]; + print $fh ' <Target Name="', $name, '">', $crlf, + ' <MSBuild Projects="', $self->mpc_basename($project), '" Targets="" />', $crlf, + ' </Target>', $crlf, + ' <Target Name="', $name, ':Make">', $crlf, + ' <MSBuild Projects="', $self->mpc_basename($project), '" Targets="Make" />', $crlf, + ' </Target>', $crlf, + ' <Target Name="', $name, ':Clean">', $crlf, + ' <MSBuild Projects="', $self->mpc_basename($project), '" Targets="Clean" />', $crlf, + ' </Target>', $crlf; + } + + ## Print the target build order + print $fh ' <Target Name="Build">', $crlf, + ' <CallTarget Targets="'; + foreach my $project (@projects) { + print $fh $$project_info{$project}->[0], ';'; + } + + ## Print the target make order + print $fh '" />', $crlf, + ' </Target>', $crlf, + ' <Target Name="Make">', $crlf, + ' <CallTarget Targets="'; + foreach my $project (@projects) { + print $fh $$project_info{$project}->[0], ':Make;'; + } + + ## Print the target clean order + print $fh '" />', $crlf, + ' </Target>', $crlf, + ' <Target Name="Clean">', $crlf, + ' <CallTarget Targets="'; + foreach my $project (@projects) { + print $fh $$project_info{$project}->[0], ':Clean;'; + } + print $fh '" />', $crlf, + ' </Target>', $crlf, + '</Project>', $crlf; +} + + +1; diff --git a/ACE/MPC/modules/BCB2009ProjectCreator.pm b/ACE/MPC/modules/BCB2009ProjectCreator.pm new file mode 100644 index 00000000000..ee2970d26bb --- /dev/null +++ b/ACE/MPC/modules/BCB2009ProjectCreator.pm @@ -0,0 +1,36 @@ +package BCB2009ProjectCreator; + +# ************************************************************ +# Description : The Borland C++ Builder 2009 Project Creator +# Author : Johnny Willemsen +# Create Date : 17/10/2008 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use BCB2007ProjectCreator; + +use vars qw(@ISA); +@ISA = qw(BCB2007ProjectCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub get_dll_exe_template_input_file { + #my $self = shift; + return 'bcb2009exe'; +} + + +sub get_dll_template_input_file { + #my $self = shift; + return 'bcb2009dll'; +} + + +1; diff --git a/ACE/MPC/modules/BCB2009WorkspaceCreator.pm b/ACE/MPC/modules/BCB2009WorkspaceCreator.pm new file mode 100644 index 00000000000..2c6c69d805c --- /dev/null +++ b/ACE/MPC/modules/BCB2009WorkspaceCreator.pm @@ -0,0 +1,36 @@ +package BCB2009WorkspaceCreator; + +# ************************************************************ +# Description : A BCB2009 Workspace Creator +# Author : Johnny Willemsen +# Create Date : 17/10/2008 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use BCB2007WorkspaceCreator; +use BCB2009ProjectCreator; + +use vars qw(@ISA); +@ISA = qw(BCB2007WorkspaceCreator); + +sub pre_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + ## This identifies it as a Borland C++Builder 2009 file + print $fh '<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">', $crlf; + + ## Optionally print the workspace comment +# $self->print_workspace_comment($fh, +# '<!-- $Id$ -->', $crlf, +# '<!-- MPC Command -->', $crlf, +# '<!-- ', $self->create_command_line_string($0, @ARGV), ' -->', +# $crlf); +} + +1; diff --git a/ACE/MPC/modules/BDS4ProjectCreator.pm b/ACE/MPC/modules/BDS4ProjectCreator.pm new file mode 100644 index 00000000000..a3fea2f90ad --- /dev/null +++ b/ACE/MPC/modules/BDS4ProjectCreator.pm @@ -0,0 +1,50 @@ +package BDS4ProjectCreator; + +# ************************************************************ +# Description : The Borland Developer Studio 4 Project Creator +# Author : Johnny Willemsen +# Create Date : 14/12/2005 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use ProjectCreator; +use BorlandProjectBase; +use XMLProjectBase; + +use vars qw(@ISA); +@ISA = qw(XMLProjectBase BorlandProjectBase ProjectCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub crlf { + #my $self = shift; + return "\n"; +} + + +sub project_file_extension { + #my $self = shift; + return '.bdsproj'; +} + + +sub get_dll_exe_template_input_file { + #my $self = shift; + return 'bds4exe'; +} + + +sub get_dll_template_input_file { + #my $self = shift; + return 'bds4dll'; +} + + +1; diff --git a/ACE/MPC/modules/BDS4WorkspaceCreator.pm b/ACE/MPC/modules/BDS4WorkspaceCreator.pm new file mode 100644 index 00000000000..b4ce3d4dca5 --- /dev/null +++ b/ACE/MPC/modules/BDS4WorkspaceCreator.pm @@ -0,0 +1,89 @@ +package BDS4WorkspaceCreator; + +# ************************************************************ +# Description : A BDS 4 Workspace Creator +# Author : Johnny Willemsen +# Create Date : 14/12/2005 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use BDS4ProjectCreator; +use WinWorkspaceBase; +use WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(WinWorkspaceBase WorkspaceCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub crlf { + #my $self = shift; + return "\n"; +} + + +sub compare_output { + #my $self = shift; + return 1; +} + + +sub workspace_file_extension { + #my $self = shift; + return '.bdsgroup'; +} + + +sub pre_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + ## This identifies it as a Borland Developer Studio 2006 file + print $fh '<?xml version="1.0" encoding="utf-8"?>', $crlf; + + ## Optionally print the workspace comment + $self->print_workspace_comment($fh, + '<!-- $Id$ -->', $crlf, + '<!-- MPC Command -->', $crlf, + '<!-- ', $self->create_command_line_string($0, @ARGV), ' -->', + $crlf); +} + + +sub write_comps { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + ## Print out the guid and the personality information + print $fh '<BorlandProject>', $crlf, + ' <PersonalityInfo>', $crlf, + ' <Option>', $crlf, + ' <Option Name="Personality">Default.Personality</Option>', $crlf, + ' <Option Name="ProjectType"></Option>', $crlf, + ' <Option Name="Version">1.0</Option>', $crlf, + ' <Option Name="GUID">{93D77FAD-C603-4FB1-95AB-34E0B6FBF615}</Option>', $crlf, + ' </Option>', $crlf, + ' </PersonalityInfo>', $crlf, + ' <Default.Personality>', $crlf, + ' <Projects>', $crlf; + + ## Print out the projects in the correct build order + foreach my $project ($self->sort_dependencies($self->get_projects(), 0)) { + print $fh ' <Projects Name="$project">$project</Projects>', $crlf; + } + + print $fh ' </Projects>', $crlf, + ' <Dependencies/>', $crlf, + ' </Default.Personality>', $crlf, + '</BorlandProject>', $crlf; +} + + +1; diff --git a/ACE/MPC/modules/BMakeProjectCreator.pm b/ACE/MPC/modules/BMakeProjectCreator.pm new file mode 100644 index 00000000000..6ef1e7f1ffc --- /dev/null +++ b/ACE/MPC/modules/BMakeProjectCreator.pm @@ -0,0 +1,111 @@ +package BMakeProjectCreator; + +# ************************************************************ +# Description : A BMake Project Creator +# Author : Chad Elliott +# Create Date : 2/03/2004 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use ProjectCreator; +use BorlandProjectBase; +use MakeProjectBase; + +use vars qw(@ISA); +@ISA = qw(MakeProjectBase BorlandProjectBase ProjectCreator); + +# ************************************************************ +# Data Section +# ************************************************************ + +my %names = ('cppdir' => 'source_files', + 'rcdir' => 'resource_files'); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub fill_value { + my($self, $name) = @_; + + if (defined $names{$name}) { + my %dirnames = ('.' => 1); + foreach my $file ($self->get_component_list($names{$name}, 1)) { + my $dirname = $self->mpc_dirname($file); + if ($dirname eq '') { + $dirname = '.'; + } + else { + $dirname =~ s/\//\\/g; + } + $dirnames{$dirname} = 1; + } + + ## Sort the directories to ensure that '.' comes first + return join(';', sort keys %dirnames); + } + + return undef; +} + + +sub get_and_symbol { + #my $self = shift; + return '&$(__TRICK_BORLAND_MAKE__)&'; +} + +sub project_file_extension { + #my $self = shift; + return '.bmak'; +} + + +sub get_dll_exe_template_input_file { + #my $self = shift; + return 'bmakedllexe'; +} + + +sub get_lib_exe_template_input_file { + #my $self = shift; + return 'bmakelibexe'; +} + + +sub get_lib_template_input_file { + #my $self = shift; + return 'bmakelib'; +} + + +sub get_dll_template_input_file { + #my $self = shift; + return 'bmakedll'; +} + + +sub get_properties { + my $self = shift; + + ## Create the map of properties that we support. + my $props = {}; + + ## Merge in properties from all base projects + foreach my $base (@ISA) { + my $func = $base . '::get_properties'; + my $p = $self->$func(); + foreach my $key (keys %$p) { + $$props{$key} = $$p{$key}; + } + } + + return $props; +} + + +1; diff --git a/ACE/MPC/modules/BMakeWorkspaceCreator.pm b/ACE/MPC/modules/BMakeWorkspaceCreator.pm new file mode 100644 index 00000000000..b5b67602b10 --- /dev/null +++ b/ACE/MPC/modules/BMakeWorkspaceCreator.pm @@ -0,0 +1,99 @@ +package BMakeWorkspaceCreator; + +# ************************************************************ +# Description : A Borland Make Workspace (Makefile) creator +# Author : Chad Elliott +# Create Date : 2/03/2004 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use BMakeProjectCreator; +use MakeWorkspaceBase; +use WinWorkspaceBase; +use WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(MakeWorkspaceBase WinWorkspaceBase WorkspaceCreator); + +# ************************************************************ +# Data Section +# ************************************************************ + +## Borland Make's maximum line length +my $max_line_length = 32767; +my $targets = 'clean generated realclean $(CUSTOM_TARGETS)'; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub workspace_file_extension { + #my $self = shift; + return '.bmak'; +} + + +sub workspace_file_name { + my $self = shift; + return $self->get_modified_workspace_name('Makefile', '.bmak'); +} + + +sub pre_workspace { + my($self, $fh) = @_; + $self->workspace_preamble($fh, $self->crlf(), + 'Borland Workspace Makefile', + '$Id$'); +} + + +sub write_project_targets { + my($self, $fh, $crlf, $target, $list, $and) = @_; + my $cwd = $self->getcwd(); + + ## Print out a make command for each project + foreach my $project (@$list) { + my $dir = $self->mpc_dirname($project); + $dir =~ s/\//\\/g; + my $chdir = ($dir ne '.'); + + print $fh "\t", ($chdir ? "\$(COMSPEC) /c \"cd $dir $and " : ''), + "\$(MAKE) -\$(MAKEFLAGS) -f ", + $self->mpc_basename($project), " $target", + ($chdir ? '"' : ''), $crlf; + } +} + + +sub write_comps { + my($self, $fh, $creator) = @_; + my %targnum; + my $pjs = $self->get_project_info(); + my @list = $self->number_target_deps($self->get_projects(), $pjs, + \%targnum, 0); + my $crlf = $self->crlf(); + + ## Set up the custom targets + print $fh '!ifndef CUSTOM_TARGETS', $crlf, + 'CUSTOM_TARGETS=_EMPTY_TARGET_', $crlf, + '!endif', $crlf; + + ## Translate each project name + my %trans; + foreach my $project (@list) { + $trans{$project} = $$pjs{$project}->[0]; + } + + ## Send all the information to our base class method + $self->write_named_targets($fh, $crlf, \%targnum, \@list, + $targets, '', '', \%trans, undef, + $creator->get_and_symbol(), $max_line_length); +} + + +1; diff --git a/ACE/MPC/modules/BorlandProjectBase.pm b/ACE/MPC/modules/BorlandProjectBase.pm new file mode 100644 index 00000000000..396e24ef416 --- /dev/null +++ b/ACE/MPC/modules/BorlandProjectBase.pm @@ -0,0 +1,36 @@ +package BorlandProjectBase; + +# ************************************************************ +# Description : A Borland base module for Borland Project Creators +# Author : Chad Elliott +# Create Date : 5/5/2009 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; +use WinProjectBase; + +our @ISA = qw(WinProjectBase); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub get_properties { + my $self = shift; + + ## Get the base class properties and add the properties that we + ## support. + my $props = $self->WinProjectBase::get_properties(); + + ## All projects that use this base class are for Borland compilers. + $$props{'borland'} = 1; + + return $props; +} + + +1; diff --git a/ACE/MPC/modules/CCProjectCreator.pm b/ACE/MPC/modules/CCProjectCreator.pm new file mode 100644 index 00000000000..f154ca46187 --- /dev/null +++ b/ACE/MPC/modules/CCProjectCreator.pm @@ -0,0 +1,62 @@ +package CCProjectCreator; + +# ************************************************************ +# Description : A Code Composer Project Creator +# Author : Chad Elliott +# Create Date : 9/18/2006 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use ProjectCreator; +use WinProjectBase; + +use vars qw(@ISA); +@ISA = qw(WinProjectBase ProjectCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub compare_output { + #my $self = shift; + return 1; +} + + +sub override_valid_component_extensions { + my $self = shift; + my $comp = shift; + my @array = @_; + + if ($comp eq 'source_files' && $self->languageIs(Creator::cplusplus)) { + push(@array, "\\.cdb"); + } + + return \@array; +} + + +sub project_file_extension { + #my $self = shift; + return '.pjt'; +} + + +sub get_dll_exe_template_input_file { + #my $self = shift; + return 'ccexe'; +} + + +sub get_dll_template_input_file { + #my $self = shift; + return 'cclib'; +} + + +1; diff --git a/ACE/MPC/modules/CCWorkspaceCreator.pm b/ACE/MPC/modules/CCWorkspaceCreator.pm new file mode 100644 index 00000000000..5cb7bf7200d --- /dev/null +++ b/ACE/MPC/modules/CCWorkspaceCreator.pm @@ -0,0 +1,117 @@ +package CCWorkspaceCreator; + +# ************************************************************ +# Description : A Code Composer Workspace creator +# Author : Chad Elliott +# Create Date : 9/18/2006 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use CCProjectCreator; +use WinWorkspaceBase; +use WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(WinWorkspaceBase WorkspaceCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub compare_output { + #my $self = shift; + return 1; +} + + +sub workspace_file_extension { + #my $self = shift; + return '.code_composer'; +} + + +sub write_comps { + my($self, $fh, $creator) = @_; + my $crlf = $self->crlf(); + + ## Workspace only consists of the name of the project. Really, Code + ## Composer doesn't use a workspace. Each project contains the + ## dependencies. + foreach my $project ($self->sort_dependencies($self->get_projects(), 0)) { + print $fh "$project$crlf"; + $self->add_dependencies($creator, $project); + } +} + + +sub add_dependencies { + my($self, $creator, $proj) = @_; + my $fh = new FileHandle(); + my $outdir = $self->get_outdir(); + $outdir = $self->getcwd() if ($outdir eq '.'); + + if (open($fh, "$outdir/$proj")) { + my @read; + my $write; + my $cwd = $self->getcwd(); + while(<$fh>) { + ## This is a comment found in cc.mpd if the project contains the + ## 'after' keyword setting. + if (/MPC\s+ADD\s+DEPENDENCIES/) { + my @projs; + my $crlf = $self->crlf(); + my $deps = $self->get_validated_ordering($proj); + foreach my $dep (@$deps) { + my $relative = $self->get_relative_dep_file($creator, + "$cwd/$proj", $dep); + if (defined $relative) { + if (!$write) { + ## Indicate that we need to re-write the file and add in + ## the start of the project dependencies section + $write = 1; + push(@read, "[Project Dependencies]$crlf"); + } + + ## Add in the dependency and save the project name for later. + push(@read, "Source=\"$relative\"$crlf"); + push(@projs, $relative); + } + } + if ($write) { + ## Finish off the dependency information for the current + ## project. + push(@read, $crlf); + foreach my $proj (@projs) { + push(@read, "[\"$proj\" Settings]$crlf", + "MatchConfigName=true$crlf", $crlf); + } + } + else { + ## We don't need to re-write the file, so we can stop reading + ## it. + last; + } + } + else { + ## Save the line to possibly be written out at the end. + push(@read, $_); + } + } + close($fh); + + ## If we need to re-write the file, then do so + if ($write && open($fh, ">$outdir/$proj")) { + foreach my $line (@read) { + print $fh $line; + } + close($fh); + } + } +} + +1; diff --git a/ACE/MPC/modules/CommandHelper.pm b/ACE/MPC/modules/CommandHelper.pm new file mode 100644 index 00000000000..f632944ab8d --- /dev/null +++ b/ACE/MPC/modules/CommandHelper.pm @@ -0,0 +1,96 @@ +package CommandHelper; + +# ************************************************************ +# Description : Base class and factory for all command helpers. +# +# The get() method converts the define custom type +# provided to uppercase, removes the '_FILES' portion and +# adds 'Helper' to the end. If a module is found matching +# that name, it will be used to assist the ProjectCreator +# in determining which output files will be generated by +# the command given the file name and command options. +# +# Author : Chad Elliott +# Create Date : 6/30/2008 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; +use File::Basename; + +# ************************************************************ +# Data Section +# ************************************************************ + +my %required; +my %notfound; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub get { + ## Create the helper name + my $type = uc(shift); + $type =~ s/_FILES$/Helper/; + + ## Don't search the filesystem again if we didn't find one the first + ## time we looked. + return undef if ($notfound{$type}); + + ## Return the helper if we've already created one + return $required{$type} if (defined $required{$type}); + + ## Assist users in figuring out why their helper isn't being picked up. + OutputMessage::debug(undef, "Searching @INC for $type.pm"); + + ## If we can find a helper with this name, we will + ## create a singleton of that type and return it. + foreach my $inc (@INC) { + if (-r "$inc/$type.pm") { + require "$type.pm"; + $required{$type} = $type->new(); + return $required{$type}; + } + } + + ## We didn't find a helper. Keep track of that fact and return undef. + $notfound{$type} = 1; + return undef; +} + +sub new { + my $class = shift; + return bless {}, $class; +} + +sub get_output { + ## This method is called with the filename and command options and + ## expects an array reference containing filenames that will be + ## generated, but can not be described using the normal Define_Custom + ## syntax. + return []; +} + +sub get_outputexts { + ## This method is expected to return an array reference containing the + ## extensions for files returned by the get_output() method. They will + ## be used as regular expressions so regular expression characters + ## (such as '.', '[', ']', etc.) must be escaped. + return []; +} + +sub get_tied { + ## This method is called with a file name and an array reference of + ## files. The first expected return value is an array reference of those + ## files listed in the passed array reference that are in some way tied + ## to the file name passed in. The second is a component name to help + ## MPC figure out a way to tie the files together. The result of "tied" + ## files is that they may be compiled after the file name passed in. + return [], undef; +} + +1; diff --git a/ACE/MPC/modules/ConfigParser.pm b/ACE/MPC/modules/ConfigParser.pm new file mode 100644 index 00000000000..ae90bb35104 --- /dev/null +++ b/ACE/MPC/modules/ConfigParser.pm @@ -0,0 +1,129 @@ +package ConfigParser; + +# ************************************************************ +# Description : Reads a generic config file and store the values +# Author : Chad Elliott +# Create Date : 6/12/2006 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use Parser; + +use vars qw(@ISA); +@ISA = qw(Parser); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + my($class, $valid) = @_; + my $self = $class->SUPER::new(); + + ## Set up the internal data members + $self->{'values'} = {}; + $self->{'clean'} = {}; + $self->{'valid'} = $valid; + $self->{'warned'} = {}; + + return $self; +} + + +sub parse_line { + my($self, $if, $line) = @_; + my $error; + + if ($line eq '') { + } + elsif ($line =~ /^([^=]+)\s*=\s*(.*)$/) { + ## Save the name, removing any trailing white space, and the value + ## too. + my $name = $1; + my $clean = $2; + $name =~ s/\s+$//; + + ## Pre-process the name and value + my $value = $self->preprocess($clean); + $name = $self->preprocess($name); + $name =~ s/\\/\//g; + + ## Store the name value pair + if (!defined $self->{'valid'}) { + ## There are no valid names, so all names are valid, except an + ## empty name. + if ($name ne '') { + $self->{'values'}->{$name} = $value; + $self->{'clean'}->{$name} = $clean; + } + } + elsif (defined $self->{'valid'}->{lc($name)}) { + ## This is a valid value, so we can store it. + $self->{'values'}->{lc($name)} = $value; + $self->{'clean'}->{lc($name)} = $clean; + } + else { + $error = "Invalid keyword: $name"; + } + } + else { + $error = "Unrecognized line: $line"; + } + + return (defined $error ? 0 : 1), $error; +} + + +sub get_names { + my @names = keys %{$_[0]->{'values'}}; + return \@names; +} + + +sub get_value { + ## Try the tag first and if that doesn't work make it all lower-case. + my($self, $tag) = @_; + return $self->{'values'}->{$tag} || $self->{'values'}->{lc($tag)}; +} + + +sub get_unprocessed { + ## Try the tag first and if that doesn't work make it all lower-case. + my($self, $tag) = @_; + return $self->{'clean'}->{$tag} || $self->{'clean'}->{lc($tag)}; +} + + +sub preprocess { + my($self, $str) = @_; + + ## We need to replace $(...) with the equivalent environment variable + ## value. + while($str =~ /\$([\(\w\)]+)/) { + my $name = $1; + $name =~ s/[\(\)]//g; + my $val = $ENV{$name}; + + ## If the environment variable is not set, we will end up removing + ## the reference, but we need to warn the user that we're doing so. + if (!defined $val) { + $val = ''; + if (!defined $self->{'warned'}->{$name}) { + $self->diagnostic("$name was used in the configuration file, " . + "but was not defined."); + $self->{'warned'}->{$name} = 1; + } + } + + ## Do the replacement + $str =~ s/\$([\(\w\)]+)/$val/; + } + return $str; +} + +1; diff --git a/ACE/MPC/modules/Creator.pm b/ACE/MPC/modules/Creator.pm new file mode 100644 index 00000000000..a3566b5d1d2 --- /dev/null +++ b/ACE/MPC/modules/Creator.pm @@ -0,0 +1,1310 @@ +package Creator; + +# ************************************************************ +# Description : Base class for workspace and project creators +# Author : Chad Elliott +# Create Date : 5/13/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; +use FileHandle; +use File::Compare; + +use Parser; + +use vars qw(@ISA); +@ISA = qw(Parser); + +# ************************************************************ +# Data Section +# ************************************************************ + +## Constants for use throughout the project +use constant cplusplus => 'cplusplus'; +use constant csharp => 'csharp'; +use constant java => 'java'; +use constant vb => 'vb'; +use constant website => 'website'; + +## The default language for MPC +my $deflang = 'cplusplus'; + +## A map of all of the allowed languages. The 'website' value +## is not here because it isn't really a language. It is used +## as a language internally by some project types though. +my %languages = (cplusplus => 1, + csharp => 1, + java => 1, + vb => 1, + ); + +my $assign_key = 'assign'; +my $gassign_key = 'global_assign'; +my %non_convert = ('prebuild' => 1, + 'postbuild' => 1, + 'postclean' => 1, + ); +my @statekeys = ('global', 'include', 'template', 'ti', + 'dynamic', 'static', 'relative', 'addtemp', + 'addproj', 'progress', 'toplevel', 'baseprojs', + 'features', 'feature_file', 'hierarchy', + 'name_modifier', 'apply_project', 'into', 'use_env', + 'expand_vars', 'language', + ); + +my %all_written; +my $onVMS = DirectoryManager::onVMS(); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + my($class, $global, $inc, $template, $ti, $dynamic, $static, $relative, $addtemp, $addproj, $progress, $toplevel, $baseprojs, $feature, $features, $hierarchy, $nmodifier, $applypj, $into, $language, $use_env, $expandvars, $type) = @_; + my $self = Parser::new($class, $inc); + + $self->{'relative'} = $relative; + $self->{'template'} = $template; + $self->{'ti'} = $ti; + $self->{'global'} = $global; + $self->{'grammar_type'} = $type; + $self->{'type_check'} = $type . '_defined'; + $self->{'global_read'} = 0; + $self->{'current_input'} = ''; + $self->{'progress'} = $progress; + $self->{'addtemp'} = $addtemp; + $self->{'addproj'} = $addproj; + $self->{'toplevel'} = $toplevel; + $self->{'files_written'} = {}; + $self->{'real_fwritten'} = []; + $self->{'reading_global'} = 0; + $self->{$gassign_key} = {}; + $self->{$assign_key} = {}; + $self->{'baseprojs'} = $baseprojs; + $self->{'dynamic'} = $dynamic; + $self->{'static'} = $static; + $self->{'feature_file'} = $feature; + $self->{'features'} = $features; + $self->{'hierarchy'} = $hierarchy; + $self->{'name_modifier'} = $nmodifier; + $self->{'apply_project'} = $applypj; + $self->{'into'} = $into; + $self->{'language'} = defined $language ? $language : $deflang; + $self->{'use_env'} = $use_env; + $self->{'expand_vars'} = $expandvars; + $self->{'convert_slashes'} = $self->convert_slashes(); + $self->{'requires_forward_slashes'} = $self->requires_forward_slashes(); + $self->{'case_tolerant'} = $self->case_insensitive(); + + return $self; +} + + +sub preprocess_line { + my($self, $fh, $line) = @_; + + $line = $self->strip_line($line); + while ($line =~ /\\$/) { + $line =~ s/\s*\\$/ /; + my $next = $fh->getline(); + $line .= $self->strip_line($next) if (defined $next); + } + return $line; +} + + +sub generate_default_input { + my $self = shift; + my($status, + $error) = $self->parse_line(undef, "$self->{'grammar_type'} {"); + + ## Parse the finish line if there was no error + ($status, $error) = $self->parse_line(undef, '}') if ($status); + + ## Display the error if there was one + $self->error($error) if (!$status); + + return $status; +} + + +sub parse_file { + my($self, $input) = @_; + + ## Save the last line number so we can put it back later + my $oline = $self->get_line_number(); + + ## Read the input file + my($status, $errorString) = $self->read_file($input); + + if (!$status) { + $self->error($errorString, + "$input: line " . $self->get_line_number() . ':'); + } + elsif ($self->{$self->{'type_check'}}) { + ## If we are at the end of the file and the type we are looking at + ## is still defined, then we have an error + $self->error("Did not " . + "find the end of the $self->{'grammar_type'}", + "$input: line " . $self->get_line_number() . ':'); + $status = 0; + } + $self->set_line_number($oline); + + return $status; +} + + +sub generate { + my($self, $input) = @_; + my $status = 1; + + ## Reset the files_written hash array between processing each file + $self->{'files_written'} = {}; + $self->{'real_fwritten'} = []; + + ## Allow subclasses to reset values before + ## each call to generate(). + $self->reset_values(); + + ## Read the global configuration file + if (!$self->{'global_read'}) { + $status = $self->read_global_configuration(); + $self->{'global_read'} = 1; + } + + if ($status) { + $self->{'current_input'} = $input; + + ## An empty input file name says that we + ## should generate a default input file and use that + if ($input eq '') { + $status = $self->generate_default_input(); + } + else { + $status = $self->parse_file($input); + } + } + + return $status; +} + + +sub parse_known { + my($self, $line) = @_; + my $status = 1; + my $errorString; + my $type = $self->{'grammar_type'}; + my @values; + + ## + ## Each regexp that looks for the '{' looks for it at the + ## end of the line. It is purposely this way to decrease + ## the amount of extra lines in each file. This + ## allows for the most compact file as human readably + ## possible. + ## + if ($line eq '') { + } + elsif ($line =~ /^$type\s*(\([^\)]+\))?\s*(:.*)?\s*{$/) { + my $name = $1; + my $parents = $2; + if ($self->{$self->{'type_check'}}) { + $errorString = "Did not find the end of the $type"; + $status = 0; + } + else { + if (defined $parents) { + $parents =~ s/^:\s*//; + $parents =~ s/\s+$//; + my @parents = split(/\s*,\s*/, $parents); + if (!defined $parents[0]) { + ## The : was used, but no parents followed. This + ## is an error. + $errorString = 'No parents listed'; + $status = 0; + } + $parents = \@parents; + } + push(@values, $type, $name, $parents); + } + } + elsif ($line =~ /^}$/) { + if ($self->{$self->{'type_check'}}) { + push(@values, $type, $line); + } + else { + $errorString = "Did not find the beginning of the $type"; + $status = 0; + } + } + elsif ($line =~ /^(feature)\s*\(([^\)]+)\)\s*(:.*)?\s*{$/) { + my $type = $1; + my $name = $2; + my $parents = $3; + my @names = split(/\s*,\s*/, $name); + + if (defined $parents) { + $parents =~ s/^:\s*//; + $parents =~ s/\s+$//; + my @parents = split(/\s*,\s*/, $parents); + if (!defined $parents[0]) { + ## The : was used, but no parents followed. This + ## is an error. + $errorString = 'No parents listed'; + $status = 0; + } + $parents = \@parents; + } + push(@values, $type, \@names, $parents); + } + elsif (!$self->{$self->{'type_check'}}) { + $errorString = "No $type was defined"; + $status = 0; + } + elsif ($self->parse_assignment($line, \@values)) { + ## If this returns true, then we've found an assignment + } + elsif ($line =~ /^(\w+)\s*(\([^\)]+\))?\s*{$/) { + my $comp = lc($1); + my $name = $2; + + if (defined $name) { + $name =~ s/^\(\s*//; + $name =~ s/\s*\)$//; + } + else { + $name = $self->get_default_component_name(); + } + push(@values, 'component', $comp, $name); + } + else { + $errorString = "Unrecognized line: $line"; + $status = -1; + } + + return $status, $errorString, @values; +} + + +sub parse_scope { + my($self, $fh, $name, $type, $validNames, $flags, $elseflags) = @_; + my $status = 0; + my $errorString = "Unable to process $name"; + + ## Make sure $flags has a hash map reference + $flags = {} if (!defined $flags); + + while(<$fh>) { + my $line = $self->preprocess_line($fh, $_); + + if ($line eq '') { + } + elsif ($line =~ /^}$/) { + ($status, $errorString) = $self->handle_scoped_end($type, $flags); + last; + } + elsif ($line =~ /^}\s*else\s*{$/) { + if (defined $elseflags) { + ## From here on out anything after this goes into the $elseflags + $flags = $elseflags; + $elseflags = undef; + + ## We need to adjust the type also. If there was a type + ## then the first part of the clause was used. If there was + ## no type, then the first part was ignored and the second + ## part will be used. + if (defined $type) { + $type = undef; + } + else { + $type = $self->get_default_component_name(); + } + } + else { + $status = 0; + $errorString = 'An else is not allowed in this context'; + last; + } + } + else { + my @values; + if (defined $validNames && $self->parse_assignment($line, \@values)) { + if (defined $$validNames{$values[1]}) { + ## If $type is not defined, we don't even need to bother with + ## processing the assignment as we will be throwing the value + ## away anyway. + if (defined $type) { + if ($values[0] == 0) { + $self->process_assignment($values[1], $values[2], $flags); + } + elsif ($values[0] == 1) { + $self->process_assignment_add($values[1], $values[2], $flags); + } + elsif ($values[0] == -1) { + $self->process_assignment_sub($values[1], $values[2], $flags); + } + } + } + else { + ($status, + $errorString) = $self->handle_unknown_assignment($type, + @values); + last if (!$status); + } + } + else { + ($status, $errorString) = $self->handle_scoped_unknown($fh, + $type, + $flags, + $line); + last if (!$status); + } + } + } + return $status, $errorString; +} + + +sub base_directory { + my $self = shift; + return $self->mpc_basename($self->getcwd()); +} + + +sub generate_default_file_list { + my($self, $dir, $exclude, $fileexc, $recurse) = @_; + my $dh = new FileHandle(); + my @files; + + if (opendir($dh, $dir)) { + my $prefix = ($dir ne '.' ? "$dir/" : ''); + my $have_exc = (defined $$exclude[0]); + my $skip = 0; + foreach my $file (grep(!/^\.\.?$/, + ($onVMS ? map {$_ =~ s/\.dir$//; $_} readdir($dh) : + readdir($dh)))) { + ## Prefix each file name with the directory only if it's not '.' + my $full = $prefix . $file; + + if ($have_exc) { + foreach my $exc (@$exclude) { + if ($full eq $exc) { + $skip = 1; + last; + } + } + } + + if ($skip) { + $skip = 0; + $$fileexc = 1 if (defined $fileexc); + } + else { + if ($recurse && -d $full) { + push(@files, + $self->generate_default_file_list($full, $exclude, + $fileexc, $recurse)); + } + else { + # Strip out ^ symbols + $full =~ s/\^//g if ($onVMS); + + push(@files, $full); + } + } + } + + if ($self->sort_files()) { + @files = sort { $self->file_sorter($a, $b) } @files; + } + + closedir($dh); + } + return @files; +} + + +sub transform_file_name { + my($self, $name) = @_; + + $name =~ s/[\s\-]/_/g; + return $name; +} + + +sub file_written { + my($self, $file) = @_; + return (defined $all_written{$self->getcwd() . '/' . $file}); +} + + +sub add_file_written { + my($self, $file) = @_; + my $key = lc($file); + + if (defined $self->{'files_written'}->{$key}) { + $self->warning("$self->{'grammar_type'} $file " . + ($self->{'case_tolerant'} ? + "has been overwritten." : + "of differing case has been processed.")); + } + else { + $self->{'files_written'}->{$key} = $file; + push(@{$self->{'real_fwritten'}}, $file); + } + + $all_written{$self->getcwd() . '/' . $file} = 1; +} + + +sub extension_recursive_input_list { + my($self, $dir, $exclude, $ext) = @_; + my $fh = new FileHandle(); + my @files; + + if (opendir($fh, $dir)) { + my $prefix = ($dir ne '.' ? "$dir/" : ''); + my $skip = 0; + foreach my $file (grep(!/^\.\.?$/, + ($onVMS ? map {$_ =~ s/\.dir$//; $_} readdir($fh) : + readdir($fh)))) { + my $full = $prefix . $file; + + ## Check for command line exclusions + if (defined $$exclude[0]) { + foreach my $exc (@$exclude) { + if ($full eq $exc) { + $skip = 1; + last; + } + } + } + + ## If we are not skipping this directory or file, then check it out + if ($skip) { + $skip = 0; + } + else { + if (-d $full) { + push(@files, $self->extension_recursive_input_list($full, + $exclude, + $ext)); + } + elsif ($full =~ /$ext$/) { + push(@files, $full); + } + } + } + closedir($fh); + } + + return @files; +} + +sub recursive_directory_list { + my($self, $dir, $exclude) = @_; + my $directories = ''; + my $fh = new FileHandle(); + + if (opendir($fh, $dir)) { + my $prefix = ($dir ne '.' ? "$dir/" : ''); + my $skip = 0; + if (defined $$exclude[0]) { + foreach my $exc (@$exclude) { + if ($dir eq $exc) { + $skip = 1; + last; + } + } + } + if ($skip) { + $skip = 0; + } + else { + $directories .= ' ' . $dir; + } + + foreach my $file (grep(!/^\.\.?$/, + ($onVMS ? map {$_ =~ s/\.dir$//; $_} readdir($fh) : + readdir($fh)))) { + my $full = $prefix . $file; + + if ($file eq '.svn' || $file eq 'CVS') { + $skip = 1; + } + else { + ## Check for command line exclusions + if (defined $$exclude[0]) { + foreach my $exc (@$exclude) { + if ($full eq $exc) { + $skip = 1; + last; + } + } + } + } + + ## If we are not skipping this directory or file, then check it out + if ($skip) { + $skip = 0; + } + else { + if (-d $full) { + $directories .= $self->recursive_directory_list($full, $exclude); + } + } + } + closedir($fh); + } + + return $directories; +} + + +sub modify_assignment_value { + my($self, $name, $value) = @_; + + if ($self->{'convert_slashes'} && + index($name, 'flags') == -1 && !defined $non_convert{$name}) { + $value =~ s/\//\\/g; + } + + return $value; +} + + +sub get_assignment_hash { + ## NOTE: If anything in this block changes, then you must make the + ## same change in process_assignment. + my $self = shift; + return $self->{$self->{'reading_global'} ? $gassign_key : $assign_key}; +} + + +sub process_assignment { + my($self, $name, $value, $assign) = @_; + + ## If no hash table was passed in + if (!defined $assign) { + ## NOTE: If anything in this block changes, then you must make the + ## same change in get_assignment_hash. + $assign = $self->{$self->{'reading_global'} ? + $gassign_key : $assign_key}; + } + + if (defined $value) { + $value =~ s/^\s+//; + $value =~ s/\s+$//; + + ## Modify the assignment value before saving it + $$assign{$name} = $self->modify_assignment_value($name, $value); + } + else { + $$assign{$name} = undef; + } +} + + +sub addition_core { + my($self, $name, $value, $nval, $assign) = @_; + + if (defined $nval) { + if ($self->preserve_assignment_order($name)) { + $nval .= " $value"; + } + else { + $nval = "$value $nval"; + } + } + else { + $nval = $value; + } + $self->process_assignment($name, $nval, $assign, 1); +} + + +sub process_assignment_add { + my($self, $name, $value, $assign) = @_; + my $nval = $self->get_assignment_for_modification($name, $assign); + + ## Remove all duplicate parts from the value to be added. + ## Whether anything gets removed or not is up to the implementation + ## of the sub classes. + $value = $self->remove_duplicate_addition($name, $value, $nval); + + ## If there is anything to add, then do so + $self->addition_core($name, $value, $nval, $assign) if ($value ne ''); +} + + +sub subtraction_core { + my($self, $name, $value, $nval, $assign) = @_; + + if (defined $nval) { + my $last = 1; + my $found; + + ## Escape any regular expression special characters + $value = $self->escape_regex_special($value); + + ## If necessary, split the value into an array + my $elements = ($value =~ /\s/ ? $self->create_array($value) : [$value]); + for(my $i = 0; $i <= $last; $i++) { + if ($i == $last) { + ## If we did not find the string to subtract in the original + ## value, try again after expanding template variables for + ## subtraction. + $nval = $self->get_assignment_for_modification($name, $assign, 1); + } + for(my $j = 0; $j <= $last; $j++) { + ## Try to remove each individual element and then set the new + ## value if any of the elements were found in the original value + foreach my $elem (@$elements) { + ## First try with quotes, then try again without them + my $re = ($j == 0 ? '"' . $elem . '"' : $elem); + + if ($nval =~ s/\s+$re\s+/ / || $nval =~ s/\s+$re$// || + $nval =~ s/^$re\s+// || $nval =~ s/^$re$//) { + $found = 1; + } + } + if ($found) { + $self->process_assignment($name, $nval, $assign, -1); + last; + } + } + last if ($found); + } + } +} + + +sub process_assignment_sub { + my($self, $name, $value, $assign) = @_; + my $nval = $self->get_assignment_for_modification($name, $assign); + + ## Remove double quotes if there are any + $value =~ s/^\"(.*)\"$/$1/; + + $self->subtraction_core($name, $value, $nval, $assign); +} + + +sub fill_type_name { + my($self, $names, $def) = @_; + my $array = ($names =~ /\s/ ? $self->create_array($names) : [$names]); + + $names = ''; + foreach my $name (@$array) { + if ($name =~ /\*/) { + my $pre = $def . '_'; + my $mid = '_' . $def . '_'; + my $post = '_' . $def; + + ## Replace the beginning and end first then the middle + $name =~ s/^\*/$pre/; + $name =~ s/\*$/$post/; + $name =~ s/\*/$mid/g; + + ## Remove any trailing underscore or any underscore that is followed + ## by a space. This value could be a space separated list. + $name =~ s/_$//; + $name =~ s/_\s/ /g; + $name =~ s/\s_/ /g; + + ## If any one word is capitalized then capitalize each word + if ($name =~ /[A-Z][0-9a-z_]+/) { + ## Do the first word + if ($name =~ /^([a-z])([^_]+)/) { + my $first = uc($1); + my $rest = $2; + $name =~ s/^[a-z][^_]+/$first$rest/; + } + ## Do subsequent words + while($name =~ /(_[a-z])([^_]+)/) { + my $first = uc($1); + my $rest = $2; + $name =~ s/_[a-z][^_]+/$first$rest/; + } + } + } + + $names .= $name . ' '; + } + $names =~ s/\s+$//; + + return $names; +} + + +sub clone { + my($self, $obj) = @_; + + ## Check for various types of data. Those that are not found to be + ## types that we need to deep copy are just assigned to new values. + ## All others are copied by recursively calling this method. + if (UNIVERSAL::isa($obj, 'HASH')) { + my $new = {}; + foreach my $key (keys %$obj) { + $$new{$key} = $self->clone($$obj{$key}); + } + return $new; + } + elsif (UNIVERSAL::isa($obj, 'ARRAY')) { + my $new = []; + foreach my $o (@$obj) { + push(@$new, $self->clone($o)); + } + return $new; + } + + return $obj; +} + + +sub save_state { + my($self, $selected) = @_; + my %state; + + ## Make a deep copy of each state value. That way our array + ## references and hash references do not get accidentally modified. + foreach my $skey (defined $selected ? $selected : @statekeys) { + if (defined $self->{$skey}) { + ## It is necessary to clone each value so that nested complex data + ## types do not get unknowingly modified. + $state{$skey} = $self->clone($self->{$skey}); + } + } + + return %state; +} + + +sub restore_state { + my($self, $state, $selected) = @_; + + ## Make a deep copy of each state value. That way our array + ## references and hash references do not get accidentally modified. + ## It's not necessary to do a recursive deep copy (i.e., use the + ## clone() method) because the value coming in will now be owned by + ## this object and will not be modified unknowingly. + foreach my $skey (defined $selected ? $selected : @statekeys) { + my $old = $self->{$skey}; + if (defined $state->{$skey} && + UNIVERSAL::isa($state->{$skey}, 'ARRAY')) { + my @arr = @{$state->{$skey}}; + $self->{$skey} = \@arr; + } + elsif (defined $state->{$skey} && + UNIVERSAL::isa($state->{$skey}, 'HASH')) { + my %hash = %{$state->{$skey}}; + $self->{$skey} = \%hash; + } + else { + $self->{$skey} = $state->{$skey}; + } + $self->restore_state_helper($skey, $old, $self->{$skey}); + } +} + + +sub get_global_cfg { + return $_[0]->{'global'}; +} + + +sub get_template_override { + return $_[0]->{'template'}; +} + + +sub get_ti_override { + return $_[0]->{'ti'}; +} + + +sub get_relative { + return $_[0]->{'relative'}; +} + + +sub get_progress_callback { + return $_[0]->{'progress'}; +} + + +sub get_addtemp { + return $_[0]->{'addtemp'}; +} + + +sub get_addproj { + return $_[0]->{'addproj'}; +} + + +sub get_toplevel { + return $_[0]->{'toplevel'}; +} + + +sub get_into { + return $_[0]->{'into'}; +} + + +sub get_use_env { + return $_[0]->{'use_env'}; +} + + +sub get_expand_vars { + return $_[0]->{'expand_vars'}; +} + + +sub get_files_written { + return $_[0]->{'real_fwritten'}; +} + + +sub get_assignment { + my $self = shift; + my $name = $self->resolve_alias(shift); + my $assign = shift; + + ## If no hash table was passed in + if (!defined $assign) { + $assign = $self->{$self->{'reading_global'} ? + $gassign_key : $assign_key}; + } + + return $$assign{$name}; +} + + +sub get_assignment_for_modification { + my($self, $name, $assign, $subtraction) = @_; + return $self->get_assignment($name, $assign); +} + + +sub get_baseprojs { + return $_[0]->{'baseprojs'}; +} + + +sub get_dynamic { + return $_[0]->{'dynamic'}; +} + + +sub get_static { + return $_[0]->{'static'}; +} + + +sub get_default_component_name { + #my $self = shift; + return 'default'; +} + + +sub get_features { + return $_[0]->{'features'}; +} + + +sub get_hierarchy { + return $_[0]->{'hierarchy'}; +} + + +sub get_name_modifier { + return $_[0]->{'name_modifier'}; +} + + +sub get_apply_project { + return $_[0]->{'apply_project'}; +} + + +sub get_language { + return $_[0]->{'language'}; +} + + +sub get_outdir { + my $self = shift; + if (defined $self->{'into'}) { + my $outdir = $self->getcwd(); + my $re = $self->escape_regex_special($self->getstartdir()); + + $outdir =~ s/^$re//; + return $self->{'into'} . $outdir; + } + else { + return '.'; + } +} + + +sub expand_variables { + my($self, $value, $rel, $expand_template, $scope, $expand, $warn) = @_; + my $cwd = $self->getcwd(); + my $start = 0; + my $forward_slashes = $self->{'convert_slashes'} || + $self->{'requires_forward_slashes'}; + + ## Fix up the value for Windows switch the \\'s to / + $cwd =~ s/\\/\//g if ($forward_slashes); + + while(substr($value, $start) =~ /(\$\(([^)]+)\))/) { + my $whole = $1; + my $name = $2; + if (defined $$rel{$name}) { + my $val = $$rel{$name}; + if ($expand) { + $val =~ s/\//\\/g if ($forward_slashes); + substr($value, $start) =~ s/\$\([^)]+\)/$val/; + $whole = $val; + } + else { + ## Fix up the value for Windows switch the \\'s to / + $val =~ s/\\/\//g if ($forward_slashes); + + my $icwd = ($self->{'case_tolerant'} ? lc($cwd) : $cwd); + my $ival = ($self->{'case_tolerant'} ? lc($val) : $val); + my $iclen = length($icwd); + my $ivlen = length($ival); + + ## If the relative value contains the current working + ## directory plus additional subdirectories, we must pull + ## off the additional directories into a temporary where + ## it can be put back after the relative replacement is done. + my $append; + if (index($ival, $icwd) == 0 && $iclen != $ivlen && + substr($ival, $iclen, 1) eq '/') { + my $diff = $ivlen - $iclen; + $append = substr($ival, $iclen); + substr($ival, $iclen, $diff) = ''; + $ivlen -= $diff; + } + + if (index($icwd, $ival) == 0 && + ($iclen == $ivlen || substr($icwd, $ivlen, 1) eq '/')) { + my $current = $icwd; + substr($current, 0, $ivlen) = ''; + + my $dircount = ($current =~ tr/\///); + if ($dircount == 0) { + $ival = '.'; + } + else { + $ival = '../' x $dircount; + $ival =~ s/\/$//; + } + $ival .= $append if (defined $append); + + ## We have to remove the leading ./ if there is one. + ## Otherwise, if this value is used as an exclude value it will + ## not match up correctly. + $ival =~ s!^\./!!; + + ## Convert the slashes if necessary + $ival =~ s/\//\\/g if ($self->{'convert_slashes'}); + substr($value, $start) =~ s/\$\([^)]+\)/$ival/; + $whole = $ival; + } + elsif ($self->convert_all_variables() && $warn) { + ## The user did not choose to expand $() variables directly, + ## but we could not convert it into a relative path. So, + ## instead of leaving it we will expand it. But, we will only + ## get into this section if this is the secondary attempt to + ## replace the variable (indicated by the $warn boolean). + $val =~ s/\//\\/g if ($self->{'convert_slashes'}); + substr($value, $start) =~ s/\$\([^)]+\)/$val/; + $whole = $val; + } + else { + my $loc = index(substr($value, $start), $whole); + $start += $loc if ($loc > 0); + } + } + } + elsif ($expand_template || + $self->expand_variables_from_template_values()) { + my $ti = $self->get_template_input(); + my $val = (defined $ti ? $ti->get_value($name) : undef); + my $sname = (defined $scope ? $scope . "::$name" : undef); + my $arr = $self->adjust_value([$sname, $name], + (defined $val ? $val : [])); + if (UNIVERSAL::isa($arr, 'HASH')) { + $self->warning("$name conflicts with a template variable scope"); + } + elsif (UNIVERSAL::isa($arr, 'ARRAY') && defined $$arr[0]) { + $val = $self->modify_assignment_value(lc($name), "@$arr"); + substr($value, $start) =~ s/\$\([^)]+\)/$val/; + + ## We have replaced the template value, but that template + ## value may contain a $() construct that may need to get + ## replaced too. However, if the name of the template variable + ## is the same as the original $() variable name, we need to + ## leave it alone to avoid looping infinitely. + $whole = '' if ($whole ne $val); + } + else { + $self->warning("Unable to expand $name.") if ($expand && $warn); + my $loc = index(substr($value, $start), $whole); + $start += $loc if ($loc > 0); + } + } + elsif ($self->convert_all_variables() && $warn) { + ## We could not find a value to correspond to the variable name. + ## Instead of leaving it we will expand it. But, we will only + ## get into this section if this is the secondary attempt to + ## replace the variable (indicated by the $warn boolean). + substr($value, $start) =~ s/\$\([^)]+\)//; + $whole = ''; + } + else { + my $loc = index(substr($value, $start), $whole); + $start += $loc if ($loc > 0); + } + $start += length($whole); + } + + $value =~ s/\\/\//g if ($self->{'requires_forward_slashes'}); + + return $value; +} + + +sub replace_env_vars { + my($self, $lref) = @_; + my $one_empty = undef; + + ## Loop through the string until we find no more environment variables. + while($$lref =~ /\$(\w+)/) { + my $name = $1; + my $val = ''; + + ## PWD is a special variable. It isn't set on Windows, but in MPC we + ## must guarantee that it is always there. + if ($name eq 'PWD') { + $val = $self->getcwd(); + } + elsif (defined $ENV{$name}) { + $val = $ENV{$name}; + } + else { + ## Keep track of an environment variable not being set. + $one_empty = 1; + } + $$lref =~ s/\$\w+/$val/; + } + return $one_empty; +} + + +sub relative { + my($self, $value, $expand_template, $scope) = @_; + + if (defined $value) { + if (UNIVERSAL::isa($value, 'ARRAY')) { + my @built; + foreach my $val (@$value) { + my $rel = $self->relative($val, $expand_template, $scope); + if (UNIVERSAL::isa($rel, 'ARRAY')) { + push(@built, @$rel); + } + else { + push(@built, $rel); + } + } + return \@built; + } + elsif (index($value, '$') >= 0) { + ## A form of this code lives in + ## ProjectCreator::create_recursive_settings. If you are changing + ## something in this area, please look at the method in + ## ProjectCreator.pm to see if it needs changing too. + + my $ovalue = $value; + my($rel, $how) = $self->get_initial_relative_values(); + $value = $self->expand_variables($value, $rel, + $expand_template, $scope, $how); + + if ($ovalue eq $value || index($value, '$') >= 0) { + ($rel, $how) = $self->get_secondary_relative_values(); + $value = $self->expand_variables($value, $rel, + $expand_template, $scope, + $how, 1); + } + } + } + + ## Values that have two or more strings enclosed in double quotes are + ## to be interpreted as elements of an array + if (defined $value && $value =~ /^"[^"]+"(\s+"[^"]+")+$/) { + $value = $self->create_array($value); + } + + return $value; +} + + +## Static function. Returns the default language for MPC. +sub defaultLanguage { + return $deflang; +} + + +## Static function. Returns an array of valid languages. +sub validLanguages { + return keys %languages; +} + + +## Static function. The one and only argument is the language +## string to check for validity. +sub isValidLanguage { + return defined $languages{$_[0]}; +} + + +sub languageIs { + #my($self, $language) = @_; + return $_[0]->{'language'} eq $_[1]; +} + +# ************************************************************ +# Virtual Methods To Be Overridden +# ************************************************************ + +sub restore_state_helper { + #my $self = shift; + #my $skey = shift; + #my $old = shift; + #my $new = shift; +} + + +sub get_initial_relative_values { + #my $self = shift; + return {}, 0; +} + + +sub get_secondary_relative_values { + my $self = shift; + return ($self->{'use_env'} ? \%ENV : + $self->{'relative'}), $self->{'expand_vars'}; +} + + +sub convert_all_variables { + #my $self = shift; + return 0; +} + + +sub expand_variables_from_template_values { + #my $self = shift; + return 0; +} + + +sub preserve_assignment_order { + #my $self = shift; + #my $name = shift; + return 1; +} + + +sub compare_output { + #my $self = shift; + return 0; +} + + +sub files_are_different { + my($self, $old, $new) = @_; + return !(-r $old && -s $new == -s $old && compare($new, $old) == 0); +} + + +sub handle_scoped_end { + #my $self = shift; + #my $type = shift; + #my $flags = shift; + return 1, undef; +} + +sub handle_unknown_assignment { + my $self = shift; + my $type = shift; + my @values = @_; + return 0, "Invalid assignment name: '$values[1]'"; +} + + +sub handle_scoped_unknown { + my($self, $fh, $type, $flags, $line) = @_; + return 0, "Unrecognized line: $line"; +} + + +sub remove_duplicate_addition { + my($self, $name, $value, $current) = @_; + return $value; +} + + +sub generate_recursive_input_list { + #my $self = shift; + #my $dir = shift; + #my $exclude = shift; + return (); +} + + +sub reset_values { + #my $self = shift; +} + + +sub sort_files { + #my $self = shift; + return 1; +} + + +sub file_sorter { + #my $self = shift; + #my $left = shift; + #my $right = shift; + return $_[1] cmp $_[2]; +} + + +sub read_global_configuration { + #my $self = shift; + #my $input = shift; + return 1; +} + + +sub set_verbose_ordering { + #my $self = shift; + #my $value = shift; +} + + +1; diff --git a/ACE/MPC/modules/Depgen/DependencyEditor.pm b/ACE/MPC/modules/Depgen/DependencyEditor.pm new file mode 100644 index 00000000000..6f551d64b5f --- /dev/null +++ b/ACE/MPC/modules/Depgen/DependencyEditor.pm @@ -0,0 +1,117 @@ +package DependencyEditor; + +# ************************************************************ +# Description : Edits existing dependencies. +# Author : Chad Elliott +# Create Date : 2/10/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; +use FileHandle; + +use DependencyGenerator; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + return bless {}, $_[0]; +} + + +sub process { + my($self, $output, $type, $noinline, $macros, + $ipaths, $replace, $exclude, $files) = @_; + + ## Back up the original file and receive the contents + my $contents; + if (-s $output) { + $contents = []; + if (!$self->backup($output, $contents)) { + print STDERR "ERROR: Unable to backup $output\n"; + return 1; + } + } + + ## Write out the contents of the file + my $fh = new FileHandle(); + if (open($fh, ">$output")) { + if (defined $contents) { + foreach my $line (@$contents) { + print $fh $line; + } + } + + ## Write out the new dependency marker + print $fh "# DO NOT DELETE THIS LINE -- depgen.pl uses it.\n", + "# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.\n\n"; + + ## Generate the new dependencies and write them to the file + my $dep = new DependencyGenerator($macros, $ipaths, $replace, + $type, $noinline, $exclude); + ## Sort the files so the dependencies are reproducible + foreach my $file (sort @$files) { + ## In some situations we may be passed a directory as part of an + ## option. If it is an unknown option, we may think the directory + ## needs to be part of the dependencies when it should not. + print $fh $dep->process($file), "\n" if (!-d $file); + } + + ## Write out the end of the block warning + print $fh "# IF YOU PUT ANYTHING HERE IT WILL GO AWAY\n"; + close($fh); + } + else { + print STDERR "ERROR: Unable to open $output for output\n"; + return 1; + } + + return 0; +} + + +sub backup { + my($self, $source, $contents) = @_; + my $status; + my $fh = new FileHandle(); + my $backup = "$source.bak"; + + ## Back up the file. While doing so, keep track of the contents of the + ## file and keep everything except the old dependencies. + if (open($fh, $source)) { + my $oh = new FileHandle(); + if (open($oh, ">$backup")) { + my $record = 1; + $status = 1; + while(<$fh>) { + print $oh $_; + if ($record) { + if (index($_, 'DO NOT DELETE') >= 0) { + $record = undef; + } + else { + push(@$contents, $_); + } + } + } + close($oh); + + ## Set file permission so that the backup has the same permissions + ## as the original file. + my @buf = stat($source); + if (defined $buf[8] && defined $buf[9]) { + utime($buf[8], $buf[9], $backup); + } + } + close($fh); + } + return $status; +} + + +1; diff --git a/ACE/MPC/modules/Depgen/DependencyGenerator.pm b/ACE/MPC/modules/Depgen/DependencyGenerator.pm new file mode 100644 index 00000000000..77c0eee81f7 --- /dev/null +++ b/ACE/MPC/modules/Depgen/DependencyGenerator.pm @@ -0,0 +1,67 @@ +package DependencyGenerator; + +# ************************************************************ +# Description : Runs the correct dependency generator on the file. +# Author : Chad Elliott +# Create Date : 2/10/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use Preprocessor; +use DependencyWriterFactory; +use ObjectGeneratorFactory; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + my($class, $macros, $ipaths, $replace, $type, $noinline, $exclude) = @_; + my $self = bless {'pre' => new Preprocessor($macros, + $ipaths, $exclude), + 'replace' => $replace, + 'dwrite' => DependencyWriterFactory::create($type), + 'objgen' => ObjectGeneratorFactory::create($type), + 'noinline' => $noinline, + }, $class; + + ## Set the current working directory, but + ## escape regular expression special characters + $self->{'cwd'} = Cwd::getcwd() . '/'; + $self->{'cwd'} =~ s/([\+\-\\\$\[\]\(\)\.])/\\$1/g; + + ## Sort the replace keys to get the longest key first. This way + ## when we are replacing portions of the file path, we replace the + ## most we can. + my @repkeys = sort { length($b) <=> length($a) } keys %$replace; + $self->{'repkeys'} = \@repkeys; + + return $self; +} + + +sub process { + my($self, $file) = @_; + + ## Generate the dependency string + my $depstr = $self->{'dwrite'}->process( + $self->{'objgen'}->process($file), + $self->{'pre'}->process($file, $self->{'noinline'})); + + ## Perform the replacements on the dependency string + $depstr =~ s/$self->{'cwd'}//go; + my $replace = $self->{'replace'}; + foreach my $rep (@{$self->{'repkeys'}}) { + $depstr =~ s/$rep/$$replace{$rep}/g; + } + + return $depstr; +} + + +1; diff --git a/ACE/MPC/modules/Depgen/DependencyWriter.pm b/ACE/MPC/modules/Depgen/DependencyWriter.pm new file mode 100644 index 00000000000..0f2cc5738af --- /dev/null +++ b/ACE/MPC/modules/Depgen/DependencyWriter.pm @@ -0,0 +1,30 @@ +package DependencyWriter; + +# ************************************************************ +# Description : Base class for all Dependency Writers. +# Author : Chad Elliott +# Create Date : 2/10/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + return bless {}, $_[0]; +} + + +sub process { + #my($self, $objects, $files) = @_; + return ''; +} + + +1; diff --git a/ACE/MPC/modules/Depgen/DependencyWriterFactory.pm b/ACE/MPC/modules/Depgen/DependencyWriterFactory.pm new file mode 100644 index 00000000000..558793ea0a5 --- /dev/null +++ b/ACE/MPC/modules/Depgen/DependencyWriterFactory.pm @@ -0,0 +1,40 @@ +package DependencyWriterFactory; + +# ************************************************************ +# Description : Create DependencyWriter objects. +# Author : Chad Elliott +# Create Date : 5/23/2003 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use DependencyWriter; + +# ************************************************************ +# Data Section +# ************************************************************ + +my $writers = {}; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub register { + $writers = shift; +} + + +sub create { + return $$writers{$_[0]}->new() if (defined $$writers{$_[0]}); + + print STDERR "WARNING: Invalid dependency writer type: $_[0]\n"; + return new DependencyWriter(); +} + + +1; diff --git a/ACE/MPC/modules/Depgen/Driver.pm b/ACE/MPC/modules/Depgen/Driver.pm new file mode 100644 index 00000000000..8aac67ca7f6 --- /dev/null +++ b/ACE/MPC/modules/Depgen/Driver.pm @@ -0,0 +1,244 @@ +package Driver; + +# ************************************************************ +# Description : Generate dependencies for Make and NMake. +# Author : Chad Elliott +# Create Date : 3/21/2007 +# ************************************************************ + +# ************************************************************ +# Pragma Section +# ************************************************************ + +use strict; +use File::Basename; + +use DependencyEditor; + +# ************************************************************ +# Data Section +# ************************************************************ + +my $version = '1.2'; +my $os = ($^O eq 'MSWin32' ? 'Windows' : 'UNIX'); +my %types; +my %defaults = ('UNIX' => 'make', + 'Windows' => 'nmake', + ); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub BEGIN { + my $fh = new FileHandle(); + my(%writers, %generators); + + ## Find all the dependency writers and object generators + foreach my $dir (@INC) { + if (opendir($fh, $dir)) { + foreach my $module (readdir($fh)) { + if ($module =~ /(.+)DependencyWriter\.pm$/) { + my $type = lc($1); + my $class = $module; + $class =~ s/\.pm$//; + require $module; + $writers{$type} = $class; + $types{$type} = 1; + } + elsif ($module =~ /(.+)ObjectGenerator\.pm$/) { + my $type = lc($1); + my $class = $module; + $class =~ s/\.pm$//; + require $module; + $generators{$type} = $class; + } + } + closedir($fh); + } + } + + ## Register them with the right factory + DependencyWriterFactory::register(\%writers); + ObjectGeneratorFactory::register(\%generators); +} + + +sub new { + my $class = shift; + my $self = bless {'automatic' => [], + }, $class; + + foreach my $add (@_) { + if ($add =~ /(UNIX|Windows)=(.*)/) { + $defaults{$1} = $2; + } + elsif ($add =~ /automatic=(.*)/) { + my @auto = split(/,/, $1); + $self->{'automatic'} = \@auto; + } + else { + print "WARNING: Unknown parameter: $add\n"; + } + } + + return $self; +} + + +sub usageAndExit { + my($self, $opt) = @_; + my $base = basename($0); + + if (defined $opt) { + print "$opt.\n"; + } + + print "$base v$version\n" . + "Usage: $base [-D<MACRO>[=VALUE]] [-I<include dir>] ", + (defined $self->{'automatic'}->[0] ? "[-A] " : ''), + "[-R <VARNAME>]\n" . + " " . (" " x length($base)) . + " [-e <file>] [-f <output file>] [-i] [-t <type>] [-n]\n" . + " " . (" " x length($base)) . " <files...>\n" . + "\n"; + if (defined $self->{'automatic'}->[0]) { + print "-A Replace paths equal to the following variables with ", + "the corresponding \$()\n value: ", + join(', ', @{$self->{'automatic'}}), ".\n"; + } + print "-D This option sets a macro to an optional value.\n" . + "-I The -I option adds an include directory.\n" . + "-R Replace \$VARNAME paths with \$(VARNAME).\n" . + "-e Exclude dependencies generated by <file>, but not <file> " . + "itself.\n" . + "-f Specifies the output file. This file will be edited if it " . + "already\n exists.\n" . + "-i Do not print an error if no source files are provided.\n" . + "-n Do not include inline files (ending in .i or .inl) in the " . + "dependencies.\n" . + "-t Use specified type ("; + my @keys = sort keys %types; + for(my $i = 0; $i <= $#keys; ++$i) { + print "$keys[$i]" . + ($i != $#keys ? $i == $#keys - 1 ? ' or ' : ', ' : '');; + } + print ") instead of the default.\n" . + " The default is "; + @keys = sort keys %defaults; + for(my $i = 0; $i <= $#keys; ++$i) { + my $def = $keys[$i]; + print $defaults{$def} . " on $def" . + ($i != $#keys ? $i == $#keys - 1 ? ' and ' : ', ' : ''); + } + print ".\n"; + exit(0); +} + + +sub setReplace { + my($self, $replace, $name, $value) = @_; + + if (defined $name) { + ## The key will be used in a regular expression. + ## So, we need to escape some special characters. + $name = File::Spec->canonpath($name); + $name =~ s/([\+\-\\\$\[\]\(\)\.])/\\$1/g; + + $$replace{$name} = $value; + } +} + + +sub run { + my($self, $args) = @_; + my $argc = scalar(@$args); + my $type = $defaults{$os}; + my $output = '-'; + my $needsrc = 1; + my($noinline, @files, %macros, @ipaths, %replace, %exclude); + + for(my $i = 0; $i < $argc; ++$i) { + my $arg = $$args[$i]; + if ($arg =~ /^\-D(\w+)(=(.*))?/) { + $macros{$1} = $3; + } + elsif ($arg =~ /^\-I(.*)/) { + push(@ipaths, File::Spec->canonpath($1)); + } + elsif ($arg eq '-A') { + foreach my $auto (@{$self->{'automatic'}}) { + $self->setReplace(\%replace, $ENV{$auto}, '$(' . $auto . ')'); + } + } + elsif ($arg eq '-R') { + ++$i; + $arg = $$args[$i]; + if (defined $arg) { + my $val = $ENV{$arg}; + if (defined $val) { + $self->setReplace(\%replace, $val, "\$($arg)"); + } + } + else { + $self->usageAndExit('Invalid use of -R'); + } + } + elsif ($arg eq '-e') { + ++$i; + $arg = $$args[$i]; + if (defined $arg) { + $exclude{$arg} = 1; + } + else { + $self->usageAndExit('Invalid use of -e'); + } + } + elsif ($arg eq '-f') { + ++$i; + $arg = $$args[$i]; + if (defined $arg) { + $output = $arg; + } + else { + $self->usageAndExit('Invalid use of -f'); + } + } + elsif ($arg eq '-i') { + $needsrc = undef; + } + elsif ($arg eq '-n') { + $noinline = 1; + } + elsif ($arg eq '-h') { + $self->usageAndExit(); + } + elsif ($arg eq '-t') { + ++$i; + $arg = $$args[$i]; + if (defined $arg && defined $types{$arg}) { + $type = $arg; + } + else { + $self->usageAndExit('Invalid use of -t'); + } + } + elsif ($arg =~ /^[\-+]/) { + ## We will ignore unknown options + ## Some options for aCC start with + + } + else { + push(@files, $arg); + } + } + + if (!defined $files[0]) { + if ($needsrc) { + $self->usageAndExit('No files specified'); + } + } + + my $editor = new DependencyEditor(); + return $editor->process($output, $type, $noinline, \%macros, + \@ipaths, \%replace, \%exclude, \@files); +} diff --git a/ACE/MPC/modules/Depgen/MakeDependencyWriter.pm b/ACE/MPC/modules/Depgen/MakeDependencyWriter.pm new file mode 100644 index 00000000000..a10d061996b --- /dev/null +++ b/ACE/MPC/modules/Depgen/MakeDependencyWriter.pm @@ -0,0 +1,43 @@ +package MakeDependencyWriter; + +# ************************************************************ +# Description : Generates generic Makefile dependencies. +# Author : Chad Elliott +# Create Date : 2/10/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; +use DependencyWriter; + +use vars qw(@ISA); +@ISA = qw(DependencyWriter); + +# ************************************************************ +# Data Section +# ************************************************************ + +my $cygwin = (defined $ENV{OS} && $ENV{OS} =~ /windows/i); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub process { + ## Replace whitespace with escaped whitespace. + map(s/(\s)/\\$1/g, @{$_[2]}); + + ## Replace <drive letter>: with /cygdrive/<drive letter>. The user may + ## or may not be using Cygwin, but leaving the colon in there will + ## cause make to fail catastrophically on the next invocation. + map(s/([A-Z]):/\/cygdrive\/$1/gi, @{$_[2]}) if ($cygwin); + + ## Sort the dependencies to make them reproducible. + return "@{$_[1]}: \\\n " . join(" \\\n ", sort @{$_[2]}) . "\n"; +} + + +1; diff --git a/ACE/MPC/modules/Depgen/MakeObjectGenerator.pm b/ACE/MPC/modules/Depgen/MakeObjectGenerator.pm new file mode 100644 index 00000000000..397c6a01abc --- /dev/null +++ b/ACE/MPC/modules/Depgen/MakeObjectGenerator.pm @@ -0,0 +1,43 @@ +package MakeObjectGenerator; + +# ************************************************************ +# Description : Generates object files for generic Makefiles. +# Author : Chad Elliott +# Create Date : 5/23/2003 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; +use ObjectGenerator; + +use vars qw(@ISA); +@ISA = qw(ObjectGenerator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub process { + my $noext = $_[1]; + my @exts = ('o'); + my @dirs = (defined $ENV{VDIR} ? $ENV{VDIR} : ''); + $noext =~ s/\.[^\.]+$//o; + + push(@exts, $ENV{SOEXT}) if (defined $ENV{SOEXT}); + push(@dirs, $ENV{VSHDIR}) if (defined $ENV{VSHDIR}); + + my @objects; + foreach my $dirs (@dirs) { + foreach my $ext (@exts) { + push(@objects, "$dirs$noext.$ext"); + } + } + + return \@objects; +} + + +1; diff --git a/ACE/MPC/modules/Depgen/NMakeDependencyWriter.pm b/ACE/MPC/modules/Depgen/NMakeDependencyWriter.pm new file mode 100644 index 00000000000..0428a55c176 --- /dev/null +++ b/ACE/MPC/modules/Depgen/NMakeDependencyWriter.pm @@ -0,0 +1,53 @@ +package NMakeDependencyWriter; + +# ************************************************************ +# Description : Generates NMake dependencies. +# Author : Chad Elliott +# Create Date : 2/10/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; +use DependencyWriter; + +use vars qw(@ISA); +@ISA = qw(DependencyWriter); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub process { + my $sources = $_[1]; + my $files = $_[2]; + my $total = 0; + + $$sources[0] =~ s/\//\\/g; + $$sources[0] =~ s/\\\\/\\/g; + my $dep = "$$sources[0] :\\\n"; + + ## Sort the dependencies to make them reproducible + foreach my $file (sort @$files) { + $file =~ s/\//\\/g; + $file =~ s/\\\\/\\/g; + if ($file ne $$sources[0]) { + $dep .= "\t\"$file\"\\\n"; + ++$total; + } + } + + if ($total == 0) { + $dep = ''; + } + else { + $dep .= "\n\n"; + } + + return $dep; +} + + +1; diff --git a/ACE/MPC/modules/Depgen/NMakeObjectGenerator.pm b/ACE/MPC/modules/Depgen/NMakeObjectGenerator.pm new file mode 100644 index 00000000000..e718fa34412 --- /dev/null +++ b/ACE/MPC/modules/Depgen/NMakeObjectGenerator.pm @@ -0,0 +1,51 @@ +# ************************************************************ +# Description : Generates object files for NMake Makefiles. +# Author : Chad Elliott +# Create Date : 5/23/2003 +# ************************************************************ + +package WinProjectBaseEx; + +use WinProjectBase; +use DirectoryManager; + +use vars qw(@ISA); +@ISA = qw(WinProjectBase DirectoryManager); + +sub new { + return bless {}, $_[0]; +} + +1; + + +package NMakeObjectGenerator; + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; +use ObjectGenerator; + +use vars qw(@ISA); +@ISA = qw(ObjectGenerator); + +# ************************************************************ +# Data Section +# ************************************************************ + +my $wpb = new WinProjectBaseEx(); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub process { + my $noext = $wpb->translate_directory($_[1]); + $noext =~ s/\.[^\.]+$//o; + return [ "\"\$(INTDIR)\\$noext.obj\"" ]; +} + + +1; diff --git a/ACE/MPC/modules/Depgen/ObjectGenerator.pm b/ACE/MPC/modules/Depgen/ObjectGenerator.pm new file mode 100644 index 00000000000..1935a5f3b42 --- /dev/null +++ b/ACE/MPC/modules/Depgen/ObjectGenerator.pm @@ -0,0 +1,30 @@ +package ObjectGenerator; + +# ************************************************************ +# Description : Base class for all Object Generators. +# Author : Chad Elliott +# Create Date : 5/23/2003 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + return bless {}, $_[0]; +} + + +sub process { + #my($self, $file) = @_; + return []; +} + + +1; diff --git a/ACE/MPC/modules/Depgen/ObjectGeneratorFactory.pm b/ACE/MPC/modules/Depgen/ObjectGeneratorFactory.pm new file mode 100644 index 00000000000..6f2834a8525 --- /dev/null +++ b/ACE/MPC/modules/Depgen/ObjectGeneratorFactory.pm @@ -0,0 +1,40 @@ +package ObjectGeneratorFactory; + +# ************************************************************ +# Description : Create ObjectGenerator objects. +# Author : Chad Elliott +# Create Date : 5/23/2003 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use ObjectGenerator; + +# ************************************************************ +# Data Section +# ************************************************************ + +my $generators = {}; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub register { + $generators = shift; +} + + +sub create { + return $$generators{$_[0]}->new() if (defined $$generators{$_[0]}); + + print STDERR "WARNING: Invalid object generator type: $_[0]\n"; + return new ObjectGenerator(); +} + + +1; diff --git a/ACE/MPC/modules/Depgen/Preprocessor.pm b/ACE/MPC/modules/Depgen/Preprocessor.pm new file mode 100644 index 00000000000..4dea2fc4117 --- /dev/null +++ b/ACE/MPC/modules/Depgen/Preprocessor.pm @@ -0,0 +1,145 @@ +package Preprocessor; + +# ************************************************************ +# Description : Preprocesses the supplied file. +# Author : Chad Elliott +# Create Date : 2/10/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; +use FileHandle; +use File::Basename; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + my($class, $macros, $ipaths, $exclude) = @_; + return bless {'macros' => $macros, + 'ipaths' => $ipaths, + 'exclude' => $exclude, + 'files' => {}, + 'ifound' => {}, + 'recurse' => 0, + }, $class; +} + + +sub process { + my($self, $file, $noinline, $noincs) = @_; + my $fh = new FileHandle(); + + ## Open the file, but if we can't we'll just silently ignore it. + if (open($fh, $file)) { + my @zero; + my $ifcount = 0; + my $files = $self->{'files'}; + my $dir = dirname($file); + + ## We only need to keep track of recursion inside this block + my $recurse = ++$self->{'recurse'}; + + $$files{$file} = []; + while(<$fh>) { + ## As an optimization, use a very simple regular expression on the + ## outside that all of the inner regular expressions have in + ## common. That way we go down the path of if elsif only if it is + ## even possible due to the outside regular expression. + ## index() is faster than a regular expression, so use index first. + next if (index($_, '#') == -1 || not /^\s*#/); + + ## Remove same line c comments (no need to worry about c++ + ## comments due to the regular expressions) inside this if statement. + ## This saves about 5% off of processing the ace directory + ## and we only need to strip comments if we are actually + ## going to look at the string. + $_ =~ s/\/\*.*\*\///o; + + if (/^\s*#\s*endif/) { + --$ifcount; + if (defined $zero[0] && $ifcount == $zero[$#zero]) { + pop(@zero); + } + } + elsif (/^\s*#\s*if\s+0/) { + push(@zero, $ifcount); + ++$ifcount; + } + elsif (/^\s*#\s*if/) { + ++$ifcount; + } + elsif (!defined $zero[0] && + /^\s*#\s*include\s+[<"]([^">]+)[">]/o) { + ## Locate the include file + my $inc; + if (exists $self->{'ifound'}->{$1}) { + $inc = $self->{'ifound'}->{$1}; + } + else { + foreach my $dirp (@{$self->{'ipaths'}}) { + if (-r "$dirp/$1") { + $inc = "$dirp/$1"; + last; + } + } + + if (!defined $inc) { + ## If the file we're currently looking at contains a + ## directory name then, we need to look for include + ## files in that directory. + if (-r "$dir/$1") { + $inc = "$dir/$1"; + } + } + $self->{'ifound'}->{$1} = $inc; + } + + ## If we've found the include file, then process it too. + next if (not defined $inc); + + $inc =~ s/\\/\//go; + if (!$noinline || + ($recurse == 1 || $inc !~ /\.i(nl)?$/o)) { + push(@{$$files{$file}}, $inc); + if (!defined $$files{$inc}) { + ## Process this file, but do not return the include files + if (!defined $self->{'exclude'}->{substr($inc, rindex($inc, '/') + 1)}) { + $self->process($inc, $noinline, 1); + } + } + } + } + } + close($fh); + + ## We only need to keep track of recursion inside this block + --$self->{'recurse'}; + } + + ## This has to be outside the if (open(... + ## If the last file to be processed isn't accessable then + ## we still need to return the array reference of includes. + if (!$noincs) { + my @files = ($file); + my %ifiles; + + foreach my $processed (@files) { + foreach my $inc (@{$self->{'files'}->{$processed}}) { + if (!defined $ifiles{$inc}) { + $ifiles{$inc} = 1; + push(@files, $inc); + } + } + } + shift(@files); + return \@files; + } +} + + +1; diff --git a/ACE/MPC/modules/DirectoryManager.pm b/ACE/MPC/modules/DirectoryManager.pm new file mode 100644 index 00000000000..cd9aa993e51 --- /dev/null +++ b/ACE/MPC/modules/DirectoryManager.pm @@ -0,0 +1,205 @@ +package DirectoryManager; + +# ************************************************************ +# Description : This module provides directory related methods +# Author : Chad Elliott +# Create Date : 5/13/2004 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; +use File::Spec; +use File::Basename; + +# ************************************************************ +# Data Section +# ************************************************************ + +my $onVMS = ($^O eq 'VMS'); +my $case_insensitive = File::Spec->case_tolerant(); +my $cwd = Cwd::getcwd(); +if ($^O eq 'cygwin' && $cwd !~ /[A-Za-z]:/) { + my $cyg = `cygpath -w $cwd`; + if (defined $cyg) { + $cyg =~ s/\\/\//g; + chop($cwd = $cyg); + } + $case_insensitive = 1; +} +elsif ($onVMS) { + $cwd = VMS::Filespec::unixify($cwd); + $cwd =~ s!/$!!g; +} +my $start = $cwd; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub cd { + my($self, $dir) = @_; + my $status = chdir($dir); + + if ($status && $dir ne '.') { + ## First strip out any /./ or ./ or /. + $dir =~ s/\/\.\//\//g; + $dir =~ s/^\.\///; + $dir =~ s/\/\.$//; + + ## If the new directory contains a relative directory + ## then we just get the real working directory + if (index($dir, '..') >= 0) { + $cwd = Cwd::getcwd(); + if ($^O eq 'cygwin' && $cwd !~ /[A-Za-z]:/) { + ## We're using Cygwin perl, use cygpath to get the windows path + ## and then fix up the slashes. + my $cyg = `cygpath -w $cwd`; + if (defined $cyg) { + $cyg =~ s/\\/\//g; + chop($cwd = $cyg); + } + } + elsif ($onVMS) { + ## On VMS, we nee to get the UNIX style path and remove the + ## trailing slash. + $cwd = VMS::Filespec::unixify($cwd); + $cwd =~ s!/$!!g; + } + } + else { + if ($dir =~ /^(\/|[a-z]:)/i) { + ## It was a full path, just store it. + $cwd = $dir; + } + else { + ## This portion was relative, add it onto the current working + ## directory. + $cwd .= "/$dir"; + } + } + } + return $status; +} + + +sub getcwd { + #my $self = shift; + return $cwd; +} + + +sub getstartdir { + #my $self = shift; + return $start; +} + + +sub mpc_basename { + #my $self = $_[0]; + #my $file = $_[1]; + return substr($_[1], rindex($_[1], '/') + 1); +} + + +sub mpc_dirname { + my($self, $dir) = @_; + + ## The dirname() on VMS doesn't work as we expect it to. + if ($onVMS) { + ## If the directory contains multiple parts, we need to get the + ## dirname in a UNIX style format and then remove the slash from the + ## end. + if (index($dir, '/') >= 0) { + $dir = VMS::Filespec::unixify(dirname($dir)); + $dir =~ s!/$!!g; + return $dir; + } + else { + ## There's no directory portion, so just return '.' + return '.'; + } + } + else { + return dirname($dir); + } +} + + +sub mpc_glob { + my($self, $pattern) = @_; + + ## glob() provided by OpenVMS does not understand [] within + ## the pattern. So, we implement our own through recursive calls + ## to mpc_glob(). + if ($onVMS && $pattern =~ /(.*)\[([^\]]+)\](.*)/) { + my @files; + my($pre, $mid, $post) = ($1, $2, $3); + for(my $i = 0; $i < length($mid); $i++) { + foreach my $new ($self->mpc_glob($pre . substr($mid, $i, 1) . $post)) { + push(@files, $new) if (!StringProcessor::fgrep($new, \@files)); + } + } + return @files; + } + + ## Otherwise, we just return the globbed pattern. + return glob($pattern); +} + + +sub onVMS { + return $onVMS; +} + + +sub path_is_relative { + ## To determine if the path is relative, we just determine if it is not + ## an absolute path. + #my($self, $path) = @_; + return (index($_[1], '/') != 0 && $_[1] !~ /^[A-Z]:\//i); +} + +# ************************************************************ +# Virtual Methods To Be Overridden +# ************************************************************ + +sub translate_directory { + my($self, $dir) = @_; + + ## Remove the current working directory from $dir (if it is contained) + my $cwd = $self->getcwd(); + $cwd =~ s/\//\\/g if ($self->convert_slashes()); + if (index($dir, $cwd) == 0) { + my $cwdl = length($cwd); + return '.' if (length($dir) == $cwdl); + $dir = substr($dir, $cwdl + 1); + } + + ## Translate .. to $dd + if (index($dir, '..') >= 0) { + my $dd = 'dotdot'; + $dir =~ s/^\.\.([\/\\])/$dd$1/; + $dir =~ s/([\/\\])\.\.$/$1$dd/; + $dir =~ s/([\/\\])\.\.([\/\\])/$1$dd$2/g; + $dir =~ s/^\.\.$/$dd/; + } + + return $dir; +} + + +sub convert_slashes { + #my $self = shift; + return 0; +} + + +sub case_insensitive { + #my $self = shift; + return $case_insensitive; +} + +1; diff --git a/ACE/MPC/modules/Driver.pm b/ACE/MPC/modules/Driver.pm new file mode 100644 index 00000000000..231c7cf6499 --- /dev/null +++ b/ACE/MPC/modules/Driver.pm @@ -0,0 +1,636 @@ +package Driver; + +# ************************************************************ +# Description : Functionality to call a workspace or project creator +# Author : Chad Elliott +# Create Date : 5/28/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use Options; +use Parser; +use Version; +use ConfigParser; + +use vars qw(@ISA); +@ISA = qw(Parser Options); + +# ************************************************************ +# Data Section +# ************************************************************ + +my $index = 0; +my @progress = ('|', '/', '-', '\\'); +my %valid_cfg = ('command_line' => 1, + 'default_type' => 1, + 'dynamic_types' => 1, + 'includes' => 1, + 'logging' => 1, + 'main_functions' => 1, + 'verbose_ordering' => 1, + ); +my @intype = ('mwc.pl', 'mpc.pl'); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + my $class = shift; + my $path = shift; + my $name = shift; + my @creators = @_; + my $self = $class->SUPER::new(); + + $self->{'path'} = $path; + $self->{'basepath'} = ::getBasePath(); + $self->{'name'} = $name; + $self->{'type'} = (lc($self->{'name'}) eq $intype[0] ? + 'WorkspaceCreator' : 'ProjectCreator'); + $self->{'types'} = {}; + $self->{'creators'} = \@creators; + $self->{'reldefs'} = {}; + $self->{'relorder'} = []; + + return $self; +} + + +sub workspaces { + return $intype[0]; +} + + +sub projects { + return $intype[1]; +} + + +sub locate_default_type { + my $self = shift; + my $name = lc(shift) . lc($self->{'type'}) . '.pm'; + my $fh = new FileHandle(); + + foreach my $dir (@INC) { + if (opendir($fh, $dir)) { + foreach my $file (readdir($fh)) { + if (lc($file) eq $name) { + $file =~ s/\.pm$//; + return $file; + } + } + closedir($fh); + } + } + + return undef; +} + + +sub locate_dynamic_directories { + my($self, $cfg, $label) = @_; + my $dtypes = $cfg->get_value($label); + + if (defined $dtypes) { + my $count = 0; + my @directories; + my @unprocessed = split(/\s*,\s*/, $cfg->get_unprocessed($label)); + foreach my $dir (split(/\s*,\s*/, $dtypes)) { + if (-d $dir) { + if (-d "$dir/modules" || -d "$dir/config" || -d "$dir/templates") { + push(@directories, $dir); + } + } + elsif (!(defined $unprocessed[$count] && + $unprocessed[$count] =~ s/\$[\(\w\)]+//g && + $unprocessed[$count] eq $dir)) { + $self->diagnostic("'$label' directory $dir not found."); + } + $count++; + } + return \@directories; + } + + return undef; +} + + +sub add_dynamic_creators { + my($self, $dirs) = @_; + my $type = $self->{'type'}; + + foreach my $dir (@$dirs) { + my $fh = new FileHandle(); + if (opendir($fh, "$dir/modules")) { + foreach my $file (readdir($fh)) { + if ($file =~ /(.+$type)\.pm$/i) { + my $name = $1; + if (DirectoryManager::onVMS()) { + my $fh = new FileHandle(); + if (open($fh, $dir . "/modules/" . $file)) { + my $line = <$fh>; + if ($line =~ /^\s*package\s+(.+);/) { + $name = $1; + } + close($fh); + } + } + $self->debug("Pulling in $name"); + push(@{$self->{'creators'}}, $name); + } + } + closedir($fh); + } + } +} + +sub parse_line { + my($self, $ih, $line) = @_; + my $status = 1; + my $errorString; + + if ($line eq '') { + } + elsif ($line =~ /^([\w\*]+)(\s*,\s*(.*))?$/) { + my $name = $1; + my $value = $3; + if (defined $value) { + $value =~ s/^\s+//; + $value =~ s/\s+$//; + } + if ($name =~ s/\*/.*/g) { + foreach my $key (keys %ENV) { + if ($key =~ /^$name$/ && !exists $self->{'reldefs'}->{$key}) { + ## Put this value at the front since it doesn't need + ## to be built up from anything else. It is a stand-alone + ## relative definition. + $self->{'reldefs'}->{$key} = undef; + unshift(@{$self->{'relorder'}}, $key); + } + } + } + else { + $self->{'reldefs'}->{$name} = $value; + if (defined $value) { + ## This relative definition may need to be built up from an + ## existing value, so it needs to be put at the end. + push(@{$self->{'relorder'}}, $name); + } + else { + ## Put this value at the front since it doesn't need + ## to be built up from anything else. It is a stand-alone + ## relative definition. + unshift(@{$self->{'relorder'}}, $name); + } + } + } + else { + $status = 0; + $errorString = "Unrecognized line: $line"; + } + + return $status, $errorString; +} + + +sub optionError { + my($self, $line) = @_; + + $self->printUsage($line, $self->{'name'}, Version::get(), + keys %{$self->{'types'}}); + exit(defined $line ? 1 : 0); +} + + +sub find_file { + my($self, $includes, $file) = @_; + + foreach my $inc (@$includes) { + if (-r $inc . '/' . $file) { + $self->debug("$file found in $inc"); + return $inc . '/' . $file; + } + } + return undef; +} + + +sub determine_cfg_file { + my($self, $cfg, $odir) = @_; + my $ci = $self->case_insensitive(); + + $odir = lc($odir) if ($ci); + foreach my $name (@{$cfg->get_names()}) { + my $value = $cfg->get_value($name); + if (index($odir, ($ci ? lc($name) : $name)) == 0) { + $self->warning("$value does not exist.") if (!-d $value); + my $cfgfile = $value . '/MPC.cfg'; + return $cfgfile if (-e $cfgfile); + } + } + + return undef; +} + + +sub run { + my $self = shift; + my @args = @_; + my $cfgfile; + + ## Save the original directory outside of the loop + ## to avoid calling it multiple times. + my $orig_dir = $self->getcwd(); + + ## Read the code base config file from the config directory + ## under $MPC_ROOT + my $cbcfg = new ConfigParser(); + my $cbfile = "$self->{'basepath'}/config/base.cfg"; + if (-r $cbfile) { + my($status, $error) = $cbcfg->read_file($cbfile); + if (!$status) { + $self->error("$error at line " . $cbcfg->get_line_number() . + " of $cbfile"); + return 1; + } + $cfgfile = $self->determine_cfg_file($cbcfg, $orig_dir); + } + + ## If no MPC config file was found and + ## there is one in the config directory, we will use that. + if (!defined $cfgfile) { + $cfgfile = $self->{'path'} . '/config/MPC.cfg'; + $cfgfile = $self->{'basepath'} . '/config/MPC.cfg' if (!-e $cfgfile); + $cfgfile = undef if (!-e $cfgfile); + } + + ## Read the MPC config file + my $cfg = new ConfigParser(\%valid_cfg); + if (defined $cfgfile) { + my $ellipses = $cfgfile; + $ellipses =~ s!.*(/[^/]+/[^/]+/[^/]+/[^/]+/[^/]+/[^/]+)!...$1!; + $self->diagnostic("Using $ellipses"); + my($status, $error) = $cfg->read_file($cfgfile); + if (!$status) { + $self->error("$error at line " . $cfg->get_line_number() . + " of $cfgfile"); + return 1; + } + OutputMessage::set_levels($cfg->get_value('logging')); + } + + $self->debug("CMD: $0 @ARGV"); + + ## After we read the config file, see if the user has provided + ## dynamic types + my $dynamic = $self->locate_dynamic_directories($cfg, 'dynamic_types'); + if (defined $dynamic) { + ## If so, add in the creators found in the dynamic directories + $self->add_dynamic_creators($dynamic); + + ## Add the each dynamic path to the include paths + foreach my $dynpath (@$dynamic) { + unshift(@INC, $dynpath . '/modules'); + unshift(@args, '-include', "$dynpath/config", + '-include', "$dynpath/templates"); + } + } + + ## Add in the creators found in the main MPC/modules directory + $self->add_dynamic_creators([$self->{'basepath'}]); + + ## Dynamically load in each perl module and set up + ## the type tags and project creators + my $creators = $self->{'creators'}; + foreach my $creator (@$creators) { + my $tag = $self->extractType($creator); + $self->{'types'}->{$tag} = $creator; + } + + ## Before we process the arguments, we will prepend the command_line + ## config variable. + my $cmd = $cfg->get_value('command_line'); + if (defined $cmd) { + my $envargs = $self->create_array($cmd); + unshift(@args, @$envargs); + } + + ## Now add in the includes to the command line arguments. + ## It is done this way to allow the Options module to process + ## the include path as it does all others. + my $incs = $cfg->get_value('includes'); + if (defined $incs) { + foreach my $inc (split(/\s*,\s*/, $incs)) { + ## We must add it to the front so that options provided at the end + ## that require a parameter (but are not given one) do not gobble + ## up the -include option. + unshift(@args, '-include', $inc); + } + } + + my $options = $self->options($self->{'name'}, + $self->{'types'}, + 1, + @args); + + ## If options are not defined, that means that calling options + ## took care of whatever functionality that was required and + ## we can now return with a good status. + return 0 if (!defined $options); + + ## Set up a hash that we can use to keep track of what + ## has been 'required' + my %loaded; + + ## Set up the default creator, if no type is selected + if (!defined $options->{'creators'}->[0]) { + my $utype = $cfg->get_value('default_type'); + if (defined $utype) { + my $default = $self->locate_default_type($utype); + if (defined $default) { + push(@{$options->{'creators'}}, $default); + } + else { + $self->error("Unable to locate the module that corresponds to " . + "the '$utype' type."); + return 1; + } + } + } + + ## If there's still no default, issue an error + if (!defined $options->{'creators'}->[0]) { + $self->error('There is no longer a default project type. Please ' . + 'specify one in MPC.cfg or use the -type option.'); + return 1; + } + + ## Set up additional main functions to recognize + my $val = $cfg->get_value('main_functions'); + if (defined $val) { + foreach my $main (split(/\s*,\s*/, $val)) { + my $err = ProjectCreator::add_main_function($main); + if (defined $err) { + $self->error("$err at line " . $cfg->get_line_number() . + " of $cfgfile"); + return 1; + } + } + } + + if ($options->{'recurse'}) { + if (defined $options->{'input'}->[0]) { + ## This is an error. + ## -recurse was used and input files were specified. + $self->optionError('No files should be ' . + 'specified when using -recurse'); + } + else { + ## We have to load at least one creator here in order + ## to call the generate_recursive_input_list virtual function. + my $name = $options->{'creators'}->[0]; + if (!$loaded{$name}) { + require "$name.pm"; + $loaded{$name} = 1; + } + + ## Generate the recursive input list + my $creator = $name->new(); + my @input = $creator->generate_recursive_input_list( + '.', $options->{'exclude'}); + $options->{'input'} = \@input; + + ## If no files were found above, then we issue a warning + ## that we are going to use the default input + if (!defined $options->{'input'}->[0]) { + $self->information('No files were found using the -recurse option. ' . + 'Using the default input.'); + } + } + } + + ## Add the default include paths. If the user has used the dynamic + ## types method of adding types to MPC, we need to push the paths + ## on. Otherwise, we unshift them onto the front. + if ($self->{'path'} ne $self->{'basepath'}) { + unshift(@{$options->{'include'}}, $self->{'path'} . '/config', + $self->{'path'} . '/templates'); + } + push(@{$options->{'include'}}, $self->{'basepath'} . '/config', + $self->{'basepath'} . '/templates'); + + ## All includes (except the current directory) have been added by this time + $self->debug("INCLUDES: @{$options->{'include'}}"); + + ## Set the global feature file + my $global_feature_file = (defined $options->{'gfeature_file'} && + -r $options->{'gfeature_file'} ? + $options->{'gfeature_file'} : undef); + if (defined $global_feature_file) { + ## If the specified path is relative, expand it based on + ## the current working directory. + if ($global_feature_file !~ /^[\/\\]/ && + $global_feature_file !~ /^[A-Za-z]:[\/\\]?/) { + $global_feature_file = DirectoryManager::getcwd() . '/' . + $global_feature_file; + } + } + else { + my $gf = 'global.features'; + $global_feature_file = $self->find_file($options->{'include'}, $gf); + if (!defined $global_feature_file) { + $global_feature_file = $self->{'basepath'} . '/config/' . $gf; + } + } + + ## Set up default values + push(@{$options->{'input'}}, '') if (!defined $options->{'input'}->[0]); + $options->{'feature_file'} = $self->find_file($options->{'include'}, + 'default.features') + if (!defined $options->{'feature_file'}); + + $options->{'global'} = $self->find_file($options->{'include'}, + 'global.mpb') + if (!defined $options->{'global'}); + + ## Set the relative + my $relative_file = (defined $options->{'relative_file'} && + -r $options->{'relative_file'} ? + $options->{'relative_file'} : undef); + if (!defined $relative_file) { + my $gf = 'default.rel'; + $relative_file = $self->find_file($options->{'include'}, $gf); + if (!defined $relative_file) { + $relative_file = $self->{'basepath'} . '/config/' . $gf; + } + } + if ($options->{'reldefs'}) { + ## Only try to read the file if it exists + if (defined $relative_file) { + my($srel, $errorString) = $self->read_file($relative_file); + if (!$srel) { + $self->error("$errorString\nin $relative_file"); + return 1; + } + + foreach my $key (@{$self->{'relorder'}}) { + if (defined $ENV{$key} && + !defined $options->{'relative'}->{$key}) { + $options->{'relative'}->{$key} = $ENV{$key}; + } + if (defined $self->{'reldefs'}->{$key} && + !defined $options->{'relative'}->{$key}) { + my $value = $self->{'reldefs'}->{$key}; + if ($value =~ /\$(\w+)(.*)?/) { + my $var = $1; + my $extra = $2; + $options->{'relative'}->{$key} = + (defined $options->{'relative'}->{$var} ? + $options->{'relative'}->{$var} : '') . + (defined $extra ? $extra : ''); + } + else { + $options->{'relative'}->{$key} = $value; + } + } + + ## If a relative path is defined, remove all trailing slashes + ## and replace any two or more slashes with a single slash. + if (defined $options->{'relative'}->{$key}) { + $options->{'relative'}->{$key} =~ s/([\/\\])[\/\\]+/$1/g; + $options->{'relative'}->{$key} =~ s/[\/\\]$//g; + } + } + } + + ## Remove MPC_ROOT since we never want to expand it + delete $options->{'relative'}->{'MPC_ROOT'}; + } + + ## Always add the current path to the include paths + unshift(@{$options->{'include'}}, $orig_dir); + + ## Set up un-buffered output for the progress callback + $| = 1; + + ## Keep the starting time for the total output + my $startTime = time(); + my $loopTimes = 0; + + ## Generate the files + my $status = 0; + foreach my $cfile (@{$options->{'input'}}) { + ## To correctly reference any pathnames in the input file, chdir to + ## its directory if there's any directory component to the specified path. + ## mpc_basename() always expects UNIX file format. + $cfile =~ s/\\/\//g; + my $base = ($cfile eq '' ? '' : $self->mpc_basename($cfile)); + + $base = '' if (-d $cfile); + + foreach my $name (@{$options->{'creators'}}) { + ++$loopTimes; + + if (!$loaded{$name}) { + require "$name.pm"; + $loaded{$name} = 1; + } + my $file = $cfile; + my $creator = $name->new($options->{'global'}, + $options->{'include'}, + $options->{'template'}, + $options->{'ti'}, + $options->{'dynamic'}, + $options->{'static'}, + $options->{'relative'}, + $options->{'addtemp'}, + $options->{'addproj'}, + (-t 1 ? \&progress : undef), + $options->{'toplevel'}, + $options->{'baseprojs'}, + $global_feature_file, + $options->{'relative_file'}, + $options->{'feature_file'}, + $options->{'features'}, + $options->{'hierarchy'}, + $options->{'exclude'}, + $options->{'make_coexistence'}, + $options->{'name_modifier'}, + $options->{'apply_project'}, + $options->{'genins'}, + $options->{'into'}, + $options->{'language'}, + $options->{'use_env'}, + $options->{'expand_vars'}, + $options->{'gendot'}, + $options->{'comments'}, + $options->{'for_eclipse'}); + + ## Update settings based on the configuration file + $creator->set_verbose_ordering($cfg->get_value('verbose_ordering')); + + if ($base ne $file) { + my $dir = ($base eq '' ? $file : $self->mpc_dirname($file)); + if (!$creator->cd($dir)) { + $self->error("Unable to change to directory: $dir"); + $status++; + last; + } + $file = $base; + } + my $diag = 'Generating \'' . $self->extractType($name) . + '\' output using '; + if ($file eq '') { + $diag .= 'default input'; + } + else { + my $partial = $self->getcwd(); + my $oescaped = $self->escape_regex_special($orig_dir) . '(/)?'; + $partial =~ s!\\!/!g; + $partial =~ s/^$oescaped//; + $diag .= ($partial ne '' ? "$partial/" : '') . $file; + } + $self->diagnostic($diag); + my $start = time(); + if (!$creator->generate($file)) { + $self->error("Unable to process: " . + ($file eq '' ? 'default input' : $file)); + $status++; + last; + } + my $total = time() - $start; + $self->diagnostic('Generation Time: ' . + (int($total / 60) > 0 ? int($total / 60) . 'm ' : '') . + ($total % 60) . 's'); + $creator->cd($orig_dir); + } + last if ($status); + } + + ## If we went through the loop more than once, we need to print + ## out the total amount of time + if ($loopTimes > 1) { + my $total = time() - $startTime; + $self->diagnostic(' Total Time: ' . + (int($total / 60) > 0 ? int($total / 60) . 'm ' : '') . + ($total % 60) . 's'); + } + + return $status; +} + + +sub progress { + ## This method will be called before each output file is written. + print "$progress[$index]\r"; + $index++; + $index = 0 if ($index > $#progress); +} + + +1; diff --git a/ACE/MPC/modules/EM3ProjectCreator.pm b/ACE/MPC/modules/EM3ProjectCreator.pm new file mode 100644 index 00000000000..280f4cb4f4f --- /dev/null +++ b/ACE/MPC/modules/EM3ProjectCreator.pm @@ -0,0 +1,54 @@ +package EM3ProjectCreator; + +# ************************************************************ +# Description : An eMbedded Visual C++ 3.00 Project Creator +# Author : Chad Elliott +# Create Date : 7/3/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use VC6ProjectCreator; + +use vars qw(@ISA); +@ISA = qw(VC6ProjectCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub project_file_extension { + #my $self = shift; + return '.vcp'; +} + + +sub get_dll_exe_template_input_file { + #my $self = shift; + return 'em3vcpdllexe'; +} + + +sub get_lib_exe_template_input_file { + #my $self = shift; + return 'em3vcplibexe'; +} + + +sub get_lib_template_input_file { + #my $self = shift; + return 'em3vcplib'; +} + + +sub get_dll_template_input_file { + #my $self = shift; + return 'em3vcpdll'; +} + + +1; diff --git a/ACE/MPC/modules/EM3WorkspaceCreator.pm b/ACE/MPC/modules/EM3WorkspaceCreator.pm new file mode 100644 index 00000000000..09e20fdf653 --- /dev/null +++ b/ACE/MPC/modules/EM3WorkspaceCreator.pm @@ -0,0 +1,53 @@ +package EM3WorkspaceCreator; + +# ************************************************************ +# Description : An eMbedded v3 Workspace Creator +# Author : Chad Elliott +# Create Date : 7/3/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use EM3ProjectCreator; +use VC6WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(VC6WorkspaceCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + + +sub workspace_file_extension { + #my $self = shift; + return '.vcw'; +} + + +sub pre_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + ## This identifies it as a Visual C++ for WinCE file + print $fh 'Microsoft eMbedded Visual Tools Workspace File, Format Version 3.00', $crlf; + + ## Optionally print the workspace comment + $self->print_workspace_comment($fh, + '#', $crlf, + '# $Id$', $crlf, + '#', $crlf, + '# This file was generated by MPC. Any changes made directly to', $crlf, + '# this file will be lost the next time it is generated.', $crlf, + '#', $crlf, + '# MPC Command:', $crlf, + '# ', $self->create_command_line_string($0, @ARGV), $crlf, + $crlf); +} + + +1; diff --git a/ACE/MPC/modules/FeatureParser.pm b/ACE/MPC/modules/FeatureParser.pm new file mode 100644 index 00000000000..e0a5ced6843 --- /dev/null +++ b/ACE/MPC/modules/FeatureParser.pm @@ -0,0 +1,89 @@ +package FeatureParser; + +# ************************************************************ +# Description : Reads the feature files and store the values +# Author : Chad Elliott +# Create Date : 5/21/2003 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use Parser; + +use vars qw(@ISA); +@ISA = qw(Parser); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + my $class = shift; + my $features = shift; + my @files = @_; + my $self = $class->SUPER::new(); + + ## Set the values associative array + $self->{'values'} = {}; + + ## Process each feature file + foreach my $f (@files) { + if (defined $f) { + my($status, $warn) = $self->read_file($f); + if (!$status) { + ## We only want to warn the user about problems + ## with the feature file. + my $lnumber = $self->get_line_number(); + $self->warning($self->mpc_basename($f) . ": line $lnumber: $warn"); + } + } + } + + ## Process each feature definition + foreach my $feature (@$features) { + my($status, $warn) = $self->parse_line(undef, $feature); + ## We only want to warn the user about problems + ## with the -feature option. + $self->warning("-features parameter: $warn") if (!$status); + } + + return $self; +} + + +sub parse_line { + my($self, $if, $line) = @_; + my $error; + + if ($line eq '') { + } + elsif ($line =~ /^(\w+)\s*=\s*(\d+)$/) { + ## This is a valid value, so we can store it. + $self->{'values'}->{lc($1)} = $2; + } + else { + $error = "Unrecognized line: $line"; + } + + return (defined $error ? 0 : 1), $error; +} + + +sub get_names { + my @names = sort keys %{$_[0]->{'values'}}; + return \@names; +} + + +sub get_value { + ## All feature names are case-insensitive. + my($self, $tag) = @_; + return $self->{'values'}->{lc($tag)}; +} + + +1; diff --git a/ACE/MPC/modules/GHSProjectCreator.pm b/ACE/MPC/modules/GHSProjectCreator.pm new file mode 100644 index 00000000000..ab7d9eeea8a --- /dev/null +++ b/ACE/MPC/modules/GHSProjectCreator.pm @@ -0,0 +1,166 @@ +package GHSProjectCreator; + +# ************************************************************ +# Description : A GHS project creator for version 4.x. +# By default, this module assumes Multi will +# be used on Windows. If it is not, you must +# set the MPC_GHS_UNIX environment variable. +# Author : Chad Elliott +# Create Date : 4/19/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use ProjectCreator; + +use vars qw(@ISA); +@ISA = qw(ProjectCreator); + +# ************************************************************ +# Data Section +# ************************************************************ + +my $startre; +my $ghsunix = 'MPC_GHS_UNIX'; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub convert_slashes { + return (defined $ENV{$ghsunix} ? 0 : 1); +} + + +sub case_insensitive { + return (defined $ENV{$ghsunix} ? 0 : 1); +} + + +sub use_win_compatibility_commands { + return (defined $ENV{$ghsunix} ? 0 : 1); +} + + +sub post_file_creation { + my $self = shift; + + ## These special files are only used if it is a custom only project or + ## there are no source files in the project. + if ((defined $self->get_assignment('custom_only') || + !defined $self->get_assignment('source_files')) && + defined $self->get_assignment('custom_types')) { + my $fh = new FileHandle(); + if (open($fh, '>.custom_build_rule')) { + print $fh ".empty_html_file\n"; + close($fh); + } + if (open($fh, '>.empty_html_file')) { + close($fh); + } + } +} + +sub compare_output { + #my $self = shift; + return 1; +} + + +sub project_file_extension { + #my $self = shift; + return '.gpj'; +} + + +sub fill_value { + my($self, $name) = @_; + my $value; + + if (!defined $startre) { + $startre = $self->escape_regex_special($self->getstartdir()); + } + + ## The Green Hills project format is strange and needs all paths + ## relative to the top directory, no matter where the source files + ## reside. The template uses reltop_ in front of the real project + ## settings, so we get the value of the real keyword and then do some + ## adjusting to get it relative to the top directory. + if ($name =~ /^reltop_(\w+)/) { + $value = $self->relative($self->get_assignment($1)); + if (defined $value) { + my $part = $self->getcwd(); + $part =~ s/^$startre[\/]?//; + if ($part ne '') { + if ($value eq '.') { + $value = $part; + } + else { + $value = $part . '/' . $value; + } + } + } + } + elsif ($name eq 'reltop') { + $value = $self->getcwd(); + $value =~ s/^$startre[\/]?//; + $value = '.' if ($value eq ''); + } + elsif ($name eq 'slash') { + ## We need to override the slash value so that we can give the right + ## value for Windows or UNIX. + $value = (defined $ENV{$ghsunix} ? '/' : '\\'); + } + elsif ($name eq 'postmkdir') { + ## If we're on Windows, we need an "or" command that will reset the + ## errorlevel so that a mkdir on a directory that already exists + ## doesn't cause the build to cease. + $value = ' || type nul' if (!defined $ENV{$ghsunix}); + } + + return $value; +} + +sub get_dll_exe_template_input_file { + #my $self = shift; + return 'ghsdllexe'; +} + + +sub get_lib_exe_template_input_file { + #my $self = shift; + return 'ghslibexe'; +} + + +sub get_lib_template_input_file { + #my $self = shift; + return 'ghslib'; +} + + +sub get_dll_template_input_file { + #my $self = shift; + return 'ghsdll'; +} + + +sub get_properties { + my $self = shift; + + ## Get the base class properties and add the properties that we + ## support. + my $props = $self->ProjectCreator::get_properties(); + + ## This project creator can work for UNIX and Windows. Set the + ## property based on the environment variable. + $$props{'windows'} = 1 if (!defined $ENV{$ghsunix}); + + return $props; +} + +1; diff --git a/ACE/MPC/modules/GHSWorkspaceCreator.pm b/ACE/MPC/modules/GHSWorkspaceCreator.pm new file mode 100644 index 00000000000..9236b1cb5d7 --- /dev/null +++ b/ACE/MPC/modules/GHSWorkspaceCreator.pm @@ -0,0 +1,199 @@ +package GHSWorkspaceCreator; + +# ************************************************************ +# Description : A GHS Workspace creator for version 4.x +# Author : Chad Elliott +# Create Date : 7/3/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use GHSProjectCreator; +use WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(WorkspaceCreator); + +# ************************************************************ +# Data Section +# ************************************************************ + +my %directives = ('I' => 1, + 'L' => 1, + 'D' => 1, + 'l' => 1, + 'G' => 1, + 'non_shared' => 1, + 'bsp' => 1, + 'os_dir' => 1, + ); +my $tgt; +my $integrity = '[INTEGRITY Application]'; +my @integ_bsps; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub compare_output { + #my $self = shift; + return 1; +} + + +sub workspace_file_name { + return $_[0]->get_modified_workspace_name('default', '.gpj'); +} + + +sub pre_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + my $prjs = $self->get_projects(); + + ## Take the primaryTarget from the first project in the list + if (defined $$prjs[0]) { + my $fh = new FileHandle(); + my $outdir = $self->get_outdir(); + if (open($fh, "$outdir/$$prjs[0]")) { + while(<$fh>) { + if (/^#primaryTarget=(.+)$/) { + $tgt = $1; + last; + } + } + close($fh); + } + } + + ## Print out the preliminary information + print $fh "#!gbuild$crlf", + "primaryTarget=$tgt$crlf", + "[Project]$crlf", + "\t--one_instantiation_per_object$crlf", + "\t:sourceDir=.$crlf", + "\t--std$crlf", + "\t-language=cxx$crlf", + "\t--long_long$crlf", + "\t--new_style_casts$crlf"; +} + + +sub create_integrity_project { + my($self, $int_proj, $project, $type, $target) = @_; + my $outdir = $self->get_outdir(); + my $crlf = $self->crlf(); + my $fh = new FileHandle(); + my $int_file = $int_proj; + $int_file =~ s/\.gpj$/.int/; + + if (open($fh, ">$outdir/$int_proj")) { + ## First print out the project file + print $fh "#!gbuild$crlf", + "\t$integrity$crlf", + "$project\t\t$type$crlf", + "$int_file$crlf"; + foreach my $bsp (@integ_bsps) { + print $fh "$bsp$crlf"; + } + close($fh); + + ## Next create the integration file + if (open($fh, ">$outdir/$int_file")) { + print $fh "Kernel$crlf", + "\tFilename\t\t\tDynamicDownload$crlf", + "EndKernel$crlf$crlf", + "AddressSpace$crlf", + "\tFilename\t\t\t$target$crlf", + "\tLanguage\t\t\tC++$crlf", + "\tLibrary\t\t\t\tlibINTEGRITY.so$crlf", + "\tLibrary\t\t\t\tlibc.so$crlf", + "\tLibrary\t\t\t\tlibscxx_e.so$crlf", + "\tTask Initial$crlf", + "\t\tStackLength\t\t0x8000$crlf", + "\tEndTask$crlf", + "EndAddressSpace$crlf"; + close($fh); + } + } +} + + +sub mix_settings { + my($self, $project) = @_; + my $rh = new FileHandle(); + my $mix = $project; + my $outdir = $self->get_outdir(); + + ## Things that seem like they should be set in the project + ## actually have to be set in the controlling project file. + if (open($rh, "$outdir/$project")) { + my $crlf = $self->crlf(); + my $integrity_project = (index($tgt, 'integrity') >= 0); + my($int_proj, $int_type, $target); + + while(<$rh>) { + if (/^\s*(\[(Program|Library|Subproject)\])\s*$/) { + my $type = $1; + if ($integrity_project && $type eq '[Program]') { + $int_proj = $project; + $int_proj =~ s/(\.gpj)$/_int$1/; + $int_type = $type; + $mix =~ s/(\.gpj)$/_int$1/; + $type = $integrity; + } + $mix .= "\t\t$type$crlf" . + "\t-object_dir=" . $self->mpc_dirname($project) . + '/.obj' . $crlf; + } + elsif (/^\s*(\[Shared Object\])\s*$/) { + $mix .= "\t\t$1$crlf" . + "\t-pic$crlf" . + "\t-object_dir=" . $self->mpc_dirname($project) . + '/.shobj' . $crlf; + } + elsif ($integrity_project && /^(.*\.bsp)\s/) { + push(@integ_bsps, $1); + } + else { + if (/^\s*\-((\w)\w*)/) { + ## Save the required options into the mixed project string + if (defined $directives{$2} || defined $directives{$1}) { + $mix .= $_; + } + + ## If this is an integrity project, we need to find out + ## what the output file will be for the integrate file. + if (defined $int_proj && /^\s*\-o\s+(.*)\s$/) { + $target = $1; + } + } + } + } + if (defined $int_proj) { + $self->create_integrity_project($int_proj, $project, + $int_type, $target); + } + close($rh); + } + + return $mix; +} + + +sub write_comps { + my($self, $fh) = @_; + + ## Print out each projet + foreach my $project ($self->sort_dependencies($self->get_projects(), 0)) { + print $fh $self->mix_settings($project); + } +} + + + +1; diff --git a/ACE/MPC/modules/GUID.pm b/ACE/MPC/modules/GUID.pm new file mode 100644 index 00000000000..0f4a29b709a --- /dev/null +++ b/ACE/MPC/modules/GUID.pm @@ -0,0 +1,48 @@ +package GUID; + +# ************************************************************ +# Description : Generate GUID's for VC7 projects and workspaces +# Author : Chad Elliott +# Create Date : 5/14/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub generate { + my($out, $in, $cwd) = @_; + my $chash = GUID::hash($cwd); + my $nhash = GUID::hash($out); + my $ihash = GUID::hash($in); + my $val = 0xfeca1bad; + + return sprintf("%08X-%04X-%04X-%04X-%04X%08X", + $nhash & 0xffffffff, ($val >> 16) & 0xffff, + ($val & 0xffff), ($ihash >> 16) & 0xffff, + $ihash & 0xffff, $chash & 0xffffffff); +} + + +sub hash { + my $str = shift; + my $value = 0; + + if (defined $str) { + my $length = length($str); + for(my $i = 0; $i < $length; $i++) { + $value = (($value << 4) & 0xffffffff) ^ ($value >> 28) + ^ ord(substr($str, $i, 1)); + } + } + + return $value; +} + +1; diff --git a/ACE/MPC/modules/HTMLProjectCreator.pm b/ACE/MPC/modules/HTMLProjectCreator.pm new file mode 100644 index 00000000000..00e49087393 --- /dev/null +++ b/ACE/MPC/modules/HTMLProjectCreator.pm @@ -0,0 +1,133 @@ +package HTMLProjectCreator; + +# ************************************************************ +# Description : An HTML project creator to display all settings +# Author : Justin Michel & Chad Elliott +# Create Date : 8/25/2003 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use ProjectCreator; +use XMLProjectBase; + +use vars qw(@ISA); +@ISA = qw(XMLProjectBase ProjectCreator); + +# ************************************************************ +# Data Section +# ************************************************************ + +my $style_indent = .5; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub file_sorter { + #my $self = shift; + #my $left = shift; + #my $right = shift; + return lc($_[1]) cmp lc($_[2]); +} + + +sub label_nodes { + my($self, $hash, $nodes, $level) = @_; + + foreach my $key (sort keys %$hash) { + push(@$nodes, [$level, $key]); + $self->label_nodes($$hash{$key}, $nodes, $level + 1); + } +} + + +sub count_levels { + my($self, $hash, $current, $count) = @_; + + foreach my $key (keys %$hash) { + $self->count_levels($$hash{$key}, $current + 1, $count); + } + $$count = $current if ($current > $$count); +} + + +sub fill_value { + my($self, $name) = @_; + my $value; + + if ($name eq 'inheritance_nodes') { + ## Get the nodes with numeric labels for the level + my @nodes; + $self->label_nodes($self->get_inheritance_tree(), \@nodes, 0); + + ## Push each node onto the value array + $value = []; + for(my $i = 0; $i <= $#nodes; ++$i) { + my $file = $nodes[$i]->[1]; + my $dir = $self->mpc_dirname($file); + my $base = $self->mpc_basename($file); + + ## Relative paths do not work at all in a web browser + $file = $base if ($dir eq '.'); + + my $path = ($base eq $file ? $self->getcwd() . '/' : ''); + my $name; + + if ($i == 0) { + ## If this is the first node, then replace the base filename + ## with the actual project name. + $name = $self->project_name(); + } + else { + ## This is a base project, so we use the basename and + ## remove the file extension. + $name = $base; + $name =~ s/\.[^\.]+$//; + } + + ## Create the div and a tags. + push(@$value, '<a href="file://' . $path . $file . + '" onClick="return popup(this, \'Project File\')" ' . + 'target=_blank>' . + '<div class="tree' . $nodes[$i]->[0] . '">' . + $name . '</div></a>'); + } + } + elsif ($name eq 'tree_styles') { + ## Count the number of levels deep the inheritance goes + my $count = 0; + $self->count_levels($self->get_inheritance_tree(), 0, \$count); + + my $margin = 0; + my $start = 100; + my $max = 255; + my $inc = ($count ne 0 ? int(($max - $start) / $count) : $max); + + ## Push each tree style onto the value array + $value = []; + for(my $i = 0; $i < $count; ++$i) { + push(@$value, ".tree$i { background-color: #" . + sprintf("%02x%02x%02x", 0, $start, $start) . ';' . + ($margin != 0 ? " margin-left: $margin" . 'in;' : '') . + ' }'); + $start += $inc; + $margin += $style_indent; + } + } + + return $value; +} + + +sub project_file_extension { + #my $self = shift; + return '.html'; +} + + +1; diff --git a/ACE/MPC/modules/HTMLWorkspaceCreator.pm b/ACE/MPC/modules/HTMLWorkspaceCreator.pm new file mode 100644 index 00000000000..de4c727bbe6 --- /dev/null +++ b/ACE/MPC/modules/HTMLWorkspaceCreator.pm @@ -0,0 +1,90 @@ +package HTMLWorkspaceCreator; + +# ************************************************************ +# Description : An html workspace creator +# Author : Justin Michel +# Create Date : 8/25/2003 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use HTMLProjectCreator; +use WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(WorkspaceCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub workspace_file_extension { + #my $self = shift; + return '_workspace.html'; +} + + +sub pre_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + ## Print the header + print $fh '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', $crlf, + '<html>', $crlf; + + ## Next, goes the workspace comment + $self->print_workspace_comment($fh, + '<!-- $Id$ -->', $crlf, + '<!-- MPC Command: -->', $crlf, + '<!-- ', $self->create_command_line_string($0, @ARGV),' -->', $crlf); + + ## Then, comes the title and the CSS settings. + print $fh '<head>', $crlf, + '<title>', $self->get_workspace_name(), '</title>', $crlf, + ' <style type="text/css">', $crlf, + ' a {font: 12pt bold verdana, lucida; color: white; padding: 3px;}', $crlf, + ' td {font: 12pt bold verdana, lucida; color: white; padding: 3px; background-color: cadetblue;}', $crlf, + ' thead tr td {font: 18pt "trebuchet ms", helvetica; color: white; padding: 3px; background-color: teal;}', $crlf, + ' </style>', $crlf, + '</head>', $crlf, + '<body>', $crlf; +} + + +sub write_comps { + my($self, $fh, $creator) = @_; + my $crlf = $self->crlf(); + + ## Start the table for all of the projects + print $fh "<table style=\"table-layout:fixed\" width=\"400\" " . + "summary=\"MPC Projects\">$crlf" . + "<col style=\"background-color: darkcyan;\">$crlf" . + "<thead>$crlf" . + "<tr><td>Projects In Build Order</td></tr>$crlf" . + "</thead>$crlf" . + "<tbody>$crlf"; + + ## Sort the projects in build order instead of alphabetical order + my $project_info = $self->get_project_info(); + foreach my $project ($self->sort_dependencies($self->get_projects(), 0)) { + print $fh "<tr><td>" . + "<a href='$project'>$$project_info{$project}->[0]</a>" . + "</td></tr>$crlf"; + } + + ## End the table + print $fh "</tbody></table>"; +} + + +sub post_workspace { + my($self, $fh) = @_; + print $fh "</body></html>" . $self->crlf(); +} + + +1; diff --git a/ACE/MPC/modules/MPC.pm b/ACE/MPC/modules/MPC.pm new file mode 100644 index 00000000000..7a99498143d --- /dev/null +++ b/ACE/MPC/modules/MPC.pm @@ -0,0 +1,41 @@ +package MPC; + +# ****************************************************************** +# Description : Instantiate a Driver and run it. This is here to +# maintain backward compatibility. +# Author : Chad Elliott +# Create Date : 1/30/2004 +# ****************************************************************** + +# ****************************************************************** +# Pragma Section +# ****************************************************************** + +use strict; +use Driver; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + my $class = shift; + my $self = bless {'creators' => [], + }, $class; + return $self; +} + + +sub getCreatorList { + return $_[0]->{'creators'}; +} + + +sub execute { + my($self, $base, $name, $args) = @_; + my $driver = new Driver($base, $name, @{$self->{'creators'}}); + return $driver->run(@$args); +} + + +1; diff --git a/ACE/MPC/modules/MWC.pm b/ACE/MPC/modules/MWC.pm new file mode 100644 index 00000000000..85d589b9bbc --- /dev/null +++ b/ACE/MPC/modules/MWC.pm @@ -0,0 +1,41 @@ +package MWC; + +# ****************************************************************** +# Description : Instantiate a Driver and run it. This is here to +# maintain backward compatibility. +# Author : Chad Elliott +# Create Date : 1/30/2004 +# ****************************************************************** + +# ****************************************************************** +# Pragma Section +# ****************************************************************** + +use strict; +use Driver; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + my $class = shift; + my $self = bless {'creators' => [], + }, $class; + return $self; +} + + +sub getCreatorList { + return $_[0]->{'creators'}; +} + + +sub execute { + my($self, $base, $name, $args) = @_; + my $driver = new Driver($base, $name, @{$self->{'creators'}}); + return $driver->run(@$args); +} + + +1; diff --git a/ACE/MPC/modules/MakeProjectBase.pm b/ACE/MPC/modules/MakeProjectBase.pm new file mode 100644 index 00000000000..cc84ca8f566 --- /dev/null +++ b/ACE/MPC/modules/MakeProjectBase.pm @@ -0,0 +1,51 @@ +package MakeProjectBase; + +# ************************************************************ +# Description : A Make Project base module +# Author : Chad Elliott +# Create Date : 1/4/2005 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub dollar_special { + #my $self = shift; + return 1; +} + + +sub sort_files { + #my $self = shift; + return (defined $ENV{MPC_ALWAYS_SORT}); +} + + +sub project_file_prefix { + #my $self = shift; + return 'Makefile.'; +} + + +sub get_properties { + my $self = shift; + + ## Get the base class properties and add the properties that we + ## support. + my $props = $self->ProjectCreator::get_properties(); + + ## All projects that use this base class are 'make' based. + $$props{'make'} = 1; + + return $props; +} + + +1; diff --git a/ACE/MPC/modules/MakeProjectCreator.pm b/ACE/MPC/modules/MakeProjectCreator.pm new file mode 100644 index 00000000000..3c589fed6cc --- /dev/null +++ b/ACE/MPC/modules/MakeProjectCreator.pm @@ -0,0 +1,105 @@ +package MakeProjectCreator; + +# ************************************************************ +# Description : A Generic Make Project Creator +# Author : Chad Elliott +# Create Date : 2/18/2003 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use MakeProjectBase; +use ProjectCreator; + +use vars qw(@ISA); +@ISA = qw(MakeProjectBase ProjectCreator); + +# ************************************************************ +# Data Section +# ************************************************************ + +my %info = (Creator::cplusplus => {'dllexe' => 'makeexe', + 'dll' => 'makedll', + 'template' => 'make', + }, + Creator::csharp => {'dllexe' => 'make.net', + 'dll' => 'make.net', + 'template' => 'make.net', + }, + Creator::java => {'dllexe' => 'makeexe', + 'dll' => 'makedll', + 'template' => 'make', + }, + Creator::vb => {'dllexe' => 'make.net', + 'dll' => 'make.net', + 'template' => 'make.net', + }, + ); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub languageSupported { + return defined $info{$_[0]->get_language()}; +} + + +sub escape_spaces { + #my $self = shift; + return 1; +} + + +sub get_dll_exe_template_input_file { + return $info{$_[0]->get_language()}->{'dllexe'}; +} + + +sub get_dll_template_input_file { + return $info{$_[0]->get_language()}->{'dll'}; +} + + +sub get_template { + return $info{$_[0]->get_language()}->{'template'}; +} + +sub fill_value { + my($self, $name) = @_; + + if ($name eq 'compilers') { + ## The default compilers template variable value is determined by the + ## language and directly corresponds to a group of settings in the + ## .mpt file (make.net.mpt for csharp and makedll.mpt for all + ## others). + my $language = $self->get_language(); + if ($language eq Creator::java) { + return 'java'; + } + elsif ($language eq Creator::csharp) { + return 'gmcs'; + } + else { + return 'gcc'; + } + } + elsif ($name eq 'language') { + ## Allow the language to be available to the template. Certain + ## things are not used in make.mpd when the language is java. + return $self->get_language(); + } + elsif ($name eq 'main') { + ## The main is needed when generating the makefiles for use with gcj. + my @sources = $self->get_component_list('source_files', 1); + my $exename = $self->find_main_file(\@sources); + return $exename if (defined $exename); + } + + return undef; +} +1; diff --git a/ACE/MPC/modules/MakeWorkspaceBase.pm b/ACE/MPC/modules/MakeWorkspaceBase.pm new file mode 100644 index 00000000000..35a78667191 --- /dev/null +++ b/ACE/MPC/modules/MakeWorkspaceBase.pm @@ -0,0 +1,343 @@ +package MakeWorkspaceBase; + +# ************************************************************ +# Description : A Make Workspace base module +# Author : Chad Elliott +# Create Date : 11/21/2006 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub targets { + return $_[0]->{'make_targets'}; +} + +sub workspace_file_prefix { + #my $self = shift; + return 'Makefile'; +} + + +sub workspace_file_extension { + #my $self = shift; + return ''; +} + + +sub supports_make_coexistence { + return ($_[0]->workspace_file_extension() ne ''); +} + + +sub workspace_file_name { + my $self = shift; + return $self->get_modified_workspace_name( + $self->workspace_file_prefix(), + $self->make_coexistence() ? + $self->workspace_file_extension() : ''); +} + + +sub workspace_per_project { + #my $self = shift; + return 1; +} + + +sub workspace_preamble { + my($self, $fh, $crlf, $name, $id) = @_; + + ## Optionally print the workspace comment + $self->print_workspace_comment($fh, + '#----------------------------------------------------------------------------', $crlf, + '# ', $name, $crlf, + '#', $crlf, + '# ', $id, $crlf, + '#', $crlf, + '# This file was generated by MPC. Any changes made directly to', $crlf, + '# this file will be lost the next time it is generated.', $crlf, + '#', $crlf, + '# MPC Command:', $crlf, + '# ', $self->create_command_line_string($0, @ARGV), $crlf, + '#', $crlf, + '#----------------------------------------------------------------------------', $crlf, + $crlf); +} + + +sub write_named_targets { + my($self, $fh, $crlf, $targnum, $list, $remain, $targpre, $allpre, $trans, $phony, $andsym, $maxline) = @_; + + ## Save the targets for later + $self->{'make_targets'} = $remain; + + ## Print out the "all" target + if (defined $maxline) { + my $all = 'all:'; + foreach my $project (@$list) { + $all .= " $$trans{$project}"; + } + if (length($all) < $maxline) { + print $fh $crlf, $all; + } + else { + $remain = 'all ' . $remain; + } + } + else { + print $fh $crlf . 'all:'; + foreach my $project (@$list) { + print $fh " $$trans{$project}"; + } + } + + ## Print out all other targets here + print $fh "$crlf$crlf$remain:$crlf"; + $self->write_project_targets($fh, $crlf, + $targpre . '$(@)', $list, $andsym); + + ## Print out each target separately + foreach my $project (@$list) { + print $fh ($phony ? "$crlf.PHONY: $$trans{$project}" : ''), + $crlf, $$trans{$project}, ':'; + if (defined $$targnum{$project}) { + foreach my $number (@{$$targnum{$project}}) { + print $fh " $$trans{$$list[$number]}"; + } + } + print $fh $crlf; + $self->write_project_targets($fh, $crlf, + $targpre . $allpre . 'all', + [ $project ], $andsym); + } + + ## Print out the project_name_list target + print $fh $crlf, "project_name_list:$crlf"; + foreach my $project (sort @$list) { + print $fh "\t\@echo $$trans{$project}$crlf"; + } +} + + +sub post_workspace { + my($self, $wsfh, $creator, $toplevel) = @_; + + if ($toplevel && $self->{'for_eclipse'}) { + my $crlf = $self->crlf(); + my $outdir = $self->get_outdir(); + my $fh = new FileHandle(); + my $outfile = "$outdir/.cdtproject"; + my $pjt = $self->get_eclipse_cdtproject(); + + if (open($fh, ">$outfile")) { + ## We want to set the make command to nmake for the nmake project + ## type. As far as stopping on an error, I don't remember why this + ## is true only for Borland make. + my $cmd = ("$self" =~ /^nmake/i ? 'nmake' : 'make'); + my $stop = ("$self" =~ /^bmake/i ? 'true' : 'false'); + print $fh $$pjt[0]; + foreach my $target ('all', + grep(/^[\w\-]+$/, split(/\s+/, $self->targets()))) { + print $fh ' <target name="', $target, '" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">', $crlf, + ' <buildCommand>', $cmd, '</buildCommand>', $crlf, + ' <buildArguments></buildArguments>', $crlf, + ' <buildTarget>', $target, '</buildTarget> ', $crlf, + ' <stopOnError>', $stop, '</stopOnError>', $crlf, + ' <useDefaultCommand>false</useDefaultCommand>', $crlf, + ' </target>', $crlf; + } + print $fh $$pjt[1]; + close($fh); + } + else { + $self->warning("Unable to create $outfile"); + } + + ## Create the eclipse project which is unchanging except for the name + ## of the starting makefile. + $pjt = $self->get_eclipse_project(); + $outfile = "$outdir/.project"; + if (open($fh, ">$outfile")) { + print $fh $$pjt[0], $self->get_workspace_name(), $$pjt[1]; + close($fh); + } + else { + $self->warning("Unable to create $outfile"); + } + } +} + + +sub get_eclipse_cdtproject { + my $self = shift; + if (!defined $self->{'eclipse_cdtproject'}) { + $self->{'eclipse_cdtproject'} = [ +'<?xml version="1.0" encoding="UTF-8"?> +<?eclipse-cdt version="2.0"?> +<cdtproject id="org.eclipse.cdt.make.core.make"> + <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.nullindexer" point="org.eclipse.cdt.core.CIndexer"/> + <data> + <item id="scannerConfiguration"> + <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/> + <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="true" filePath=""/> + <parser enabled="true"/> + </buildOutputProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="false" filePath=""/> + <parser enabled="false"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> + <parser enabled="false"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> + <buildOutputProvider> + <openAction enabled="false" filePath=""/> + <parser enabled="false"/> + </buildOutputProvider> + <scannerInfoProvider id="specsFile"> + <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> + <parser enabled="false"/> + </scannerInfoProvider> + </profile> + <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> + <buildOutputProvider> + <openAction enabled="false" filePath=""/> + <parser enabled="false"/> + </buildOutputProvider> + <scannerInfoProvider id="makefileGenerator"> + <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> + <parser enabled="false"/> + </scannerInfoProvider> + </profile> + </item> + <item id="org.eclipse.cdt.core.pathentry"> + <pathentry kind="src" path=""/> + <pathentry kind="out" path=""/> + <pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/> + </item> + <item id="org.eclipse.cdt.make.core.buildtargets"> + <buildTargets> +', + +' </buildTargets> + </item> + </data> +</cdtproject> +']; + } + return $self->{'eclipse_cdtproject'}; +} + + +sub get_eclipse_project { + my $self = shift; + if (!defined $self->{'eclipse_project'}) { + $self->{'eclipse_project'} = [ +'<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>', +'</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.cdt.make.core.makeBuilder</name> + <triggers>clean,full,incremental,</triggers> + <arguments> + <dictionary> + <key>org.eclipse.cdt.make.core.build.arguments</key> + <value></value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.core.errorOutputParser</key> + <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableAutoBuild</key> + <value>false</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.environment</key> + <value></value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableFullBuild</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.build.target.inc</key> + <value>all</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.build.target.clean</key> + <value>clean</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.build.command</key> + <value>make</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableCleanBuild</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.append_environment</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.build.target.full</key> + <value>clean all</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.build.target.auto</key> + <value>all</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.stopOnError</key> + <value>false</value> + </dictionary> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.cdt.core.cnature</nature> + <nature>org.eclipse.cdt.make.core.makeNature</nature> + <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature> + <nature>org.eclipse.cdt.core.ccnature</nature> + </natures> +</projectDescription> +']; + } + return $self->{'eclipse_project'}; +} + +1; diff --git a/ACE/MPC/modules/MakeWorkspaceCreator.pm b/ACE/MPC/modules/MakeWorkspaceCreator.pm new file mode 100644 index 00000000000..fe3c0d05c73 --- /dev/null +++ b/ACE/MPC/modules/MakeWorkspaceCreator.pm @@ -0,0 +1,71 @@ +package MakeWorkspaceCreator; + +# ************************************************************ +# Description : A Generic Workspace (Makefile) creator +# Author : Chad Elliott +# Create Date : 2/18/2003 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use MakeProjectCreator; +use MakeWorkspaceBase; +use WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(MakeWorkspaceBase WorkspaceCreator); + +# ************************************************************ +# Data Section +# ************************************************************ + +my $targets = 'clean depend generated realclean $(CUSTOM_TARGETS)'; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub write_project_targets { + my($self, $fh, $crlf, $target, $list) = @_; + + ## Print out a make command for each project + foreach my $project (@$list) { + my $dname = $self->mpc_dirname($project); + my $chdir = ($dname ne '.'); + print $fh "\t\@", + ($chdir ? "cd $dname && " : ''), + "\$(MAKE) -f ", + ($chdir ? $self->mpc_basename($project) : $project), + " $target$crlf"; + } +} + +sub pre_workspace { + my($self, $fh) = @_; + $self->workspace_preamble($fh, $self->crlf(), 'Make Workspace', + '$Id$'); +} + + +sub write_comps { + my($self, $fh) = @_; + my %targnum; + my @list = $self->number_target_deps($self->get_projects(), + $self->get_project_info(), + \%targnum, 0); + + ## Send all the information to our base class method + $self->write_named_targets($fh, $self->crlf(), \%targnum, \@list, + ($self->languageIs(Creator::csharp) ? + 'bundle ' : '') . $targets, '', 'generated ', + $self->project_target_translation(1), 1); +} + + + + +1; diff --git a/ACE/MPC/modules/NMakeProjectCreator.pm b/ACE/MPC/modules/NMakeProjectCreator.pm new file mode 100644 index 00000000000..8371142bdd0 --- /dev/null +++ b/ACE/MPC/modules/NMakeProjectCreator.pm @@ -0,0 +1,65 @@ +package NMakeProjectCreator; + +# ************************************************************ +# Description : An NMake Project Creator +# Author : Chad Elliott +# Create Date : 5/31/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use ProjectCreator; +use WinProjectBase; +use MakeProjectBase; + +use vars qw(@ISA); +@ISA = qw(MakeProjectBase WinProjectBase ProjectCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub project_file_extension { + #my $self = shift; + return '.mak'; +} + + +sub get_dll_exe_template_input_file { + #my $self = shift; + return 'nmakeexe'; +} + + +sub get_dll_template_input_file { + #my $self = shift; + return 'nmakedll'; +} + + +sub get_properties { + my $self = shift; + + ## Create the map of properties that we support. This is a reproduced + ## property from the VCProjectBase and out of laziness I have not made + ## a base project for just this property. + my $props = {'microsoft' => 1}; + + ## Merge in properties from all base projects + foreach my $base (@ISA) { + my $func = $base . '::get_properties'; + my $p = $self->$func(); + foreach my $key (keys %$p) { + $$props{$key} = $$p{$key}; + } + } + + return $props; +} + + +1; diff --git a/ACE/MPC/modules/NMakeWorkspaceCreator.pm b/ACE/MPC/modules/NMakeWorkspaceCreator.pm new file mode 100644 index 00000000000..80e39a898f6 --- /dev/null +++ b/ACE/MPC/modules/NMakeWorkspaceCreator.pm @@ -0,0 +1,108 @@ +package NMakeWorkspaceCreator; + +# ************************************************************ +# Description : A NMake Workspace (Makefile) creator +# Author : Chad Elliott +# Create Date : 6/10/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use NMakeProjectCreator; +use MakeWorkspaceBase; +use WinWorkspaceBase; +use WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(MakeWorkspaceBase WinWorkspaceBase WorkspaceCreator); + +# ************************************************************ +# Data Section +# ************************************************************ + +my $targets = 'clean depend generated realclean $(CUSTOM_TARGETS)'; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub workspace_file_extension { + #my $self = shift; + return '.mak'; +} + + +sub pre_workspace { + my($self, $fh) = @_; + $self->workspace_preamble($fh, $self->crlf(), 'NMAKE Workspace', + '$Id$'); +} + + +sub write_project_targets { + my($self, $fh, $crlf, $target, $list) = @_; + my $cwd = $self->getcwd(); + + ## Print out a make command for each project + foreach my $project (@$list) { + my $dir = $self->mpc_dirname($project); + my $chdir = ($dir ne '.'); + + print $fh ($chdir ? "\t\@cd $dir$crlf\t\@echo Directory: $dir$crlf" : ''), + "\t\@echo Project: ", $self->mpc_basename($project), $crlf, + "\t\$(MAKE) /\$(MAKEFLAGS) /f ", $self->mpc_basename($project), + " $target$crlf", + ($chdir ? "\t\@cd \$(MAKEDIR)$crlf" : ''); + } +} + + +sub write_comps { + my($self, $fh) = @_; + my %targnum; + my $pjs = $self->get_project_info(); + my @list = $self->number_target_deps($self->get_projects(), $pjs, + \%targnum, 0); + my $crlf = $self->crlf(); + my $default = 'Win32 Debug'; + + ## Determine the default configuration. We want to get the Debug + ## configuration (if available). It just so happens that Debug comes + ## before Release so sorting the configurations works in our favor. + foreach my $project (keys %$pjs) { + my($name, $deps, $pguid, $lang, $custom_only, $nocross, $managed, @cfgs) = @{$pjs->{$project}}; + @cfgs = sort @cfgs; + if (defined $cfgs[0]) { + $default = $cfgs[0]; + + ## The configuration comes out in the form that is usable to Visual + ## Studio. We need it to be in the form that was chosen for the + ## nmake configuration. So, we just swap the parts and remove the + ## '|' character. + $default =~ s/(.*)\|(.*)/$2 $1/; + last; + } + } + + ## Print out the content + print $fh '!IF "$(CFG)" == ""', $crlf, + 'CFG=', $default, $crlf, + '!MESSAGE No configuration specified. ', + 'Defaulting to ', $default, '.', $crlf, + '!ENDIF', $crlf, $crlf, + '!IF "$(CUSTOM_TARGETS)" == ""', $crlf, + 'CUSTOM_TARGETS=_EMPTY_TARGET_', $crlf, + '!ENDIF', $crlf; + + ## Send all the information to our base class method + $self->write_named_targets($fh, $crlf, \%targnum, \@list, + $targets, 'CFG="$(CFG)" ', '', + $self->project_target_translation()); +} + + +1; diff --git a/ACE/MPC/modules/Options.pm b/ACE/MPC/modules/Options.pm new file mode 100644 index 00000000000..130bbe56edb --- /dev/null +++ b/ACE/MPC/modules/Options.pm @@ -0,0 +1,602 @@ +package Options; + +# ************************************************************ +# Description : Process mpc command line options +# Author : Chad Elliott +# Create Date : 3/20/2003 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use DirectoryManager; +use StringProcessor; +use ProjectCreator; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub printUsage { + my $self = shift; + my $msg = shift; + my $base = shift; + my $version = shift; + my @types = @_; + + print STDERR "ERROR: $msg\n" if (defined $msg); + + my $spaces = (' ' x (length($base) + 8)); + print STDERR "$base v$version\n" . + "Usage: $base [-global <file>] [-include <directory>] [-recurse]\n" . + $spaces . "[-ti <dll | lib | dll_exe | lib_exe>:<file>] [-hierarchy]\n" . + $spaces . "[-template <file>] [-relative NAME=VAL] [-base <project>]\n" . + $spaces . "[-noreldefs] [-notoplevel] [-static] [-genins] [-use_env]\n" . + $spaces . "[-value_template <NAME+=VAL | NAME=VAL | NAME-=VAL>]\n" . + $spaces . "[-value_project <NAME+=VAL | NAME=VAL | NAME-=VAL>]\n" . + $spaces . "[-make_coexistence] [-feature_file <file name>] [-gendot]\n" . + $spaces . "[-expand_vars] [-features <feature definitions>]\n" . + $spaces . "[-exclude <directories>] [-name_modifier <pattern>]\n" . + $spaces . "[-apply_project] [-version] [-into <directory>]\n" . + $spaces . "[-gfeature_file <file name>] [-nocomments]\n" . + $spaces . "[-relative_file <file name>] [-for_eclipse]\n" . + $spaces . "[-language <"; + + my $olen = length($spaces) + 12; + my $len = $olen; + my $mlen = 77; + my @keys = sort(Creator::validLanguages()); + for(my $i = 0; $i <= $#keys; $i++) { + my $klen = length($keys[$i]); + $len += $klen; + if ($len > $mlen) { + print STDERR "\n$spaces "; + $len = $olen + $klen; + } + print STDERR $keys[$i]; + if ($i != $#keys) { + print STDERR ' | '; + $len += 3; + } + } + print STDERR ">]\n", + $spaces, "[-type <"; + + $olen = length($spaces) + 8; + $len = $olen; + + ## Sort the project types, but keep those that are the same with different + ## version numbers in the right order (i.e., vc8, vc9, vc10). The vc71 + ## type is a special case and needs to stay betwen vc7 and vc8. + @keys = sort { if ($a ne 'vc71' && $b ne 'vc71' && $a =~ /^([^\d]+)(\d+)$/) { + my($a1, $a2) = ($1, $2); + if ($b =~ /^([^\d]+)(\d+)$/ && $a1 eq $1) { + return $a2 <=> $2; + } + } + return $a cmp $b; + } @types; + for(my $i = 0; $i <= $#keys; $i++) { + my $klen = length($keys[$i]); + $len += $klen; + if ($len > $mlen) { + print STDERR "\n$spaces "; + $len = $olen + $klen; + } + print STDERR $keys[$i]; + if ($i != $#keys) { + print STDERR ' | '; + $len += 3; + } + } + print STDERR ">]\n" . + $spaces . "[files]\n\n"; + + print STDERR +" -base Add <project> as a base project to each generated\n" . +" project file. Do not provide a file extension, the\n" . +" .mpb extension will be tried first; if that fails the\n" . +" .mpc extension will be tried.\n" . +" -exclude Use this option to exclude directories or files when\n" . +" searching for input files.\n" . +" -expand_vars Perform direct expansion, instead of performing relative\n" . +" replacement with either -use_env or -relative options.\n" . +" -feature_file Specifies the feature file to read before processing.\n" . +" The default feature file is default.features under the\n" . +" config directory.\n" . +" -features Specifies the feature list to set before processing.\n" . +" -for_eclipse Generate files for use with eclipse. This is only\n" . +" useful for make based project types.\n" . +" -gendot Generate .dot files for use with Graphviz.\n" . +" -genins Generate .ins files for use with prj_install.pl.\n" . +" -gfeature_file Specifies the global feature file. The\n" . +" default value is global.features under the\n" . +" config directory.\n" . +" -global Specifies the global input file. Values stored\n" . +" within this file are applied to all projects.\n" . +" -hierarchy Generate a workspace in a hierarchical fashion.\n" . +" -include Specifies a directory to search when looking for base\n" . +" projects, template input files and templates. This\n" . +" option can be used multiple times to add directories.\n" . +" -into Place all output files in a mirrored directory\n" . +" structure starting at <directory>. This should be a\n" . +" full path.\n" . +" -language Specify the language preference; possible values are\n", +" [", join(', ', sort(Creator::validLanguages())), "]. The default is\n". +" " . Creator::defaultLanguage() . ".\n", +" -make_coexistence If multiple 'make' based project types are\n" . +" generated, they will be named such that they can coexist.\n" . +" -name_modifier Modify output names. The pattern passed to this\n" . +" parameter will have the '*' portion replaced with the\n" . +" actual output name. Ex. *_Static\n" . +" -apply_project When used in conjunction with -name_modifier, it applies\n" . +" the name modifier to the project name also.\n" . +" -nocomments Do not place comments in the generated files.\n" . +" -noreldefs Do not try to generate default relative definitions.\n" . +" -notoplevel Do not generate the top level target file. Files\n" . +" are still process, but no top level file is created.\n" . +" -recurse Recurse from the current directory and generate from\n" . +" all found input files.\n" . +" -relative Any \$() variable in an mpc file that is matched to NAME\n" . +" is replaced by VAL only if VAL can be made into a\n" . +" relative path based on the current working directory.\n" . +" This option can be used multiple times to add multiple\n" . +" variables.\n" . +" -relative_file Specifies the relative file to read before processing.\n" . +" The default relative file is default.rel under the\n" . +" config directory.\n" . +" -static Specifies that only static projects will be generated.\n" . +" By default, only dynamic projects are generated.\n" . +" -template Specifies the template name (with no extension).\n" . +" -ti Specifies the template input file (with no extension)\n" . +" for the specific type (ex. -ti dll_exe:vc8exe).\n" . +" -type Specifies the type of project file to generate. This\n" . +" option can be used multiple times to generate multiple\n" . +" types. There is no longer a default.\n" . +" -use_env Use environment variables for all uses of \$() instead\n" . +" of the relative replacement values.\n" . +" -value_project This option allows modification of a project variable\n" . +" assignment . Use += to add VAL to the NAME's value.\n" . +" Use -= to subtract and = to override the value.\n" . +" This can be used to introduce new name value pairs to\n" . +" a project. However, it must be a valid project\n" . +" assignment.\n" . +" -value_template This option allows modification of a template input\n" . +" name value pair. Use += to add VAL to the NAME's\n" . +" value. Use -= to subtract and = to override the value.\n" . +" -version Print the MPC version and exit.\n"; +} + + +sub optionError { + #my $self = shift; + #my $str = shift; +} + + +sub completion_command { + my($self, $name, $types) = @_; + my $str = "complete $name " . + "'c/-/(gendot genins global include type template relative " . + "ti static noreldefs notoplevel feature_file use_env " . + "value_template value_project make_coexistence language " . + "hierarchy exclude name_modifier apply_project version " . + "expand_vars gfeature_file nocomments for_eclipse relative_file)/' " . + "'c/dll:/f/' 'c/dll_exe:/f/' 'c/lib_exe:/f/' 'c/lib:/f/' " . + "'n/-ti/(dll lib dll_exe lib_exe)/:' "; + + $str .= "'n/-language/("; + my @keys = sort(Creator::validLanguages()); + for(my $i = 0; $i <= $#keys; $i++) { + $str .= $keys[$i]; + $str .= " " if ($i != $#keys); + } + $str .= ")/' 'n/-type/("; + + @keys = sort keys %$types; + for(my $i = 0; $i <= $#keys; $i++) { + $str .= $keys[$i]; + $str .= " " if ($i != $#keys); + } + $str .= ")/'"; + return $str; +} + + +sub options { + my $self = shift; + my $name = shift; + my $types = shift; + my $defaults = shift; + my @args = @_; + my @include; + my @input; + my @creators; + my @baseprojs; + my %ti; + my %relative; + my %addtemp; + my %addproj; + my @exclude; + my $global; + my $template; + my $feature_f; + my $gfeature_f; + my $relative_f; + my @features; + my $nmodifier; + my $into; + my $hierarchy = 0; + my $language = ($defaults ? Creator::defaultLanguage() : undef); + my $dynamic = ($defaults ? 1 : undef); + my $comments = ($defaults ? 1 : undef); + my $reldefs = ($defaults ? 1 : undef); + my $toplevel = ($defaults ? 1 : undef); + my $use_env = ($defaults ? 0 : undef); + my $expandvars = ($defaults ? 0 : undef); + my $static = ($defaults ? 0 : undef); + my $recurse = ($defaults ? 0 : undef); + my $makeco = ($defaults ? 0 : undef); + my $applypj = ($defaults ? 0 : undef); + my $genins = ($defaults ? 0 : undef); + my $gendot = ($defaults ? 0 : undef); + my $foreclipse = ($defaults ? 0 : undef); + + ## Process the command line arguments + for(my $i = 0; $i <= $#args; $i++) { + my $arg = $args[$i]; + $arg =~ s/^--/-/; + + if ($arg eq '-apply_project') { + $applypj = 1; + } + elsif ($arg eq '-complete') { + print $self->completion_command($name, $types) . "\n"; + return undef; + } + elsif ($arg eq '-base') { + $i++; + if (!defined $args[$i]) { + $self->optionError('-base requires an argument'); + } + else { + push(@baseprojs, $args[$i]); + } + } + elsif ($arg eq '-type') { + $i++; + if (!defined $args[$i]) { + $self->optionError('-type requires an argument'); + } + else { + my $type = lc($args[$i]); + if (defined $types->{$type}) { + my $call = $types->{$type}; + my $found = 0; + foreach my $creator (@creators) { + if ($creator eq $call) { + $found = 1; + last; + } + } + push(@creators, $call) if (!$found); + } + else { + $self->optionError("Invalid type: $args[$i]"); + } + } + } + elsif ($arg eq '-exclude') { + $i++; + if (defined $args[$i]) { + foreach my $exclude (split(',', $args[$i])) { + push(@exclude, DirectoryManager::mpc_glob(undef, $exclude)); + } + } + else { + $self->optionError('-exclude requires a ' . + 'comma separated list argument'); + } + } + elsif ($arg eq '-expand_vars') { + $expandvars = 1; + } + elsif ($arg eq '-feature_file') { + $i++; + $feature_f = $args[$i]; + if (!defined $feature_f) { + $self->optionError('-feature_file requires a file name argument'); + } + } + elsif ($arg eq '-features') { + $i++; + if (defined $args[$i]) { + @features = split(',', $args[$i]); + } + else { + $self->optionError('-features requires a comma separated list argument'); + } + } + elsif ($arg eq '-for_eclipse') { + $foreclipse = 1; + } + elsif ($arg eq '-gfeature_file') { + $i++; + $gfeature_f = $args[$i]; + if (!defined $gfeature_f) { + $self->optionError('-gfeature_file ' . + 'requires a file name argument'); + } + } + elsif ($arg eq '-relative_file') { + $i++; + $relative_f = $args[$i]; + if (!defined $relative_f) { + $self->optionError('-relative_file ' . + 'requires a file name argument'); + } + } + elsif ($arg eq '-gendot') { + $gendot = 1; + } + elsif ($arg eq '-genins') { + $genins = 1; + } + elsif ($arg eq '-global') { + $i++; + $global = $args[$i]; + if (!defined $global) { + $self->optionError('-global requires a file name argument'); + } + } + elsif ($arg eq '-help') { + $self->optionError(); + } + elsif ($arg eq '-hierarchy') { + $hierarchy = 1; + } + elsif ($arg eq '-include') { + $i++; + my $include = $args[$i]; + if (!defined $include) { + $self->optionError('-include requires a directory argument'); + } + else { + ## If the specified include path is relative, expand it based on + ## the current working directory. + if ($include !~ /^[\/\\]/ && + $include !~ /^[A-Za-z]:[\/\\]?/) { + $include = DirectoryManager::getcwd() . '/' . $include; + } + + push(@include, $include); + } + } + elsif ($arg eq '-into') { + $i++; + $into = $args[$i]; + if (!defined $into) { + $self->optionError('-into requires a directory argument'); + } + } + elsif ($arg eq '-language') { + $i++; + $language = $args[$i]; + if (!defined $language) { + $self->optionError('-language requires a language argument'); + } + elsif (!Creator::isValidLanguage($language)) { + $self->optionError("$language is not a valid language"); + } + } + elsif ($arg eq '-make_coexistence') { + $makeco = 1; + } + elsif ($arg eq '-name_modifier') { + $i++; + my $nmod = $args[$i]; + if (!defined $nmod) { + $self->optionError('-name_modifier requires a modifier argument'); + } + else { + $nmodifier = $nmod; + } + } + elsif ($arg eq '-nocomments') { + $comments = 0; + } + elsif ($arg eq '-noreldefs') { + $reldefs = 0; + } + elsif ($arg eq '-notoplevel') { + $toplevel = 0; + } + elsif ($arg eq '-recurse') { + $recurse = 1; + } + elsif ($arg eq '-template') { + $i++; + $template = $args[$i]; + if (!defined $template) { + $self->optionError('-template requires a file name argument'); + } + } + elsif ($arg eq '-relative') { + $i++; + my $rel = $args[$i]; + if (!defined $rel) { + $self->optionError('-relative requires a variable assignment argument'); + } + else { + if ($rel =~ /(\w+)\s*=\s*(.*)/) { + my $name = $1; + my $val = $2; + $val =~ s/^\s+//; + $val =~ s/\s+$//; + + ## If the specified path is relative, expand it based on + ## the current working directory. + if ($val !~ /^[\/\\]/ && + $val !~ /^[A-Za-z]:[\/\\]?/) { + $val = DirectoryManager::getcwd() . '/' . $val; + } + + ## Clean up the path as much as possible. For some reason, + ## File::Spec->canonpath() on Windows doesn't remove trailing + ## /. from the path. + $relative{$name} = File::Spec->canonpath($val); + $relative{$name} =~ s/\\/\//g; + $relative{$name} =~ s!/\.$!!; + } + else { + $self->optionError('Invalid argument to -relative'); + } + } + } + elsif ($arg eq '-ti') { + $i++; + my $tmpi = $args[$i]; + if (!defined $tmpi) { + $self->optionError('-ti requires a template input argument'); + } + else { + if ($tmpi =~ /((dll|lib|dll_exe|lib_exe):)?(.*)/) { + my $key = $2; + my $name = $3; + if (defined $key) { + $ti{$key} = $name; + } + else { + foreach my $type ('dll', 'lib', 'dll_exe', 'lib_exe') { + $ti{$type} = $name; + } + } + } + else { + $self->optionError("Invalid -ti argument: $tmpi"); + } + } + } + elsif ($arg eq '-use_env') { + $use_env = 1; + } + elsif ($arg eq '-value_template') { + $i++; + my $value = $args[$i]; + if (!defined $value) { + $self->optionError('-value_template requires a variable assignment argument'); + } + else { + my @values; + my $pc = new ProjectCreator(); + if ($pc->parse_assignment($value, \@values)) { + $addtemp{$values[1]} = [] if (!defined $addtemp{$values[1]}); + ## The extra parameter (3rd) indicates that this value was + ## specified on the command line. This "extra parameter" is + ## used in ProjectCreator::update_template_variable(). + push(@{$addtemp{$values[1]}}, [$values[0], $values[2], 1]); + + my $keywords = ProjectCreator::getKeywords(); + if (defined $$keywords{$values[1]}) { + $self->warning($values[1] . ' is a project keyword; you ' . + 'should use -value_project instead.'); + } + } + else { + $self->optionError('Invalid argument to -value_template'); + } + } + } + elsif ($arg eq '-value_project') { + $i++; + my $value = $args[$i]; + if (!defined $value) { + $self->optionError('-value_project requires a variable assignment argument'); + } + else { + my @values; + my $pc = new ProjectCreator(); + if ($pc->parse_assignment($value, \@values)) { + $addproj{$values[1]} = [] if (!defined $addproj{$values[1]}); + push(@{$addproj{$values[1]}}, [$values[0], $values[2]]); + } + else { + $self->optionError('Invalid argument to -value_project'); + } + } + } + elsif ($arg eq '-version') { + print 'MPC v', Version::get(), "\n"; + return undef; + } + elsif ($arg eq '-static') { + $static = 1; + $dynamic = 0; + } + elsif ($arg =~ /^-/) { + $self->optionError("Unknown option: $arg"); + } + else { + push(@input, $arg); + } + } + + return {'global' => $global, + 'feature_file' => $feature_f, + 'gfeature_file' => $gfeature_f, + 'relative_file' => $relative_f, + 'features' => \@features, + 'for_eclipse' => $foreclipse, + 'include' => \@include, + 'input' => \@input, + 'comments' => $comments, + 'creators' => \@creators, + 'baseprojs' => \@baseprojs, + 'template' => $template, + 'ti' => \%ti, + 'dynamic' => $dynamic, + 'static' => $static, + 'relative' => \%relative, + 'reldefs' => $reldefs, + 'toplevel' => $toplevel, + 'recurse' => $recurse, + 'addtemp' => \%addtemp, + 'addproj' => \%addproj, + 'make_coexistence' => $makeco, + 'hierarchy' => $hierarchy, + 'exclude' => \@exclude, + 'name_modifier' => $nmodifier, + 'apply_project' => $applypj, + 'gendot' => $gendot, + 'genins' => $genins, + 'into' => $into, + 'language' => $language, + 'use_env' => $use_env, + 'expand_vars' => $expandvars, + }; +} + + +sub is_set { + my($self, $key, $options) = @_; + + if (defined $options->{$key}) { + if (UNIVERSAL::isa($options->{$key}, 'ARRAY')) { + return 'ARRAY' if (defined $options->{$key}->[0]); + } + elsif (UNIVERSAL::isa($options->{$key}, 'HASH')) { + my @keys = keys %{$options->{$key}}; + return 'HASH' if (defined $keys[0]); + } + else { + return 'SCALAR'; + } + } + + return undef; +} + +1; diff --git a/ACE/MPC/modules/OutputMessage.pm b/ACE/MPC/modules/OutputMessage.pm new file mode 100644 index 00000000000..58636c7823f --- /dev/null +++ b/ACE/MPC/modules/OutputMessage.pm @@ -0,0 +1,106 @@ +package OutputMessage; + +# ************************************************************ +# Description : Prints information, warnings and errors. +# Author : Chad Elliott +# Create Date : 2/02/2004 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +# ************************************************************ +# Data Section +# ************************************************************ + +my $debugtag = 'DEBUG: '; +my $infotag = 'INFORMATION: '; +my $warntag = 'WARNING: '; +my $errortag = 'ERROR: '; + +my $debug = 0; +my $information = 0; +my $warnings = 1; +my $diagnostic = 1; +my $details = 1; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + my $class = shift; + return bless {}, $class; +} + + +sub set_levels { + my $str = shift; + + if (defined $str) { + $debug = ($str =~ /debug\s*=\s*(\d+)/i ? $1 : 0); + $details = ($str =~ /detail(s)?\s*=\s*(\d+)/i ? $2 : 0); + $diagnostic = ($str =~ /diag(nostic)?\s*=\s*(\d+)/i ? $2 : 0); + $information = ($str =~ /info(rmation)?\s*=\s*(\d+)/i ? $2 : 0); + $warnings = ($str =~ /warn(ing)?\s*=\s*(\d+)/i ? $2 : 0); + } +} + +sub split_message { + my($self, $msg, $spc) = @_; + $msg =~ s/\.\s+/.\n$spc/g; + return $msg . "\n"; +} + + +sub details { + if ($details) { + #my($self, $msg) = @_; + print "$_[1]\n"; + } +} + + +sub diagnostic { + if ($diagnostic) { + #my($self, $msg) = @_; + print "$_[1]\n"; + } +} + + +sub debug { + if ($debug) { + #my($self, $msg) = @_; + print "$debugtag$_[1]\n"; + } +} + + +sub information { + if ($information) { + #my($self, $msg) = @_; + print $infotag, $_[0]->split_message($_[1], ' ' x length($infotag)); + } +} + + +sub warning { + if ($warnings) { + #my($self, $msg) = @_; + print $warntag, $_[0]->split_message($_[1], ' ' x length($warntag)); + } +} + + +sub error { + my($self, $msg, $pre) = @_; + print STDERR '', (defined $pre ? "$pre\n" : ''), $errortag, + $self->split_message($msg, ' ' x length($errortag)); +} + + +1; diff --git a/ACE/MPC/modules/Parser.pm b/ACE/MPC/modules/Parser.pm new file mode 100644 index 00000000000..bca6dccddf5 --- /dev/null +++ b/ACE/MPC/modules/Parser.pm @@ -0,0 +1,196 @@ +package Parser; + +# ************************************************************ +# Description : A basic parser that requires a parse_line override +# Author : Chad Elliott +# Create Date : 5/16/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; +use FileHandle; + +use OutputMessage; +use StringProcessor; +use DirectoryManager; + +use vars qw(@ISA); +@ISA = qw(OutputMessage StringProcessor DirectoryManager); + +# ************************************************************ +# Data Section +# ************************************************************ + +my %filecache; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + my($class, $inc) = @_; + my $self = $class->SUPER::new(); + + ## Set up the internal data members. + $self->{'line_number'} = 0; + $self->{'include'} = $inc; + + return $self; +} + + +sub strip_line { + my($self, $line) = @_; + + ## Keep track of our line number + ++$self->{'line_number'}; + + ## Remove comments and leading and trailing white-space. + $line =~ s/\/\/.*//; + $line =~ s/^\s+//; + $line =~ s/\s+$//; + + return $line; +} + + +sub preprocess_line { + #my $self = shift; + #my $fh = shift; + #my $line = shift; + return $_[0]->strip_line($_[2]); +} + + +sub read_file { + my($self, $input, $cache) = @_; + my $ih = new FileHandle(); + my $status = 1; + my $errorString; + + $self->{'line_number'} = 0; + if (open($ih, $input)) { + $self->debug("Open $input"); + if ($cache) { + ## If we don't have an array for this file, then start one + $filecache{$input} = [] if (!defined $filecache{$input}); + + while(<$ih>) { + ## Preprocess the line + my $line = $self->preprocess_line($ih, $_); + + ## Push the line onto the array for this file + push(@{$filecache{$input}}, $line); + + ## Parse the line + ($status, $errorString) = $self->parse_line($ih, $line); + + ## Stop reading the file if we've encountered an error + last if (!$status); + } + } + else { + ## We're not caching, so we just preprocess and parse in one call. + while(<$ih>) { + ($status, $errorString) = $self->parse_line( + $ih, $self->preprocess_line($ih, $_)); + + ## Stop reading the file if we've encountered an error + last if (!$status); + } + } + $self->debug("Close $input"); + close($ih); + } + else { + $errorString = "Unable to open \"$input\" for reading"; + $status = 0; + } + + return $status, $errorString; +} + + +sub cached_file_read { + my($self, $input) = @_; + my $lines = $filecache{$input}; + + if (defined $lines) { + my $status = 1; + my $error; + $self->{'line_number'} = 0; + foreach my $line (@$lines) { + ++$self->{'line_number'}; + ## Since we're "reading" a cached file, we must pass undef as the + ## file handle to parse_line(). + ($status, $error) = $self->parse_line(undef, $line); + + ## Stop "reading" the file if we've encountered an error + last if (!$status); + } + return $status, $error; + } + + ## We haven't cached this file yet, read it and cache it. + return $self->read_file($input, 1); +} + + +sub get_line_number { + return $_[0]->{'line_number'}; +} + + +sub set_line_number { + my($self, $number) = @_; + $self->{'line_number'} = $number; +} + + +sub slash_to_backslash { + ## This method is here solely for convenience. It's used to make the + ## calling code look cleaner. + my($self, $file) = @_; + $file =~ s/\//\\/g; + return $file; +} + + +sub get_include_path { + return $_[0]->{'include'}; +} + + +sub search_include_path { + my($self, $file) = @_; + + foreach my $include ('.', @{$self->{'include'}}) { + return "$include/$file" if (-r "$include/$file"); + } + + return undef; +} + + +sub escape_regex_special { + my($self, $name) = @_; + $name =~ s/([\+\-\\\$\[\]\(\)\.])/\\$1/g; + return $name; +} + + +# ************************************************************ +# Virtual Methods To Be Overridden +# ************************************************************ + +sub parse_line { + #my $self = shift; + #my $ih = shift; + #my $line = shift; +} + + +1; diff --git a/ACE/MPC/modules/ProjectCreator.pm b/ACE/MPC/modules/ProjectCreator.pm new file mode 100644 index 00000000000..2f68c18183c --- /dev/null +++ b/ACE/MPC/modules/ProjectCreator.pm @@ -0,0 +1,5425 @@ +package ProjectCreator; + +# ************************************************************ +# Description : Base class for all project creators +# Author : Chad Elliott +# Create Date : 3/13/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; +use FileHandle; +use File::Path; + +use Creator; +use TemplateInputReader; +use TemplateParser; +use FeatureParser; +use CommandHelper; + +use vars qw(@ISA); +@ISA = qw(Creator); + +# ************************************************************ +# Data Section +# ************************************************************ + +## The basic extensions known to a project creator +my $BaseClassExtension = 'mpb'; +my $ProjectCreatorExtension = 'mpc'; +my $TemplateExtension = 'mpd'; +my $TemplateInputExtension = 'mpt'; + +## This feature is enabled or disabled depending on whether +## or not the -static option is used. +my $static_libs_feature = 'static_libs_only'; + +## Valid names for assignments within a project +## Bit Meaning +## 0 Preserve the order for additions (1) or invert it (0) +## 1 Add this value to template input value (if there is one) +## 2 Preserve <% %> settings for evaluation within the template +my %validNames = ('after' => 1, + 'avoids' => 3, + 'custom_only' => 1, + 'dllout' => 1, + 'dynamicflags' => 3, + 'exename' => 1, + 'exeout' => 1, + 'includes' => 3, + 'libout' => 1, + 'libpaths' => 3, + 'libs' => 2, + 'lit_libs' => 2, + 'macros' => 3, + 'managed' => 1, + 'pch_header' => 1, + 'pch_source' => 1, + 'postbuild' => 5, + 'postclean' => 5, + 'prebuild' => 5, + 'pure_libs' => 2, + 'recurse' => 1, + 'recursive_includes' => 3, + 'recursive_libpaths' => 3, + 'requires' => 3, + 'sharedname' => 1, + 'staticflags' => 3, + 'staticname' => 1, + 'tagchecks' => 1, + 'tagname' => 1, + 'version' => 1, + 'webapp' => 1, + ); + +## Custom definitions only +## Bit Meaning +## 0 Value is always an array +## 1 Value is an array and name gets 'outputext' converted to 'files' +## 2 Value is always scalar +## 3 Name can also be used in an 'optional' clause +## 4 Needs <%...%> conversion +my %customDefined = ('automatic_in' => 0x04, + 'automatic_out' => 0x04, + 'command' => 0x14, + 'commandflags' => 0x14, + 'dependent' => 0x14, + 'precommand' => 0x14, + 'postcommand' => 0x14, + 'inputext' => 0x01, + 'libpath' => 0x04, + 'output_follows_input' => 0x04, + 'output_option' => 0x14, + 'pch_postrule' => 0x04, + 'pre_extension' => 0x08, + 'source_pre_extension' => 0x08, + 'template_pre_extension' => 0x08, + 'header_pre_extension' => 0x08, + 'inline_pre_extension' => 0x08, + 'documentation_pre_extension' => 0x08, + 'resource_pre_extension' => 0x08, + 'generic_pre_extension' => 0x08, + 'pre_filename' => 0x08, + 'source_pre_filename' => 0x08, + 'template_pre_filename' => 0x08, + 'header_pre_filename' => 0x08, + 'inline_pre_filename' => 0x08, + 'documentation_pre_filename' => 0x08, + 'resource_pre_filename' => 0x08, + 'generic_pre_filename' => 0x08, + 'pre_dirname' => 0x08, + 'source_pre_dirname' => 0x08, + 'template_pre_dirname' => 0x08, + 'header_pre_dirname' => 0x08, + 'inline_pre_dirname' => 0x08, + 'documentation_pre_dirname' => 0x08, + 'resource_pre_dirname' => 0x08, + 'generic_pre_dirname' => 0x08, + 'source_outputext' => 0x0a, + 'template_outputext' => 0x0a, + 'header_outputext' => 0x0a, + 'inline_outputext' => 0x0a, + 'documentation_outputext' => 0x0a, + 'resource_outputext' => 0x0a, + 'generic_outputext' => 0x0a, + ); + +## Custom sections as well as definitions +## Value Meaning +## 0 No modifications +## 1 Needs <%...%> conversion +my %custom = ('command' => 1, + 'commandflags' => 1, + 'dependent' => 1, + 'gendir' => 0, + 'precommand' => 1, + 'postcommand' => 1, + ); + +## All matching assignment arrays will get these keywords +my @default_matching_assignments = ('recurse', + ); + +## Deal with these components in a special way +my %specialComponents = ('header_files' => 1, + 'inline_files' => 1, + 'template_files' => 1, + ); +my %sourceComponents = ('source_files' => 1, + 'template_files' => 1, + ); + +my $defgroup = 'default_group'; +my $grouped_key = 'grouped_'; +my $tikey = '/ti/'; + +## Matches with generic_outputext +my $generic_key = 'generic_files'; + +# ************************************************************ +# C++ Specific Component Settings +# ************************************************************ + +## Resource files tag for C++ +my $cppresource = 'resource_files'; + +## Valid component names within a project along with the valid file extensions +my %cppvc = ('source_files' => [ "\\.cpp", "\\.cxx", "\\.cc", "\\.c", "\\.C", ], + 'template_files' => [ "_T\\.cpp", "_T\\.cxx", "_T\\.cc", "_T\\.c", "_T\\.C", "_t\\.cpp", "_t\\.cxx", "_t\\.cc", "_t\\.c", "_t\\.C" ], + 'header_files' => [ "\\.h", "\\.hpp", "\\.hxx", "\\.hh", ], + 'inline_files' => [ "\\.i", "\\.ipp", "\\.inl", ], + 'documentation_files' => [ "README", "readme", "\\.doc", "\\.txt", "\\.html" ], + $cppresource => [ "\\.rc", ], + ); + +## Exclude these extensions when auto generating the component values +my %cppec = ('source_files' => $cppvc{'template_files'}, + ); + +## These matching assignment arrays will get added, but only to the +## specific project component types. +my %cppma = ('source_files' => ['buildflags', + 'managed', + 'no_pch', + ], + ); + +# ************************************************************ +# C# Specific Component Settings +# ************************************************************ + +## Resource files tag for C# +my $csresource = 'resx_files'; + +## Valid component names within a project along with the valid file extensions +my %csvc = ('source_files' => [ "\\.cs" ], + 'config_files' => [ "\\.config" ], + $csresource => [ "\\.resx", "\\.resources" ], + 'aspx_files' => [ "\\.aspx" ], + 'ico_files' => [ "\\.ico" ], + 'documentation_files' => [ "README", "readme", "\\.doc", "\\.txt", "\\.html" ], + ); + +my %csma = ('source_files' => [ 'dependent_upon', + 'subtype', + ], + $csresource => [ 'dependent_upon', + 'generates_source', + 'subtype', + ], + ); + +# ************************************************************ +# Java Specific Component Settings +# ************************************************************ + +## Valid component names within a project along with the valid file extensions +my %jvc = ('source_files' => [ "\\.java" ], + 'documentation_files' => [ "README", "readme", "\\.doc", "\\.txt", "\\.html" ], + ); + +# ************************************************************ +# Visual Basic Specific Component Settings +# ************************************************************ + +## Resource files tag for VB +my $vbresource = 'resx_files'; + +## Valid component names within a project along with the valid file extensions +my %vbvc = ('source_files' => [ "\\.vb" ], + 'config_files' => [ "\\.config" ], + $vbresource => [ "\\.resx" ], + 'aspx_files' => [ "\\.aspx" ], + 'ico_files' => [ "\\.ico" ], + 'documentation_files' => [ "README", "readme", "\\.doc", "\\.txt", "\\.html" ], + ); + +my %vbma = ('source_files' => [ 'subtype' ], + ); + +# ************************************************************ +# Language Specific Component Settings +# ************************************************************ + +# Index Description +# ----- ----------- +# 0 File types +# 1 Files automatically excluded from source_files +# 2 Assignments available in standard file types +# 3 The entry point for executables +# 4 The language uses a C preprocessor +# 5 Name of the tag for 'resource_files' for this language +# * This is special because it gets treated like source_files in that +# a project with only these files is a library/exe not "custom only". +my %language = (Creator::cplusplus => [ \%cppvc, \%cppec, \%cppma, 'main', + 1, $cppresource ], + + Creator::csharp => [ \%csvc, {}, \%csma, 'Main', 0, + $csresource ], + + Creator::java => [ \%jvc, {}, {}, 'main', 0 ], + + Creator::vb => [ \%vbvc, {}, \%vbma, 'Main', 0, + $vbresource ], + ); +my %mains; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + my($class, $global, $inc, $template, $ti, $dynamic, $static, $relative, $addtemp, $addproj, $progress, $toplevel, $baseprojs, $gfeature, $relative_f, $feature, $features, $hierarchy, $exclude, $makeco, $nmod, $applypj, $genins, $into, $language, $use_env, $expandvars, $gendot, $comments, $foreclipse) = @_; + my $self = $class->SUPER::new($global, $inc, + $template, $ti, $dynamic, $static, + $relative, $addtemp, $addproj, + $progress, $toplevel, $baseprojs, + $feature, $features, + $hierarchy, $nmod, $applypj, + $into, $language, $use_env, + $expandvars, + 'project'); + + $self->{$self->{'type_check'}} = 0; + $self->{'feature_defined'} = 0; + $self->{'features_changed'} = undef; + $self->{'project_info'} = []; + $self->{'lib_locations'} = {}; + $self->{'reading_parent'} = []; + $self->{'dll_exe_template_input'}= {}; + $self->{'lib_exe_template_input'}= {}; + $self->{'lib_template_input'} = {}; + $self->{'dll_template_input'} = {}; + $self->{'flag_overrides'} = {}; + $self->{'custom_special_output'} = {}; + $self->{'custom_special_depend'} = {}; + $self->{'special_supplied'} = {}; + $self->{'pctype'} = $self->extractType("$self"); + $self->{'verbatim'} = {}; + $self->{'verbatim_accessed'} = {$self->{'pctype'} => {}}; + $self->{'defaulted'} = {}; + $self->{'custom_types'} = {}; + $self->{'parents_read'} = {}; + $self->{'inheritance_tree'} = {}; + $self->{'remove_files'} = {}; + $self->{'expanded'} = {}; + $self->{'gfeature_file'} = $gfeature; + $self->{'relative_file'} = $relative_f; + $self->{'feature_parser'} = $self->create_feature_parser($features, + $feature); + $self->{'sort_files'} = $self->sort_files(); + $self->{'source_callback'} = undef; + $self->{'dollar_special'} = $self->dollar_special(); + $self->{'generate_ins'} = $genins; + $self->{'addtemp_state'} = undef; + $self->{'command_subs'} = $self->get_command_subs(); + $self->{'escape_spaces'} = $self->escape_spaces(); + $self->{'current_template'} = undef; + $self->{'make_coexistence'} = $makeco; + + $self->add_default_matching_assignments(); + $self->reset_generating_types(); + + return $self; +} + + +sub is_keyword { + ## Is the name passed in a known keyword for a project. This includes + ## keywords mapped by Define_Custom or Modify_Custom. + my($self, $name) = @_; + return $self->{'valid_names'}->{$name}; +} + + +sub read_global_configuration { + my $self = shift; + my $input = $self->get_global_cfg(); + my $status = 1; + + if (defined $input) { + ## If it doesn't contain a path, search the include path + if ($input !~ /[\/\\]/) { + $input = $self->search_include_path($input); + $input = $self->get_global_cfg() if (!defined $input); + } + + ## Read and parse the global project file + $self->{'reading_global'} = 1; + $status = $self->parse_file($input); + $self->{'reading_global'} = 0; + } + + return $status; +} + + +sub convert_to_template_assignment { + my($self, $name, $value, $calledfrom) = @_; + + ## If the value we are going to set for $name has been used as a + ## scoped template variable, we need to hijack the whole assignment + ## and turn it into a template variable assignment. + my $atemp = $self->get_addtemp(); + foreach my $key (grep(/::$name$/, keys %$atemp)) { + $self->update_template_variable(0, $calledfrom, $key, $value); + } +} + + +sub create_recursive_settings { + my($self, $name, $value, $assign) = @_; + + ## Handle both recursive_includes and recursive_libpaths in one + ## search and replace. + if ($name =~ s/^recursive_//) { + ## This portion of code was lifted directly from Creator::relative() + ## but modified to always expand the variables. We will turn the + ## expanded values back into variables below and once they're passed + ## off to the assignment processing code, they will be turned into + ## relative values (if possible). + if (index($value, '$') >= 0) { + my $ovalue = $value; + my($rel, $how) = $self->get_initial_relative_values(); + $value = $self->expand_variables($value, $rel, 0, undef, 1); + + if ($ovalue eq $value || index($value, '$') >= 0) { + ($rel, $how) = $self->get_secondary_relative_values(); + $value = $self->expand_variables($value, $rel, 0, undef, 1, 1); + } + } + + ## Create an array out of the recursive directory list. Convert all + ## of the relative or full path values back into $() values. + my @dirs = (); + my $elems = $self->create_array($value); + foreach my $elem (@$elems) { + my $dlist = $self->recursive_directory_list($elem, []); + if ($dlist eq '') { + ## This directory doesn't exist, just add the original value + push(@dirs, $elem); + } + else { + ## Create an array out of the directory list and add it to our + ## array. + my $array = $self->create_array($dlist); + push(@dirs, @$array); + } + } + + ## We need to return a string, so we join it all together space + ## separated. + $value = join(' ', $self->back_to_variable(\@dirs)); + } + + return $name, $value; +} + +sub process_assignment { + my($self, $name, $value, $assign, $calledfrom) = @_; + $calledfrom = 0 if (!defined $calledfrom); + + ## See if the name is one of the special "recursive" settings. If so, + ## fix up the value and change the name. + ($name, $value) = $self->create_recursive_settings($name, $value, $assign); + + ## Support the '*' mechanism as in the project name, to allow + ## the user to correctly depend on another project within the same + ## directory. + if (defined $value) { + if ($name eq 'after' && index($value, '*') >= 0) { + $value = $self->fill_type_name($value, + $self->get_default_project_name()); + } + + ## If this particular project type does not consider the dollar sign + ## special and the user has provided two dollarsigns as an escape, we + ## will turn it into a single dollar sign. + if (!$self->{'dollar_special'} && index($value, '$$') >= 0) { + $value =~ s/\$\$/\$/g; + } + + ## If the assignment name is valid and requires parameter (<%...%>) + ## replacement, then do so. + if (defined $self->{'valid_names'}->{$name} && + ($self->{'valid_names'}->{$name} & 0x04) == 0 && + index($value, '<%') >= 0) { + $value = $self->replace_parameters($value, $self->{'command_subs'}); + } + } + + if ($calledfrom == 0) { + $self->convert_to_template_assignment($name, $value, $calledfrom); + } + + ## Call the base process_assigment() after we have modified the name and + ## value. + $self->SUPER::process_assignment($name, $value, $assign); + + ## Support keyword mapping here only at the project level scope. The + ## scoped keyword mapping is done through the parse_scoped_assignment() + ## method. + if (!defined $assign || $assign == $self->get_assignment_hash()) { + my $mapped = $self->{'valid_names'}->{$name}; + if (defined $mapped && UNIVERSAL::isa($mapped, 'ARRAY')) { + $self->parse_scoped_assignment($$mapped[0], 0, + $$mapped[1], $value, + $self->{'generated_exts'}->{$$mapped[0]}); + } + } +} + + +sub process_assignment_add { + my($self, $name, $value, $assign) = @_; + + ## See if the name is one of the special "recursive" settings. If so, + ## fix up the value and change the name. + ($name, $value) = $self->create_recursive_settings($name, $value, $assign); + + return $self->SUPER::process_assignment_add($name, $value, $assign); +} + + +sub process_assignment_sub { + my($self, $name, $value, $assign) = @_; + + ## See if the name is one of the special "recursive" settings. If so, + ## fix up the value and change the name. + ($name, $value) = $self->create_recursive_settings($name, $value, $assign); + + return $self->SUPER::process_assignment_sub($name, $value, $assign); +} + + +sub addition_core { + my($self, $name, $value, $nval, $assign) = @_; + + ## If there is a previous value ($nval) and the keyword is going to be + ## evaled, we need to separate the values with a command separator. + ## This has to be done at the MPC level because it isn't always + ## possible for the user to know if a value has already been added to + ## the keyword (prebuild, postbuild and postclean). + if (defined $nval && + defined $validNames{$name} && ($validNames{$name} & 4)) { + if ($self->preserve_assignment_order($name)) { + $value = '<%cmdsep%> ' . $value; + } + else { + $value .= '<%cmdsep%>'; + } + } + + ## For an addition, we need to see if it is a project keyword being + ## used within a 'specific' section. If it is, we may need to update + ## scoped settings for that variable (which are in essence template + ## variables). + $self->convert_to_template_assignment($name, $value, 1); + + ## Next, we just give everything to the base class method. + $self->SUPER::addition_core($name, $value, $nval, $assign); +} + + +sub subtraction_core { + my($self, $name, $value, $nval, $assign) = @_; + + ## For a subtraction, we need to see if it is a project keyword being + ## used within a 'specific' section. If it is, we may need to update + ## scoped settings for that variable (which are in essence template + ## variables). + $self->convert_to_template_assignment($name, $value, -1); + + ## Next, we just give everything to the base class method. + $self->SUPER::subtraction_core($name, $value, $nval, $assign); +} + + +sub get_assignment_for_modification { + my($self, $name, $assign, $subtraction) = @_; + + ## If we weren't passed an assignment hash, then we need to + ## look one up that may possibly correctly deal with keyword mappings + if (!defined $assign) { + my $mapped = $self->{'valid_names'}->{$name}; + + if (defined $mapped && UNIVERSAL::isa($mapped, 'ARRAY')) { + $name = $$mapped[1]; + $assign = $self->{'generated_exts'}->{$$mapped[0]}; + } + } + + ## Get the assignment value + my $value = $self->get_assignment($name, $assign); + + ## If we are involved in a subtraction, we get back a value and + ## it's a scoped or mapped assignment, then we need to possibly + ## expand any template variables. Otherwise, the subtractions + ## may not work correctly. + if ($subtraction && defined $value && defined $assign) { + $value = $self->relative($value, 1); + } + + return $value; +} + + +sub begin_project { + my($self, $parents) = @_; + my $status = 1; + my $error; + + ## Deal with the inheritance hierarchy first + ## Add in the base projects from the command line + if (!$self->{'reading_global'} && + !defined $self->{'reading_parent'}->[0]) { + my $baseprojs = $self->get_baseprojs(); + + if (defined $parents) { + foreach my $base (@$baseprojs) { + push(@$parents, $base) if (!StringProcessor::fgrep($base, $parents)); + } + } + else { + $parents = $baseprojs; + } + } + + if (defined $parents) { + foreach my $parent (@$parents) { + ## Read in the parent onto ourself + my $file = $self->search_include_path( + "$parent.$BaseClassExtension"); + if (!defined $file) { + $file = $self->search_include_path( + "$parent.$ProjectCreatorExtension"); + } + + if (defined $file) { + if (defined $self->{'reading_parent'}->[0]) { + if (StringProcessor::fgrep($file, $self->{'reading_parent'})) { + $status = 0; + $error = 'Cyclic inheritance detected: ' . $parent; + } + } + + if ($status) { + if (!defined $self->{'parents_read'}->{$file}) { + $self->{'parents_read'}->{$file} = 1; + + ## Push the base project file onto the parent stack + push(@{$self->{'reading_parent'}}, $file); + + ## Collect up some information about the inheritance tree + my $tree = $self->{'current_input'}; + if (!defined $self->{'inheritance_tree'}->{$tree}) { + $self->{'inheritance_tree'}->{$tree} = {}; + } + my $hash = $self->{'inheritance_tree'}->{$tree}; + foreach my $p (@{$self->{'reading_parent'}}) { + $$hash{$p} = {} if (!defined $$hash{$p}); + $hash = $$hash{$p}; + } + + ## Begin reading the parent + $status = $self->parse_file($file); + + ## Take the base project file off of the parent stack + pop(@{$self->{'reading_parent'}}); + + $error = "Invalid parent: $parent" if (!$status); + } + else { + ## The base project has already been read. So, if + ## we are reading the original project (not a parent base + ## project), then the current base project is redundant. + if (!defined $self->{'reading_parent'}->[0]) { + $file =~ s/\.[^\.]+$//; + $self->information('Inheriting from \'' . + $self->mpc_basename($file) . + '\' in ' . $self->{'current_input'} . + ' is redundant at line ' . + $self->get_line_number() . '.'); + } + } + } + } + else { + $status = 0; + $error = "Unable to locate parent: $parent"; + } + } + } + + ## Copy each value from global_assign into assign + if (!$self->{'reading_global'}) { + foreach my $key (keys %{$self->{'global_assign'}}) { + if (!defined $self->{'assign'}->{$key}) { + $self->{'assign'}->{$key} = $self->{'global_assign'}->{$key}; + } + } + } + + return $status, $error; +} + + +sub get_process_project_type { + my($self, $types) = @_; + my $type = ''; + my $defcomp = $self->get_default_component_name(); + + foreach my $t (split(/\s*,\s*/, $types)) { + my $not = ($t =~ s/^!\s*//); + if ($not) { + if ($t eq $self->{'pctype'}) { + $type = ''; + last; + } + else { + $type = $self->{'pctype'}; + } + } + elsif ($t eq $self->{'pctype'} || $t eq $defcomp) { + $type = $t; + last; + } + } + + return $type; +} + + +sub matches_specific_scope { + my($self, $elements) = @_; + + ## First check for properties that correspond to the current project + ## type. Elements that begin with "prop:" indicate a property. + my $list = ''; + my $props = $self->get_properties(); + foreach my $prop (split(/\s*,\s*/, $elements)) { + my $not = ($prop =~ s/^!\s*//); + if ($prop =~/(.+):(.+)/) { + if ($1 eq 'prop') { + $prop = $2; + if ($not) { + return $self->{'pctype'} if (!$$props{$prop}); + } + else { + return $self->{'pctype'} if ($$props{$prop}); + } + } + else { + $self->warning("$prop is not recognized."); + } + } + else { + $list .= ($not ? '!' : '') . $prop . ','; + } + } + + ## If none of the elements match a property, then check the type + ## against the current project type or the default component name + ## (which is what it would be set to if a specific clause is used with + ## out parenthesis). + my $type = $self->get_process_project_type($list); + return $self->{'pctype'} if ($type eq $self->{'pctype'} || + $type eq $self->get_default_component_name()); + + ## Nothing matched + return undef; +} + + +sub parse_line { + my($self, $ih, $line) = @_; + my($status, + $errorString, + @values) = $self->parse_known($line); + + ## parse_known() passes back an array of values + ## that make up the contents of the line parsed. + ## The array can have 0 to 3 items. The first, + ## if defined, is always an identifier of some + ## sort. + + if ($status && defined $values[0]) { + if ($values[0] eq $self->{'grammar_type'}) { + my $name = $values[1]; + my $typecheck = $self->{'type_check'}; + if (defined $name && $name eq '}') { + ## Project Ending + if (!defined $self->{'reading_parent'}->[0] && + !$self->{'reading_global'}) { + ## Fill in all the default values + $self->generate_defaults(); + + ## Perform any additions, subtractions + ## or overrides for the project values. + my $addproj = $self->get_addproj(); + foreach my $ap (keys %$addproj) { + if (defined $self->{'valid_names'}->{$ap}) { + foreach my $val (@{$$addproj{$ap}}) { + if ($$val[0] > 0) { + $self->process_assignment_add($ap, $$val[1]); + } + elsif ($$val[0] < 0) { + $self->process_assignment_sub($ap, $$val[1]); + } + else { + $self->process_assignment($ap, $$val[1]); + } + } + } + else { + $errorString = 'Invalid ' . + "assignment modification name: $ap"; + $status = 0; + } + } + + if ($status) { + ## Generate default target names after all source files are added + ## and after we've added in all of the options from the + ## command line. If the user set exename on the command line + ## and no "main" is found, sharedname will be set too and + ## most templates do not handle that well. + $self->generate_default_target_names(); + + ## End of project; Write out the file. + ($status, $errorString) = $self->write_project(); + + ## write_project() can return 0 for error, 1 for project + ## was written and 2 for project was skipped + if ($status == 1) { + ## Save the library name and location + foreach my $name ('sharedname', 'staticname') { + my $val = $self->get_assignment($name); + if (defined $val) { + my $cwd = $self->getcwd(); + my $start = $self->getstartdir(); + my $amount = 0; + if ($cwd eq $start) { + $amount = length($start); + } + elsif (index($cwd, $start) == 0) { + $amount = length($start) + 1; + } + $self->{'lib_locations'}->{$val} = + substr($cwd, $amount); + last; + } + } + + ## Check for unused verbatim markers + foreach my $key (keys %{$self->{'verbatim'}}) { + if (defined $self->{'verbatim_accessed'}->{$key}) { + foreach my $ikey (keys %{$self->{'verbatim'}->{$key}}) { + if (!defined $self->{'verbatim_accessed'}->{$key}->{$ikey}) { + $self->warning("Marker $ikey does not exist."); + } + } + } + } + } + + ## Reset all of the project specific data + foreach my $key (keys %{$self->{'valid_components'}}) { + delete $self->{$key}; + $self->{'defaulted'}->{$key} = 0; + } + if (defined $self->{'addtemp_state'}) { + $self->restore_state($self->{'addtemp_state'}, 'addtemp'); + $self->{'addtemp_state'} = undef; + } + $self->{'assign'} = {}; + $self->{'verbatim'} = {}; + $self->{'verbatim_accessed'} = {$self->{'pctype'} => {}}; + $self->{'special_supplied'} = {}; + $self->{'flag_overrides'} = {}; + $self->{'parents_read'} = {}; + $self->{'inheritance_tree'} = {}; + $self->{'remove_files'} = {}; + $self->{'custom_special_output'} = {}; + $self->{'custom_special_depend'} = {}; + $self->{'expanded'} = {}; + $self->reset_generating_types(); + } + } + $self->{$typecheck} = 0; + } + else { + ## Project Beginning + ($status, $errorString) = $self->begin_project($values[2]); + + ## Set up the default project name + if ($status) { + if (defined $name) { + if ($name =~ /[\/\\]/) { + $status = 0; + $errorString = 'Projects can not have a slash ' . + 'or a back slash in the name'; + } + else { + ## We should only set the project name if we are not + ## reading in a parent project. + if (!defined $self->{'reading_parent'}->[0]) { + $name =~ s/^\(\s*//; + $name =~ s/\s*\)$//; + $name = $self->transform_file_name($name); + + ## Replace any *'s with the default name + if (index($name, '*') >= 0) { + $name = $self->fill_type_name( + $name, + $self->get_default_project_name()); + } + + $self->set_project_name($name); + } + else { + $self->warning("Ignoring project name " . + "$name in a base project."); + } + } + } + } + + ## Signify that we have a valid project + $self->{$typecheck} = 1 if ($status); + } + } + elsif ($values[0] eq '0') { + ## $values[1] = name; $values[2] = value + if (defined $self->{'valid_names'}->{$values[1]}) { + $self->process_assignment($values[1], $values[2]); + } + else { + $errorString = "Invalid assignment name: '$values[1]'"; + $status = 0; + } + } + elsif ($values[0] eq '1') { + ## $values[1] = name; $values[2] = value + if (defined $self->{'valid_names'}->{$values[1]}) { + $self->process_assignment_add($values[1], $values[2]); + } + else { + $errorString = "Invalid addition name: $values[1]"; + $status = 0; + } + } + elsif ($values[0] eq '-1') { + ## $values[1] = name; $values[2] = value + if (defined $self->{'valid_names'}->{$values[1]}) { + $self->process_assignment_sub($values[1], $values[2]); + } + else { + $errorString = "Invalid subtraction name: $values[1]"; + $status = 0; + } + } + elsif ($values[0] eq 'component') { + my $comp = $values[1]; + my $name = $values[2]; + my $vc = $self->{'valid_components'}; + + if (defined $$vc{$comp}) { + ($status, $errorString) = $self->parse_components($ih, $comp, $name); + } + else { + if ($comp eq 'verbatim') { + my($type, $loc, $add) = split(/\s*,\s*/, $name); + ($status, $errorString) = $self->parse_verbatim($ih, $type, + $loc, $add); + } + elsif ($comp eq 'specific') { + my $type = $self->matches_specific_scope($name); + if (defined $type) { + ($status, $errorString) = $self->parse_scope( + $ih, $comp, $type, + $self->{'valid_names'}, + $self->get_assignment_hash(), + {}); + } + else { + ## We still need to parse the scope, but we will be + ## throwing away whatever is processed. However, it + ## could still be invalid code that will cause an error. + ($status, $errorString) = $self->parse_scope( + $ih, $comp, undef, + $self->{'valid_names'}, + undef, + $self->get_assignment_hash()); + } + } + elsif ($comp eq 'define_custom') { + ($status, $errorString) = $self->parse_define_custom($ih, $name); + } + elsif ($comp eq 'modify_custom') { + ($status, $errorString) = $self->parse_define_custom($ih, $name, 1); + } + elsif ($comp eq 'expand') { + $self->{'parsing_expand'} = 1; + ($status, $errorString) = $self->parse_scope($ih, $comp, $name); + $self->{'parsing_expand'} = undef; + } + else { + $errorString = "Invalid component name: $comp"; + $status = 0; + } + } + } + elsif ($values[0] eq 'feature') { + $self->{'feature_defined'} = 1; + ($status, $errorString) = $self->process_feature($ih, + $values[1], + $values[2]); + if ($status && $self->{'feature_defined'}) { + $errorString = "Did not find the end of the feature"; + $status = 0; + } + } + else { + $errorString = "Unrecognized line: $line"; + $status = 0; + } + } + elsif ($status == -1) { + $status = 0; + } + + return $status, $errorString; +} + + +sub parse_scoped_assignment { + my($self, $tag, $type, $name, $value, $flags) = @_; + + ## Map the assignment name on a scoped assignment + my $mapped = $self->{'valid_names'}->{$name}; + if (defined $mapped && UNIVERSAL::isa($mapped, 'ARRAY')) { + $name = $$mapped[1]; + } + + if (defined $self->{'matching_assignments'}->{$tag} && + StringProcessor::fgrep($name, $self->{'matching_assignments'}->{$tag})) { + my $over = {}; + if (defined $self->{'flag_overrides'}->{$tag}) { + $over = $self->{'flag_overrides'}->{$tag}; + } + else { + $self->{'flag_overrides'}->{$tag} = $over; + } + + if ($type == 0) { + $self->process_assignment($name, $value, $flags); + } + elsif ($type == 1) { + ## If there is no value in $$flags, then we need to get + ## the outer scope value and put it in there. + if (!defined $self->get_assignment($name, $flags)) { + my $outer = $self->get_assignment($name); + $self->process_assignment($name, $outer, $flags); + } + $self->process_assignment_add($name, $value, $flags); + } + elsif ($type == -1) { + ## If there is no value in $$flags, then we need to get + ## the outer scope value and put it in there. + if (!defined $self->get_assignment($name, $flags)) { + my $outer = $self->get_assignment($name); + $self->process_assignment($name, $outer, $flags); + } + $self->process_assignment_sub($name, $value, $flags); + } + return 1; + } + + return 0; +} + + +sub update_template_variable { + my $self = shift; + my $check = shift; + my @values = @_; + + ## Save the addtemp state if we haven't done so before + if (!defined $self->{'addtemp_state'}) { + my %state = $self->save_state('addtemp'); + $self->{'addtemp_state'} = \%state; + } + + ## If the name that is used within a specific is a mapped keyword + ## then we need to translate it into the mapped keyword as it will + ## be used by the TemplateParser. + my $name; + if ($values[1] =~ /(.*::)(.*)/) { + my $base = $1; + my $mapped = $self->{'valid_names'}->{$2}; + if (defined $mapped && UNIVERSAL::isa($mapped, 'ARRAY')) { + $name = $values[1]; + $values[1] = $base . 'custom_type->' . $$mapped[1]; + } + } + + ## Now modify the addtemp values + my $atemp = $self->get_addtemp(); + $self->information("'$values[1]' was used as a template modifier."); + + if ($check && !defined $atemp->{$values[1]}) { + $name = $values[1] if (!defined $name); + if ($name =~ s/.*:://) { + my $value = $self->get_assignment($name); + ## Regardless of whether there was and assignment value, we need to + ## look at the template value of the base so that modification of a + ## scoped variable includes the base values. + if (defined $atemp->{$name}) { + foreach my $arr (@{$atemp->{$name}}) { + my @copy = @$arr; + push(@{$atemp->{$values[1]}}, \@copy); + } + } + unshift(@{$atemp->{$values[1]}}, + [0, $value, undef, $name]) if (defined $value); + } + } + + ## Subsitute all pseudo variables for the project specific characters. + $values[2] = $self->replace_parameters($values[2], $self->{'command_subs'}) + if (index($values[2], '<%') >= 0); + + if (defined $atemp->{$values[1]}) { + ## If there are template variable settings, then we need to add + ## this new one to the end of the settings that did not come from + ## the command line. That way, adjust_value() does not need to + ## sort the values (and have knowledge about which came from the + ## command line and which didn't). + my $max = scalar(@{$atemp->{$values[1]}}); + for(my $i = 0; $i < $max; $i++) { + if ($atemp->{$values[1]}->[$i]->[2]) { + splice(@{$atemp->{$values[1]}}, $i, 0, + [$values[0], $values[2], undef, $name]); + return; + } + } + } + else { + $atemp->{$values[1]} = []; + } + + ## If the variable name is not scoped, we need to look through existing + ## scoped variables that match the base. If we find one, we need to + ## propagate this value into the scoped settings. + if (index($values[1], '::') == -1) { + $name = $values[1] if (!defined $name); + foreach my $key (keys %$atemp) { + if ($key ne $name) { + foreach my $entry (@{$atemp->{$key}}) { + if ($$entry[3] eq $name) { + push(@{$atemp->{$key}}, [$values[0], $values[2], undef, $name]); + last; + } + } + } + } + } + + ## 0: (0 set, 1 add, -1 subtract) + ## 1: The text value + ## 2: (true set on command line, false set in project) + ## 3: The original variable name if it's scoped or mapped + push(@{$atemp->{$values[1]}}, [$values[0], $values[2], undef, $name]); +} + + +sub handle_unknown_assignment { + my $self = shift; + my $type = shift; + my @values = @_; + + ## Unknown assignments within a 'specific' section are handled as + ## template value modifications. These are handled exactly as the + ## -value_template option in Options.pm. + + ## If $type is not defined, then we are skipping this section + $self->update_template_variable(1, @values) if (defined $type); + + return 1, undef; +} + + +sub handle_scoped_unknown { + my($self, $fh, $type, $flags, $line) = @_; + + if (defined $type && $self->{'parsing_expand'}) { + if ($type eq $self->get_default_component_name()) { + return 0, 'Can not set expansion in this context'; + } + else { + if (!defined $self->{'expanded'}->{$type}) { + my $undef = $self->replace_env_vars(\$line); + if (!$undef) { + ## This is a special concession for Windows. It will not allow + ## you to set an empty environment variable. If an empty + ## double quoted string is found, we will assume that the user + ## wanted an empty string. + $line = '' if ($line eq '""'); + + $self->{'expanded'}->{$type} = $line; + } + } + return 1, undef; + } + } + + ## If the type is not defined, then this is something other than an + ## assignment in a 'specific' section and should be flagged as an error + return 0, "Unrecognized line: $line"; +} + +sub process_component_line { + my($self, $tag, $line, $flags, + $grname, $current, $excarr, $comps, $count) = @_; + my $status = 1; + my $error; + my %exclude; + my @values; + + ## If this returns true, then we've found an assignment + if ($self->parse_assignment($line, \@values)) { + $status = $self->parse_scoped_assignment($tag, @values, $flags); + if (!$status) { + $error = 'Unknown keyword: ' . $values[1]; + } + } + else { + ## If we successfully remove a '!' from the front, then + ## the file(s) listed are to be excluded + my $rem = ($line =~ s/^\^\s*//); + my $exc = $rem || ($line =~ s/^!\s*//); + + ## Convert any $(...) in this line before we process any + ## wild card characters. If we do not, scoped assignments will + ## not work nor will we get the correct wild carded file list. + ## We also need to make sure that any back slashes are converted to + ## slashes to ensure that later flag_overrides checks will happen + ## correctly. + $line = $self->relative($line); + $line =~ s/\\/\//g if ($self->{'convert_slashes'}); + + ## Now look for specially listed files. + ## Regular expressions are very slow. Searching the line twice with + ## index() is 328 times faster than searching with just the regular + ## expression when it doesn't match (which is likely to be the case). + if ((index($line, '>>') >= 0 || index($line, '<<') >= 0) && + $line =~ /(.*)\s+(>>|<<)\s+(.*)/) { + $line = $1; + my $oop = $2; + my $iop = ($oop eq '>>' ? '<<' : '>>'); + my $out = ($oop eq '>>' ? $3 : undef); + my $dep = ($oop eq '<<' ? $3 : undef); + + $line =~ s/\s+$//; + if (index($line, $iop) >= 0 && $line =~ /(.*)\s+$iop\s+(.*)/) { + $line = $1; + $out = $2 if ($iop eq '>>'); + $dep = $2 if ($iop eq '<<'); + $line =~ s/\s+$//; + } + + ## Check for both possible error conditions + if (index($line, $oop) >= 0) { + $status = 0; + $error = "Duplicate $oop used"; + } + elsif (index($line, $iop) >= 0) { + $status = 0; + $error = "Duplicate $iop used"; + } + + ## Keys used internally to MPC need to be in forward slash format. + my $key = $line; + $key =~ s/\\/\//g if ($self->{'convert_slashes'}); + if (defined $out) { + if (!defined $self->{'custom_special_output'}->{$tag}) { + $self->{'custom_special_output'}->{$tag} = {}; + } + ## We can not convert slashes here as we do for dependencies + ## (below). The files specified here need to retain the forward + ## slashes as they are used elsewhere. + $self->{'custom_special_output'}->{$tag}->{$key} = $self->create_array($out); + } + if (defined $dep) { + $self->{'custom_special_depend'}->{$key} = $self->create_array($dep); + if ($self->{'convert_slashes'}) { + foreach my $depfile (@{$self->{'custom_special_depend'}->{$key}}) { + $depfile =~ s/\//\\/g; + } + } + } + } + + ## If there is a command helper, we need to add the output files + ## here. It is possible that helper determined output files are + ## the only files added by this component type. + my $cmdHelper = CommandHelper::get($tag); + if (defined $cmdHelper) { + my $key = $line; + $key =~ s/\\/\//g if ($self->{'convert_slashes'}); + my $cmdflags = $$flags{'commandflags'}; + my $add_out = $cmdHelper->get_output($key, $cmdflags); + push(@{$self->{'custom_special_output'}->{$tag}->{$key}}, @$add_out); + } + + ## Set up the files array. If the line contains a wild card + ## character use CORE::glob() to get the files specified. + my @files; + if ($line =~ /^"([^"]+)"$/) { + push(@files, $1); + } + ## Don't glob the line if we're wanting to remove the file. Wait + ## until later to do the wildcard expansion (in remove_excluded). + elsif (!$rem && $line =~ /[\?\*\[\]]/) { + @files = $self->mpc_glob($line); + } + else { + push(@files, $line); + } + + ## If we want to remove these files at the end too, then + ## add them to our remove_files hash array. + if ($rem) { + if (!defined $self->{'remove_files'}->{$tag}) { + $self->{'remove_files'}->{$tag} = {}; + } + foreach my $file (@files) { + $self->{'remove_files'}->{$tag}->{$file} = 1; + } + } + + ## If we're excluding these files, then put them in the hash + if ($exc) { + $$grname = $current; + @exclude{@files} = (@files); + push(@$excarr, @files); + } + else { + ## Set the flag overrides for each file + my $over = $self->{'flag_overrides'}->{$tag}; + if (defined $over) { + foreach my $file (@files) { + $$over{$file} = $flags; + } + } + + foreach my $file (@files) { + ## Add the file if we're not excluding it + push(@{$$comps{$current}}, $file) if (!defined $exclude{$file}); + + ## The user listed a file explicitly, whether we + ## excluded it or not. + ++$$count; + } + } + } + + return $status, $error; +} + + +sub parse_conditional { + my($self, $fh, $types, $tag, $flags, + $grname, $current, $exclude, $comps, $count) = @_; + my $status = 1; + my $error; + my $type = $self->matches_specific_scope($types); + my $add = (defined $type ? 1 : 0); + + while(<$fh>) { + my $line = $self->preprocess_line($fh, $_); + + if ($line eq '') { + } + elsif ($line =~ /^}\s*else\s*{$/) { + $add ^= 1; + } + elsif ($line =~ /^}$/) { + last; + } + elsif ($add) { + ($status, $error) = $self->process_component_line( + $tag, $line, $flags, + $grname, $current, + $exclude, $comps, $count); + last if (!$status); + } + } + + return $status, $error; +} + +sub parse_components { + my($self, $fh, $tag, $name) = @_; + my $current = $defgroup; + my $status = 1; + my $error; + my $names = {}; + my $comps = {}; + my $set; + my %flags; + my @exclude; + my $custom = defined $self->{'generated_exts'}->{$tag}; + my $grtag = $grouped_key . $tag; + my $grname; + + if ($custom) { + ## For the custom scoped assignments, we want to put a copy of + ## the original custom defined values in our flags associative array. + foreach my $key (keys %custom) { + if (defined $self->{'generated_exts'}->{$tag}->{$key}) { + $flags{$key} = $self->{'generated_exts'}->{$tag}->{$key}; + } + } + } + + if (defined $self->{$tag}) { + $names = $self->{$tag}; + } + else { + $self->{$tag} = $names; + } + if (defined $$names{$name}) { + $comps = $$names{$name}; + } + else { + $$names{$name} = $comps; + } + $$comps{$current} = [] if (!defined $$comps{$current}); + + my $count = 0; + while(<$fh>) { + my $line = $self->preprocess_line($fh, $_); + + if ($line eq '') { + } + elsif ($line =~ /^(\w+)\s*{$/) { + if (!$set) { + $current = $1; + $set = 1; + $$comps{$current} = [] if (!defined $$comps{$current}); + } + else { + $status = 0; + $error = 'Can not nest groups'; + last; + } + } + elsif ($line =~ /^conditional\s*(\(([^\)]+)\))\s*{$/) { + ($status, $error) = $self->parse_conditional( + $fh, $2, $tag, \%flags, \$grname, + $current, \@exclude, $comps, + \$count); + last if (!$status); + } + elsif ($line =~ /^}$/) { + if (!defined $$comps{$current}->[0] && !defined $exclude[0]) { + ## The default components name was never used + ## so we remove it from the components + delete $$comps{$current}; + } + else { + ## It was used, so we need to add that name to + ## the set of group names unless it's already been added. + $self->process_assignment_add($grtag, $current); + } + if ($set) { + $current = $defgroup; + $set = undef; + } + else { + ## We are at the end of a component. If the only group + ## we added was the default group, then we need to remove + ## the group setting altogether. + my $groups = $self->get_assignment($grtag); + if (defined $groups) { + my $grarray = $self->create_array($groups); + if (scalar(@$grarray) == 1 && $$grarray[0] eq $defgroup) { + $self->process_assignment($grtag, undef); + } + } + + ## This is not an error, + ## this is the end of the components + last; + } + } + else { + ($status, $error) = $self->process_component_line($tag, $line, \%flags, + \$grname, $current, + \@exclude, $comps, + \$count); + last if (!$status); + } + } + + ## If this is a "special" component, we need to see if the + ## user provided all directories. If they have, then we need to + ## store an array of directories that the user supplied. Otherwise, + ## we just store a 1. + if (defined $specialComponents{$tag}) { + my @dirs; + foreach my $name (keys %$names) { + my $comps = $$names{$name}; + foreach my $comp (keys %$comps) { + foreach my $item (@{$$comps{$comp}}) { + if (-d $item) { + push(@dirs, $item); + } + else { + @dirs = (); + last; + } + } + } + } + if (defined $dirs[0]) { + $self->{'special_supplied'}->{$tag} = \@dirs; + } + else { + $self->{'special_supplied'}->{$tag} = 1; + } + } + + ## If we didn't encounter an error, didn't have any files explicitly + ## listed and we attempted to exclude files, then we need to find the + ## set of files that don't match the excluded files and add them. + if ($status && defined $exclude[0] && defined $grname) { + my $alldir = $self->get_assignment('recurse') || $flags{'recurse'}; + my %checked; + my @files; + foreach my $exc (@exclude) { + my $dname = $self->mpc_dirname($exc); + if (!defined $checked{$dname}) { + $checked{$dname} = 1; + push(@files, $self->generate_default_file_list($dname, + \@exclude, + undef, $alldir)); + } + } + + $self->sift_files(\@files, + $self->{'valid_components'}->{$tag}, + $self->get_assignment('pch_header'), + $self->get_assignment('pch_source'), + $tag, + $$comps{$grname}); + } + + return $status, $error; +} + + +sub parse_verbatim { + my($self, $fh, $type, $loc, $add) = @_; + + if (!defined $loc) { + return 0, 'You must provide a location parameter to verbatim'; + } + + ## All types are lower case + $type = lc($type); + + if (!defined $self->{'verbatim'}->{$type}) { + $self->{'verbatim'}->{$type} = {}; + } + + ## Instead of always creating a new array for a particular type and + ## location, create a new array if there isn't one already or the user + ## does not want to add to the existing verbatim settings. + $self->{'verbatim'}->{$type}->{$loc} = [] + if (!$add || !defined $self->{'verbatim'}->{$type}->{$loc}); + my $array = $self->{'verbatim'}->{$type}->{$loc}; + + while(<$fh>) { + my $line = $self->preprocess_line($fh, $_); + + ## This is not an error, + ## this is the end of the verbatim + last if ($line =~ /^}$/); + push(@$array, $line); + } + + return 1, undef; +} + + +sub process_feature { + my($self, $fh, $names, $parents) = @_; + my $status = 1; + my $error; + + my $requires = ''; + my $avoids = ''; + foreach my $name (@$names) { + if ($name =~ /^!\s*(.*)$/) { + $avoids .= ' ' if ($avoids ne ''); + $avoids .= $1; + } + else { + $requires .= ' ' if ($requires ne ''); + $requires .= $name; + } + } + + if ($self->check_features($requires, $avoids)) { + ## The required features are enabled, so we say that + ## a project has been defined and we allow the parser to + ## find the data held within the feature. + ($status, $error) = $self->begin_project($parents); + if ($status) { + $self->{'feature_defined'} = 0; + $self->{$self->{'type_check'}} = 1; + } + } + else { + ## Otherwise, we read in all the lines until we find the + ## closing brace for the feature and it appears to the parser + ## that nothing was defined. + my $curly = 1; + while(<$fh>) { + my $line = $self->preprocess_line($fh, $_); + + ## This is a very simplistic way of finding the end of + ## the feature definition. It will work as long as no spurious + ## open curly braces are counted. + ++$curly if ($line =~ /{$/); + --$curly if ($line =~ /^}/); + + if ($curly == 0) { + $self->{'feature_defined'} = 0; + last; + } + } + } + + return $status, $error; +} + + +sub process_array_assignment { + my($self, $aref, $type, $array) = @_; + + if (!defined $$aref || $type == 0) { + if ($type != -1) { + $$aref = $array; + } + } + else { + if ($type == 1) { + push(@{$$aref}, @$array); + } + elsif ($type == -1) { + my $count = scalar(@{$$aref}); + for(my $i = 0; $i < $count; ++$i) { + if (StringProcessor::fgrep($$aref->[$i], $array)) { + splice(@{$$aref}, $i, 1); + --$i; + --$count; + } + } + } + } +} + + +sub parse_define_custom { + my($self, $fh, $tag, $modify) = @_; + + ## Make the tag something _files + $tag = lc($tag) . '_files'; + + ## We can not have a custom type named "generic" + return 0, "$tag is reserved" if ($tag eq $generic_key); + + if (defined $self->{'valid_components'}->{$tag}) { + if (!$modify) { + return 0, "$tag has already been defined"; + } + } + elsif ($modify) { + return 0, "$tag has not yet been defined and can not be modified"; + } + + my $status = 0; + my $errorString = "Unable to process $tag"; + + ## Update the custom_types assignment + $self->process_assignment_add('custom_types', $tag) if (!$modify); + + if (!defined $self->{'matching_assignments'}->{$tag}) { + my @keys = keys %custom; + push(@keys, @default_matching_assignments); + $self->{'matching_assignments'}->{$tag} = \@keys; + } + + my $optname; + my $inscope = 0; + while(<$fh>) { + my $line = $self->preprocess_line($fh, $_); + + if ($line eq '') { + } + elsif ($line =~ /optional\s*\(([^\)]+)\)\s*{/) { + $optname = $1; + $optname =~ s/^\s+//; + $optname =~ s/\s+$//; + if (defined $customDefined{$optname} && + ($customDefined{$optname} & 0x08) != 0) { + ++$inscope; + if ($inscope != 1) { + $status = 0; + $errorString = 'Can not nest \'optional\' sections'; + last; + } + } + else { + $status = 0; + $errorString = "Invalid optional name: $optname"; + last; + } + } + elsif ($inscope) { + if ($line =~ /^}$/) { + $optname = undef; + --$inscope; + } + else { + if ($line =~ /(\w+)\s*\(([^\)]+)\)\s*(\+)?=\s*(.*)/) { + my $name = lc($1); + my $opt = $2; + my $add = $3; + my @val = split(/\s*,\s*/, $4); + + ## Fix $opt spacing + $opt =~ s/(\&\&|\|\|)/ $1 /g; + $opt =~ s/!\s+/!/g; + + ## Set up the 'optional' hash table + if (!$add || !defined $self->{'generated_exts'}->{$tag}-> + {'optional'}->{$optname}->{$name}->{$opt}) { + $self->{'generated_exts'}->{$tag}-> + {'optional'}->{$optname}->{$name}->{$opt} = \@val; + } + else { + push(@{$self->{'generated_exts'}->{$tag}->{'optional'}-> + {$optname}->{$name}->{$opt}}, @val); + } + } + else { + $status = 0; + $errorString = "Unrecognized optional line: $line"; + last; + } + } + } + elsif ($line =~ /^}$/) { + $status = 1; + $errorString = undef; + + ## Propagate the custom defined values into the mapped values + foreach my $key (keys %{$self->{'valid_names'}}) { + if (UNIVERSAL::isa($self->{'valid_names'}->{$key}, 'ARRAY')) { + my $value = $self->{'generated_exts'}->{$tag}->{ + $self->{'valid_names'}->{$key}->[1]}; + + ## Bypass the process_assignment() defined in this class + ## to avoid unwanted keyword mapping. + $self->SUPER::process_assignment($key, $value) if (defined $value); + } + } + + ## Set some defaults (if they haven't already been set) + if (!defined $self->{'generated_exts'}->{$tag}->{'pre_filename'}) { + $self->{'generated_exts'}->{$tag}->{'pre_filename'} = [ '' ]; + } + if (!defined $self->{'generated_exts'}->{$tag}->{'pre_dirname'}) { + $self->{'generated_exts'}->{$tag}->{'pre_dirname'} = [ '' ]; + } + if (!defined $self->{'generated_exts'}->{$tag}->{'pre_extension'}) { + $self->{'generated_exts'}->{$tag}->{'pre_extension'} = [ '' ]; + } + if (!defined $self->{'generated_exts'}->{$tag}->{'automatic_in'}) { + $self->{'generated_exts'}->{$tag}->{'automatic_in'} = 1; + } + if (!defined $self->{'generated_exts'}->{$tag}->{'automatic_out'}) { + $self->{'generated_exts'}->{$tag}->{'automatic_out'} = 1; + } + if (!defined $self->{'generated_exts'}->{$tag}->{'output_follows_input'}) { + $self->{'generated_exts'}->{$tag}->{'output_follows_input'} = 1; + } + if (!defined $self->{'valid_components'}->{$tag}) { + $self->{'valid_components'}->{$tag} = []; + } + last; + } + else { + my @values; + ## If this returns true, then we've found an assignment + if ($self->parse_assignment($line, \@values)) { + my($type, $name, $value) = @values; + ## The 'automatic' keyword has always contained two distinct + ## functions. The first is to automatically add input files of + ## the specified extension. And the second is to automatically + ## add generated files to the right components. It has now been + ## split into separate functionality and we map the 'automatic' + ## keyword to the two new ones here. + my $ok = 1; + my @names = $name eq 'automatic' ? + ('automatic_in', 'automatic_out') : $name; + foreach $name (@names) { + if (defined $customDefined{$name}) { + if (($customDefined{$name} & 0x01) != 0) { + $value = $self->escape_regex_special($value); + my @array = split(/\s*,\s*/, $value); + $self->process_array_assignment( + \$self->{'valid_components'}->{$tag}, $type, \@array); + } + else { + if (!defined $self->{'generated_exts'}->{$tag}) { + $self->{'generated_exts'}->{$tag} = {}; + } + ## Try to convert the value into a relative path + $value = $self->relative($value); + + if (($customDefined{$name} & 0x04) != 0) { + if ($type == 0) { + $self->process_assignment( + $name, $value, + $self->{'generated_exts'}->{$tag}); + } + elsif ($type == 1) { + $self->process_assignment_add( + $name, $value, + $self->{'generated_exts'}->{$tag}); + } + elsif ($type == -1) { + $self->process_assignment_sub( + $name, $value, + $self->{'generated_exts'}->{$tag}); + } + } + else { + if (($customDefined{$name} & 0x02) != 0) { + ## Transform the name from something outputext to + ## something files. We expect this to match the + ## names of valid_assignments. + $name =~ s/outputext/files/g; + } + + ## Get it ready for regular expressions + $value = $self->escape_regex_special($value); + + ## Split the value into an array using a comma as the + ## separator. If there are no elements in the array we're + ## going to add an empty element to the array. This way, + ## assignments of blank values are useful. + my @array = split(/\s*,\s*/, $value); + push(@array, '') if ($#array == -1); + + ## Process the array assignment after adjusting the values + $self->process_array_assignment( + \$self->{'generated_exts'}->{$tag}->{$name}, + $type, \@array); + } + } + } + else { + $ok = 0; + $status = 0; + $errorString = "Invalid assignment name: '$name'"; + last; + } + } + + ## $status is zero until the end of the define custom block, so + ## we can't use it for this check. + last if (!$ok); + } + elsif ($line =~ /^keyword\s+(\w+)(?:\s*=\s*(\w+)?)?/) { + ## Check for keyword mapping here + my $newkey = $1; + my $mapkey = $2; + if (defined $self->{'valid_names'}->{$newkey}) { + $status = 0; + $errorString = "Cannot map $newkey onto an " . + "existing keyword"; + last; + } + elsif (!defined $mapkey) { + $self->{'valid_names'}->{$newkey} = 1; + } + elsif ($newkey ne $mapkey) { + if (defined $customDefined{$mapkey}) { + $self->{'valid_names'}->{$newkey} = [ $tag, $mapkey ]; + } + else { + $status = 0; + $errorString = "Cannot map $newkey to an " . + "undefined custom keyword: $mapkey"; + last; + } + } + else { + $status = 0; + $errorString = "Cannot map $newkey to $mapkey"; + last; + } + } + else { + $status = 0; + $errorString = "Unrecognized line: $line"; + last; + } + } + } + + return $status, $errorString; +} + + +sub back_to_variable { + my($self, $values) = @_; + my $cwd = $self->getcwd(); + my $case_tolerant = $self->case_insensitive(); + my @values = (); + + ## Get both of the relative value hash maps and put them in an array + my @rels = (); + my($rel, $how) = $self->get_initial_relative_values(); + push(@rels, $rel); + ($rel, $how) = $self->get_secondary_relative_values(); + push(@rels, $rel); + + ## Go through each value and try to convert it to a variable setting + foreach my $ovalue (@$values) { + ## Fix up the value, replacing '.' with the current working + ## directory. + my $value = $ovalue; + $value =~ s/\\/\//g; + if ($value eq '.') { + $value = $cwd; + } + else { + $value =~ s/^.\//$cwd\//; + } + my $valuelen = length($value); + + ## Go through each relative value hash map and see if any of the + ## values match the value that we're currently inspecting. + my $found = undef; + foreach my $rel (@rels) { + foreach my $key (keys %$rel) { + ## Get the relative replacement value and convert back-slashes + my $val = $$rel{$key}; + $val =~ s/\\/\//g; + + ## We only need to check for reverse replacement if the length + ## of the value is greater than or equal to the length of our + ## replacement value. + my $vlen = length($val); + if ($valuelen >= $vlen) { + ## Cut the string down by the length of the replacement value + my $lval = substr($value, 0, $vlen); + + ## Check for equivalence, taking into account file system + ## case-insenitivity. + if ($case_tolerant) { + $found = (lc($lval) eq lc($val)); + } + else { + $found = ($lval eq $val); + } + + ## If they match, replace the value and save it in our array. + if ($found) { + substr($value, 0, length($val)) = "\$($key)"; + push(@values, $value); + last; + } + } + } + + ## Once it's been found, there's no reason to continue on through + ## the relative hash maps. + last if ($found); + } + + push(@values, $ovalue) if (!$found); + } + + return @values; +} + + +sub remove_duplicate_addition { + my($self, $name, $value, $nval) = @_; + + if (defined $nval) { + ## If we are modifying the libs, libpaths, macros or includes + ## assignment with either addition or subtraction, we are going to + ## perform a little fix on the value to avoid multiple + ## libraries and to try to insure the correct linking order + if ($name eq 'macros' || $name eq 'libpaths' || + $name eq 'includes' || $name =~ /libs$/ || + index($name, $grouped_key) == 0) { + my $allowed = ''; + my %parts; + + ## Convert the array into keys for a hash table + @parts{@{$self->create_array($nval)}} = (); + + ## In order to ensure that duplicates are correctly removed, we + ## need to get the modified assignment value before we attempt to + ## do so. + $value = $self->modify_assignment_value($name, $value); + foreach my $val (@{$self->create_array($value)}) { + if (!exists $parts{$val}) { + ## We need to supply quotes if there is a space in the value or + ## a variable. The variable may contain spaces. + my $qt = ($val =~ /\s/ || $val =~ /\$\(.+\)/ ? '"' : ''); + $allowed .= $qt . $val . $qt . ' '; + } + } + $allowed =~ s/\s+$//; + return $allowed; + } + } + + return $value; +} + + +sub read_template_input { + my($self, $tkey) = @_; + my $status = 1; + my $errorString; + my $file; + my $tag; + my $ti = $self->get_ti_override(); + my $lang = $self->get_language(); + my $override; + + if ($self->exe_target()) { + if ($self->get_static() == 1) { + $tag = 'lib_exe_template_input'; + ## Check for the TemplateInputReader for the template key provided. + if (!defined $self->{$tag}->{$lang}->{$tkey}) { + if (defined $$ti{'lib_exe'}) { + $file = $$ti{'lib_exe'}; + $override = 1; + } + else { + $file = $self->get_lib_exe_template_input_file($tkey); + } + } + } + else { + $tag = 'dll_exe_template_input'; + ## Check for the TemplateInputReader for the template key provided. + if (!defined $self->{$tag}->{$lang}->{$tkey}) { + if (defined $$ti{'dll_exe'}) { + $file = $$ti{'dll_exe'}; + $override = 1; + } + else { + $file = $self->get_dll_exe_template_input_file($tkey); + } + } + } + } + else { + if ($self->get_static() == 1) { + $tag = 'lib_template_input'; + ## Check for the TemplateInputReader for the template key provided. + if (!defined $self->{$tag}->{$lang}->{$tkey}) { + if (defined $$ti{'lib'}) { + $file = $$ti{'lib'}; + $override = 1; + } + else { + $file = $self->get_lib_template_input_file($tkey); + } + } + } + else { + $tag = 'dll_template_input'; + ## Check for the TemplateInputReader for the template key provided. + if (!defined $self->{$tag}->{$lang}->{$tkey}) { + if (defined $$ti{'dll'}) { + $file = $$ti{'dll'}; + $override = 1; + } + else { + $file = $self->get_dll_template_input_file($tkey); + } + } + } + } + + if (defined $self->{$tag}->{$lang}->{$tkey}) { + ## We have a TemplateInputReader for this template key, so we need + ## to set the entry corresponding to $tikey to it for use in the + ## get_template_input() method. + $self->{$tag}->{$lang}->{$tikey} = $self->{$tag}->{$lang}->{$tkey}; + } + else { + ## We haven't read this file yet, so we will create the template + ## input reader and store it in the entry for the template key + ## ($tkey) and the template input key ($tikey). + my $ti = new TemplateInputReader($self->get_include_path()); + $self->{$tag}->{$lang}->{$tkey} = $ti; + $self->{$tag}->{$lang}->{$tikey} = $ti; + + ## Process the template input file + if (defined $file) { + my $tfile = $self->search_include_path("$file.$TemplateInputExtension"); + if (defined $tfile) { + ($status, $errorString) = $ti->read_file($tfile); + } + else { + ## Not finding a template input file is only an error if the user + ## specifically provided a template input file override. + if ($override) { + $status = 0; + $errorString = "Unable to locate template input file: $file"; + } + } + } + + ## Now that we've read in the template input file, set up our + ## automatic template variables. + if ($self->{'make_coexistence'}) { + $ti->parse_line(undef, + "make_coexistence = $self->{'make_coexistence'}"); + } + } + + ## We do this regardless of whether or not this parser is cached or + ## not. If the features have changed (through a workspace cmdline + ## setting), we need to reflect it. + if ($status) { + ## Put the features into the template input set + my $features = $self->{'feature_parser'}->get_names(); + $self->{$tag}->{$lang}->{$tikey}->parse_line(undef, + "features = @$features"); + } + + return $status, $errorString; +} + + +sub already_added { + my($self, $array, $name) = @_; + + ## This method expects that the file name will be unix style + $name =~ s/\\/\//g if ($self->{'convert_slashes'}); + + ## Remove the leading ./ + $name =~ s/^\.\///; + my $dsname = "./$name"; + + foreach my $file (@$array) { + return 1 if ($file eq $name || $file eq $dsname); + } + + return 0; +} + + +sub get_applied_custom_keyword { + my($self, $name, $type, $file) = @_; + + if (defined $self->{'flag_overrides'}->{$type} && + defined $self->{'flag_overrides'}->{$type}->{$file} && + defined $self->{'flag_overrides'}->{$type}->{$file}->{$name}) { + return $self->relative( + $self->{'flag_overrides'}->{$type}->{$file}->{$name}, 1); + } + + return $self->relative($self->get_assignment( + $name, + $self->{'generated_exts'}->{$type}), 1); +} + + +sub evaluate_optional_option { + my($self, $opt, $value) = @_; + + if ($opt =~ /^!\s*(.*)/) { + return (!exists $$value{$1} ? 1 : 0); + } + else { + return (exists $$value{$opt} ? 1 : 0); + } +} + + +sub process_optional_option { + my($self, $opt, $value) = @_; + my $status; + my @parts = grep(!/^$/, split(/\s+/, $opt)); + my $pcount = scalar(@parts); + + for(my $i = 0; $i < $pcount; $i++) { + if ($parts[$i] eq '&&' || $parts[$i] eq '||') { + if (defined $status) { + if (defined $parts[$i + 1]) { + if ($parts[$i] eq '&&') { + $status &&= $self->evaluate_optional_option($parts[$i + 1], + $value); + } + else { + ## We are coming into an '||', if status is already true + ## then we can leave immediately + last if ($status); + + $status ||= $self->evaluate_optional_option($parts[$i + 1], + $value); + } + } + else { + $self->warning("Expected token in optional after $parts[$i]"); + } + } + else { + $self->warning("Unexpected token in optional: $parts[$i]"); + } + ++$i; + } + else { + if (!defined $status) { + $status = $self->evaluate_optional_option($parts[$i], $value); + } + else { + $self->warning("Unexpected token in optional: $parts[$i]"); + } + } + } + + return $status; +} + + +sub add_optional_filename_portion { + my($self, $gentype, $tag, $file, $array) = @_; + + if (defined $self->{'generated_exts'}->{$gentype}->{'optional'}->{$tag}) { + foreach my $name (keys %{$self->{'generated_exts'}->{$gentype}->{'optional'}->{$tag}}) { + foreach my $opt (keys %{$self->{'generated_exts'}->{$gentype}->{'optional'}->{$tag}->{$name}}) { + ## Get the name value + my $value = $self->get_applied_custom_keyword($name, + $gentype, $file); + + ## Convert the value into a hash map for easy lookup + my %values; + @values{split(/\s+/, $value)} = () if (defined $value); + + ## See if the option or options are contained in the value. We + ## need to call this even if $value is not defined due to the + ## ability to negate optional parameters. + if ($self->process_optional_option($opt, \%values)) { + ## Add the optional portion + push(@$array, @{$self->{'generated_exts'}->{$gentype}->{'optional'}->{$tag}->{$name}->{$opt}}); + } + } + } + } +} + + +sub get_pre_keyword_array { + my($self, $keyword, $gentype, $tag, $file) = @_; + + ## Get the general pre extension array. + ## $self->{'generated_exts'}->{$gentype}->{$keyword} is guaranteed to + ## be defined due to the defaulting that is done in + ## parse_define_custom() and the only three calls to this method use + ## valid $keyword values. + my @array = @{$self->{'generated_exts'}->{$gentype}->{$keyword}}; + + ## Add the component specific pre extension array + my @additional; + $tag =~ s/files$/$keyword/; + if (defined $self->{'generated_exts'}->{$gentype}->{$tag}) { + push(@additional, @{$self->{'generated_exts'}->{$gentype}->{$tag}}); + } + + ## Add in any optional portion to the array + foreach my $itag ($keyword, $tag) { + $self->add_optional_filename_portion($gentype, $itag, + $file, \@additional); + } + + ## If the current array only has the default, + ## then we need to remove it + if (defined $additional[0]) { + if ($#array == 0 && $array[0] eq '') { + pop(@array); + } + push(@array, @additional); + } + + return @array; +} + + +sub add_explicit_output { + my($self, $file, $type, $tag, $array, $arrs) = @_; + + if (defined $self->{'custom_special_output'}->{$type} && + defined $self->{'custom_special_output'}->{$type}->{$file}) { + if (defined $self->{'valid_components'}->{$tag}) { + my @files; + foreach my $check (@{$self->{'custom_special_output'}->{$type}->{$file}}) { + foreach my $regext (@{$self->{'valid_components'}->{$tag}}) { + if ($check =~ /$regext$/) { + my $add = 1; + if ($tag eq 'source_files') { + foreach my $tregext (@{$self->{'valid_components'}->{'template_files'}}) { + if ($check =~ /$tregext$/) { + $add = undef; + last; + } + } + } + if ($add) { + ## If gendir was specified, then we need to account for that + my $dir = ''; + if (defined $self->{'flag_overrides'}->{$type} && + defined $self->{'flag_overrides'}->{$type}->{$file} && + defined $self->{'flag_overrides'}->{$type}->{$file}->{'gendir'} && + $self->{'flag_overrides'}->{$type}->{$file}->{'gendir'} ne '.') { + $dir = $self->{'flag_overrides'}->{$type}->{$file}->{'gendir'} . '/'; + $dir =~ s/\\/\//g if ($self->{'convert_slashes'}); + } + + push(@files, "$dir$check"); + last; + } + } + } + } + if (defined $files[0]) { + if ($arrs) { + push(@$array, \@files); + } + else { + push(@$array, @files); + } + } + } + } +} + +sub generated_filenames { + my($self, $part, $type, $tag, $file, $noext, $arrs) = @_; + + ## A custom type is not allowed to generate it's own input files + return () if ($type eq $tag); + + ## See if the type for which we are generating ($tag) is also a custom + ## file type. If it is, we need to do some massaging. + my $otag = $tag; + if (defined $self->{'generated_exts'}->{$tag}) { + ## If the custom type ($type) doesn't specify that it generates + ## generic files, we need to see if there is a command helper for + ## this type and see what sort of output it knows about. + my $inputexts = $self->{'generated_exts'}->{$type}->{$generic_key}; + if (!defined $inputexts) { + my $cmdHelper = CommandHelper::get($type); + $inputexts = $cmdHelper->get_outputexts() if (defined $cmdHelper); + } + + ## We will need to use 'generic_files' instead of $tag if $tag is + ## defined in 'generated_exts', but only for the type that will + ## actually generate the right type of generic file. + my $good; + if (defined $inputexts) { + foreach my $inputext (@$inputexts) { + my $ext = $inputext; + $ext =~ s/\\//g; + foreach my $extreg (@{$self->{'valid_components'}->{$tag}}) { + if ($ext =~ /$extreg$/) { + $tag = $generic_key; + $good = 1; + last; + } + } + last if ($good); + } + } + return () if (!$good); + } + + my @pearr = $self->get_pre_keyword_array('pre_extension', + $type, $tag, $file); + my @pfarr = $self->get_pre_keyword_array('pre_filename', + $type, $tag, $file); + my @pdarr = $self->get_pre_keyword_array('pre_dirname', + $type, $tag, $file); + my @exts = (defined $self->{'generated_exts'}->{$type}->{$tag} ? + @{$self->{'generated_exts'}->{$type}->{$tag}} : ()); + + if (!defined $exts[0]) { + my $backtag = $tag; + if ($backtag =~ s/files$/outputext/) { + $self->add_optional_filename_portion($type, $backtag, + $file, \@exts); + } + } + + my @array; + if (!defined $exts[0] && $#pearr == 0 && $#pfarr == 0 && $#pdarr == 0 && + $pearr[0] eq '' && $pfarr[0] eq '' && $pdarr[0] eq '') { + ## If both arrays are defined to be the defaults, then there + ## is nothing for us to do. + } + else { + my $dir = ''; + my $base; + + ## Correctly deal with pre filename and directories + if ($part =~ /(.*[\/\\])([^\/\\]+)$/) { + ## Split the directory and base name of the file. Only set the + ## directory if the output follows the input directory. + $dir = $1 + if ($self->{'generated_exts'}->{$type}->{'output_follows_input'}); + $base = $2; + } + else { + $base = $part; + } + + ## If gendir was specified, then we need to account for that + if (defined $self->{'flag_overrides'}->{$type} && + defined $self->{'flag_overrides'}->{$type}->{$file} && + defined $self->{'flag_overrides'}->{$type}->{$file}->{'gendir'}) { + if ($self->{'flag_overrides'}->{$type}->{$file}->{'gendir'} eq '.') { + $dir = ''; + } + else { + $dir = $self->{'flag_overrides'}->{$type}->{$file}->{'gendir'} . '/'; + $dir =~ s/\\/\//g if ($self->{'convert_slashes'}); + } + } + + ## Loop through creating all of the possible file names + foreach my $pe (@pearr) { + my @genfile; + $pe =~ s/\\\././g; + foreach my $pf (@pfarr) { + $pf =~ s/\\\././g; + foreach my $pd (@pdarr) { + if ($noext) { + push(@genfile, "$pd$dir$pf$base$pe"); + } + else { + foreach my $ext (@exts) { + $ext =~ s/\\\././g; + push(@genfile, "$pd$dir$pf$base$pe$ext"); + } + } + } + } + if ($arrs) { + push(@array, \@genfile); + } + else { + push(@array, @genfile); + } + } + } + + ## Now add the explicit output. We need to use the original tag value + ## ($otag) so that we can find the custom output files. + $self->add_explicit_output($file, $type, $otag, \@array, $arrs); + return @array; +} + + +sub add_generated_files { + my($self, $gentype, $tag, $group, $arr) = @_; + + ## This method is called by list_default_generated. It performs the + ## actual file insertion and grouping. + + ## Get the generated filenames + my @added; + foreach my $file (keys %$arr) { + foreach my $gen ($self->generated_filenames($$arr{$file}, $gentype, + $tag, $file, 1)) { + $self->list_generated_file($gentype, $tag, \@added, $gen, $$arr{$file}); + } + } + + if (defined $added[0]) { + my $names = $self->{$tag}; + + ## Get all files in one list and save the directory + ## and component group in a hashed array. + my @all; + my %dircomp; + foreach my $name (keys %$names) { + foreach my $key (keys %{$$names{$name}}) { + push(@all, @{$$names{$name}->{$key}}); + foreach my $file (@{$$names{$name}->{$key}}) { + $dircomp{$self->mpc_dirname($file)} = $key; + } + } + } + + ## Create a small array of only the files we want to add. + ## We put them all together so we can keep them in order when + ## we put them at the front of the main file list. + my @oktoadd; + foreach my $file (@added) { + push(@oktoadd, $file) if (!$self->already_added(\@all, $file)); + } + + ## If we have files to add, make sure we add them to a group + ## that has the same directory location as the files we're adding. + if (defined $oktoadd[0]) { + my $key = (defined $group ? $group : + $dircomp{$self->mpc_dirname($oktoadd[0])}); + if (!defined $key) { + my $check = $oktoadd[0]; + foreach my $regext (@{$self->{'valid_components'}->{$tag}}) { + last if ($check =~ s/$regext$//); + } + foreach my $vc (keys %{$self->{'valid_components'}}) { + ## If this component name does not match the component name for + ## which we are adding files and there are components defined + ## for it, we will look to see if we can find a matching group + ## name. We have to make sure that we do not use the hash map + ## ($self->{$vc}) unless it's defined. Doing so will + ## automatically create the map and that will cause MPC to + ## think that the user provided the empty setting (when it + ## wasn't). + if ($vc ne $tag && defined $self->{$vc}) { + foreach my $name (keys %{$self->{$vc}}) { + foreach my $ckey (keys %{$self->{$vc}->{$name}}) { + if ($ckey ne $defgroup) { + foreach my $ofile (@{$self->{$vc}->{$name}->{$ckey}}) { + my $file = $ofile; + foreach my $regext (@{$self->{'valid_components'}->{$vc}}) { + last if ($file =~ s/$regext$//); + } + if ($file eq $check) { + $key = $ckey; + last; + } + } + } + last if (defined $key); + } + } + last if (defined $key); + } + } + $key = $defgroup if (!defined $key); + } + foreach my $name (keys %$names) { + if (!defined $$names{$name}->{$key}) { + if ($key ne $defgroup && + defined $$names{$name}->{$defgroup} && + defined $$names{$name}->{$defgroup}->[0]) { + $self->process_assignment_add($grouped_key . $tag, $defgroup); + } + $$names{$name}->{$key} = []; + $self->process_assignment_add($grouped_key . $tag, $key); + } + unshift(@{$$names{$name}->{$key}}, @oktoadd); + } + } + } +} + + +sub search_for_entry { + my($self, $file, $marray, $preproc) = @_; + my $name; + my $fh = new FileHandle(); + + if (open($fh, $file)) { + my $poundifed = 0; + my $commented = 0; + + while(<$fh>) { + ## Remove c++ style comments + $_ =~ s/\/\/.*// if (!$commented); + + ## Remove one line c style comments + $_ =~ s/\/\*.*\*\///g; + + if ($commented) { + if (/\*\//) { + ## Found the end of a multi-line c style comment + --$commented; + } + } + else { + if (/\/\*/) { + ## Found the beginning of a multi-line c style comment + ++$commented; + } + elsif ($preproc) { + ## If the current language supports a c preprocessor, we + ## will perform a minimal check for #if 0 + if (/#\s*if\s+0/) { + ## Found the beginning of a #if 0 + ++$poundifed; + } + elsif ($poundifed) { + if (/#\s*if/) { + ## We need to keep track of any other #if directives + ## to be sure that when we see an #endif we don't + ## count the wrong one. + ++$poundifed; + } + elsif (/#\s*endif/) { + ## Found a #endif, so decrement our count + --$poundifed; + } + } + } + } + + ## Check for main; Make sure it's not #if 0'ed and not commented out + if (!$poundifed && !$commented) { + my $found = undef; + foreach my $main (@$marray) { + if (/\s+$main\s*\(/ || /^\s*$main\s*\(/) { + ## If we've found a main, set the exename to the basename + ## of the cpp file with the extension removed + $name = $self->mpc_basename($file); + $name =~ s/\.[^\.]+$//; + $found = 1; + last; + } + last if ($found); + } + } + } + close($fh); + } + return $name; +} + + +sub find_main_file { + my($self, $sources) = @_; + my $lang = $self->get_language(); + my @main = $language{$lang}->[3]; + my $preproc = $language{$lang}->[4]; + + ## If additional main's have been supplied by the user for this + ## language type, then just push them onto the array. + push(@main, @{$mains{$lang}}) if (defined $mains{$lang}); + + ## Now search each source file until we've found a main function. + foreach my $file (@$sources) { + my $exename = $self->search_for_entry($file, \@main, $preproc); + return $exename if (defined $exename); + } + + return undef; +} + + +sub generate_default_target_names { + my $self = shift; + + ## If this is a custom_only project, we need not waste time setting the + ## sharedname, staticname or exename. Searching all of the files for a + ## main function is very time consuming and unnecessary. + return undef if ($self->get_assignment('custom_only')); + + if (!$self->exe_target()) { + my $sharedname = $self->get_assignment('sharedname'); + my $staticname = $self->get_assignment('staticname'); + my $shared_empty; + + if (defined $sharedname) { + if ($sharedname eq '') { + $shared_empty = 1; + $sharedname = undef; + $self->process_assignment('sharedname', $sharedname); + } + elsif (!defined $staticname) { + $staticname = $sharedname; + $self->process_assignment('staticname', $staticname); + } + } + if (defined $staticname && !$shared_empty && !defined $sharedname) { + $sharedname = $staticname; + $self->process_assignment('sharedname', $sharedname); + } + + ## If it's neither an exe or library target, we will search + ## through the source files for a main() + if (!$self->lib_target()) { + ## Set the exename assignment + my @sources = $self->get_component_list('source_files', 1); + my $exename = $self->find_main_file(\@sources); + $self->process_assignment('exename', $exename) if (defined $exename); + + ## If we still don't have a project type, then we will + ## default to a library if there are source or resource files + if (!defined $exename) { + if (!defined $sources[0]) { + @sources = $self->get_component_list($self->get_resource_tag(), 1); + } + if (defined $sources[0]) { + if (!$shared_empty) { + $self->process_assignment('sharedname', + $self->{'unmodified_project_name'}); + } + $self->process_assignment('staticname', + $self->{'unmodified_project_name'}); + } + } + } + } + + ## If we are generating only static projects, then we need to + ## unset the sharedname, so that we can insure that projects of + ## various types only generate static targets. + if ($self->get_static() == 1) { + my $sharedname = $self->get_assignment('sharedname'); + if (defined $sharedname) { + $self->process_assignment('sharedname', undef); + } + } + + ## Check for the use of an asterisk in the name + foreach my $key ('exename', 'sharedname', 'staticname') { + my $value = $self->get_assignment($key); + if (defined $value && index($value, '*') >= 0) { + $value = $self->fill_type_name($value, + $self->{'unmodified_project_name'}); + $self->process_assignment($key, $value); + } + } +} + + +sub generate_default_pch_filenames { + my($self, $files) = @_; + my $pchhdef = (defined $self->get_assignment('pch_header')); + my $pchcdef = (defined $self->get_assignment('pch_source')); + + if (!$pchhdef || !$pchcdef) { + my $pname = $self->get_assignment('project_name'); + my $hcount = 0; + my $ccount = 0; + my $hmatching; + my $cmatching; + foreach my $file (@$files) { + ## If the file doesn't even contain _pch, then there's no point + ## in looping through all of the extensions + if (index($file, '_pch') >= 0) { + if (!$pchhdef) { + foreach my $ext (@{$self->{'valid_components'}->{'header_files'}}) { + if ($file =~ /(.*_pch$ext)$/) { + $self->process_assignment('pch_header', $1); + ++$hcount; + $hmatching = $file if (index($file, $pname) >= 0); + last; + } + } + } + if (!$pchcdef) { + foreach my $ext (@{$self->{'valid_components'}->{'source_files'}}) { + if ($file =~ /(.*_pch$ext)$/) { + $self->process_assignment('pch_source', $1); + ++$ccount; + $cmatching = $file if (index($file, $pname) >= 0); + last; + } + } + } + } + } + if (!$pchhdef && $hcount > 1 && defined $hmatching) { + $self->process_assignment('pch_header', $hmatching); + } + if (!$pchcdef && $ccount > 1 && defined $cmatching) { + $self->process_assignment('pch_source', $cmatching); + } + } +} + + +sub fix_pch_filenames { + my $self = shift; + + ## Unset the precompiled header settings if they are set but empty + foreach my $type ('pch_header', 'pch_source') { + my $pch = $self->get_assignment($type); + $self->process_assignment($type, undef) if (defined $pch && $pch eq ''); + } +} + + +sub remove_extra_pch_listings { + my $self = shift; + my @pchs = ('pch_header', 'pch_source'); + my @tags = ('header_files', 'source_files'); + + for(my $j = 0; $j < 2; ++$j) { + my $pch = $self->get_assignment($pchs[$j]); + + if (defined $pch) { + ## If we are converting slashes, then we need to + ## convert the pch file back to forward slashes + $pch =~ s/\\/\//g if ($self->{'convert_slashes'}); + + ## Find out which files are duplicated + my $names = $self->{$tags[$j]}; + foreach my $name (keys %$names) { + my $comps = $$names{$name}; + foreach my $key (keys %$comps) { + my $array = $$comps{$key}; + my $count = scalar(@$array); + for(my $i = 0; $i < $count; ++$i) { + if ($pch eq $$array[$i]) { + splice(@$array, $i, 1); + --$count; + } + } + } + } + } + } +} + + +sub sift_files { + my($self, $files, $exts, $pchh, $pchc, $tag, $array, $alldir) = @_; + my @saved; + my $havec = (defined $self->{'exclude_components'}->{$tag}); + + ## The special actions taken based on $saverc only applies to + ## C++ resource files. + my $saverc = (!$alldir && $tag eq $self->get_resource_tag() && + $self->languageIs(Creator::cplusplus)); + + foreach my $ext (@$exts) { + foreach my $file (grep(/$ext$/, @$files)) { + ## Always exclude the precompiled header and cpp + if ((!defined $pchh || $file ne $pchh) && + (!defined $pchc || $file ne $pchc)) { + if ($havec) { + my $exclude = 0; + foreach my $exc (@{$self->{'exclude_components'}->{$tag}}) { + if ($file =~ /$exc$/) { + $exclude = 1; + last; + } + } + next if ($exclude); + } + elsif ($saverc) { + ## Save these files for later. There may + ## be more than one and we want to try and + ## find the one that corresponds to this project + push(@saved, $file); + next; + } + + push(@$array, $file) if (!$self->already_added($array, $file)); + } + } + } + + ## Now deal with the saved files + if (defined $saved[0]) { + if (!defined $saved[1]) { + ## Theres only one rc file, take it + push(@$array, $saved[0]); + } + else { + my $pjname = $self->escape_regex_special( + $self->transform_file_name( + $self->get_assignment('project_name'))); + ## Use a case insensitive search. + ## After all, this is a Windows specific file type. + foreach my $save (@saved) { + if ($save =~ /$pjname/i) { + if (!$self->already_added($array, $save)) { + push(@$array, $save); + } + } + } + } + } +} + + +sub sift_default_file_list { + my($self, $tag, $file, $built, $exts, $recurse, $pchh, $pchc) = @_; + my $alldir = $recurse || + (defined $self->{'flag_overrides'}->{$tag} && + defined $self->{'flag_overrides'}->{$tag}->{$file} && + $self->{'flag_overrides'}->{$tag}->{$file}->{'recurse'}); + my @gen = $self->generate_default_file_list($file, [], undef, $alldir); + + $self->sift_files(\@gen, $exts, $pchh, $pchc, $tag, $built, $alldir); +} + + +sub correct_generated_files { + my($self, $defcomp, $exts, $tag, $array) = @_; + + if (defined $sourceComponents{$tag}) { + my $grtag = $grouped_key . $tag; + foreach my $gentype (keys %{$self->{'generated_exts'}}) { + ## If we are not automatically adding generated output, then we + ## need to skip this component type. + next if (!$self->{'generated_exts'}->{$gentype}->{'automatic_out'}); + + ## If we are auto-generating the source_files, then + ## we need to make sure that any generated source + ## files that are added are put at the front of the list. + my $newgroup; + my @input; + + ## If I call keys %{$self->{$gentype}} using perl 5.6.1 + ## it returns nothing. I have to put it in an + ## intermediate variable to ensure that I get the keys. + my $names = $self->{$gentype}; + foreach my $name (keys %$names) { + foreach my $key (keys %{$$names{$name}}) { + push(@input, @{$$names{$name}->{$key}}); + $newgroup = $key if ($key ne $defgroup); + } + } + + if (defined $input[0]) { + my @front; + my @copy = @$array; + + @$array = (); + foreach my $input (@input) { + my $part = $self->remove_wanted_extension( + $input, + $self->{'valid_components'}->{$gentype}); + + my @files = $self->generated_filenames($part, $gentype, + $tag, $input); + if (defined $copy[0]) { + my $found = 0; + foreach my $file (@files) { + for(my $i = 0; $i < scalar(@copy); $i++) { + my $re = $self->escape_regex_special($copy[$i]); + if ($file eq $copy[$i] || $file =~ /[\/\\]$re$/) { + ## No need to check for previously added files + ## here since there are none. + $found = 1; + push(@front, $file); + splice(@copy, $i, 1); + last; + } + } + last if ($found); + } + if (!$found) { + ## The first file listed in @files is the preferred + ## extension for the custom command. Take the first + ## file extension and see if it matches one in the accepted + ## extensions. + if (defined $files[0]) { + my $ext; + if ($files[0] =~ /.*(\.[^\.]+)$/) { + $ext = $self->escape_regex_special($1); + } + if (defined $ext) { + ## If it doesn't match one of the accepted extensions, + ## then just use the first extension from the type for + ## which we are generating. + $ext = $$exts[0] if (!StringProcessor::fgrep($ext, $exts)); + } + + ## Add all the files that match the chosen extension + foreach my $file (@files) { + push(@front, $file) if ($file =~ /$ext$/); + } + } + } + } + else { + my $ext = $$exts[0]; + foreach my $file (@files) { + push(@front, $file) if ($file =~ /$ext$/); + } + } + } + if (defined $copy[0]) { + ## No need to check for previously added files + ## here since there are none. + push(@$array, @copy); + if (defined $self->get_assignment($grtag)) { + $self->process_assignment_add($grtag, $defgroup); + } + } + if (defined $front[0]) { + if (defined $newgroup) { + if (defined $copy[0]) { + $self->process_assignment_add($grtag, $defgroup); + } + if (!defined $self->{$tag}->{$defcomp}->{$newgroup}) { + $self->{$tag}->{$defcomp}->{$newgroup} = \@front; + } + else { + push(@{$self->{$tag}->{$defcomp}->{$newgroup}}, @front); + } + $self->process_assignment_add($grtag, $newgroup); + } + else { + unshift(@$array, @front); + } + } + } + } + } +} + + +sub generate_default_components { + my($self, $files, $passed) = @_; + my $genext = $self->{'generated_exts'}; + my @gc = reverse sort { $self->sort_generated_types($a, $b) + } keys %$genext; + my @tags = (defined $passed ? $passed : + (@gc, keys %{$language{$self->get_language()}->[0]})); + my $pchh = $self->get_assignment('pch_header'); + my $pchc = $self->get_assignment('pch_source'); + my $recurse = $self->get_assignment('recurse'); + my $defcomp = $self->get_default_component_name(); + my $flo = $self->{'flag_overrides'}; + my $cmdflags = 'commandflags'; + + ## The order of @tags does make a difference in the way that generated + ## files get added. Hence the sort call on the generate_exts keys to + ## ensure that user defined types come first. They are reverse sorted + ## using the custom sort function to ensure that user defined types + ## that rely on other user defined types for input files are processed + ## first. + foreach my $tag (@tags) { + if (!defined $genext->{$tag} || + $genext->{$tag}->{'automatic_in'}) { + my $exts = $self->{'valid_components'}->{$tag}; + if (defined $$exts[0]) { + if (defined $self->{$tag}) { + ## If the tag is defined, then process directories + my $names = $self->{$tag}; + foreach my $name (keys %$names) { + my $comps = $$names{$name}; + foreach my $comp (keys %$comps) { + my $array = $$comps{$comp}; + if (defined $passed) { + $self->sift_files($files, $exts, $pchh, $pchc, $tag, $array); + } + else { + my @built; + my $alldirs = 1; + foreach my $file (@$array) { + if (-d $file) { + my @portion; + $self->sift_default_file_list($tag, $file, \@portion, + $exts, $recurse, $pchh, $pchc); + + ## Since the file was actually a directory, we will + ## need to propagate the flag overrides (if there are + ## any) to the newly located files. + if (defined $flo->{$tag} && + defined $flo->{$tag}->{$file}) { + foreach my $built (@portion) { + $flo->{$tag}->{$built} = $flo->{$tag}->{$file}; + } + } + + ## Always push the @portion array onto the back of + ## @built. + push(@built, @portion); + } + else { + $alldirs = undef; + if (!$self->already_added(\@built, $file)) { + push(@built, $file); + } + } + } + if ($alldirs) { + $self->correct_generated_files($defcomp, $exts, + $tag, \@built); + } + $$comps{$comp} = \@built; + } + } + } + } + else { + ## Generate default values for undefined tags + $self->{$tag} = {}; + my $comps = {}; + $self->{$tag}->{$defcomp} = $comps; + $$comps{$defgroup} = []; + my $array = $$comps{$defgroup}; + + $self->{'defaulted'}->{$tag} = 1; + + if (!defined $specialComponents{$tag}) { + $self->sift_files($files, $exts, $pchh, $pchc, $tag, $array); + $self->correct_generated_files($defcomp, $exts, $tag, $array); + } + } + + ## If the type that we're generating defaults for ($tag) is a + ## custom type, then we need to see if other custom types + ## ($gentype) will generate files that will be used as input. It + ## has to be done here so that the built-in types will have all + ## of the possible input files that they can. + if (defined $genext->{$tag}) { + foreach my $gentype (keys %{$genext}) { + if ($gentype ne $tag) { + $self->list_default_generated($gentype, [$tag]); + } + } + + ## Now that we have the files for this type ($tag), we need to + ## locate a command helper for the custom command and see if it + ## knows about any additional output files based on the file + ## name. + my $cmdHelper = CommandHelper::get($tag); + if (defined $cmdHelper) { + my $names = $self->{$tag}; + foreach my $name (keys %$names) { + my $comps = $$names{$name}; + foreach my $comp (keys %$comps) { + my $array = $$comps{$comp}; + foreach my $file (@$array) { + my $flags = defined $flo->{$tag}->{$file} ? + $flo->{$tag}->{$file}->{$cmdflags} : + $genext->{$tag}->{$cmdflags}; + my $add_out = $cmdHelper->get_output($file, $flags); + push(@{$self->{'custom_special_output'}->{$tag}->{$file}}, + @$add_out); + } + } + } + } + } + } + } + } +} + + +sub remove_duplicated_files { + my($self, $dest, $source) = @_; + my @slist = $self->get_component_list($source, 1); + + ## There's no point in going on if there's nothing in this component + ## list. + return undef if ($#slist == -1); + + ## Convert the array into keys for a hash table + my %shash; + @shash{@slist} = (); + + ## Find out which source files are listed + my $names = $self->{$dest}; + foreach my $name (keys %$names) { + foreach my $key (keys %{$$names{$name}}) { + my $array = $$names{$name}->{$key}; + my $count = scalar(@$array); + for(my $i = 0; $i < $count; ++$i) { + ## Is the source file in the component array? + if (exists $shash{$$array[$i]}) { + ## Remove the element and fix the index and count + splice(@$array, $i, 1); + --$count; + --$i; + } + } + } + } +} + + +sub generated_source_listed { + my($self, $gent, $tag, $arr, $sext) = @_; + my $names = $self->{$tag}; + + ## Find out which generated source files are listed + foreach my $name (keys %$names) { + my $comps = $$names{$name}; + foreach my $key (keys %$comps) { + foreach my $val (@{$$comps{$key}}) { + foreach my $i (keys %$arr) { + ## If $gent doesn't cause $tag files to be generated, then we + ## can just return a non-zero value to short-circuit attempting + ## to add generated files after the caller continues. + my @gfiles = $self->generated_filenames($$arr{$i}, $gent, $tag, $i); + return 2 if ($#gfiles == -1); + + foreach my $re (@gfiles) { + $re = $self->escape_regex_special($re); + return 1 if ($val =~ /$re$/); + } + } + } + } + } + + return 0; +} + + +sub list_default_generated { + my($self, $gentype, $tags) = @_; + + ## This method is called when the user has custom input files and has + ## provided source files. If the user defaults the component (i.e. + ## source_files, resource_files, etc.) they are filled in by the + ## generate_default_components method. + + if (defined $self->{'generated_exts'}->{$gentype} && + $self->{'generated_exts'}->{$gentype}->{'automatic_out'}) { + ## After all source and headers have been defaulted, see if we + ## need to add the generated files + if (defined $self->{$gentype}) { + ## Build up the list of files + my %arr; + my $names = $self->{$gentype}; + my $group; + foreach my $name (keys %$names) { + foreach my $key (keys %{$$names{$name}}) { + my $array = $$names{$name}->{$key}; + + ## Take the last group name we encounter + $group = $key if ($key ne $defgroup); + + foreach my $val (@$array) { + $arr{$val} = $self->remove_wanted_extension( + $val, + $self->{'valid_components'}->{$gentype}); + } + } + } + + foreach my $type (@$tags) { + ## Do not add generated files if they are "special" + ## unless they haven't been explicitly supplied. + if ($gentype ne $type && + (!$specialComponents{$type} || + (!$self->{'special_supplied'}->{$type} || + UNIVERSAL::isa($self->{'special_supplied'}->{$type}, 'ARRAY')))) { + if (!$self->generated_source_listed( + $gentype, $type, \%arr, + $self->{'valid_components'}->{$gentype})) { + $self->add_generated_files($gentype, $type, $group, \%arr); + } + } + } + } + } +} + + +sub prepend_gendir { + my($self, $created, $ofile, $gentype) = @_; + my $key; + + if (defined $self->{'flag_overrides'}->{$gentype}) { + foreach my $ext (@{$self->{'valid_components'}->{$gentype}}) { + my $e = $ext; + $e =~ s/\\//g; + $key = "$ofile$e"; + + last if (defined $self->{'flag_overrides'}->{$gentype}->{$key}); + $key = undef; + } + + if (defined $key) { + if (StringProcessor::fgrep('gendir', + $self->{'matching_assignments'}->{$gentype})) { + my $dir = $self->{'flag_overrides'}->{$gentype}->{$key}->{'gendir'}; + if (defined $dir) { + ## Convert the file to unix style for basename + if ($self->{'convert_slashes'}) { + $created =~ s/\\/\//g; + $dir =~ s/\\/\//g; + } + return ($dir eq '.' ? '' : "$dir/") . $self->mpc_basename($created); + } + } + } + } + + return $created; +} + + +sub list_generated_file { + my($self, $gentype, $tag, $array, $file, $ofile) = @_; + my $count = 0; + + ## Go through each file listed in our original type and attempt to find + ## out if it is the generated file we may need to add ($file). + foreach my $gen ($self->get_component_list($gentype, 1)) { + my $input = $gen; + + ## Take the file and see if it contains an extension that our + ## generating type ($gentype) knows about. If it does, remove it and + ## stop looking for the extension. + foreach my $ext (@{$self->{'valid_components'}->{$gentype}}) { + ## Remove the extension. + ## If it works, then we can exit this loop. + last if ($gen =~ s/$ext$//); + } + + ## If the user provided file does not match any of the + ## extensions specified by the custom definition, we need + ## to remove the extension or else this file will not be + ## added to the project. + $gen =~ s/\.[^\.]+$// if ($gen eq $input); + + ## See if we need to add the file. We always need to check since the + ## output file may have absolutely nothing in common with the input + ## file. + foreach my $created ($self->generated_filenames($gen, $gentype, + $tag, $input)) { + ## $gen is a file that has a custom definition that generates + ## files of the type $tag. The $file passed in is of type + ## $gentype and, as far as I can tell, $created will always be + ## longer or of the same length of $file. It doesn't really + ## matter if $file contains a '.' or not. + if (index($created, $file) != -1) { + if (defined $ofile) { + $created = $self->prepend_gendir($created, $ofile, $gentype); + } + if (!$self->already_added($array, $created)) { + push(@$array, $created); + ++$count; + } + last; + } + } + } + + return $count; +} + + +sub add_corresponding_component_files { + my($self, $filecomp, $tag) = @_; + my $grname = $grouped_key . $tag; + + ## Create a hash array keyed off of the existing files of the type + ## that we plan on adding. + my $fexist = 0; + my %scfiles; + my $names = $self->{$tag}; + foreach my $name (keys %$names) { + ## Check to see if files exist in the default group + if (defined $$names{$name}->{$defgroup} && + defined $$names{$name}->{$defgroup}->[0]) { + $fexist = 1; + } + foreach my $comp (keys %{$$names{$name}}) { + @scfiles{@{$$names{$name}->{$comp}}} = (); + } + } + + ## Create an array of extensions for the files we want to add + my @exts; + foreach my $ext (@{$self->{'valid_components'}->{$tag}}) { + push(@exts, $ext); + $exts[$#exts] =~ s/\\//g; + } + + ## Check each file against a possible new file addition + my $adddefaultgroup = 0; + my $oktoadddefault = 0; + foreach my $sfile (keys %$filecomp) { + my $found = 0; + foreach my $ext (@exts) { + if (exists $scfiles{"$sfile$ext"}) { + $found = 1; + last; + } + } + + if (!$found) { + ## Get the array of files for the selected component name + my $array = []; + my $comp = $$filecomp{$sfile}; + foreach my $name (keys %$names) { + if (defined $$names{$name}->{$comp}) { + $array = $$names{$name}->{$comp}; + } + } + + ## First, see if it will be generated so that we can correctly + ## deal with 'gendir' settings. + foreach my $gentype (keys %{$self->{'generated_exts'}}) { + $found += $self->list_generated_file($gentype, $tag, $array, $sfile); + } + + ## Next check to see if the file exists + if (!$found) { + foreach my $ext (@exts) { + if (-r "$sfile$ext") { + my $file = "$sfile$ext"; + if (!$self->already_added($array, $file)) { + push(@$array, $file); + ++$found; + } + last; + } + } + } + + ## If we have any files at all in the component array, check + ## to see if we need to add a new group name + if (defined $$array[0]) { + if ($comp eq $defgroup) { + $adddefaultgroup = 1; + } + else { + my $grval = $self->get_assignment($grname); + if (!defined $grval || + !StringProcessor::fgrep($comp, $self->create_array($grval))) { + $self->process_assignment_add($grname, $comp); + } + $oktoadddefault = 1; + $adddefaultgroup |= $fexist; + } + + ## Put the array back into the component list + if ($found) { + foreach my $name (keys %$names) { + $$names{$name}->{$comp} = $array; + } + } + } + } + } + + ## We only need to add the default group name if we wanted to + ## add the default group when adding new files and we added a group + ## by some other name. Otherwise, defaulted files would always be + ## in a group, which is not what we want. + if ($adddefaultgroup && $oktoadddefault) { + $self->process_assignment_add($grname, $defgroup); + } +} + + +sub get_default_project_name { + my $self = shift; + my $name = $self->{'current_input'}; + + if ($name eq '') { + $name = $self->transform_file_name($self->base_directory()); + } + else { + ## Since files on UNIX can have back slashes, we transform them + ## into underscores. + $name =~ s/\\/_/g; + + ## Convert the name to a usable name + $name = $self->transform_file_name($name); + + ## Take off the extension + $name =~ s/\.[^\.]+$//; + } + + return $name; +} + + +sub remove_excluded { + my $self = shift; + my @tags = @_; + + ## Process each file type and remove the excluded files + foreach my $tag (@tags) { + my $names = $self->{$tag}; + foreach my $name (keys %$names) { + foreach my $comp (keys %{$$names{$name}}) { + my $count = scalar(@{$$names{$name}->{$comp}}); + for(my $i = 0; $i < $count; ++$i) { + my $file = $$names{$name}->{$comp}->[$i]; + if (defined $self->{'remove_files'}->{$tag}->{$file}) { + splice(@{$$names{$name}->{$comp}}, $i, 1); + --$i; + --$count; + } + else { + ## The file does not match exactly with one of the files to + ## remove. Look for wildcard specifications in the files to + ## be removed and perform the removal if one of them matches + ## the current file. + foreach my $key (keys %{$self->{'remove_files'}->{$tag}}) { + if ($key =~ /[\*\?\[\]]/) { + my $regex = $key; + $regex =~ s/\./\\./g; + $regex =~ s/\*/\.\*/g; + $regex =~ s/\?/\./g; + if ($file =~ /^$regex$/) { + splice(@{$$names{$name}->{$comp}}, $i, 1); + --$i; + --$count; + last; + } + } + } + } + } + } + } + delete $self->{'remove_files'}->{$tag}; + } +} + + +sub sort_generated_types { + ## We need to sort the custom component types such that a custom type + ## that generates input for another custom type comes first in the + ## list. + my($self, $left, $right, $norecurse) = @_; + foreach my $key (keys %{$self->{'generated_exts'}->{$left}}) { + if ($key =~ /_files$/) { + foreach my $regex (@{$self->{'generated_exts'}->{$left}->{$key}}) { + my $ext = $regex; + $ext =~ s/\\//g; + foreach my $vreg (@{$self->{'valid_components'}->{$right}}) { + return -1 if ($ext =~ /$vreg$/); + } + } + } + } + if (!$norecurse && $self->sort_generated_types($right, $left, 1) == -1) { + return 1; + } + + return 0; +} + +sub generate_defaults { + my $self = shift; + + ## Generate default project name + if (!defined $self->get_assignment('project_name')) { + $self->set_project_name($self->get_default_project_name()); + } + + ## Generate the default pch file names (if needed) + my @files = $self->generate_default_file_list( + '.', [], + undef, $self->get_assignment('recurse')); + $self->generate_default_pch_filenames(\@files); + + ## If the pch file names are empty strings then we need to fix that + $self->fix_pch_filenames(); + + ## Generate default components, but %specialComponents + ## are skipped in the initial default components generation + $self->generate_default_components(\@files); + + ## Remove source files that are also listed in the template files + ## If we do not do this, then generated projects can be invalid. + $self->remove_duplicated_files('source_files', 'template_files'); + + ## If pch files are listed in header_files or source_files more than + ## once, we need to remove the extras + $self->remove_extra_pch_listings(); + + ## Generate the default generated list of files only if we defaulted + ## the generated file list. I want to ensure that source_files comes + ## first in the list to pick up group information (since source_files + ## are most likely going to be grouped than anything else). + my @vc = sort { return -1 if $a eq 'source_files'; + return 1 if $b eq 'source_files'; + return $b cmp $a; } keys %{$self->{'valid_components'}}; + my @gvc = sort { $self->sort_generated_types($a, $b) + } keys %{$self->{'generated_exts'}}; + foreach my $gentype (@gvc) { + $self->list_default_generated($gentype, \@vc); + } + + ## Now that all of the source files have been added + ## we need to remove those that have need to be removed + $self->remove_excluded('source_files'); + + ## Collect up all of the source files that have already been listed + ## with the extension removed for use directly below. + my %sourcecomp; + foreach my $sourcetag (keys %sourceComponents) { + my $names = $self->{$sourcetag}; + foreach my $name (keys %$names) { + foreach my $comp (keys %{$$names{$name}}) { + foreach my $sfile (@{$$names{$name}->{$comp}}) { + my $mod = $sfile; + $mod =~ s/\.[^\.]+$//; + $sourcecomp{$mod} = $comp; + } + } + } + } + + ## Add %specialComponents files based on the + ## source_components (i.e. .h and .i or .inl based on .cpp) + foreach my $tag (keys %specialComponents) { + $self->add_corresponding_component_files(\%sourcecomp, $tag); + } + + ## Now, if the %specialComponents are still empty + ## then take any file that matches the components extension + foreach my $tag (keys %specialComponents) { + if (!$self->{'special_supplied'}->{$tag} || + UNIVERSAL::isa($self->{'special_supplied'}->{$tag}, 'ARRAY')) { + my $names = $self->{$tag}; + if (defined $names) { + ## We only want to generate default components if we have + ## defaulted the source files or we have no files listed + ## in the current special component. + my $ok = $self->{'defaulted'}->{'source_files'}; + if (!$ok) { + my @all; + foreach my $name (keys %$names) { + foreach my $key (keys %{$$names{$name}}) { + push(@all, @{$$names{$name}->{$key}}); + } + } + $ok = (!defined $all[0]); + } + if ($ok) { + ## If the "special" type was supplied and it was all + ## directories, we need to use those directories to generate + ## the default components instead of the current directory. + my $fileref = \@files; + if (defined $self->{'special_supplied'}->{$tag} && + UNIVERSAL::isa($self->{'special_supplied'}->{$tag}, 'ARRAY')) { + my @special; + foreach my $dir (@{$self->{'special_supplied'}->{$tag}}) { + push(@special, $self->generate_default_file_list( + $dir, [], undef, + $self->get_assignment('recurse'))); + } + $fileref = \@special; + } + $self->generate_default_components($fileref, $tag); + } + } + } + } + + ## Now that all of the other files have been added + ## we need to remove those that have need to be removed + my @rmkeys = keys %{$self->{'remove_files'}}; + $self->remove_excluded(@rmkeys) if (defined $rmkeys[0]); + + ## Tie custom files together if need be. This currently only applies + ## to types with command helpers. At some point, if it is found to be + ## desirous, we could extend the MPC syntax somehow to support this + ## sort of thing manually. + my $dep = 'dependent'; + foreach my $gentype (@gvc) { + my $cmdHelper = CommandHelper::get($gentype); + if (defined $cmdHelper) { + ## There has to be at least two files files in order for + ## something to be tied together. + my @files = $self->get_component_list($gentype, 1); + if ($#files >= 1) { + foreach my $file (@files) { + my $part = $self->remove_wanted_extension( + $file, $self->{'valid_components'}->{$gentype}); + my($tied, $vc) = $cmdHelper->get_tied($file, \@files); + foreach my $tie (@$tied) { + my @gen; + if (!defined $vc) { + foreach $vc (@vc) { + @gen = $self->generated_filenames($part, $gentype, + $vc, $file); + last if ($#gen >= 0); + } + } + + ## We have a tied file, now we need to actually perform + ## the tieing of the two. We will do this by saying that + ## the output of the original is necessary for the + ## processing of the tied file. + @gen = $self->generated_filenames($part, $gentype, + $vc, $file) if (!$gen[0]); + + ## We have found a set of files that are generated + ## based on the component type of the original file + ## ($gentype), so we just add the first one and + ## we're done. + my $first = $gen[0]; + $self->{'flag_overrides'}->{$gentype}->{$tie}->{$dep} = + $self->{'generated_exts'}->{$gentype}->{$dep} + if (!defined $self->{'flag_overrides'}->{$gentype}->{$tie}->{$dep}); + + $self->{'flag_overrides'}->{$gentype}->{$tie}->{$dep} .= " $first" + if (!defined $self->{'flag_overrides'}->{$gentype}->{$tie}->{$dep} || + $self->{'flag_overrides'}->{$gentype}->{$tie}->{$dep} !~ /\b$first\b/); + } + } + } + } + } +} + + +sub set_project_name { + my($self, $name) = @_; + + ## Save the unmodified project name so that when we + ## need to determine the default target name, we can use + ## what is expected by the user. + $self->{'unmodified_project_name'} = $name; + + ## If we are applying the name modifier to the project + ## then we will modify the project name + if ($self->get_apply_project()) { + my $nmod = $self->get_name_modifier(); + + if (defined $nmod) { + $nmod =~ s/\*/$name/g; + $name = $nmod; + } + } + + ## Set the project_name assignment so that the TemplateParser + ## can get the project name. + $self->process_assignment('project_name', $name); +} + + +sub project_name { + return $_[0]->get_assignment('project_name'); +} + + +sub lib_target { + my $self = shift; + return (defined $self->get_assignment('sharedname') || + defined $self->get_assignment('staticname')); +} + + +sub exe_target { + return (defined $_[0]->get_assignment('exename')); +} + + +sub get_component_list { + my($self, $tag, $noconvert) = @_; + my $names = $self->{$tag}; + my @list; + + foreach my $name (keys %$names) { + foreach my $key (keys %{$$names{$name}}) { + push(@list, @{$$names{$name}->{$key}}); + } + } + + ## By default, if 'convert_slashes' is true, then we convert slashes + ## to backslashes. There are cases where we do not want to convert + ## the slashes, in that case get_component_list() was called with + ## an additional parameter indicating this. + if (!$noconvert && $self->{'convert_slashes'}) { + foreach my $item (@list) { + $item =~ s/\//\\/g; + } + } + + if ($self->{'sort_files'}) { + @list = sort { $self->file_sorter($a, $b) } @list; + } + + return @list; +} + + +sub check_custom_output { + my($self, $based, $cinput, $ainput, $type, $comps) = @_; + my @outputs; + + foreach my $array ($self->generated_filenames($cinput, $based, + $type, $ainput, 0, 1)) { + foreach my $built (@$array) { + if (@$comps == 0) { + push(@outputs, $built); + last; + } + elsif (defined $specialComponents{$type} && + (!$self->{'special_supplied'}->{$type} || + UNIVERSAL::isa($self->{'special_supplied'}->{$type}, 'ARRAY'))) { + push(@outputs, $built); + last; + } + else { + my $base = $built; + $base =~ s/\\/\//g if ($self->{'convert_slashes'}); + my $re = $self->escape_regex_special($self->mpc_basename($base)); + foreach my $c (@$comps) { + ## We only match if the built file name matches from + ## beginning to end or from a slash to the end. + if ($c =~ /^$re$/ || $c =~ /[\/\\]$re$/) { + push(@outputs, $built); + last; + } + } + } + } + } + + return @outputs; +} + + +sub get_special_value { + my $self = shift; + my $type = shift; + my $cmd = shift; + my $based = shift; + my @params = @_; + + ## These names (held in $type) are variables that contain various + ## commands that will be used in templates within the context of a + ## foreach (e.g., <%custom_type->input_files%> or <%feature->value%>). + if ($type eq 'feature') { + return $self->get_feature_value($cmd, $based); + } + elsif (index($type, 'custom_type') == 0) { + return $self->get_custom_value($cmd, $based, @params); + } + elsif (index($type, $grouped_key) == 0) { + return $self->get_grouped_value($type, $cmd, $based); + } + + return undef; +} + + +sub get_feature_value { + my($self, $cmd, $based) = @_; + + if ($cmd eq 'value') { + my $val = $self->{'feature_parser'}->get_value($based); + if (defined $val && $val != 0) { + return 1; + } + } + + return undef; +} + + +sub get_grouped_value { + my($self, $type, $cmd, $based) = @_; + my $value; + + ## Make it all lower case + $type = lc($type); + + ## Remove the grouped_ part + $type =~ s/^$grouped_key//; + + ## Add the s if it isn't there + $type .= 's' if ($type !~ /s$/); + + my $names = $self->{$type}; + if ($cmd eq 'files') { + foreach my $name (keys %$names) { + my $comps = $$names{$name}; + my @keys = keys %$comps; + if (StringProcessor::fgrep($based, \@keys)) { + if ($self->{'convert_slashes'}) { + my @converted; + foreach my $file (@{$$comps{$based}}) { + push(@converted, $self->slash_to_backslash($file)); + } + $value = \@converted; + } + else { + $value = $$comps{$based}; + } + if ($self->{'sort_files'}) { + my @sorted = sort { $self->file_sorter($a, $b) } @$value; + $value = \@sorted; + } + } + } + } + elsif ($cmd eq 'component_name') { + ## If there is more than one name, then we will need + ## to deal with that at a later time. + foreach my $name (keys %$names) { + $value = $name; + } + } + + return $value; +} + + +sub get_command_subs { + my $self = shift; + my %valid; + + ## Add the built-in OS compatibility commands + if (UNIVERSAL::isa($self, 'WinProjectBase') || + $self->use_win_compatibility_commands()) { + $valid{'cat'} = 'type'; + $valid{'cmp'} = 'fc'; + $valid{'cp'} = 'copy /y'; + $valid{'mkdir'} = 'mkdir'; + $valid{'mv'} = 'move /y'; + $valid{'os'} = 'win32'; + $valid{'rm'} = 'del /f/s/q'; + $valid{'rmdir'} = 'rmdir /s/q'; + $valid{'nul'} = 'nul'; + $valid{'slash'} = '\\'; + $valid{'bat'} = '.bat'; + $valid{'cmd'} = '.cmd'; + $valid{'exe'} = '.exe'; + } + else { + $valid{'cat'} = 'cat'; + $valid{'cmp'} = 'cmp'; + $valid{'cp'} = 'cp -f'; + $valid{'mkdir'} = 'mkdir -p'; + $valid{'mv'} = 'mv -f'; + $valid{'os'} = 'unix'; + $valid{'rm'} = 'rm -rf'; + $valid{'rmdir'} = 'rm -rf'; + $valid{'nul'} = '/dev/null'; + $valid{'slash'} = '/'; + $valid{'bat'} = ''; + $valid{'cmd'} = ''; + $valid{'exe'} = ''; + } + + ## Add the project specific compatibility commands + $valid{'gt'} = $self->get_gt_symbol(); + $valid{'lt'} = $self->get_lt_symbol(); + $valid{'and'} = $self->get_and_symbol(); + $valid{'or'} = $self->get_or_symbol(); + $valid{'quote'} = $self->get_quote_symbol(); + $valid{'equote'} = $self->get_escaped_quote_symbol(); + $valid{'crlf'} = $self->crlf(); + $valid{'cmdsep'} = $self->get_cmdsep_symbol(); + $valid{'temporary'} = 'temp.$$$$.' . int(rand(0xffffffff)); + $valid{'prj_type'} = $self->{'pctype'}; + + return \%valid; +} + + +sub replace_parameters { + my($self, $str, $valid, $nowarn, $input, $output, $always_clear) = @_; + + my %saved; + my $count = 0; + while ($str =~ /<%(\w+)(\(\w+\))?%>/) { + my $name = $1; + my $modifier = $2; + if (defined $modifier) { + my $tmp = $name; + $name = $modifier; + $name =~ s/[\(\)]//g; + $modifier = $tmp; + } + + ## Support both pseudo variables and project settings + if (defined $$valid{$name} || $self->is_keyword($name)) { + ## If the pseudo variable is defined or the project setting has a + ## value, then we'll need to do the replacement. However, if it's + ## a project keyword and it's not defined, we will need to delay + ## the replacement until later (unless $always_clear is true). + my $replace; + my $clear = $always_clear; + if (defined $$valid{$name}) { + $replace = $$valid{$name}; + } + elsif ($self->is_keyword($name)) { + $replace = $self->get_assignment($name); + } + + ## Perform the modification and replacement here + if (defined $replace) { + if (defined $modifier) { + if ($modifier eq 'noextension') { + $replace =~ s/\.[^\.]+$//; + } + else { + $self->warning("Unknown parameter modifier $modifier."); + } + } + $str =~ s/<%\w+(\(\w+\))?%>/$replace/; + } + elsif ($clear) { + ## We need to clear out this variable usage. + $str =~ s/<%\w+(\(\w+\))?%>//; + } + else { + ## Save this variable usage to be put back after we're done + ## processing the string. + my $key = "\1" . $count++ . "\1"; + if ($str =~ s/(<%\w+(\(\w+\))?%>)/$key/) { + $saved{$key} = $1; + } + } + } + else { + $str =~ s/<%\w+(\(\w+\))?%>//; + + ## We only want to warn the user that we did not recognize the + ## pseudo template parameter if there was an input and an output + ## file passed to this function. If this variable was used + ## without the parenthesis (as in an if statement), then we don't + ## want to warn the user. + if (defined $input && defined $output) { + if (!defined $$nowarn{$name}) { + $self->warning("<%$name%> was not recognized."); + } + + ## If we didn't recognize the pseudo template parameter then + ## we don't want to return anything back. + return undef; + } + } + } + + ## Replace the saved variables so that they may be replaced (or + ## removed) later on. + foreach my $key (keys %saved) { + $str =~ s/$key/$saved{$key}/; + } + return $str; +} + + +sub convert_command_parameters { + my($self, $ktype, $str, $input, $output) = @_; + my %nowarn; + my %valid = %{$self->{'command_subs'}}; + + ## Add in the values that change for every call to this function + $valid{'temporary'} = 'temp.$$$$.' . int(rand(0xffffffff)); + + if (defined $input) { + $valid{'input'} = $input; + $valid{'input_basename'} = $self->mpc_basename($input); + $valid{'input_dirname'} = $self->mpc_dirname($input); + $valid{'input_noext'} = $input; + + ## An input file doesn't always have an extension. If there isn't + ## one, then we need to set the 'input_ext' field to an empty string + ## ($1 will not necessarily have a valid value). + if ($valid{'input_noext'} =~ s/(\.[^\.]+)$//) { + $valid{'input_ext'} = $1; + } + else { + $valid{'input_ext'} = ''; + } + + ## Check for the gendir setting associated with this input file. We + ## have to check at so many levels so we don't inadvertantly create + ## intermediate hash tables. + if (defined $self->{'flag_overrides'}->{$ktype} && + defined $self->{'flag_overrides'}->{$ktype}->{$input} && + $self->{'flag_overrides'}->{$ktype}->{$input}->{'gendir'}) { + $valid{'gendir'} = $self->{'flag_overrides'}->{$ktype}->{$input}->{'gendir'}; + } + } + + ## If there is no gendir setting, just set it to the current directory. + $valid{'gendir'} = '.' if (!defined $valid{'gendir'}); + + if (defined $output) { + my $first = 1; + $valid{'output'} = "@$output"; + foreach my $out (@$output) { + ## An output file doesn't always have an extension. If there isn't + ## one, then we need to set the 'output_ext' field to an empty + ## string ($1 will not necessarily have a valid value). + my $noext = $out; + if ($noext =~ s/(\.[^\.]+)$//) { + $valid{'output_ext'} = $1; + } + else { + $valid{'output_ext'} = ''; + } + $valid{'output_noext'} .= (!$first ? ' ' : '') . $noext; + + ## In order to call basename or dirname, we must make sure that the + ## directory separators are forward slashes. + my $file = $out; + $file =~ s/\\/\//g if ($self->{'convert_slashes'}); + $valid{'output_basename'} .= (!$first ? ' ' : '') . + $self->mpc_basename($file); + $valid{'output_dirname'} .= (!$first ? ' ' : '') . + $self->mpc_dirname($file); + $first = 0; + } + } + + ## Add in the specific types of output files + if (defined $output) { + foreach my $type (keys %{$self->{'valid_components'}}) { + my $key = $type; + $key =~ s/s$//gi; + $nowarn{$key} = 1; + $nowarn{$key . '_noext'} = 1; + foreach my $ext (@{$self->{'valid_components'}->{$type}}) { + foreach my $out (@$output) { + if ($out =~ /$ext$/) { + $valid{$key} = $out; + $valid{$key . '_noext'} = $out; + $valid{$key . '_noext'} =~ s/$ext$//; + last; + } + } + } + } + } + + return $self->replace_parameters($str, \%valid, \%nowarn, $input, $output, 1); +} + + +sub get_custom_value { + my $self = shift; + my $cmd = shift; + my $based = shift; + my @params = @_; + my $value; + + if ($cmd eq 'input_files') { + ## Get the component list for the component type + my @array = $self->get_component_list($based); + + ## Check for directories in the component list. If the component + ## type is not automatic, we may have directories here and will need + ## to get the file list for that type. + my $once; + for(my $i = 0; $i < scalar(@array); ++$i) { + if (-d $array[$i]) { + if (!defined $once) { + $once = {'recurse' => $self->get_assignment('recurse'), + 'pchh' => $self->get_assignment('pch_header'), + 'pchc' => $self->get_assignment('pch_source'), + }; + } + my @built; + $self->sift_default_file_list($based, $array[$i], \@built, + $self->{'valid_components'}->{$based}, + $$once{'recurse'}, + $$once{'pchh'}, $$once{'pchc'}); + splice(@array, $i, 1, @built); + $i += $#built; + } + } + + $value = \@array; + + $self->{'custom_output_files'} = {}; + my %vcomps; + foreach my $vc (keys %{$self->{'valid_components'}}) { + my @comps = $self->get_component_list($vc); + $vcomps{$vc} = \@comps; + } + $vcomps{$generic_key} = []; + + foreach my $input (@array) { + my @outputs; + my $ainput = $input; + my $cinput = $input; + + ## Remove the extension + $cinput =~ s/\.[^\.]+$//; + + ## If we are converting slashes, + ## change them back for this parameter + $ainput =~ s/\\/\//g if ($self->{'convert_slashes'}); + + ## Add all of the output files. We can not add $generic_key to the + ## list here (as it used to be). It may have been handled by + ## generated_filenames. + foreach my $vc (keys %{$self->{'valid_components'}}) { + ## The output of multiple components could be input for the + ## current component type ($based). We need to avoid adding + ## duplicates here. + foreach my $file ($self->check_custom_output( + $based, $cinput, $ainput, $vc, $vcomps{$vc})) { + push(@outputs, $file) if (!StringProcessor::fgrep($file, \@outputs)); + } + } + foreach my $file ($self->check_custom_output($based, $cinput, + $ainput, $generic_key, + $vcomps{$generic_key})) { + push(@outputs, $file) if (!StringProcessor::fgrep($file, \@outputs)); + } + + ## Add specially listed files avoiding duplicates. We don't want + ## to add these files if gendir is set to something besides . + if (defined $self->{'custom_special_output'}->{$based} && + defined $self->{'custom_special_output'}->{$based}->{$ainput} && + (!defined $self->{'flag_overrides'}->{$based} || + !defined $self->{'flag_overrides'}->{$based}->{$ainput} || + !defined $self->{'flag_overrides'}->{$based}->{$ainput}->{'gendir'} || + $self->{'flag_overrides'}->{$based}->{$ainput}->{'gendir'} eq '.')) { + foreach my $file (@{$self->{'custom_special_output'}->{$based}->{$ainput}}) { + push(@outputs, $file) if (!StringProcessor::fgrep($file, \@outputs)); + } + } + + if ($self->{'convert_slashes'}) { + foreach my $output (@outputs) { + $output =~ s/\//\\/g; + } + } + if ($self->{'sort_files'}) { + @outputs = sort { $self->file_sorter($a, $b) } @outputs; + } + $self->{'custom_output_files'}->{$input} = \@outputs; + } + } + elsif ($cmd eq 'output_files') { + # Generate output files based on $based + if (defined $self->{'custom_output_files'}) { + $value = $self->{'custom_output_files'}->{$based}; + } + } + elsif ($cmd eq 'source_output_files') { + # Generate source output files based on $based + if (defined $self->{'custom_output_files'}) { + $value = []; + foreach my $file (@{$self->{'custom_output_files'}->{$based}}) { + foreach my $ext (@{$self->{'valid_components'}->{'source_files'}}) { + if ($file =~ /$ext$/) { + ## We've found a file that matches one of the source file + ## extensions. Now we have to make sure that it doesn't + ## match a template file extension. + my $matched = 0; + foreach my $text (@{$self->{'valid_components'}->{'template_files'}}) { + if ($file =~ /$text$/) { + $matched = 1; + last; + } + } + push(@$value, $file) if (!$matched); + last; + } + } + } + } + } + elsif ($cmd eq 'non_source_output_files') { + # Generate non source output files based on $based + if (defined $self->{'custom_output_files'}) { + $value = []; + foreach my $file (@{$self->{'custom_output_files'}->{$based}}) { + my $source = 0; + foreach my $ext (@{$self->{'valid_components'}->{'source_files'}}) { + if ($file =~ /$ext$/) { + $source = 1; + ## We've found a file that matches one of the source file + ## extensions. Now we have to make sure that it doesn't + ## match a template file extension. + foreach my $text (@{$self->{'valid_components'}->{'template_files'}}) { + if ($file =~ /$text$/) { + $source = 0; + last; + } + } + last if ($source); + } + } + push(@$value, $file) if (!$source); + } + } + } + elsif ($cmd eq 'inputexts') { + my @array = @{$self->{'valid_components'}->{$based}}; + foreach my $val (@array) { + $val =~ s/\\\.//g; + } + $value = \@array; + } + elsif ($cmd eq 'dependencies') { + ## If we are converting slashes, change them back for this parameter + $based =~ s/\\/\//g if ($self->{'convert_slashes'}); + $value = $self->{'custom_special_depend'}->{$based}; + } + elsif (defined $customDefined{$cmd}) { + $value = $self->get_assignment($cmd, + $self->{'generated_exts'}->{$based}); + if (defined $value && ($customDefined{$cmd} & 0x14) != 0) { + $value = $self->convert_command_parameters($based, $value, @params); + } + } + + return $value; +} + + +sub check_features { + my($self, $requires, $avoids, $info) = @_; + my $status = 1; + my $why; + + if (defined $requires) { + foreach my $require (split(/\s+/, $requires)) { + my $fval = $self->{'feature_parser'}->get_value($require); + + ## By default, if the feature is not listed, then it is enabled. + if (defined $fval && !$fval) { + $why = "requires $require"; + $status = 0; + last; + } + + ## For automakes sake, if we're to this point the feature is + ## enabled and we will set it in the feature parser explicitly + if (!defined $fval) { + $self->{'feature_parser'}->parse_line(undef, "$require = 1"); + } + } + } + + ## If it passes the requires, then check the avoids + if ($status) { + if (defined $avoids) { + foreach my $avoid (split(/\s+/, $avoids)) { + my $fval = $self->{'feature_parser'}->get_value($avoid); + + ## By default, if the feature is not listed, then it is enabled. + if (!defined $fval || $fval) { + $why = "avoids $avoid"; + $status = 0; + last; + } + } + } + } + + if ($info && !$status) { + $self->details("Skipping " . $self->get_assignment('project_name') . + " ($self->{'current_input'}), it $why."); + } + + return $status; +} + + +sub need_to_write_project { + my $self = shift; + my $count = 0; + + ## We always write a project if the user has provided a verbatim. + ## We have no idea what that verbatim clause does, so we need to just + ## do what the user tells us to do. + return 1 if (defined $self->{'verbatim'}->{$self->{'pctype'}}); + + ## The order here is important, we must check for source or resource + ## files first and then for custom input files. + foreach my $key ('source_files', $self->get_resource_tag(), + keys %{$self->{'generated_exts'}}) { + my $names = $self->{$key}; + foreach my $name (keys %$names) { + foreach my $key (keys %{$names->{$name}}) { + ## See if the project contains a file that corresponds to this + ## component name. + if (defined $names->{$name}->{$key}->[0]) { + if ($count >= 2) { + ## Return 2 if we have found a custom input file (and thus no + ## source or resource files due to the foreach order). + return 2; + } + ## We have either source files or resource files, we need to + ## see if this project creator supports the current language. + ## If it doesn't then we don't need to create the project. + elsif ($self->languageSupported()) { + ## Return 1 if we have found a source file or a resource file. + return 1; + } + } + } + } + $count++; + } + + ## Indicate that there is no need to write the project + return 0; +} + + +sub write_output_file { + my($self, $webapp) = @_; + my $status = 0; + my $error; + my $tover = $self->get_template_override(); + my @templates = $self->get_template(); + + ## The template override will override all templates + @templates = ($tover) if (defined $tover); + + foreach my $template (@templates) { + ## Save the template name for use as a key for various function calls + $self->{'current_template'} = $template; + + ## Create the output file name based on the project name and the + ## template that we're currently using. + my $name = $self->transform_file_name( + $self->project_file_name(undef, + $self->{'current_template'})); + + ## If the template files does not end in the template extension + ## then we will add it on. + if ($template !~ /$TemplateExtension$/) { + $template .= '.' . $TemplateExtension; + } + + ## If the template file does not contain a path, then we + ## will search through the include paths for it. + my $tfile; + if ($template =~ /[\/\\]/i) { + $tfile = $template; + } + else { + $tfile = $self->search_include_path($template); + } + + if (defined $tfile) { + ## Read in the template values for the specific target and project + ## type. The template input file we get may depend upon the + ## current template that we're using. + ($status, $error) = $self->read_template_input( + $self->{'current_template'}); + last if (!$status); + + my $tp = new TemplateParser($self); + + ## Set the project_file assignment for the template parser + $self->process_assignment('project_file', $name); + + ($status, $error) = $tp->parse_file($tfile); + last if (!$status); + + if (defined $self->{'source_callback'}) { + my $cb = $self->{'source_callback'}; + my $pjname = $self->get_assignment('project_name'); + my @list = $self->get_component_list('source_files'); + if (UNIVERSAL::isa($cb, 'ARRAY')) { + my @copy = @$cb; + my $s = shift(@copy); + &$s(@copy, $name, $pjname, \@list); + } + elsif (UNIVERSAL::isa($cb, 'CODE')) { + &$cb($name, $pjname, \@list); + } + else { + $self->warning("Ignoring callback: $cb."); + } + } + + if ($self->get_toplevel()) { + my $outdir = $self->get_outdir(); + my $oname = $name; + + $name = "$outdir/$name"; + + my $fh = new FileHandle(); + my $dir = $self->mpc_dirname($name); + + mkpath($dir, 0, 0777) if ($dir ne '.'); + + if ($webapp) { + ## At this point in time, webapps do not get a project file, + ## but they do appear in the workspace + } + elsif ($self->compare_output()) { + ## First write the output to a temporary file + my $tmp = "$outdir/MPC$>.$$"; + my $different = 1; + if (open($fh, ">$tmp")) { + my $lines = $tp->get_lines(); + foreach my $line (@$lines) { + print $fh $line; + } + close($fh); + + $different = 0 if (!$self->files_are_different($name, $tmp)); + } + else { + $error = "Unable to open $tmp for output."; + $status = 0; + last; + } + + ## If they are different, then rename the temporary file + if ($different) { + unlink($name); + if (rename($tmp, $name)) { + $self->post_file_creation($name); + } + else { + $error = "Unable to open $name for output."; + $status = 0; + last; + } + } + else { + ## We will pretend that we wrote the file + unlink($tmp); + } + } + else { + if (open($fh, ">$name")) { + my $lines = $tp->get_lines(); + foreach my $line (@$lines) { + print $fh $line; + } + close($fh); + $self->post_file_creation($name); + } + else { + $error = "Unable to open $name for output."; + $status = 0; + last; + } + } + + ## There may be more than one template associated with this + ## project creator. If there is, we can only add one generated + ## file and we rely on the project creator to tell us which + ## template generates the file that we need to track. + $self->add_file_written($oname) + if ($self->file_visible($self->{'current_template'})); + } + } + else { + $error = "Unable to locate the template file: $template."; + $status = 0; + last; + } + } + return $status, $error; +} + + +sub write_install_file { + my $self = shift; + my $fh = new FileHandle(); + my $insfile = $self->transform_file_name( + $self->get_assignment('project_name')) . + '.ins'; + my $outdir = $self->get_outdir(); + + $insfile = "$outdir/$insfile"; + + unlink($insfile); + if (open($fh, ">$insfile")) { + foreach my $vc (keys %{$self->{'valid_components'}}) { + my $names = $self->{$vc}; + foreach my $name (keys %$names) { + foreach my $key (keys %{$$names{$name}}) { + my $array = $$names{$name}->{$key}; + if (defined $$array[0]) { + print $fh "$vc:\n"; + foreach my $file (@$array) { + print $fh "$file\n"; + } + print $fh "\n"; + } + } + } + } + if ($self->exe_target()) { + my $exeout = $self->get_assignment('exeout'); + print $fh "exe_output:\n", + (defined $exeout ? $self->relative($exeout) : ''), + ' ', $self->get_assignment('exename'), "\n"; + } + elsif ($self->lib_target()) { + my $shared = $self->get_assignment('sharedname'); + my $static = $self->get_assignment('staticname'); + my $dllout = $self->relative($self->get_assignment('dllout')); + my $libout = $self->relative($self->get_assignment('libout')); + + print $fh "lib_output:\n"; + + if (defined $shared && $shared ne '') { + print $fh (defined $dllout ? $dllout : $libout), " $shared\n"; + } + if ((defined $static && $static ne '') && + (defined $dllout || !defined $shared || + (defined $shared && $shared ne $static))) { + print $fh "$libout $static\n"; + } + } + + close($fh); + return 1, undef; + } + + return 0, 'Unable write to ' . $insfile; +} + + +sub write_project { + my $self = shift; + my $status = 2; + my $error; + my $progress = $self->get_progress_callback(); + + &$progress() if (defined $progress); + + if ($self->check_features($self->get_assignment('requires'), + $self->get_assignment('avoids'), + 1)) { + my $webapp = $self->get_assignment('webapp'); + my $ntwp = $self->need_to_write_project(); + if ($webapp || $ntwp) { + if ($webapp && !$self->webapp_supported()) { + $self->warning("Web Applications are not supported by this type."); + } + else { + ## A return value of 2 from need_to_write_project() indicates + ## that the only reason that we need to write the project is that + ## there are custom input files (i.e., no source or resource + ## files). + $self->process_assignment('custom_only', '1') if ($ntwp == 2); + + if ($self->get_assignment('custom_only')) { + $self->remove_non_custom_settings(); + } + + if ($self->{'escape_spaces'}) { + foreach my $name ('exename', 'sharedname', 'staticname', + 'exeout', 'dllout', 'libout') { + my $value = $self->get_assignment($name); + if (defined $value && $value =~ s/(\s)/\\$1/g) { + $self->process_assignment($name, $value); + } + } + foreach my $key (keys %{$self->{'valid_components'}}) { + my $names = $self->{$key}; + foreach my $name (keys %$names) { + foreach my $key (keys %{$$names{$name}}) { + foreach my $file (@{$$names{$name}->{$key}}) { + $file =~ s/(\s)/\\$1/g; + } + } + } + } + } + + ## We don't need to pass a file name here. write_output_file() + ## will determine the file name for itself. + ($status, $error) = $self->write_output_file($webapp); + + ## Write the .ins file if the user requested it and we were + ## successful. + if ($self->{'generate_ins'} && $status) { + ($status, $error) = $self->write_install_file(); + } + } + } + elsif ($self->warn_useless_project()) { + my $msg = $self->transform_file_name($self->project_file_name()) . + " has no useful targets."; + + if ($self->{'current_input'} eq '') { + $self->information($msg); + } + else { + $self->warning($msg); + } + } + } + + return $status, $error; +} + + +sub get_project_info { + return $_[0]->{'project_info'}; +} + + +sub get_lib_locations { + return $_[0]->{'lib_locations'}; +} + + +sub get_inheritance_tree { + return $_[0]->{'inheritance_tree'}; +} + + +sub set_component_extensions { + my $self = shift; + my $vc = $self->{'valid_components'}; + my $ec = $self->{'exclude_components'}; + + foreach my $key (keys %$vc) { + my $ov = $self->override_valid_component_extensions($key, + @{$$vc{$key}}); + $$vc{$key} = $ov if (defined $ov); + } + + foreach my $key (keys %$ec) { + my $ov = $self->override_exclude_component_extensions($key, + @{$$ec{$key}}); + $$ec{$key} = $ov if (defined $ov); + } +} + + +sub get_component_extensions { + my($self, $comp) = @_; + my @ext; + if (defined $self->{'valid_components'}->{$comp}) { + ## Build up an array of extensions. Since they are stored as regular + ## expressions, we need to remove the escaped period to provide the + ## minimal amount of text for each extension to provide maximum + ## flexibility within the project template. + foreach my $re (@{$self->{'valid_components'}->{$comp}}) { + push(@ext, $re); + $ext[$#ext] =~ s/\\\.//; + } + } + return @ext; +} + + +sub set_source_listing_callback { + my($self, $cb) = @_; + $self->{'source_callback'} = $cb; +} + + +sub reset_values { + my $self = shift; + + ## Only put data structures that need to be cleared + ## out when the mpc file is done being read, not at the + ## end of each project within the mpc file. Those go in + ## the closing curly brace section of parse_line(). + $self->{'project_info'} = []; + $self->{'lib_locations'} = {}; + $self->reset_generating_types(); +} + + +sub add_default_matching_assignments { + my $self = shift; + my $lang = $self->get_language(); + + foreach my $key (keys %{$language{$lang}->[0]}) { + push(@{$language{$lang}->[2]->{$key}}, @default_matching_assignments) + if (!StringProcessor::fgrep($default_matching_assignments[0], + $language{$lang}->[2]->{$key})); + } +} + + +sub reset_generating_types { + my $self = shift; + my $lang = $self->get_language(); + my %reset = ('valid_components' => $language{$lang}->[0], + 'custom_only_removed' => $language{$lang}->[0], + 'exclude_components' => $language{$lang}->[1], + 'matching_assignments' => $language{$lang}->[2], + 'generated_exts' => {}, + 'valid_names' => \%validNames, + ); + + foreach my $r (keys %reset) { + $self->{$r} = {}; + foreach my $key (keys %{$reset{$r}}) { + $self->{$r}->{$key} = $reset{$r}->{$key}; + } + } + + $self->{'custom_types'} = {}; + + ## Allow subclasses to override the default extensions + $self->set_component_extensions(); +} + + +sub get_template_input { + my $self = shift; + my $lang = $self->get_language(); + + ## This follows along the same logic as read_template_input() by + ## checking for exe target and then defaulting to a lib target + if ($self->exe_target()) { + if ($self->get_static() == 1) { + return $self->{'lib_exe_template_input'}->{$lang}->{$tikey}; + } + else { + return $self->{'dll_exe_template_input'}->{$lang}->{$tikey}; + } + } + + if ($self->get_static() == 1) { + return $self->{'lib_template_input'}->{$lang}->{$tikey}; + } + + return $self->{'dll_template_input'}->{$lang}->{$tikey}; +} + + +sub update_project_info { + my($self, $tparser, $append, $names, $sep) = @_; + my $value = ''; + $sep = '' if (!defined $sep); + + ## Append the values of all names into one string + my $ncount = scalar(@$names) - 1; + for(my $i = 0; $i <= $ncount; $i++) { + $value .= $self->translate_value( + $$names[$i], + $tparser->get_value_with_default($$names[$i])); + $value .= $sep if ($i != $ncount); + } + + ## There may be more than one template associated with this project + ## creator. If there is, we can only add one generated file and we + ## rely on the project creator to tell us which template generates the + ## file that we need to track. + if ($self->file_visible($self->{'current_template'})) { + ## If we already have an array, take the one off the top. Otherwise, + ## create a new one which will be added below. + my $arr = ($append && defined $self->{'project_info'}->[0] ? + pop(@{$self->{'project_info'}}) : []); + + ## Set up the hash table when we are starting a new project_info + $self->{'project_info_hash_table'} = {} if (!$append); + + ## If we haven't seen this value yet, put it on the array + if (!defined $self->{'project_info_hash_table'}->{"@$names $value"}) { + $self->{'project_info_hash_table'}->{"@$names $value"} = 1; + push(@$arr, $value); + } + + ## Always push the array back onto the project_info + push(@{$self->{'project_info'}}, $arr); + } + + return $value; +} + + +sub adjust_value { + my($self, $names, $value, $tp) = @_; + my $atemp = $self->get_addtemp(); + + ## Perform any additions, subtractions + ## or overrides for the template values. + foreach my $name (@$names) { + if (defined $name && defined $atemp->{lc($name)}) { + my $lname = lc($name); + my $base = $lname; + $base =~ s/.*:://; + + ## If the template variable is a complex name, then we need to make + ## sure that the mapped value belongs to the correct type based on + ## the base of the complex name. The $tp (TemplateParser) variable + ## will, in the majority of all calls to this method, be defined so + ## it is checked second to avoid checking it if the name isn't + ## complex. + if ($base =~ /(.+)\->/ && defined $tp) { + my $v = $tp->get_value($1); + if (defined $v) { + my $found = undef; + foreach my $val (@{$atemp->{$lname}}) { + if (defined $$val[3]) { + my $mapped = $self->{'valid_names'}->{$$val[3]}; + if (defined $mapped && UNIVERSAL::isa($mapped, 'ARRAY')) { + $found = 1 if ($v ne $$mapped[0]); + } + last; + } + } + next if ($found); + } + } + + my $replace = (defined $self->{'valid_names'}->{$base} && + ($self->{'valid_names'}->{$base} & 0x04) == 0); + foreach my $val (@{$atemp->{$lname}}) { + if ($replace && index($$val[1], '<%') >= 0) { + $$val[1] = $self->replace_parameters($$val[1], + $self->{'command_subs'}); + } + my $arr = $self->create_array($$val[1]); + if ($$val[0] > 0) { + if (!defined $value) { + $value = ''; + } + if (UNIVERSAL::isa($value, 'ARRAY')) { + ## Avoid adding duplicates. If the existing array contains + ## the value already, remove it from the newly created array. + for(my $i = 0; $i < scalar(@$value); $i++) { + if (StringProcessor::fgrep($$value[$i], $arr)) { + splice(@$value, $i, 1); + $i--; + } + } + + ## We need to make $value a new array reference ($arr) + ## to avoid modifying the array reference pointed to by $value + unshift(@$arr, @$value); + $value = $arr; + } + else { + $value .= " $$val[1]"; + } + } + elsif ($$val[0] < 0) { + if (defined $value) { + my $parts; + if (UNIVERSAL::isa($value, 'ARRAY')) { + $parts = $value; + } + else { + $parts = $self->create_array($value); + } + + $value = []; + foreach my $part (@$parts) { + if ($part ne '') { + push(@$value, $part) if (!StringProcessor::fgrep($part, $arr)); + } + } + } + } + else { + ## If the user set the variable to empty, then we need to + ## set the value to undef + $value = (defined $$arr[0] ? $arr : undef); + } + } + last; + } + } + + return $value; +} + + +sub get_verbatim { + my($self, $marker) = @_; + my $str; + my $thash = $self->{'verbatim'}->{$self->{'pctype'}}; + + if (defined $thash) { + if (defined $thash->{$marker}) { + my $crlf = $self->crlf(); + foreach my $line (@{$thash->{$marker}}) { + $str = '' if (!defined $str); + $str .= $self->process_special($line) . $crlf; + } + if (defined $str) { + $str .= $crlf; + $self->{'verbatim_accessed'}->{$self->{'pctype'}}->{$marker} = 1; + } + } + } + + return $str; +} + + +sub generate_recursive_input_list { + my($self, $dir, $exclude) = @_; + return $self->extension_recursive_input_list($dir, + $exclude, + $ProjectCreatorExtension); +} + + +sub get_modified_project_file_name { + my($self, $name, $ext) = @_; + my $nmod = $self->get_name_modifier(); + + ## We don't apply the name modifier to the project file + ## name if we have already applied it to the project name + ## since the project file name comes from the project name. + if (defined $nmod && !$self->get_apply_project()) { + $nmod =~ s/\*/$name/g; + $name = $nmod; + } + return "$name$ext"; +} + + +sub get_valid_names { + return $_[0]->{'valid_names'}; +} + + +sub get_feature_parser { + return $_[0]->{'feature_parser'}; +} + + +sub preserve_assignment_order { + my($self, $name) = @_; + my $mapped = $self->{'valid_names'}->{$name}; + + ## Only return the value stored in the valid_names hash map if it's + ## defined and it's not an array reference. The array reference is + ## a keyword mapping and all mapped keywords should have preserved + ## assignment order. + if (defined $mapped && !UNIVERSAL::isa($mapped, 'ARRAY')) { + return ($mapped & 1); + } + + return 1; +} + + +sub add_to_template_input_value { + my($self, $name) = @_; + my $mapped = $self->{'valid_names'}->{$name}; + + ## Only return the value stored in the valid_names hash map if it's + ## defined and it's not an array reference. The array reference is + ## a keyword mapping and no mapped keywords should be added to + ## template input variables. + if (defined $mapped && !UNIVERSAL::isa($mapped, 'ARRAY')) { + return ($mapped & 2); + } + + return 0; +} + + +sub dependency_combined_static_library { + #my $self = shift; + return defined $ENV{MPC_DEPENDENCY_COMBINED_STATIC_LIBRARY}; +} + + +sub translate_value { + my($self, $key, $val) = @_; + + if ($key eq 'after' && $val ne '') { + my $arr = $self->create_array($val); + $val = ''; + + if ($self->require_dependencies()) { + foreach my $entry (@$arr) { + if ($self->get_apply_project()) { + my $nmod = $self->get_name_modifier(); + if (defined $nmod) { + $nmod =~ s/\*/$entry/g; + $entry = $nmod; + } + } + $val .= '"' . ($self->dependency_is_filename() ? + $self->project_file_name($entry) : $entry) . '" '; + } + $val =~ s/\s+$//; + } + } + return $val; +} + + +sub requires_parameters { + #my $self = shift; + #my $name = shift; + return $custom{$_[1]}; +} + + +sub project_file_name { + my($self, $name, $template) = @_; + + ## Fill in the name if one wasn't provided + $name = $self->get_assignment('project_name') if (!defined $name); + + return $self->get_modified_project_file_name( + $self->project_file_prefix() . $name, + $self->project_file_extension()); +} + + +sub remove_non_custom_settings { + my $self = shift; + + ## Remove any files that may have automatically been added + ## to this project + foreach my $key (keys %{$self->{'custom_only_removed'}}) { + $self->{$key} = {}; + } + + ## Unset the exename, sharedname and staticname + $self->process_assignment('exename', undef); + $self->process_assignment('sharedname', undef); + $self->process_assignment('staticname', undef); +} + + +sub remove_wanted_extension { + my($self, $name, $array) = @_; + + foreach my $wanted (@$array) { + return $name if ($name =~ s/$wanted$//); + } + + ## If the user provided file does not match any of the + ## extensions specified by the custom definition, we need + ## to remove the extension or else this file will not be + ## added to the project. + $name =~ s/\.[^\.]+$//; + return $name; +} + + +sub resolve_alias { + if (index($_[1], 'install') >= 0) { + my $resolved = $_[1]; + if ($resolved =~ s/(.*::)install$/$1exeout/) { + } + elsif ($resolved eq 'install') { + $resolved = 'exeout'; + } + return $resolved; + } + return $_[1]; +} + + +sub create_feature_parser { + my($self, $features, $feature) = @_; + my $gfeature = $self->{'gfeature_file'}; + my $typefeaturef = (defined $gfeature ? + $self->mpc_dirname($gfeature) . '/' : '') . + $self->{'pctype'} . '.features'; + $typefeaturef = undef if (! -r $typefeaturef); + if (defined $feature && $feature !~ /[\/\\]/i) { + my $searched = $self->search_include_path($feature); + $feature = $searched if (defined $searched); + } + my $fp = new FeatureParser($features, + $gfeature, + $typefeaturef, + $feature); + + my $slo = $fp->get_value($static_libs_feature); + if (!defined $slo) { + my $sval = $self->get_static() || 0; + $fp->parse_line(undef, + $static_libs_feature . ' = ' . $sval); + } + + return $fp; +} + + +sub restore_state_helper { + my($self, $skey, $old, $new) = @_; + + if ($skey eq 'feature_file') { + if ($self->{'features_changed'} || + !(!defined $old && !defined $new || + (defined $old && defined $new && $old eq $new))) { + ## Create a new feature parser. This relies on the fact that + ## 'features' is restored first in restore_state(). + $self->{'feature_parser'} = $self->create_feature_parser( + $self->get_features(), $new); + $self->{'features_changed'} = undef; + } + } + elsif ($skey eq 'ti') { + my $lang = $self->get_language(); + my @keys = keys %$old; + @keys = keys %$new if (!defined $keys[0]); + foreach my $key (@keys) { + if (!defined $$old{$key} || !defined $$new{$key} || + $$old{$key} ne $$new{$key}) { + ## Clear out the template input reader that we're currently set + ## to use. + $self->{$key . '_template_input'}->{$lang}->{$tikey} = undef; + } + } + } + elsif ($skey eq 'features') { + ## If the user has changed the 'features' setting, then we need to + ## make sure that we create a new feature parser regardless of + ## whether or not the feature file has changed. + $self->{'features_changed'} = ("@$old" ne "@$new"); + } + elsif ($skey eq 'language') { + if ($old ne $new) { + $self->add_default_matching_assignments(); + } + } +} + + +sub get_initial_relative_values { + return $_[0]->{'expanded'}, 1; +} + +sub add_main_function { + my $langmain = shift; + + ## See if a language was supplied. + if ($langmain =~ /([^:]+):(.+)/) { + ## If the language supplied is not one that we know about, return an + ## error message. + return 'Invalid language: ' . $1 if (!defined $language{$1}); + + ## Otherwise, add it to the list for the language. + push(@{$mains{$1}}, $2); + } + else { + ## No language was supplied, so add the main to all of the languages + ## that we support. + foreach my $lang (keys %language) { + push(@{$mains{$lang}}, $langmain); + } + } + + ## Return no error message. + return undef; +} + +sub get_resource_tag { + my $self = shift; + my $lang = $self->get_language(); + + ## Not all entries in the %language map have a resource tag. + ## For this, we will just return the tag for C++ since it probably + ## doesn't really matter anyway. + return defined $language{$lang}->[5] ? $language{$lang}->[5] : $cppresource; +} + +# ************************************************************ +# Accessors used by support scripts +# ************************************************************ + +sub getKeywords { + return \%validNames; +} + +sub getValidComponents { + my $language = shift; + return (defined $language{$language} ? $language{$language}->[0] : undef); +} + +# ************************************************************ +# Virtual Methods To Be Overridden +# ************************************************************ + +sub languageSupported { + #my $self = shift; + return $_[0]->get_language() eq Creator::cplusplus; +} + +sub file_visible { + #my($self, $template) = @_; + return 1; +} + +sub webapp_supported { + #my $self = shift; + return 0; +} + + +sub use_win_compatibility_commands { + #my $self = shift; + return $ENV{MPC_USE_WIN_COMMANDS}; +} + + +sub post_file_creation { + #my $self = shift; + #my $file = shift; +} + + +sub escape_spaces { + #my $self = shift; + return 0; +} + + +sub validated_directory { + my($self, $dir) = @_; + return $dir; +} + +sub get_quote_symbol { + #my $self = shift; + return '"'; +} + +sub get_escaped_quote_symbol { + #my $self = shift; + return '\\\"'; +} + +sub get_gt_symbol { + #my $self = shift; + return '>'; +} + + +sub get_lt_symbol { + #my $self = shift; + return '<'; +} + + +sub get_and_symbol { + #my $self = shift; + return '&&'; +} + + +sub get_or_symbol { + #my $self = shift; + return '||'; +} + + +sub get_cmdsep_symbol { + #my $self = shift; + return ';'; +} + + +sub dollar_special { + #my $self = shift; + return 0; +} + + +sub expand_variables_from_template_values { + #my $self = shift; + return 1; +} + + +sub require_dependencies { + #my $self = shift; + return 1; +} + + +sub dependency_is_filename { + #my $self = shift; + return 1; +} + + +sub fill_value { + #my $self = shift; + #my $name = shift; + return undef; +} + + +sub project_file_prefix { + #my $self = shift; + return ''; +} + + +sub project_file_extension { + #my $self = shift; + return ''; +} + + +sub override_valid_component_extensions { + #my $self = shift; + #my $comp = shift; + return undef; +} + + +sub override_exclude_component_extensions { + #my $self = shift; + #my $comp = shift; + return undef; +} + + +sub get_dll_exe_template_input_file { + #my($self, $tkey) = @_; + return undef; +} + + +sub get_lib_exe_template_input_file { + my($self, $tkey) = @_; + return $self->get_dll_exe_template_input_file($tkey); +} + + +sub get_lib_template_input_file { + my($self, $tkey) = @_; + return $self->get_dll_template_input_file($tkey); +} + + +sub get_dll_template_input_file { + #my($self, $tkey) = @_; + return undef; +} + + +sub get_template { + return $_[0]->{'pctype'}; +} + +sub requires_forward_slashes { + return 0; +} + +sub warn_useless_project { + return 1; +} + +sub get_properties { + my $self = shift; + return {'static' => $self->get_static(), + $self->get_language() => 1}; +} + +1; diff --git a/ACE/MPC/modules/SLEProjectCreator.pm b/ACE/MPC/modules/SLEProjectCreator.pm new file mode 100644 index 00000000000..2a1508beb29 --- /dev/null +++ b/ACE/MPC/modules/SLEProjectCreator.pm @@ -0,0 +1,43 @@ +package SLEProjectCreator; + +# ************************************************************ +# Description : The SLE Project Creator +# Author : Johnny Willemsen +# Create Date : 3/23/2003 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use ProjectCreator; +use XMLProjectBase; + +use vars qw(@ISA); +@ISA = qw(XMLProjectBase ProjectCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub project_file_extension { + #my $self = shift; + return '.vpj'; +} + + +sub get_dll_exe_template_input_file { + #my $self = shift; + return 'sleexe'; +} + + +sub get_dll_template_input_file { + #my $self = shift; + return 'sledll'; +} + + +1; diff --git a/ACE/MPC/modules/SLEWorkspaceCreator.pm b/ACE/MPC/modules/SLEWorkspaceCreator.pm new file mode 100644 index 00000000000..52ee2691a0b --- /dev/null +++ b/ACE/MPC/modules/SLEWorkspaceCreator.pm @@ -0,0 +1,65 @@ +package SLEWorkspaceCreator; + +# ************************************************************ +# Description : The SLE Workspace Creator +# Author : Johnny Willemsen +# Create Date : 3/23/2004 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use SLEProjectCreator; +use WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(WorkspaceCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + + +sub compare_output { + #my $self = shift; + return 1; +} + + +sub workspace_file_extension { + #my $self = shift; + return '.vpw'; +} + + +sub pre_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + print $fh "<!DOCTYPE Workspace SYSTEM \"http://www.slickedit.com/dtd/vse/8.1/vpw.dtd\">$crlf" . + "<Workspace Version=\"8.1\" VendorName=\"SlickEdit\">$crlf"; +} + + +sub write_comps { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + print $fh "\t<Projects>$crlf"; + foreach my $project ($self->sort_dependencies($self->get_projects(), 0)) { + print $fh "\t\t<Project File=\"$project\"/>$crlf"; + } + print $fh "\t</Projects>$crlf"; +} + + +sub post_workspace { + my($self, $fh) = @_; + print $fh '</Workspace>' . $self->crlf(); +} + + +1; diff --git a/ACE/MPC/modules/StringProcessor.pm b/ACE/MPC/modules/StringProcessor.pm new file mode 100644 index 00000000000..fc08e97fd2b --- /dev/null +++ b/ACE/MPC/modules/StringProcessor.pm @@ -0,0 +1,133 @@ +package StringProcessor; + +# ************************************************************ +# Description : Perform various algorithms on strings +# Author : Chad Elliott +# Create Date : 3/07/2003 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub parse_assignment { + my($self, $line, $values) = @_; + + ## In MPC, a scope can have spaces in it. However, it can not end + ## in a space. + if ($line =~ /^((\w+[\s\w]+\w::)*\w+)\s*([\-+]?=)\s*(.*)?/) { + my $op = ($3 eq '+=' ? 1 : $3 eq '-=' ? -1 : 0); + push(@$values, $op, $self->resolve_alias(lc($1)), $4); + return 1; + } + + return 0; +} + + +sub extractType { + my($self, $name) = @_; + my $type = $name; + + if ($name =~ /(.*)(Project|Workspace)Creator/) { + $type = $1; + } + + return lc($type); +} + + +sub process_special { + my($self, $line) = @_; + + ## Replace all escaped double quotes and escaped backslashes + ## with special characters + my $escaped = ($line =~ s/\\\\/\01/g); + $escaped |= ($line =~ s/\\"/\02/g); + + ## Un-escape all other characters + $line =~ s/\\(.)/$1/g; + + ## Remove any non-escaped double quotes + $line =~ s/"//g; + + ## Put the escaped double quotes and backslashes back in + if ($escaped) { + $line =~ s/\02/"/g; + $line =~ s/\01/\\/g; + } + + return $line; +} + + +sub create_array { + my($self, $line) = @_; + my @array; + + ## Replace all escaped double and single quotes with special characters + my $escaped = ($line =~ s/\\\"/\01/g); + $escaped |= ($line =~ s/\\\'/\02/g); + $escaped |= ($line =~ s/\\ /\03/g); + $escaped |= ($line =~ s/\\\t/\04/g); + + foreach my $part (grep(!/^\s*$/, + split(/(\"[^\"]+\"|\'[^\']+\'|\s+)/, $line))) { + ## Remove enclosing double and single quotes + $part =~ s/^"(.*)"$/$1/; + $part =~ s/^'(.*)'$/$1/; + + ## Put any escaped double or single quotes back into the string. + if ($escaped) { + $part =~ s/\01/\"/g; + $part =~ s/\02/\'/g; + $part =~ s/\03/ /g; + $part =~ s/\04/\t/g; + } + + ## Push it onto the array + push(@array, $part); + } + + return \@array; +} + + +sub crlf { + #my $self = shift; + return "\n"; +} + + +sub windows_crlf { + ## Windows, OS/2 and cygwin require a carriage return and line feed. + ## However, at some point cygwin changed the way it does output and can + ## be controled through an environment variable. + return ($^O eq 'MSWin32' || $^O eq 'os2' || + ($^O eq 'cygwin' && + ($] < 5.008 || (defined $ENV{PERLIO} && $ENV{PERLIO} eq 'crlf'))) ? + "\n" : "\r\n"); +} + + +sub resolve_alias { + #my $self = shift; + #my $name = shift; + return $_[1]; +} + +sub fgrep { + my($str, $array) = @_; + foreach my $target (@$array) { + return 1 if ($str eq $target); + } + return undef; +} + +1; diff --git a/ACE/MPC/modules/TemplateInputReader.pm b/ACE/MPC/modules/TemplateInputReader.pm new file mode 100644 index 00000000000..c1fc7c455d4 --- /dev/null +++ b/ACE/MPC/modules/TemplateInputReader.pm @@ -0,0 +1,140 @@ +package TemplateInputReader; + +# ************************************************************ +# Description : Reads the template input and stores the values +# Author : Chad Elliott +# Create Date : 5/16/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use Parser; + +use vars qw(@ISA); +@ISA = qw(Parser); + +# ************************************************************ +# Data Section +# ************************************************************ + +my $mpt = 'mpt'; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + my($class, $inc) = @_; + my $self = Parser::new($class, $inc); + + ## Set up the internal data members + $self->{'values'} = {}; + $self->{'cindex'} = 0; + $self->{'current'} = [ $self->{'values'} ]; + $self->{'realnames'} = {}; + + return $self; +} + + +sub parse_line { + my($self, $ih, $line) = @_; + my $status = 1; + my $errorString; + my $current = $self->{'current'}; + + if ($line eq '') { + } + elsif ($line =~ /^([\w\s\(\)\.]+)\s*{$/) { + ## Entering a new scope, we need to save the real name so that it can + ## be accessed at a later time. + my $rname = $1; + $rname =~ s/\s+$//; + my $name = lc($rname); + $self->{'realnames'}->{$name} = $rname; + + ## Scopes are reentrant, so we only create a new map when we haven't + ## got one. + if (!defined $$current[$self->{'cindex'}]->{$name}) { + $$current[$self->{'cindex'}]->{$name} = {}; + } + + ## Keep track of the current scope + push(@$current, $$current[$self->{'cindex'}]->{$name}); + $self->{'cindex'}++; + } + elsif ($line =~ /^}$/) { + ## Maintain the scope and make sure there aren't any unmatched + ## braces. + if ($self->{'cindex'} > 0) { + pop(@$current); + $self->{'cindex'}--; + } + else { + $status = 0; + $errorString = 'Unmatched curly brace'; + } + } + elsif ($line =~ /^(\w+)\s*(\+=|=)\s*(.*)?/) { + ## Save the name, operation type and value. + my $name = lc($1); + my $op = $2; + my $value = $3; + + ## Turn the value into an array + if (defined $value) { + $value = $self->create_array($value); + } + else { + $value = []; + } + + ## Store the value + if ($op eq '+=' && defined $$current[$self->{'cindex'}]->{$name}) { + push(@{$$current[$self->{'cindex'}]->{$name}}, @$value); + } + else { + $$current[$self->{'cindex'}]->{$name} = $value; + } + } + elsif ($line =~ /^conditional_include\s+"([\w\s\-\+\/\\\.]+)"$/) { + ## Search for the include template file. If it does not exist, we + ## don't complain. It's likely that these sort of files won't exist. + my $file = $self->search_include_path("$1.$mpt"); + if (defined $file) { + ## Process the file making sure to restore the line number seting + ## when we get done. + my $ol = $self->get_line_number(); + ($status, $errorString) = $self->read_file($file); + $self->set_line_number($ol); + } + } + else { + $status = 0; + $errorString = "Unrecognized line: $line"; + } + + return $status, $errorString; +} + + +sub get_value { + ## All template names are case-insensitive. + my($self, $tag) = @_; + return $self->{'values'}->{lc($tag)}; +} + + +sub get_realname { + ## Sometimes, we need to get back to the name retaining the case so we + ## access the hash map containing them. + my($self, $tag) = @_; + return $self->{'realnames'}->{lc($tag)}; +} + + +1; diff --git a/ACE/MPC/modules/TemplateParser.pm b/ACE/MPC/modules/TemplateParser.pm new file mode 100644 index 00000000000..22dd49d5c69 --- /dev/null +++ b/ACE/MPC/modules/TemplateParser.pm @@ -0,0 +1,2050 @@ +package TemplateParser; + +# ************************************************************ +# Description : Parses the template and fills in missing values +# Author : Chad Elliott +# Create Date : 5/17/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use Parser; +use WinVersionTranslator; + +use vars qw(@ISA); +@ISA = qw(Parser); + +# ************************************************************ +# Data Section +# ************************************************************ + +# Valid keywords for use in template files. Each has a handle_ +# method available, but some have other methods too. +# Bit Meaning +# 0 means there is a get_ method available (used by if and nested functions) +# 1 means there is a perform_ method available (used by foreach and nested) +# 2 means there is a doif_ method available (used by if) +# 3 means that parameters to perform_ should not be evaluated +# +# Perl Function Parameter Type Return Type +# get_ string string or array +# perform_ array reference array +# doif_ array reference boolean +# +my %keywords = ('if' => 0, + 'else' => 0, + 'endif' => 0, + 'noextension' => 3, + 'dirname' => 7, + 'basename' => 0, + 'basenoextension' => 0, + 'foreach' => 0, + 'forfirst' => 0, + 'fornotfirst' => 0, + 'fornotlast' => 0, + 'forlast' => 0, + 'endfor' => 0, + 'eval' => 0, + 'comment' => 0, + 'marker' => 0, + 'uc' => 3, + 'lc' => 3, + 'ucw' => 0, + 'normalize' => 3, + 'flag_overrides' => 1, + 'reverse' => 3, + 'sort' => 3, + 'uniq' => 3, + 'multiple' => 5, + 'starts_with' => 5, + 'ends_with' => 5, + 'contains' => 5, + 'remove_from' => 0xf, + 'compares' => 5, + 'duplicate_index' => 5, + 'transdir' => 5, + 'has_extension' => 5, + 'keyname_used' => 0, + 'scope' => 0, + 'full_path' => 3, + 'extensions' => 0xa, + ); + +my %target_type_vars = ('type_is_static' => 1, + 'need_staticflags' => 1, + 'type_is_dynamic' => 1, + 'type_is_binary' => 1, + ); + +my %arrow_op_ref = ('custom_type' => 'custom types', + 'grouped_.*_file' => 'grouped files', + 'feature' => 'features', + ); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + my($class, $prjc) = @_; + my $self = $class->SUPER::new(); + + $self->{'prjc'} = $prjc; + $self->{'ti'} = $prjc->get_template_input(); + $self->{'cslashes'} = $prjc->convert_slashes(); + $self->{'crlf'} = $prjc->crlf(); + $self->{'cmds'} = $prjc->get_command_subs(); + $self->{'vnames'} = $prjc->get_valid_names(); + $self->{'values'} = {}; + $self->{'defaults'} = {}; + $self->{'lines'} = []; + $self->{'built'} = ''; + $self->{'sstack'} = []; + $self->{'lstack'} = []; + $self->{'if_skip'} = 0; + $self->{'eval'} = 0; + $self->{'eval_str'} = ''; + $self->{'dupfiles'} = {}; + $self->{'override_target_type'} = undef; + $self->{'keyname_used'} = {}; + $self->{'scopes'} = {}; + + $self->{'foreach'} = {}; + $self->{'foreach'}->{'count'} = -1; + $self->{'foreach'}->{'nested'} = 0; + $self->{'foreach'}->{'name'} = []; + $self->{'foreach'}->{'vars'} = []; + $self->{'foreach'}->{'text'} = []; + $self->{'foreach'}->{'scope'} = []; + $self->{'foreach'}->{'scope_name'} = []; + $self->{'foreach'}->{'temp_scope'} = []; + $self->{'foreach'}->{'processing'} = 0; + + return $self; +} + + +sub tp_basename { + my($self, $file) = @_; + + if ($self->{'cslashes'}) { + $file =~ s/.*[\/\\]//; + } + else { + $file =~ s/.*\///; + } + return $file; +} + + +sub validated_dirname { + my($self, $file) = @_; + my $index = rindex($file, ($self->{'cslashes'} ? '\\' : '/')); + + if ($index >= 0) { + return $self->{'prjc'}->validated_directory(substr($file, 0, $index)); + } + else { + return '.'; + } +} + + +sub tp_dirname { + my($self, $file) = @_; + my $index = rindex($file, ($self->{'cslashes'} ? '\\' : '/')); + + if ($index >= 0) { + return substr($file, 0, $index); + } + else { + return '.'; + } +} + + +sub strip_line { + #my $self = shift; + #my $line = shift; + + ## Override strip_line() from Parser. + ## We need to preserve leading space and + ## there is no comment string in templates. + ++$_[0]->{'line_number'}; + $_[1] =~ s/\s+$//; + + return $_[1]; +} + + +## Append the current value to the line that is being +## built. This line may be a foreach line or a general +## line without a foreach. +sub append_current { + my $value = $_[1]; + my $scope = $_[0]->{'scopes'}; + while(defined $$scope{'scope'}) { + $scope = $$scope{'scope'}; + if (defined $$scope{'escape'}) { + if ($$scope{'escape'}->[1] < 0 && $_[0]->{'foreach'}->{'count'} >= 0) { + ## This scope was created outside of a foreach. If we are + ## processing a foreach, we need to skip this at this point as it + ## will be handled once the foreach has been completed and is + ## appended to the main project body. + last; + } + else { + my $key = $$scope{'escape'}->[0]; + if ($key eq '\\') { + $value =~ s/\\/\\\\/g; + } + else { + $value =~ s/($key)/\\$1/g; + } + } + } + else { + foreach my $key (keys %$scope) { + $_[0]->warning("Unrecognized scope function: $key."); + } + } + } + + + if ($_[0]->{'foreach'}->{'count'} >= 0) { + $_[0]->{'foreach'}->{'text'}->[$_[0]->{'foreach'}->{'count'}] .= $value; + } + elsif ($_[0]->{'eval'}) { + $_[0]->{'eval_str'} .= $value; + } + else { + $_[0]->{'built'} .= $value; + } +} + + +sub split_parameters { + my($self, $str) = @_; + my @params; + + while($str =~ /^(\w+\([^\)]+\))\s*,\s*(.*)/) { + push(@params, $1); + $str = $2; + } + while($str =~ /^([^,]+)\s*,\s*(.*)/) { + push(@params, $1); + $str = $2; + } + + ## Return the parameters (which includes whatever is left in the + ## string). Just return it instead of pushing it onto @params. + return @params, $str; +} + + +sub set_current_values { + my($self, $name) = @_; + my $set = 0; + + ## If any value within a foreach matches the name + ## of a hash table within the template input we will + ## set the values of that hash table in the current scope + if (defined $self->{'ti'}) { + my $counter = $self->{'foreach'}->{'count'}; + if ($counter >= 0) { + ## Variable names are case-insensitive in MPC, however this can + ## cause problems when dealing with template variable values that + ## happen to match HASH names only by case-insensitivity. So, we + ## now make HASH names match with case-sensitivity. + my $value = $self->{'ti'}->get_value($name); + if (defined $value && UNIVERSAL::isa($value, 'HASH') && + $self->{'ti'}->get_realname($name) eq $name) { + $self->{'foreach'}->{'scope_name'}->[$counter] = $name; + my %copy; + foreach my $key (keys %$value) { + $copy{$key} = $self->{'prjc'}->adjust_value( + [$name . '::' . $key, $name], $$value{$key}, $self); + } + $self->{'foreach'}->{'temp_scope'}->[$counter] = \%copy; + $set = 1; + } + else { + ## Since we're not creating a temporary scope for this level, we + ## need to empty out the scope that may have been held here from + ## a previous foreach. + $self->{'foreach'}->{'temp_scope'}->[$counter] = {}; + } + } + } + return $set; +} + + +sub get_value { + my($self, $name) = @_; + my $value; + my $counter = $self->{'foreach'}->{'count'}; + my $fromprj; + my $scope; + my $sname; + my $adjust = 1; + + ## $name should always be all lower-case + $name = lc($name); + + ## First, check the temporary scope (set inside a foreach) + if ($counter >= 0) { + ## Find the outer most scope for our variable name + for(my $index = $counter; $index >= 0; --$index) { + if (defined $self->{'foreach'}->{'scope_name'}->[$index]) { + $scope = $self->{'foreach'}->{'scope_name'}->[$index]; + $sname = $scope . '::' . $name; + last; + } + } + while(!defined $value && $counter >= 0) { + $value = $self->{'foreach'}->{'temp_scope'}->[$counter]->{$name}; + --$counter; + } + $counter = $self->{'foreach'}->{'count'}; + + if ($self->{'override_target_type'} && + defined $value && defined $target_type_vars{$name}) { + $value = $self->{'values'}->{$name}; + } + } + + if (!defined $value) { + if ($name =~ /^flag_overrides\((.*)\)$/) { + $value = $self->get_flag_overrides($1); + } + + if (!defined $value) { + ## Next, check for a template value + if (defined $self->{'ti'}) { + $value = $self->{'ti'}->get_value($name); + } + + if (!defined $value) { + ## Calling adjust_value here allows us to pick up template + ## overrides before getting values elsewhere. + my $uvalue = $self->{'prjc'}->adjust_value([$sname, $name], + [], $self); + if (defined $$uvalue[0]) { + $value = $uvalue; + $adjust = 0; + $fromprj = 1; + } + + if (!defined $value) { + ## Next, check the inner to outer foreach + ## scopes for overriding values + while(!defined $value && $counter >= 0) { + $value = $self->{'foreach'}->{'scope'}->[$counter]->{$name}; + --$counter; + } + + ## Then get the value from the project creator + if (!defined $value) { + $fromprj = 1; + $value = $self->{'prjc'}->get_assignment($name); + + ## Then get it from our known values + if (!defined $value) { + $value = $self->{'values'}->{$name}; + if (!defined $value) { + ## Call back onto the project creator to allow + ## it to fill in the value before defaulting to undef. + $value = $self->{'prjc'}->fill_value($name); + if (!defined $value && $name =~ /^(.*)\->(\w+)/) { + my $pre = $1; + my $post = $2; + my $base = $self->get_value($pre); + + if (defined $base) { + $value = $self->{'prjc'}->get_special_value( + $pre, $post, $base, + ($self->{'prjc'}->requires_parameters($post) ? + $self->prepare_parameters($pre) : undef)); + } + } + } + } + } + } + } + } + } + + ## Adjust the value even if we haven't obtained one from an outside + ## source. + if ($adjust && defined $value) { + $value = $self->{'prjc'}->adjust_value([$sname, $name], $value, $self); + } + + ## If the value did not come from the project creator, we + ## check the variable name. If it is a project keyword we then + ## check to see if we need to add the project value to the template + ## variable value. If so, we make a copy of the value array and + ## push the project value onto that (to avoid modifying the original). + if (!$fromprj && defined $self->{'vnames'}->{$name} && + $self->{'prjc'}->add_to_template_input_value($name)) { + my $pjval = $self->{'prjc'}->get_assignment($name); + if (defined $pjval) { + my @copy = @$value; + if (!UNIVERSAL::isa($pjval, 'ARRAY')) { + $pjval = $self->create_array($pjval); + } + push(@copy, @$pjval); + $value = \@copy; + } + } + + return $self->{'prjc'}->relative($value, undef, $scope); +} + + +sub get_value_with_default { + my $self = shift; + my $name = lc(shift); + my $value = $self->get_value($name); + + if (!defined $value) { + $value = $self->{'defaults'}->{$name}; + if (defined $value) { + my $counter = $self->{'foreach'}->{'count'}; + my $sname; + + if ($counter >= 0) { + ## Find the outer most scope for our variable name + for(my $index = $counter; $index >= 0; --$index) { + if (defined $self->{'foreach'}->{'scope_name'}->[$index]) { + $sname = $self->{'foreach'}->{'scope_name'}->[$index] . + '::' . $name; + last; + } + } + } + $value = $self->{'prjc'}->relative( + $self->{'prjc'}->adjust_value( + [$sname, $name], $value, $self)); + + ## If the user set the variable to empty, we will go ahead and use + ## the default value (since we know we have one at this point). + $value = $self->{'defaults'}->{$name} if (!defined $value); + } + else { + #$self->warning("$name defaulting to empty string."); + $value = ''; + } + } + + return (UNIVERSAL::isa($value, 'ARRAY') ? "@$value" : $value); +} + + +sub process_foreach { + my $self = shift; + my $index = $self->{'foreach'}->{'count'}; + my $text = $self->{'foreach'}->{'text'}->[$index]; + my @values; + my $name = $self->{'foreach'}->{'name'}->[$index]; + my @cmds; + my $val = $self->{'foreach'}->{'vars'}->[$index]; + my $check_for_mixed; + + if ($val =~ /^((\w+),\s*)?flag_overrides\((.*)\)$/) { + ## If the user did not provide a name we have to pick one otherwise + ## there would be no way to access the foreach values. + $name = (defined $2 ? $2 : '__unnamed__'); + + ## Now check to see if there were overrides for this value. If there + ## were, convert them into an array (if necessary) and continue + ## processing. + $val = $self->get_flag_overrides($3); + if (defined $val) { + $val = $self->create_array($val) if (!UNIVERSAL::isa($val, 'ARRAY')); + @values = @$val; + } + } + else { + ## Pull out modifying commands first + while ($val =~ /(\w+)\((.+)\)/) { + my $cmd = $1; + $val = $2; + if (($keywords{$cmd} & 0x02) != 0) { + push(@cmds, 'perform_' . $cmd); + if (($keywords{$cmd} & 0x08) != 0) { + my @params = $self->split_parameters($val); + $val = \@params; + last; + } + } + else { + $self->warning("Unable to use $cmd in foreach (no perform_ method)."); + } + } + + ## Get the values for all of the variable names + ## contained within the foreach + if (UNIVERSAL::isa($val, 'ARRAY')) { + @values = @$val; + } + else { + my $names = $self->create_array($val); + foreach my $n (@$names) { + my $vals = $self->get_value($n); + if (defined $vals && $vals ne '') { + if (!UNIVERSAL::isa($vals, 'ARRAY')) { + $vals = $self->create_array($vals); + } + push(@values, @$vals); + } + if (!defined $name) { + $name = $n; + $name =~ s/s$//; + } + ## We only want to check for the mixing of scalar and hash + ## variables if the variable name is not a keyword (or the + ## special 'features' template variable). + if (!$check_for_mixed && + !$self->{'prjc'}->is_keyword($n) && $n ne 'features') { + $check_for_mixed = 1; + } + } + } + } + + ## Perform the commands on the built up @values + foreach my $cmd (reverse @cmds) { + @values = $self->$cmd(\@values); + } + + ## Reset the text (it will be regenerated by calling parse_line + $self->{'foreach'}->{'text'}->[$index] = ''; + + if (defined $values[0]) { + my $scope = $self->{'foreach'}->{'scope'}->[$index]; + my $base = $self->{'foreach'}->{'base'}->[$index]; + + $$scope{'forlast'} = ''; + $$scope{'fornotlast'} = 1; + $$scope{'forfirst'} = 1; + $$scope{'fornotfirst'} = ''; + + ## If the foreach values are mixed (HASH and SCALAR), then + ## remove the SCALAR values. + if ($check_for_mixed) { + my %mixed; + my $mixed = 0; + foreach my $mval (@values) { + $mixed{$mval} = $self->set_current_values($mval); + $mixed |= $mixed{$mval}; + } + if ($mixed) { + my @nvalues; + foreach my $key (sort keys %mixed) { + push(@nvalues, $key) if ($mixed{$key}); + } + + ## Set the new values only if they are different + ## from the original (except for order). + my @sorted = sort(@values); + @values = @nvalues if (@sorted != @nvalues); + } + } + + for(my $i = 0; $i <= $#values; ++$i) { + my $value = $values[$i]; + + ## Set the corresponding values in the temporary scope + $self->set_current_values($value); + + ## Set the special values that only exist + ## within a foreach + if ($i != 0) { + $$scope{'forfirst'} = ''; + $$scope{'fornotfirst'} = 1; + } + if ($i == $#values) { + $$scope{'forlast'} = 1; + $$scope{'fornotlast'} = ''; + } + $$scope{'forcount'} = $i + $base; + + ## We don't use adjust_value here because these names + ## are generated from a foreach and should not be adjusted. + $$scope{$name} = $value; + + ## A tiny hack for VC7 + if ($name eq 'configuration' && + $self->get_value_with_default('platform') ne '') { + $self->{'prjc'}->update_project_info($self, 1, + ['configuration', 'platform'], + '|'); + } + + ## Now parse the line of text, each time + ## with different values + ++$self->{'foreach'}->{'processing'}; + my($status, $error) = $self->parse_line(undef, $text); + --$self->{'foreach'}->{'processing'}; + return $error if (defined $error); + } + } + + return undef; +} + + +sub generic_handle { + my($self, $func, $str) = @_; + + if (defined $str) { + my $val = $self->$func([$str]); + + if (defined $val) { + $self->append_current($val); + } + else { + $self->append_current(0); + } + } +} + + +sub handle_endif { + my($self, $name) = @_; + my $end = pop(@{$self->{'sstack'}}); + pop(@{$self->{'lstack'}}); + + if (!defined $end) { + return "Unmatched $name"; + } + else { + my $in = index($end, $name); + if ($in == 0) { + $self->{'if_skip'} = 0; + } + elsif ($in == -1) { + return "Unmatched $name"; + } + } + + return undef; +} + + +sub handle_endfor { + my($self, $name) = @_; + my $end = pop(@{$self->{'sstack'}}); + pop(@{$self->{'lstack'}}); + + if (!defined $end) { + return "Unmatched $name"; + } + else { + my $in = index($end, $name); + if ($in == 0) { + my $index = $self->{'foreach'}->{'count'}; + my $error = $self->process_foreach(); + if (!defined $error) { + --$self->{'foreach'}->{'count'}; + $self->append_current($self->{'foreach'}->{'text'}->[$index]); + } + return $error; + } + elsif ($in == -1) { + return "Unmatched $name"; + } + } + + return undef; +} + + +sub get_flag_overrides { + my($self, $name) = @_; + my $type; + + ## Split the name and type parameters + ($name, $type) = split(/,\s*/, $name); + + my $file = $self->get_value($name); + if (defined $file) { + ## Save the name prefix (if there is one) for + ## command parameter conversion at the end + my $pre; + if ($name =~ /^(\w+)->/) { + $pre = $1; + + ## Replace the custom_type key with the actual custom type + if ($pre eq 'custom_type') { + my $ct = $self->get_value($pre); + $name = $ct if (defined $ct); + } + elsif ($pre =~ /^grouped_(.*_file)$/) { + $name = $1; + } + } + + my $fo = $self->{'prjc'}->{'flag_overrides'}; + my $key = (defined $$fo{$name . 's'} ? $name . 's' : + (defined $$fo{$name} ? $name : undef)); + + if (defined $key) { + ## Convert the file name into a unix style file name + my $ustyle = $file; + $ustyle =~ s/\\/\//g if ($self->{'cslashes'}); + + ## Save the directory portion for checking in the foreach + my $dir = $self->mpc_dirname($ustyle); + + my $of = (defined $$fo{$key}->{$ustyle} ? $ustyle : + (defined $$fo{$key}->{$dir} ? $dir : undef)); + if (defined $of) { + my $prjc = $self->{'prjc'}; + foreach my $aname (@{$prjc->{'matching_assignments'}->{$key}}) { + if ($aname eq $type && defined $$fo{$key}->{$of}->{$aname}) { + my $value = $$fo{$key}->{$of}->{$aname}; + + ## If the name that we're overriding has a value and + ## requires parameters, then we will convert all of the + ## pseudo variables and provide parameters. + if (defined $pre && $prjc->requires_parameters($type)) { + $value = $prjc->convert_command_parameters( + $key, $value, + $self->prepare_parameters($pre)); + } + + return $prjc->relative($value); + } + } + } + } + } + + return undef; +} + + +sub get_multiple { + my($self, $name) = @_; + return $self->doif_multiple( + $self->create_array($self->get_value_with_default($name))); +} + + +sub doif_multiple { + my($self, $value) = @_; + return defined $value ? (scalar(@$value) > 1) : undef; +} + + +sub handle_multiple { + my($self, $name) = @_; + my $val = $self->get_value_with_default($name); + + if (defined $val) { + my $array = $self->create_array($val); + $self->append_current(scalar(@$array)); + } + else { + $self->append_current(0); + } +} + + +sub get_starts_with { + my($self, $str) = @_; + return $self->doif_starts_with([$str]); +} + + +sub doif_starts_with { + my($self, $val) = @_; + + if (defined $val) { + my($name, $pattern) = $self->split_parameters("@$val"); + if (defined $name && defined $pattern) { + return ($self->get_value_with_default($name) =~ /^$pattern/); + } + } + return undef; +} + + +sub handle_starts_with { + my($self, $str) = @_; + $self->generic_handle('doif_starts_with', $str); +} + + +sub get_ends_with { + my($self, $str) = @_; + return $self->doif_ends_with([$str]); +} + + +sub doif_ends_with { + my($self, $val) = @_; + + if (defined $val) { + my($name, $pattern) = $self->split_parameters("@$val"); + if (defined $name && defined $pattern) { + return ($self->get_value_with_default($name) =~ /$pattern$/); + } + } + return undef; +} + + +sub handle_ends_with { + my($self, $str) = @_; + $self->generic_handle('doif_ends_with', $str); +} + + +sub handle_keyname_used { + my($self, $str) = @_; + + if (defined $str) { + my($name, $key) = $self->split_parameters($str); + my $file = $self->get_value_with_default($name); + if (defined $self->{'keyname_used'}->{$file}->{$key}) { + $self->append_current($self->{'keyname_used'}->{$file}->{$key}++); + } + else { + $self->{'keyname_used'}->{$file}->{$key} = 1; + } + } +} + + +sub handle_scope { + my($self, $str) = @_; + + if (defined $str) { + my($state, $func, $param) = $self->split_parameters($str); + if (defined $state) { + my $pscope; + my $scope = $self->{'scopes'}; + + while(defined $$scope{'scope'}) { + $pscope = $scope; + $scope = $$scope{'scope'}; + } + if ($state eq 'enter') { + if (defined $func) { + $param = '' if (!defined $param); + $$scope{'scope'}->{$func} = [$self->process_special($param), + $_[0]->{'foreach'}->{'count'}]; + } + else { + $self->warning("The enter scope function requires a parameter."); + } + } + elsif ($state eq 'leave') { + if (defined $pscope) { + delete $$pscope{'scope'}; + } + else { + $self->warning("leave scope function encountered without an enter."); + } + } + else { + $self->warning("Unrecognized scope function parameter: $state."); + } + } + else { + $self->warning("The scope function requires 1 to 3 parameters."); + } + } +} + +sub get_has_extension { + my($self, $str) = @_; + return $self->doif_has_extension([$str]); +} + + +sub doif_has_extension { + my($self, $val) = @_; + + if (defined $val) { + return ($self->tp_basename( + $self->get_value_with_default("@$val")) =~ /\.[^\.]*$/); + } + return undef; +} + + +sub handle_has_extension { + my($self, $str) = @_; + $self->generic_handle('doif_has_extension', $str); +} + + +sub get_contains { + my($self, $str) = @_; + return $self->doif_contains([$str]); +} + + +sub doif_contains { + my($self, $val) = @_; + + if (defined $val) { + my($name, $pattern) = $self->split_parameters("@$val"); + if (defined $name && defined $pattern) { + return ($self->get_value_with_default($name) =~ /$pattern/); + } + } + return undef; +} + + +sub handle_contains { + my($self, $str) = @_; + $self->generic_handle('doif_contains', $str); +} + + +sub get_remove_from { + my($self, $str) = @_; + return $self->doif_remove_from($str); +} + + +sub doif_remove_from { + my($self, $str) = @_; + my @params = $self->split_parameters($str); + my @removed = $self->perform_remove_from(\@params); + return (defined $removed[0] ? 1 : undef); +} + + +sub perform_remove_from { + my($self, $val) = @_; + my($source, $pattern, $target, $tremove) = @$val; + + ## $source should be a component name (e.g., source_files, + ## header_files, etc.) $target is a variable name + ## $pattern and $tremove are optional; $pattern is a partial regular + ## expression to match the end of the files found from $source. The + ## beginning of the regular expression is made from $target by removing + ## $tremove from the end of it. + if (defined $source && defined $target && + defined $self->{'values'}->{$source}) { + my $tval = $self->get_value_with_default($target); + if (defined $tval) { + $tval =~ s/$tremove$// if (defined $tremove); + $tval = $self->escape_regex_special($tval); + my @removed; + my $max = scalar(@{$self->{'values'}->{$source}}); + for(my $i = 0; $i < $max;) { + if ($self->{'values'}->{$source}->[$i] =~ /^$tval$pattern$/) { + push(@removed, splice(@{$self->{'values'}->{$source}}, $i, 1)); + $max--; + } + else { + $i++; + } + } + return @removed; + } + } + + return (); +} + + +sub handle_remove_from { + my($self, $str) = @_; + + if (defined $str) { + my @params = $self->split_parameters($str); + my $val = $self->perform_remove_from(\@params); + $self->append_current("@$val") if (defined $val); + } +} + + +sub get_compares { + my($self, $str) = @_; + return $self->doif_compares([$str]); +} + + +sub doif_compares { + my($self, $val) = @_; + + if (defined $val) { + my($name, $pattern) = $self->split_parameters("@$val"); + if (defined $name && defined $pattern) { + return ($self->get_value_with_default($name) eq $pattern); + } + } + return undef; +} + + +sub handle_compares { + my($self, $str) = @_; + $self->generic_handle('doif_compares', $str); +} + + +sub get_reverse { + my($self, $name) = @_; + my $value = $self->get_value_with_default($name); + + if (defined $value) { + my @array = $self->perform_reverse($self->create_array($value)); + return \@array; + } + + return undef; +} + + +sub perform_reverse { + my($self, $value) = @_; + return reverse(@$value); +} + + +sub handle_reverse { + my($self, $name) = @_; + my $val = $self->get_value_with_default($name); + + if (defined $val) { + my @array = $self->perform_reverse($self->create_array($val)); + $self->append_current("@array"); + } +} + + +sub get_sort { + my($self, $name) = @_; + my $value = $self->get_value_with_default($name); + + if (defined $value) { + my @array = $self->perform_sort($self->create_array($value)); + return \@array; + } + + return undef; +} + + +sub perform_sort { + my($self, $value) = @_; + return sort(@$value); +} + + +sub handle_sort { + my($self, $name) = @_; + my $val = $self->get_value_with_default($name); + + if (defined $val) { + my @array = $self->perform_sort($self->create_array($val)); + $self->append_current("@array"); + } +} + + +sub get_uniq { + my($self, $name) = @_; + my $value = $self->get_value_with_default($name); + + if (defined $value) { + my @array = $self->perform_uniq($self->create_array($value)); + return \@array; + } + + return undef; +} + + +sub perform_uniq { + my($self, $value) = @_; + my %value; + @value{@$value} = (); + return sort(keys %value); +} + + +sub handle_uniq { + my($self, $name) = @_; + my $val = $self->get_value_with_default($name); + + if (defined $val) { + my @array = $self->perform_uniq($self->create_array($val)); + $self->append_current("@array"); + } +} + + +sub process_compound_if { + my($self, $str) = @_; + + if (index($str, '||') >= 0) { + my $ret = 0; + foreach my $v (split(/\s*\|\|\s*/, $str)) { + $ret |= $self->process_compound_if($v); + return 1 if ($ret != 0); + } + return 0; + } + elsif (index($str, '&&') >= 0) { + my $ret = 1; + foreach my $v (split(/\s*\&\&\s*/, $str)) { + $ret &&= $self->process_compound_if($v); + return 0 if ($ret == 0); + } + return 1; + } + else { + ## See if we need to reverse the return value + my $not = 0; + if ($str =~ /^!+(.*)/) { + $not = 1; + $str = $1; + } + + ## Get the value based on the string + my @cmds; + my $val; + while ($str =~ /(\w+)\((.+)\)(.*)/) { + if ($3 eq '') { + push(@cmds, $1); + $str = $2; + } + else { + ## If there is something trailing the closing parenthesis then + ## the whole thing is considered a parameter to the first + ## function. + last; + } + } + + if (defined $cmds[0]) { + ## Start out calling get_xxx on the string + my $type = 0x01; + my $prefix = 'get_'; + + $val = $str; + foreach my $cmd (reverse @cmds) { + if (defined $keywords{$cmd} && ($keywords{$cmd} & $type) != 0) { + my $func = "$prefix$cmd"; + $val = $self->$func($val); + + ## Now that we have a value, we need to switch over + ## to calling doif_xxx + $type = 0x04; + $prefix = 'doif_'; + } + else { + $self->warning("Unable to use $cmd in if (no $prefix method)."); + } + } + } + else { + $val = $self->get_value($str); + } + + ## See if any portion of the value is defined and not empty + my $ret = 0; + if (defined $val) { + if (UNIVERSAL::isa($val, 'ARRAY')) { + foreach my $v (@$val) { + if ($v ne '') { + $ret = 1; + last; + } + } + } + elsif ($val ne '') { + $ret = 1; + } + } + return ($not ? !$ret : $ret); + } +} + + +sub handle_if { + my($self, $val) = @_; + my $name = 'endif'; + + push(@{$self->{'lstack'}}, + "<%if($val)%> (" . $self->get_line_number() . '?)'); + if ($self->{'if_skip'}) { + push(@{$self->{'sstack'}}, "*$name"); + } + else { + ## Determine if we are skipping the portion of this if statement + ## $val will always be defined since we won't get into this method + ## without properly parsing the if statement. + $self->{'if_skip'} = !$self->process_compound_if($val); + push(@{$self->{'sstack'}}, $name); + } +} + + +sub handle_else { + my $self = shift; + my @scopy = @{$self->{'sstack'}}; + my $index = index($scopy[$#scopy], 'endif'); + if ($index >= 0) { + if ($index == 0) { + $self->{'if_skip'} ^= 1; + } + $self->{'sstack'}->[$#scopy] .= ':'; + } + + return 'Unmatched else' if (($self->{'sstack'}->[$#scopy] =~ tr/:/:/) > 1); + return undef; +} + + +sub handle_foreach { + my $self = shift; + my $val = lc(shift); + my $name = 'endfor'; + my $errorString; + + push(@{$self->{'lstack'}}, $self->get_line_number()); + if (!$self->{'if_skip'}) { + my $base = 1; + my $vname; + if ($val =~ /flag_overrides\([^\)]+\)/) { + } + elsif ($val =~ /([^,]*),(.*)/) { + $vname = $1; + $val = $2; + $vname =~ s/^\s+//; + $vname =~ s/\s+$//; + $val =~ s/^\s+//; + $val =~ s/\s+$//; + + if ($vname eq '') { + $errorString = 'The foreach variable name is not valid'; + } + + if ($val =~ /([^,]*),(.*)/) { + $base = $1; + $val = $2; + $base =~ s/^\s+//; + $base =~ s/\s+$//; + $val =~ s/^\s+//; + $val =~ s/\s+$//; + + if ($base !~ /^\d+$/) { + $errorString = 'The forcount specified is not a valid number'; + } + } + elsif ($vname =~ /^\d+$/) { + $base = $vname; + $vname = undef; + } + + ## Due to the way flag_overrides works, we can't allow + ## the user to name the foreach variable when dealing + ## with variables that can be used with the -> operator + if (defined $vname) { + foreach my $ref (keys %arrow_op_ref) { + my $name_re = $ref . 's'; + if ($val =~ /^$ref\->/ || $val =~ /^$name_re$/) { + $errorString = 'The foreach variable can not be ' . + 'named when dealing with ' . + $arrow_op_ref{$ref}; + } + } + } + } + + push(@{$self->{'sstack'}}, $name); + my $index = ++$self->{'foreach'}->{'count'}; + + $self->{'foreach'}->{'base'}->[$index] = $base; + $self->{'foreach'}->{'name'}->[$index] = $vname; + $self->{'foreach'}->{'vars'}->[$index] = $val; + $self->{'foreach'}->{'text'}->[$index] = ''; + $self->{'foreach'}->{'scope'}->[$index] = {}; + $self->{'foreach'}->{'scope_name'}->[$index] = undef; + } + else { + push(@{$self->{'sstack'}}, "*$name"); + } + + return $errorString; +} + + +sub handle_special { + my($self, $name, $val) = @_; + + ## If $name (fornotlast, forfirst, etc.) is set to 1 + ## Then we append the $val onto the current string that's + ## being built. + $self->append_current($val) if ($self->get_value($name)); +} + + +sub get_uc { + my($self, $name) = @_; + return uc($self->get_value_with_default($name)); +} + + +sub handle_uc { + my($self, $name) = @_; + $self->append_current($self->get_uc($name)); +} + + +sub perform_uc { + my($self, $value) = @_; + my @val; + foreach my $val (@$value) { + push(@val, uc($val)); + } + return @val; +} + + +sub get_lc { + my($self, $name) = @_; + return lc($self->get_value_with_default($name)); +} + + +sub handle_lc { + my($self, $name) = @_; + $self->append_current($self->get_lc($name)); +} + + +sub perform_lc { + my($self, $value) = @_; + my @val; + foreach my $val (@$value) { + push(@val, lc($val)); + } + return @val; +} + + +sub handle_ucw { + my($self, $name) = @_; + my $val = $self->get_value_with_default($name); + + substr($val, 0, 1) = uc(substr($val, 0, 1)); + while($val =~ /[_\s]([a-z])/) { + my $uc = uc($1); + $val =~ s/[_\s][a-z]/ $uc/; + } + $self->append_current($val); +} + + +sub actual_normalize { + $_[1] =~ tr/ \t\/\\\-$()./_/; + return $_[1]; +} + +sub perform_normalize { + my($self, $value) = @_; + my @val; + foreach my $val (@$value) { + push(@val, $self->actual_normalize($val)); + } + return @val; +} + + +sub get_normalize { + my($self, $name) = @_; + return $self->actual_normalize($self->get_value_with_default($name)); +} + + +sub handle_normalize { + my($self, $name) = @_; + $self->append_current($self->get_normalize($name)); +} + + +sub actual_noextension { + $_[1] =~ s/\.[^\.]*$//; + return $_[1]; +} + + +sub perform_noextension { + my($self, $value) = @_; + my @val; + foreach my $val (@$value) { + push(@val, $self->actual_noextension($val)); + } + return @val; +} + + +sub get_noextension { + my($self, $name) = @_; + return $self->actual_noextension($self->get_value_with_default($name)); +} + +sub handle_noextension { + my($self, $name) = @_; + $self->append_current($self->get_noextension($name)); +} + + +sub perform_full_path { + my($self, $value) = @_; + my @val; + foreach my $val (@$value) { + push(@val, $self->actual_full_path($val)); + } + return @val; +} + + +sub get_full_path { + my($self, $name) = @_; + return $self->actual_full_path($self->get_value_with_default($name)); +} + + +sub actual_full_path { + my($self, $value) = @_; + + ## Expand all defined env vars + $value =~ s/\$\((\w+)\)/$ENV{$1} || '$(' . $1 . ')'/ge; + + ## If we expanded all env vars, get absolute path + if ($value =~ /\$\(\w+\)/) { + $self->{'error_in_handle'} = "<%full_path%> couldn't expand " . + "environment variables in $value"; + return $value; + } + + ## Always convert the slashes since they may be in the OS native + ## format and we need them in UNIX format. + $value =~ s/\\/\//g; + my $dir = $self->mpc_dirname($value); + if (-e $dir) { + $dir = Cwd::abs_path($dir); + } + elsif ($self->{'prjc'}->path_is_relative($dir)) { + ## If the directory is is not already an absolute path, then we will + ## assume that the directory is relative to the current directory + ## (which will be the location of the MPC file). + $dir = $self->getcwd() . '/' . $dir; + } + + ## Create the full path value and convert the slashes if necessary. + $value = $dir . '/' . $self->mpc_basename($value); + $value =~ s/\//\\/g if ($self->{'cslashes'}); + return $value; +} + + +sub handle_full_path { + my($self, $name) = @_; + my $val = $self->get_value_with_default($name); + + $self->append_current($self->actual_full_path($val)); +} + + +sub perform_extensions { + my($self, $value) = @_; + my @val; + foreach my $val (@$value) { + push(@val, $self->{'prjc'}->get_component_extensions($val)); + } + return @val; +} + + +sub handle_extensions { + my($self, $name) = @_; + my @val = $self->perform_extensions([$name]); + $self->append_current("@val"); +} + + +sub evaluate_nested_functions { + my($self, $name, $val) = @_; + + ## Get the value based on the string + my @cmds = ($name); + while ($val =~ /(\w+)\((.+)\)/) { + push(@cmds, $1); + $val = $2; + } + + ## Start out calling get_xxx on the string + my $type = 0x01; + my $prefix = 'get_'; + + foreach my $cmd (reverse @cmds) { + if (defined $keywords{$cmd} && ($keywords{$cmd} & $type) != 0) { + my $func = "$prefix$cmd"; + if ($type == 0x01) { + $val = $self->$func($val); + $val = [ $val ] if (!UNIVERSAL::isa($val, 'ARRAY')); + } + else { + my @array = $self->$func($val); + $val = \@array; + } + + ## Now that we have a value, we need to switch over + ## to calling perform_xxx + $type = 0x02; + $prefix = 'perform_'; + } + else { + $self->warning("Unable to use $cmd in nested " . + "functions (no $prefix method)."); + } + } + if (defined $val && UNIVERSAL::isa($val, 'ARRAY')) { + $self->append_current("@$val"); + } +} + + +sub perform_dirname { + my($self, $value) = @_; + my @val; + foreach my $val (@$value) { + push(@val, $self->validated_dirname($val)); + } + return @val; +} + + +sub get_dirname { + my($self, $name) = @_; + return $self->doif_dirname($self->get_value_with_default($name)); +} + + +sub doif_dirname { + my($self, $value) = @_; + + if (defined $value) { + $value = $self->validated_dirname($value); + return ($value ne '.'); + } + return undef; +} + + +sub handle_dirname { + my($self, $name) = @_; + + $self->append_current( + $self->validated_dirname($self->get_value_with_default($name))); +} + + +sub handle_basename { + my($self, $name) = @_; + + $self->append_current( + $self->tp_basename($self->get_value_with_default($name))); +} + + +sub handle_basenoextension { + my($self, $name) = @_; + my $val = $self->tp_basename($self->get_value_with_default($name)); + + $val =~ s/\.[^\.]*$//; + $self->append_current($val); +} + + +sub handle_flag_overrides { + my($self, $name) = @_; + my $value = $self->get_flag_overrides($name); + $self->append_current(UNIVERSAL::isa($value, 'ARRAY') ? + "@$value" : $value) if (defined $value); +} + + +sub handle_marker { + my($self, $name) = @_; + my $val = $self->{'prjc'}->get_verbatim($name); + $self->append_current($val) if (defined $val); +} + + +sub handle_eval { + my($self, $name) = @_; + my $val = $self->get_value_with_default($name); + + if (defined $val) { + if (index($val, "<%eval($name)%>") >= 0) { + $self->warning("Infinite recursion detected in '$name'."); + } + else { + ## Enter the eval state + ++$self->{'eval'}; + + ## Parse the eval line + my($status, $error) = $self->parse_line(undef, $val); + if ($status) { + $self->{'built'} .= $self->{'eval_str'}; + } + else { + $self->warning($error); + } + + ## Leave the eval state + --$self->{'eval'}; + $self->{'eval_str'} = ''; + } + } +} + + +sub handle_pseudo { + my($self, $name) = @_; + $self->append_current($self->{'cmds'}->{$name}); +} + + +sub get_duplicate_index { + my($self, $name) = @_; + return $self->doif_duplicate_index($self->get_value_with_default($name)); +} + + +sub doif_duplicate_index { + my($self, $value) = @_; + + if (defined $value) { + my $base = lc($self->tp_basename($value)); + my $path = $self->validated_dirname($value); + + if (!defined $self->{'dupfiles'}->{$base}) { + $self->{'dupfiles'}->{$base} = [$path]; + } + else { + my $index = 1; + foreach my $file (@{$self->{'dupfiles'}->{$base}}) { + return $index if ($file eq $path); + ++$index; + } + + push(@{$self->{'dupfiles'}->{$base}}, $path); + return 1; + } + } + + return undef; +} + + +sub handle_duplicate_index { + my($self, $name) = @_; + my $value = $self->doif_duplicate_index( + $self->get_value_with_default($name)); + $self->append_current($value) if (defined $value); +} + + +sub get_transdir { + my($self, $name) = @_; + return $self->doif_transdir($self->get_value_with_default($name)); +} + + +sub doif_transdir { + my($self, $value) = @_; + + if ($value =~ /([\/\\])/) { + return $self->{'prjc'}->translate_directory( + $self->tp_dirname($value)) . $1; + } + + return undef; +} + + +sub handle_transdir { + my($self, $name) = @_; + my $value = $self->doif_transdir($self->get_value_with_default($name)); + $self->append_current($value) if (defined $value); +} + + +sub prepare_parameters { + my($self, $prefix) = @_; + my $input = $self->get_value($prefix . '->input_file'); + my $output; + + if (defined $input) { + $input =~ s/\//\\/g if ($self->{'cslashes'}); + $output = $self->get_value($prefix . '->input_file->output_files'); + + if (defined $output) { + my $size = scalar(@$output); + for(my $i = 0; $i < $size; ++$i) { + my $fo = $self->get_flag_overrides($prefix . '->input_file, gendir'); + if (defined $fo) { + $$output[$i] = ($fo eq '.' ? '' : $fo . '/') . + $self->tp_basename($$output[$i]); + } + $$output[$i] =~ s/\//\\/g if ($self->{'cslashes'}); + } + } + } + + ## Set the parameters array with the determined input and output files + return $input, $output; +} + + +sub process_name { + my($self, $line) = @_; + my $length = 0; + my $errorString; + + ## Split the line into a name and value + if ($line =~ /([^%\(]+)(\(([^%]+)\))?%>/) { + my $name = lc($1); + my $val = $3; + $length += length($name); + + if (defined $val) { + ## Check for the parenthesis + if (($val =~ tr/(//) != ($val =~ tr/)//)) { + return 'Missing the closing parenthesis', $length; + } + + ## Add the length of the value plus 2 for the surrounding () + $length += length($val) + 2; + } + + if (defined $keywords{$name}) { + if ($name eq 'if') { + $self->handle_if($val); + } + elsif ($name eq 'endif') { + $errorString = $self->handle_endif($name); + } + elsif ($name eq 'else') { + $errorString = $self->handle_else(); + } + elsif ($name eq 'endfor') { + $errorString = $self->handle_endfor($name); + } + elsif ($name eq 'foreach') { + $errorString = $self->handle_foreach($val); + } + elsif ($name eq 'fornotlast' || $name eq 'forlast' || + $name eq 'fornotfirst' || $name eq 'forfirst') { + if (!$self->{'if_skip'}) { + $self->handle_special($name, $self->process_special($val)); + } + } + elsif ($name eq 'comment') { + ## Ignore the contents of the comment + } + else { + if (!$self->{'if_skip'}) { + if (index($val, '(') >= 0) { + $self->evaluate_nested_functions($name, $val); + } + else { + my $func = 'handle_' . $name; + $self->$func($val); + if ($self->{'error_in_handle'}) { + $errorString = $self->{'error_in_handle'}; + } + } + } + } + } + elsif (defined $self->{'cmds'}->{$name}) { + $self->handle_pseudo($name) if (!$self->{'if_skip'}); + } + else { + if (!$self->{'if_skip'}) { + if (defined $val && !defined $self->{'defaults'}->{$name}) { + $self->{'defaults'}->{$name} = $self->process_special($val); + } + $self->append_current($self->get_value_with_default($name)); + } + } + } + else { + my $error = $line; + my $length = length($line); + for(my $i = 0; $i < $length; ++$i) { + my $part = substr($line, $i, 2); + if ($part eq '%>') { + $error = substr($line, 0, $i + 2); + last; + } + } + $errorString = "Unable to parse line starting at '$error'"; + } + + return $errorString, $length; +} + + +sub collect_data { + my $self = shift; + my $prjc = $self->{'prjc'}; + my $cwd = $self->getcwd(); + + ## Set the current working directory + $cwd =~ s/\//\\/g if ($self->{'cslashes'}); + $self->{'values'}->{'cwd'} = $cwd; + + ## Collect the components into {'values'} somehow + foreach my $key (keys %{$prjc->{'valid_components'}}) { + my @list = $prjc->get_component_list($key); + $self->{'values'}->{$key} = \@list if (defined $list[0]); + } + + ## If there is a staticname and no sharedname then this project + ## 'type_is_static'. If we are generating static projects, let + ## all of the templates know that we 'need_staticflags'. + ## If there is a sharedname then this project 'type_is_dynamic'. + my $sharedname = $prjc->get_assignment('sharedname'); + my $staticname = $prjc->get_assignment('staticname'); + if (!defined $sharedname && defined $staticname) { + $self->{'override_target_type'} = 1; + $self->{'values'}->{'type_is_static'} = 1; + $self->{'values'}->{'need_staticflags'} = 1; + } + elsif ($prjc->get_static() == 1) { + $self->{'values'}->{'need_staticflags'} = 1; + } + elsif (defined $sharedname) { + $self->{'values'}->{'type_is_dynamic'} = 1; + } + + ## If there is a sharedname or exename then this project + ## 'type_is_binary'. + if (defined $sharedname || + defined $prjc->get_assignment('exename')) { + $self->{'values'}->{'type_is_binary'} = 1; + } + + ## A tiny hack (mainly for VC6 projects) + ## for the workspace creator. It needs to know the + ## target names to match up with the project name. + $prjc->update_project_info($self, 0, ['project_name']); + + ## This is for all projects + $prjc->update_project_info($self, 1, ['after']); + + ## VC7 Projects need to know the GUID. + ## We need to save this value in our known values + ## since each guid generated will be different. We need + ## this to correspond to the same guid used in the workspace. + my $guid = $prjc->update_project_info($self, 1, ['guid']); + $self->{'values'}->{'guid'} = $guid; + + ## In order for VC7 to mix languages, we need to keep track + ## of the language associated with each project. + $prjc->update_project_info($self, 1, ['language']); + + ## For VC7+ to properly work with wince, which is cross compiled, + ## a new platform-specific token is added, nocross, which is used + ## to determine if a project is even to be built for non-native + ## targets. Additionally, custom-only projects are built but not + ## deployed, thus these are added to the project_info mix + $prjc->update_project_info($self, 1, ['custom_only']); + $prjc->update_project_info($self, 1, ['nocross']); + + ## For VC8 to be able to add references to managed DLL's to the current + ## managed DLL project (if it is one), we need to keep track of whether + ## the project is 'managed' or not. + $prjc->update_project_info($self, 1, ['managed']); + + ## Some Windows based projects can't deal with certain version + ## values. So, for those we provide a translated version. + my $version = $prjc->get_assignment('version'); + if (defined $version) { + $self->{'values'}->{'win_version'} = + WinVersionTranslator::translate($version); + } +} + + +sub parse_line { + my($self, $ih, $line) = @_; + my $errorString; + my $startempty = ($line eq ''); + + ## If processing a foreach or the line only + ## contains a keyword, then we do + ## not need to add a newline to the end. + if ($self->{'foreach'}->{'processing'} == 0 && !$self->{'eval'} && + ($line !~ /^[ ]*<%(\w+)(?:\((?:(?:\w+\s*,\s*)*[!]?\w+\(.+\)|[^\)]+)\))?%>$/ || + !defined $keywords{$1})) { + $line .= $self->{'crlf'}; + } + + if ($self->{'foreach'}->{'count'} < 0 && !$self->{'eval'}) { + $self->{'built'} = ''; + } + + my $start = index($line, '<%'); + if ($start >= 0) { + my $append_name; + if ($start > 0) { + if (!$self->{'if_skip'}) { + $self->append_current(substr($line, 0, $start)); + } + $line = substr($line, $start); + } + + my $nlen = 0; + foreach my $item (split('<%', $line)) { + my $name = 1; + my $length = length($item); + my $endi = index($item, '%>'); + for(my $i = 0; $i < $length; ++$i) { + if ($i == $endi) { + ++$i; + $endi = index($item, '%>', $i); + $name = undef; + if ($append_name) { + $append_name = undef; + if (!$self->{'if_skip'}) { + $self->append_current('%>'); + } + } + if ($length != $i + 1) { + if (!$self->{'if_skip'}) { + $self->append_current(substr($item, $i + 1)); + } + last; + } + } + elsif ($name) { + my $efcheck = (index($item, 'endfor%>') == 0); + my $focheck = ($efcheck ? 0 : (index($item, 'foreach(') == 0)); + + if ($focheck && $self->{'foreach'}->{'count'} >= 0) { + ++$self->{'foreach'}->{'nested'}; + } + + if ($self->{'foreach'}->{'count'} < 0 || + $self->{'foreach'}->{'processing'} > $self->{'foreach'}->{'nested'} || + (($efcheck || $focheck) && + $self->{'foreach'}->{'nested'} == $self->{'foreach'}->{'processing'})) { + ($errorString, $nlen) = $self->process_name($item); + + if (defined $errorString) { + return 0, $errorString; + } + elsif ($nlen == 0) { + return 0, "Could not parse this line at column $i"; + } + + $i += ($nlen - 1); + } + else { + $name = undef; + $nlen = ($i < $endi ? $endi : $length) - $i; + if (!$self->{'if_skip'}) { + $self->append_current('<%' . substr($item, $i, $nlen)); + $append_name = 1; + } + $i += ($nlen - 1); + } + + if ($efcheck && $self->{'foreach'}->{'nested'} > 0) { + --$self->{'foreach'}->{'nested'}; + } + } + else { + $nlen = ($i < $endi ? $endi : $length) - $i; + if (!$self->{'if_skip'}) { + $self->append_current(substr($item, $i, $nlen)); + } + $i += ($nlen - 1); + } + } + } + } + else { + $self->append_current($line) if (!$self->{'if_skip'}); + } + + if ($self->{'foreach'}->{'count'} < 0 && !$self->{'eval'} && + ## If the line started out empty and we're not + ## skipping from the start or the built up line is not empty + ($startempty || + ($self->{'built'} ne $self->{'crlf'} && $self->{'built'} ne ''))) { + push(@{$self->{'lines'}}, $self->{'built'}); + } + + return !defined $errorString, $errorString; +} + + +sub parse_file { + my($self, $input) = @_; + + $self->collect_data(); + my($status, $errorString) = $self->cached_file_read($input); + + ## If there was no error, check the stack to make sure that we aren't + ## missing an <%endif%> or an <%endfor%>. + if ($status && defined $self->{'sstack'}->[0]) { + $status = 0; + $errorString = "Missing an '$self->{'sstack'}->[0]' starting at " . + $self->{'lstack'}->[0]; + } + + ## Add in the line number if there is an error + $errorString = "$input: line " . + $self->get_line_number() . ":\n$errorString" if (!$status); + + return $status, $errorString; +} + + +sub get_lines { + return $_[0]->{'lines'}; +} + + +# ************************************************************ +# Accessors used by support scripts +# ************************************************************ + +sub getKeywords { + return \%keywords; +} + + +sub getArrowOp { + return \%arrow_op_ref; +} + + +1; diff --git a/ACE/MPC/modules/VC10ProjectCreator.pm b/ACE/MPC/modules/VC10ProjectCreator.pm new file mode 100644 index 00000000000..caf93286e5f --- /dev/null +++ b/ACE/MPC/modules/VC10ProjectCreator.pm @@ -0,0 +1,20 @@ +package VC10ProjectCreator; + +# ************************************************************ +# Description : A VC10 Project Creator +# Author : Johnny Willemsen +# Create Date : 11/10/2008 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use VC9ProjectCreator; + +use vars qw(@ISA); +@ISA = qw(VC9ProjectCreator); + +1; diff --git a/ACE/MPC/modules/VC10WorkspaceCreator.pm b/ACE/MPC/modules/VC10WorkspaceCreator.pm new file mode 100644 index 00000000000..89c50c5a0d5 --- /dev/null +++ b/ACE/MPC/modules/VC10WorkspaceCreator.pm @@ -0,0 +1,42 @@ +package VC10WorkspaceCreator; + +# ************************************************************ +# Description : A VC10 Workspace Creator +# Author : Johnny Willemsen +# Create Date : 11/10/2008 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use VC10ProjectCreator; +use VC9WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(VC9WorkspaceCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub pre_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + print $fh '', $crlf, + 'Microsoft Visual Studio Solution File, Format Version 11.00', $crlf; + $self->print_workspace_comment($fh, + '# Visual Studio 10', $crlf, + '# $Id$', $crlf, + '#', $crlf, + '# This file was generated by MPC. Any changes made directly to', $crlf, + '# this file will be lost the next time it is generated.', $crlf, + '#', $crlf, + '# MPC Command:', $crlf, + '# ', $self->create_command_line_string($0, @ARGV), $crlf); +} + +1; diff --git a/ACE/MPC/modules/VC6ProjectCreator.pm b/ACE/MPC/modules/VC6ProjectCreator.pm new file mode 100644 index 00000000000..4a28f228c69 --- /dev/null +++ b/ACE/MPC/modules/VC6ProjectCreator.pm @@ -0,0 +1,81 @@ +package VC6ProjectCreator; + +# ************************************************************ +# Description : A VC6 Project Creator +# Author : Chad Elliott +# Create Date : 3/14/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use ProjectCreator; +use VCProjectBase; + +use vars qw(@ISA); +@ISA = qw(VCProjectBase ProjectCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub project_file_extension { + #my $self = shift; + return '.dsp'; +} + + +sub override_valid_component_extensions { + my($self, $comp) = @_; + + ## Visual C++ 6.0 doesn't understand all of the extensions that MPC + ## supports. + if ($comp eq 'source_files' && $self->languageIs(Creator::cplusplus)) { + return ["\\.cpp", "\\.cxx", "\\.c"]; + } + + return undef; +} + + +sub override_exclude_component_extensions { + my($self, $comp) = @_; + + ## Visual C++ 6.0 doesn't understand all of the extensions that MPC + ## supports. + if ($comp eq 'source_files' && $self->languageIs(Creator::cplusplus)) { + return ["_T\\.cpp", "_T\\.cxx"]; + } + + return undef; +} + + +sub get_dll_exe_template_input_file { + #my $self = shift; + return 'vc6dspdllexe'; +} + + +sub get_lib_exe_template_input_file { + #my $self = shift; + return 'vc6dsplibexe'; +} + + +sub get_lib_template_input_file { + #my $self = shift; + return 'vc6dsplib'; +} + + +sub get_dll_template_input_file { + #my $self = shift; + return 'vc6dspdll'; +} + + +1; diff --git a/ACE/MPC/modules/VC6WorkspaceCreator.pm b/ACE/MPC/modules/VC6WorkspaceCreator.pm new file mode 100644 index 00000000000..714c7ce1673 --- /dev/null +++ b/ACE/MPC/modules/VC6WorkspaceCreator.pm @@ -0,0 +1,105 @@ +package VC6WorkspaceCreator; + +# ************************************************************ +# Description : A VC6 Workspace Creator +# Author : Chad Elliott +# Create Date : 5/13/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use VC6ProjectCreator; +use WinWorkspaceBase; +use WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(WinWorkspaceBase WorkspaceCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + + +sub compare_output { + #my $self = shift; + return 1; +} + + +sub workspace_file_extension { + #my $self = shift; + return '.dsw'; +} + + +sub pre_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + ## This identifies it as a Visual C++ file + print $fh 'Microsoft Developer Studio Workspace File, Format Version 6.00', $crlf; + + ## Optionally print the workspace comment + $self->print_workspace_comment($fh, + '#', $crlf, + '# $Id$', $crlf, + '#', $crlf, + '# This file was generated by MPC. Any changes made directly to', $crlf, + '# this file will be lost the next time it is generated.', $crlf, + '#', $crlf, + '# MPC Command:', $crlf, + '# ', $self->create_command_line_string($0, @ARGV), $crlf, $crlf); +} + + +sub write_comps { + my($self, $fh, $gen) = @_; + my $projects = $self->get_projects(); + my $pjs = $self->get_project_info(); + my $crlf = $self->crlf(); + + ## Sort the project so that they resulting file can be exactly + ## reproduced given the same list of projects. + foreach my $project (sort { $gen->file_sorter($a, $b) } @$projects) { + + ## Add the project name and project file information + print $fh "###############################################################################$crlf$crlf", + "Project: \"$$pjs{$project}->[0]\"=", $self->slash_to_backslash($project), + " - Package Owner=<4>$crlf$crlf", + "Package=<5>${crlf}{{{$crlf}}}$crlf$crlf", + "Package=<4>${crlf}{{{$crlf"; + + my $deps = $self->get_validated_ordering($project); + if (defined $$deps[0]) { + ## Add in the project dependencies + foreach my $dep (@$deps) { + print $fh " Begin Project Dependency$crlf", + " Project_Dep_Name $dep$crlf", + " End Project Dependency$crlf"; + } + } + + ## End the project section + print $fh "}}}$crlf$crlf"; + } +} + + +sub post_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + ## This text is always the same + print $fh "###############################################################################$crlf$crlf", + "Global:$crlf$crlf", + "Package=<5>${crlf}{{{$crlf}}}$crlf$crlf", + "Package=<3>${crlf}{{{$crlf}}}$crlf$crlf", + "###############################################################################$crlf$crlf"; +} + + +1; diff --git a/ACE/MPC/modules/VC71ProjectCreator.pm b/ACE/MPC/modules/VC71ProjectCreator.pm new file mode 100644 index 00000000000..5c8d9e5b4ce --- /dev/null +++ b/ACE/MPC/modules/VC71ProjectCreator.pm @@ -0,0 +1,37 @@ +package VC71ProjectCreator; + +# ************************************************************ +# Description : A VC7.1 Project Creator +# Author : Chad Elliott +# Create Date : 4/17/2003 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use VC7ProjectCreator; + +use vars qw(@ISA); +@ISA = qw(VC7ProjectCreator); + +# ************************************************************ +# Data Section +# ************************************************************ + +my %config = ('vcversion' => '7.10', + 'forloopscope' => 'TRUE', + ); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub get_configurable { + my($self, $name) = @_; + return $config{$name}; +} + +1; diff --git a/ACE/MPC/modules/VC71WorkspaceCreator.pm b/ACE/MPC/modules/VC71WorkspaceCreator.pm new file mode 100644 index 00000000000..0c9ecdada1b --- /dev/null +++ b/ACE/MPC/modules/VC71WorkspaceCreator.pm @@ -0,0 +1,82 @@ +package VC71WorkspaceCreator; + +# ************************************************************ +# Description : A VC7.1 Workspace Creator +# Author : Chad Elliott +# Create Date : 4/17/2003 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use VC71ProjectCreator; +use VC7WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(VC7WorkspaceCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + + +sub pre_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + ## This identifies it as a Visual Studio 2003 file + print $fh 'Microsoft Visual Studio Solution File, Format Version 8.00', $crlf; + + ## Optionally print the workspace comment + $self->print_workspace_comment($fh, + '#', $crlf, + '# $Id$', $crlf, + '#', $crlf, + '# This file was generated by MPC. Any changes made directly to', $crlf, + '# this file will be lost the next time it is generated.', $crlf, + '#', $crlf, + '# MPC Command:', $crlf, + '# ', $self->create_command_line_string($0, @ARGV), $crlf); +} + + +sub print_inner_project { + my($self, $fh, $gen, $pguid, $deps, $project_name, $name_to_guid_map) = @_; + + if ($self->allow_empty_dependencies() || defined $$deps[0]) { + ## Print out the project dependencies + my $crlf = $self->crlf(); + print $fh "\tProjectSection(ProjectDependencies) = postProject$crlf"; + foreach my $dep (@$deps) { + my $guid = $name_to_guid_map->{$dep}; + print $fh "\t\t{$guid} = {$guid}$crlf" if (defined $guid); + } + print $fh "\tEndProjectSection$crlf"; + } +} + + +sub allow_empty_dependencies { + #my $self = shift; + return 1; +} + + +sub print_configs { + my($self, $fh, $configs) = @_; + my $crlf = $self->crlf(); + foreach my $key (sort keys %$configs) { + print $fh "\t\t$key = $key$crlf"; + } +} + + +sub print_dependencies { + ## These are done in the print_inner_project method +} + + +1; diff --git a/ACE/MPC/modules/VC7ProjectCreator.pm b/ACE/MPC/modules/VC7ProjectCreator.pm new file mode 100644 index 00000000000..8182c23f130 --- /dev/null +++ b/ACE/MPC/modules/VC7ProjectCreator.pm @@ -0,0 +1,150 @@ +package VC7ProjectCreator; + +# ************************************************************ +# Description : A VC7 Project Creator +# Author : Chad Elliott +# Create Date : 4/23/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use GUID; +use ProjectCreator; +use VCProjectBase; +use XMLProjectBase; + +use vars qw(@ISA); +@ISA = qw(XMLProjectBase VCProjectBase ProjectCreator); + +# ************************************************************ +# Data Section +# ************************************************************ + +my %info = (Creator::cplusplus => {'ext' => '.vcproj', + 'dllexe' => 'vc7exe', + 'libexe' => 'vc7libexe', + 'dll' => 'vc7dll', + 'lib' => 'vc7lib', + 'template' => 'vc7', + }, + Creator::csharp => {'ext' => '.csproj', + 'dllexe' => 'vc7csharp', + 'libexe' => 'vc7csharp', + 'dll' => 'vc7csharp', + 'lib' => 'vc7csharp', + 'template' => 'vc7csharp', + }, + Creator::java => {'ext' => '.vjsproj', + 'dllexe' => 'vc7java', + 'libexe' => 'vc7java', + 'dll' => 'vc7java', + 'lib' => 'vc7java', + 'template' => 'vc7java', + }, + Creator::vb => {'ext' => '.vbproj', + 'dllexe' => 'vc7vb', + 'libexe' => 'vc7vb', + 'dll' => 'vc7vb', + 'lib' => 'vc7vb', + 'template' => 'vc7vb', + }, + ); + +my %config = ('vcversion' => '7.00', + 'forloopscope' => 'TRUE', + ); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub languageSupported { + return defined $info{$_[0]->get_language()}; +} + + +sub get_info_hash { + #my($self, $key) = @_; + return $info{$_[1]}; +} + + +sub get_configurable { + #my($self, $name) = @_; + return $config{$_[1]}; +} + + +sub fill_value { + my($self, $name) = @_; + + if ($name eq 'guid') { + ## Return a repeatable GUID for use within the template. The values + ## provided will be hashed and returned in a format expected by + ## Visual Studio. + return GUID::generate($self->project_file_name(), + $self->{'current_input'}, $self->getcwd()); + } + elsif ($name eq 'language') { + ## If this project is a Web Application, the language is website. + ## Since Visual Studio 2003 doesn't support Web Applications, this + ## will never happen. However, this code is shared by the vc8 + ## project type, so it can happen then. + return Creator::website if ($self->get_assignment('webapp')); + + ## Also for the vc8 project type, the language is stored in the + ## project file as a comment when external C# references need to be + ## added to the resulting project. Since a C++ project can mix with + ## C#, the particular project language can not be determined by the + ## workspace language. + return $self->get_language(); + } + + ## Consult another method for this template name. This method is + ## overrridden by the other project creators that inherit from this + ## one. + return $self->get_configurable($name); +} + + +sub project_file_extension { + return $_[0]->get_info_hash($_[0]->get_language())->{'ext'}; +} + + +sub get_dll_exe_template_input_file { + return $_[0]->get_info_hash($_[0]->get_language())->{'dllexe'}; +} + + +sub get_lib_exe_template_input_file { + return $_[0]->get_info_hash($_[0]->get_language())->{'libexe'}; +} + + +sub get_dll_template_input_file { + return $_[0]->get_info_hash($_[0]->get_language())->{'dll'}; +} + + +sub get_lib_template_input_file { + return $_[0]->get_info_hash($_[0]->get_language())->{'lib'}; +} + + +sub get_template { + return $_[0]->get_info_hash($_[0]->get_language())->{'template'}; +} + + +sub get_cmdsep_symbol { + #my $self = shift; + return '&'; +} + + +1; diff --git a/ACE/MPC/modules/VC7WorkspaceCreator.pm b/ACE/MPC/modules/VC7WorkspaceCreator.pm new file mode 100644 index 00000000000..8de15f83db2 --- /dev/null +++ b/ACE/MPC/modules/VC7WorkspaceCreator.pm @@ -0,0 +1,295 @@ +package VC7WorkspaceCreator; + +# ************************************************************ +# Description : A VC7 Workspace Creator +# Author : Chad Elliott +# Create Date : 5/14/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use VC7ProjectCreator; +use WinWorkspaceBase; +use WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(WinWorkspaceBase WorkspaceCreator); + +# ************************************************************ +# Data Section +# ************************************************************ + +my %guids = (Creator::cplusplus => '8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942', + Creator::csharp => 'FAE04EC0-301F-11D3-BF4B-00C04F79EFBC', + Creator::java => 'E6FDF86B-F3D1-11D4-8576-0002A516ECE8', + Creator::vb => 'F184B08F-C81C-45F6-A57F-5ABD9991F28F', + Creator::website => 'E24C65DC-7377-472B-9ABA-BC803B73C61A', + ); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub compare_output { + #my $self = shift; + return 1; +} + + +sub workspace_file_extension { + #my $self = shift; + return '.sln'; +} + + +sub pre_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + ## This identifies it as a Visual Studio file + print $fh 'Microsoft Visual Studio Solution File, Format Version 7.00', $crlf; + + ## Optionally print the workspace comment + $self->print_workspace_comment($fh, + '#', $crlf, + '# $Id$', $crlf, + '#', $crlf, + '# This file was generated by MPC. Any changes made directly to', $crlf, + '# this file will be lost the next time it is generated.', $crlf, + '#', $crlf, + '# MPC Command:', $crlf, + '# ', $self->create_command_line_string($0, @ARGV), $crlf); +} + + +sub print_inner_project { + #my $self = shift; + #my $fh = shift; + #my $gen = shift; + #my $pguid = shift; + #my $deps = shift; + #my $name = shift; + #my $name_to_guid_map = shift; + #my $proj_language = shift; + #my $cfgs = shift; + +} + + +sub print_configs { + my($self, $fh, $configs) = @_; + my $crlf = $self->crlf(); + my $count = 0; + + ## Print out the configurations for the solution + foreach my $key (sort keys %$configs) { + print $fh "\t\tConfigName.$count = $key$crlf"; + $count++; + } +} + + +sub print_dependencies { + my($self, $fh, $gen, $list, $pjs) = @_; + my $crlf = $self->crlf(); + + ## I hate to add yet another loop through all the projects, but + ## we must have some way to map plain project names to guids. + my %name_to_guid_map; + foreach my $project (@$list) { + my($name, $deps, $guid) = @{$$pjs{$project}}; + $name_to_guid_map{$name} = $guid; + } + + ## Project Dependencies + print $fh "\tGlobalSection(ProjectDependencies) = postSolution$crlf"; + foreach my $project (@$list) { + my($name, $rawdeps, $project_guid) = @{$$pjs{$project}}; + my $deps = $self->get_validated_ordering($project); + if (defined $$deps[0]) { + my $i = 0; + foreach my $dep (@$deps) { + my $guid = $name_to_guid_map{$dep}; + if (defined $guid) { + print $fh "\t\t{$project_guid}.$i = {$guid}$crlf"; + $i++; + } + } + } + } + print $fh "\tEndGlobalSection$crlf"; +} + + +sub write_comps { + my($self, $fh, $gen) = @_; + my $projects = $self->get_projects(); + my $pjs = $self->get_project_info(); + my @list = sort @$projects; + my $crlf = $self->crlf(); + + ## I hate to add yet another loop through all the projects, but + ## we must have some way to map plain project names to guids. + my %name_to_guid_map; + foreach my $project (@list) { + my($name, $deps, $guid) = @{$$pjs{$project}}; + $name_to_guid_map{$name} = $guid; + } + + ## Project Information + foreach my $project (@list) { + my($pname, $rawdeps, $guid, $language, $custom_only, $nocross, $managed, @cfgs) = @{$$pjs{$project}}; + my $pguid = $guids{$language}; + my $deps = $self->get_validated_ordering($project); + my($name, $proj) = $self->adjust_names($pname, $project, $language); + print $fh "Project(\"{$pguid}\") = \"$name\", \"$proj\", \"{$guid}\"$crlf"; + $self->print_inner_project($fh, $gen, $guid, $deps, + $name, \%name_to_guid_map, + $language, \@cfgs); + print $fh "EndProject$crlf"; + } + + ## This block creates the different possible configurations for this + ## solution. + print $fh "Global$crlf", + "\tGlobalSection(", + $self->get_solution_config_section_name(), + ") = preSolution$crlf"; + my %configs; + foreach my $project (@list) { + my($name, $deps, $pguid, $lang, $custom_only, $nocross, $managed, @cfgs) = @{$$pjs{$project}}; + foreach my $cfg (@cfgs) { + $configs{$self->get_short_config_name($cfg)} = $cfg; + } + } + $self->print_configs($fh, \%configs); + print $fh "\tEndGlobalSection$crlf"; + + ## Print dependencies if there are any + $self->print_dependencies($fh, $gen, \@list, $pjs); + + ## Project Configuration Names + print $fh "\tGlobalSection(", + $self->get_project_config_section_name(), + ") = postSolution$crlf"; + + ## See if there is an 'Any CPU' or '.NET' configuration + my $anycpu; + foreach my $key (keys %configs) { + if (index($key, 'Any CPU') >= 0 || index($key, '.NET') >= 0) { + $anycpu = 1; + last; + } + } + + ## Go through each project and print out the settings per GUID + foreach my $project (@list) { + my($name, $deps, $pguid, $lang, $custom_only, $nocross, $managed, @cfgs) = @{$$pjs{$project}}; + my %all_configs = %configs; + foreach my $cfg (sort @cfgs) { + my $c = $self->get_short_config_name($cfg); + my $deployable = !$nocross; + my $buildable = $deployable; + if (index($cfg, 'Win32') >= 0 || index($cfg, 'x64') >= 0) { + $deployable = 0; + $buildable = 1; + } elsif ($custom_only) { + $deployable = 0; + } + if (defined $anycpu) { + ## There is a non-C++ project; there is no need to explicitly + ## enable building of the configurations for this project. So, we + ## get rid of the configuration settings from the copy of the + ## configs map. + delete $all_configs{$c}; + } + else { + print $fh "\t\t{$pguid}.$c.ActiveCfg = $cfg$crlf"; + print $fh "\t\t{$pguid}.$c.Build.0 = $cfg$crlf" if ($buildable == 1); + print $fh "\t\t{$pguid}.$c.Deploy.0 = $cfg$crlf" if ($deployable == 1); + } + } + + ## If this is a mixed language workspace, we need to explicitly + ## enable the building of the non-C++ projects when any platform + ## other than Any CPU/.NET is selected. + if (defined $anycpu) { + my %printed; + foreach my $c (sort @cfgs) { + if ($c =~ /(.+\|)/) { + my $cfg = $1; + foreach my $remainder (sort keys %all_configs) { + if (index($remainder, $cfg) == 0) { + if (!$printed{$pguid.$remainder}) { + print $fh "\t\t{$pguid}.$remainder.ActiveCfg = $c$crlf", + "\t\t{$pguid}.$remainder.Build.0 = $c$crlf"; + $printed{$pguid.$remainder} = 1; + } + } + } + } + print $fh "\t\t{$pguid}.$c.ActiveCfg = $c$crlf", + "\t\t{$pguid}.$c.Build.0 = $c$crlf"; + } + } + else { + ## Non-C++ projects have no configurations + if (!defined $cfgs[0]) { + foreach my $c (sort keys %configs) { + my $cfg = $c . '|.NET'; + print $fh "\t\t{$pguid}.$c.ActiveCfg = $cfg$crlf", + "\t\t{$pguid}.$c.Build.0 = $cfg$crlf"; + } + } + } + } + print $fh "\tEndGlobalSection$crlf"; + + $self->print_additional_sections($fh); + + print $fh "EndGlobal$crlf"; +} + + +sub adjust_names { + my($self, $name, $proj, $lang) = @_; + $proj =~ s/\//\\/g; + return $name, $proj; +} + + +sub get_short_config_name { + my($self, $cfg) = @_; + $cfg =~ s/\|.*//; + return $cfg; +} + + +sub get_solution_config_section_name { + #my $self = shift; + return 'SolutionConfiguration'; +} + + +sub get_project_config_section_name { + #my $self = shift; + return 'ProjectConfiguration'; +} + + +sub print_additional_sections { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + print $fh "\tGlobalSection(ExtensibilityGlobals) = postSolution$crlf", + "\tEndGlobalSection$crlf", + "\tGlobalSection(ExtensibilityAddIns) = postSolution$crlf", + "\tEndGlobalSection$crlf"; +} + + +1; diff --git a/ACE/MPC/modules/VC8ProjectCreator.pm b/ACE/MPC/modules/VC8ProjectCreator.pm new file mode 100644 index 00000000000..67de189c0d0 --- /dev/null +++ b/ACE/MPC/modules/VC8ProjectCreator.pm @@ -0,0 +1,113 @@ +package VC8ProjectCreator; + +# ************************************************************ +# Description : A VC8 Project Creator +# Author : Johnny Willemsen +# Create Date : 4/21/2004 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use VC7ProjectCreator; + +use vars qw(@ISA); +@ISA = qw(VC7ProjectCreator); + +# ************************************************************ +# Data Section +# ************************************************************ + +my %info = (Creator::cplusplus => {'ext' => '.vcproj', + 'dllexe' => 'vc8exe', + 'libexe' => 'vc8libexe', + 'dll' => 'vc8dll', + 'lib' => 'vc8lib', + 'template' => 'vc8', + }, + Creator::csharp => {'ext' => '.csproj', + 'dllexe' => 'vc8csharp', + 'libexe' => 'vc8csharp', + 'dll' => 'vc8csharp', + 'lib' => 'vc8csharp', + 'template' => 'vc8csharp', + }, + Creator::java => {'ext' => '.vjsproj', + 'dllexe' => 'vc8java', + 'libexe' => 'vc8java', + 'dll' => 'vc8java', + 'lib' => 'vc8java', + 'template' => 'vc8java', + }, + Creator::vb => {'ext' => '.vbproj', + 'dllexe' => 'vc8vb', + 'libexe' => 'vc8vb', + 'dll' => 'vc8vb', + 'lib' => 'vc8vb', + 'template' => 'vc8vb', + }, + ); + +my %config = ('vcversion' => '8.00'); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub languageSupported { + return defined $info{$_[0]->get_language()}; +} + + +sub webapp_supported { + #my $self = shift; + return 1; +} + + +sub require_dependencies { + ## With vc8, they fixed it such that static libraries that depend on + ## other static libraries will not be included into the target library + ## by default. Way to go Microsoft! + return 1; +} + +sub post_file_creation { + my($self, $file) = @_; + + ## VC8 stores information in a .user file that may conflict + ## with information stored in the project file. If we have + ## created a new project file, we will remove the corresponding + ## .user file to avoid strange conflicts. + unlink("$file.user"); +} + +sub get_configurable { + #my($self, $name) = @_; + return $config{$_[1]}; +} + +sub get_info_hash { + my($self, $key) = @_; + + ## If we have the setting in our information map, the use it. + return $info{$key} if (defined $info{$key}); + + ## Otherwise, see if our parent type can take care of it. + return $self->SUPER::get_info_hash($key); +} + +sub translate_value { + my($self, $key, $val) = @_; + + ## Microsoft uses AnyCPU in the project file, but uses Any CPU in the + ## solution file. + $val = 'Any CPU' if ($key eq 'platform' && $val eq 'AnyCPU'); + + return $self->SUPER::translate_value($key, $val); +} + +1; diff --git a/ACE/MPC/modules/VC8WorkspaceCreator.pm b/ACE/MPC/modules/VC8WorkspaceCreator.pm new file mode 100644 index 00000000000..60dfd7c7187 --- /dev/null +++ b/ACE/MPC/modules/VC8WorkspaceCreator.pm @@ -0,0 +1,248 @@ +package VC8WorkspaceCreator; + +# ************************************************************ +# Description : A VC8 Workspace Creator +# Author : Johnny Willemsen +# Create Date : 4/21/2004 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use VC8ProjectCreator; +use VC71WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(VC71WorkspaceCreator); + +# ************************************************************ +# Data Section +# ************************************************************ + +my %lang_map = (Creator::cplusplus => 'Visual C#', + Creator::csharp => 'Visual C#', + Creator::vb => 'Visual Basic', + Creator::java => 'Visual J#'); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub pre_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + ## This identifies it as a Visual Studio 2005 file + print $fh '', $crlf, + 'Microsoft Visual Studio Solution File, Format Version 9.00', $crlf; + + ## Optionally print the workspace comment + $self->print_workspace_comment($fh, + '# Visual Studio 2005', $crlf, + '# $Id$', $crlf, + '#', $crlf, + '# This file was generated by MPC. Any changes made directly to', $crlf, + '# this file will be lost the next time it is generated.', $crlf, + '#', $crlf, + '# MPC Command:', $crlf, + '# ', $self->create_command_line_string($0, @ARGV), $crlf); +} + +sub post_workspace { + my($self, $fh, $creator) = @_; + my $pjs = $self->get_project_info(); + my @projects = $self->sort_dependencies($self->get_projects(), 0); + my %gmap; + + ## Store a map of the project name to project guid and whether or not + ## it is suitable to be referenced. Adding a reference to a + ## non-managed c++ library or a "utility" project causes a warning in + ## Visual Studio 2008 and higher. + foreach my $project (@projects) { + my($name, $deps, $guid, $lang, $custom_only, $nocross, $managed) = @{$$pjs{$project}}; + $gmap{$name} = [$guid, !$custom_only && ($managed || + $lang ne Creator::cplusplus)]; + } + + ## Now go through the projects and check for the need to add external + ## references. + foreach my $project (@projects) { + my $ph = new FileHandle(); + my $outdir = $self->get_outdir(); + $outdir = $self->getcwd() if ($outdir eq '.'); + if (open($ph, "$outdir/$project")) { + my $write; + my @read; + my $crlf = $self->crlf(); + my $cwd = $self->getcwd(); + my $lang = $$pjs{$project}->[3]; + my $managed = $$pjs{$project}->[6]; + + while(<$ph>) { + ## This is a comment found in vc8.mpd if the project contains the + ## 'after' keyword setting and the 'add_references' template + ## variable setting. + if (/^(\s*)<!\-\-\s+MPC\s+ADD\s+DEPENDENCIES/) { + my $spc = $1; + my $deps = $self->get_validated_ordering($project); + foreach my $dep (@$deps) { + my $relative = $self->get_relative_dep_file($creator, + "$cwd/$project", + $dep); + if (defined $relative) { + if ($lang eq Creator::cplusplus) { + ## If the current project is not managed, then we will + ## add references (although I doubt that will be useful). + ## If the current project is managed, then the reference + ## project must be managed or a non-c++ project. + if (!$managed || ($managed && $gmap{$dep}->[1])) { + push(@read, $spc . '<ProjectReference' . $crlf . + $spc . "\tReferencedProjectIdentifier=" . + "\"\{$gmap{$dep}->[0]\}\"$crlf" . + $spc . "\tRelativePathToProject=\"$relative\"$crlf" . + $spc . '/>' . $crlf); + } + } + ## This is a non-c++ language. So, it should not reference + ## unmanaged c++ libraries. If it's a managed project or + ## it's not a c++ project, it's ok to add a reference. + elsif ($gmap{$dep}->[1]) { + push(@read, $spc . '<ProjectReference Include="' . + $relative . '">' . $crlf, + $spc . ' <Project>{' . $gmap{$dep}->[0] . + '}</Project>' . $crlf, + $spc . ' <Name>' . $dep . '</Name>' . $crlf, + $spc . '</ProjectReference>' . $crlf); + } + + ## Indicate that we need to re-write the file + $write = 1; + } + } + last if (!$write); + } + else { + push(@read, $_); + } + } + close($ph); + + ## If we need to re-write the file, then do so + if ($write && open($ph, ">$outdir/$project")) { + foreach my $line (@read) { + print $ph $line; + } + close($ph); + } + } + } +} + +sub adjust_names { + my($self, $name, $proj, $lang) = @_; + + ## For websites, the project needs to be the directory of the actual + ## project file with a trailing slash. The name needs a trailing slash + ## too. + if ($lang eq Creator::website) { + $proj = $self->mpc_dirname($proj); + $proj .= '\\'; + $name .= '\\'; + } + + ## This always needs to be a path with the Windows style directory + ## separator. + $proj =~ s/\//\\/g; + return $name, $proj; +} + +sub get_short_config_name { + #my($self, $cfg) = @_; + return $_[1]; +} + +sub get_solution_config_section_name { + #my $self = shift; + return 'SolutionConfigurationPlatforms'; +} + +sub get_project_config_section_name { + #my $self = shift; + return 'ProjectConfigurationPlatforms'; +} + +sub print_additional_sections { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + print $fh "\tGlobalSection(SolutionProperties) = preSolution$crlf", + "\t\tHideSolutionNode = FALSE$crlf", + "\tEndGlobalSection$crlf"; +} + +sub allow_empty_dependencies { + #my $self = shift; + return 0; +} + +sub print_inner_project { + my($self, $fh, $gen, $currguid, $deps, $name, $name_to_guid_map, $proj_language, $cfgs) = @_; + + ## We need to perform a lot of work, but only for websites. + if ($proj_language eq Creator::website) { + my $crlf = $self->crlf(); + my $directory = ($name eq '.\\' ? + $self->get_workspace_name() . '\\' : $name); + + ## We need the directory name with no trailing back-slash for use + ## below. + my $notrail = $directory; + $notrail =~ s/\\$//; + + # Print the website project. + print $fh "\tProjectSection(WebsiteProperties) = preProject", $crlf; + + ## Print out the references + my $references; + foreach my $dep (@$deps) { + if (defined $$name_to_guid_map{$dep}) { + $references = "\t\t" . + 'ProjectReferences = "' if (!defined $references); + $references .= "{$$name_to_guid_map{$dep}}|$dep;"; + } + } + print $fh $references, '"', $crlf if (defined $references); + + ## And now the configurations + my %cfg_seen; + foreach my $config (@$cfgs) { + $config =~ s/\|.*//; + if (!$cfg_seen{$config}) { + print $fh "\t\t$config.AspNetCompiler.VirtualPath = \"/$notrail\"", $crlf, + "\t\t$config.AspNetCompiler.PhysicalPath = \"$directory\"", $crlf, + "\t\t$config.AspNetCompiler.TargetPath = \"PrecompiledWeb\\$directory\"", $crlf, + "\t\t$config.AspNetCompiler.Updateable = \"true\"", $crlf, + "\t\t$config.AspNetCompiler.ForceOverwrite = \"true\"", $crlf, + "\t\t$config.AspNetCompiler.FixedNames = \"true\"", $crlf, + "\t\t$config.AspNetCompiler.Debug = \"", + ($config =~ /debug/i ? 'True' : 'False'), "\"", $crlf; + $cfg_seen{$config} = 1; + } + } + print $fh "\t\tVWDPort = \"1573\"", $crlf, + "\t\tDefaultWebSiteLanguage = \"", + $lang_map{$self->get_language()}, "\"", $crlf, + "\tEndProjectSection", $crlf; + } + else { + # We can ignore this project and pass it to the + # SUPER since it's not a website. + $self->SUPER::print_inner_project($fh, $gen, $currguid, $deps, + $name, $name_to_guid_map); + } +} + +1; diff --git a/ACE/MPC/modules/VC9ProjectCreator.pm b/ACE/MPC/modules/VC9ProjectCreator.pm new file mode 100644 index 00000000000..fea5ee31fc4 --- /dev/null +++ b/ACE/MPC/modules/VC9ProjectCreator.pm @@ -0,0 +1,35 @@ +package VC9ProjectCreator; + +# ************************************************************ +# Description : A VC9 Project Creator +# Author : Johnny Willemsen +# Create Date : 11/22/2007 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use VC8ProjectCreator; + +use vars qw(@ISA); +@ISA = qw(VC8ProjectCreator); + +my %config = ('vcversion' => '9.00', + 'prversion' => '9.0.30729', + 'toolsversion' => '3.5', + 'xmlheader' => 1, + ); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub get_configurable { + my($self, $name) = @_; + return $config{$name}; +} + +1; diff --git a/ACE/MPC/modules/VC9WorkspaceCreator.pm b/ACE/MPC/modules/VC9WorkspaceCreator.pm new file mode 100644 index 00000000000..e0a5ba6b667 --- /dev/null +++ b/ACE/MPC/modules/VC9WorkspaceCreator.pm @@ -0,0 +1,42 @@ +package VC9WorkspaceCreator; + +# ************************************************************ +# Description : A VC9 Workspace Creator +# Author : Johnny Willemsen +# Create Date : 11/22/2007 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use VC9ProjectCreator; +use VC8WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(VC8WorkspaceCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub pre_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + print $fh '', $crlf, + 'Microsoft Visual Studio Solution File, Format Version 10.00', $crlf; + $self->print_workspace_comment($fh, + '# Visual Studio 2008', $crlf, + '# $Id$', $crlf, + '#', $crlf, + '# This file was generated by MPC. Any changes made directly to', $crlf, + '# this file will be lost the next time it is generated.', $crlf, + '#', $crlf, + '# MPC Command:', $crlf, + '# ', $self->create_command_line_string($0, @ARGV), $crlf); +} + +1; diff --git a/ACE/MPC/modules/VCProjectBase.pm b/ACE/MPC/modules/VCProjectBase.pm new file mode 100644 index 00000000000..47786b49dcd --- /dev/null +++ b/ACE/MPC/modules/VCProjectBase.pm @@ -0,0 +1,61 @@ +package VCProjectBase; + +# ************************************************************ +# Description : A VC Project base module +# Author : Chad Elliott +# Create Date : 1/4/2005 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use WinProjectBase; + +use vars qw(@ISA); +@ISA = qw(WinProjectBase); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub compare_output { + #my $self = shift; + return 1; +} + + +sub require_dependencies { + my $self = shift; + + ## Only write dependencies for non-static projects + ## and static exe projects, unless the user wants the + ## dependency combined static library. + return ($self->get_static() == 0 || $self->exe_target() || + $self->dependency_combined_static_library()); +} + + +sub dependency_is_filename { + #my $self = shift; + return 0; +} + + +sub get_properties { + my $self = shift; + + ## Get the base class properties and add the properties that we + ## support. + my $props = $self->WinProjectBase::get_properties(); + + ## All projects that use this base class are for Microsoft compilers. + $$props{'microsoft'} = 1; + + return $props; +} + + +1; diff --git a/ACE/MPC/modules/Version.pm b/ACE/MPC/modules/Version.pm new file mode 100644 index 00000000000..7edc61a50f7 --- /dev/null +++ b/ACE/MPC/modules/Version.pm @@ -0,0 +1,58 @@ +package Version; + +# ************************************************************ +# Description : Central location for the MPC version. +# Author : Chad Elliott +# Create Date : 1/5/2003 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +# ************************************************************ +# Data Section +# ************************************************************ + +## This is the starting major and minor version +my $version = '3.7'; +my $once = 1; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub get { + if ($once) { + ## We only need to do this once + $once = 0; + + ## Here we determine the beta version. The base variable + ## is the negated number of existing ChangeLog entries at the + ## time of the release of the major and minor version. We then + ## add the total number of ChangeLog entries to the base to + ## get the beta version. + my $base = -1; + if (open(CLH, ::getBasePath() . '/ChangeLog')) { + while(<CLH>) { + if (/^\w\w\w\s\w\w\w\s/) { + ++$base; + } + } + close(CLH); + + ## We then append the beta version number to the version string + $version .= ".$base"; + } + else { + $version .= '.??'; + } + } + + return $version; +} + + +1; diff --git a/ACE/MPC/modules/WB26ProjectCreator.pm b/ACE/MPC/modules/WB26ProjectCreator.pm new file mode 100644 index 00000000000..2a59f05038f --- /dev/null +++ b/ACE/MPC/modules/WB26ProjectCreator.pm @@ -0,0 +1,85 @@ +package WB26ProjectCreator; + +# ************************************************************ +# Description : Workbench 2.6 / VxWorks 6.4 generator +# Author : Johnny Willemsen +# Create Date : 07/01/2008 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use ProjectCreator; + +use vars qw(@ISA); +@ISA = qw(ProjectCreator); + +# ************************************************************ +# Data Section +# ************************************************************ + +my %templates = ('wb26' => '.project', + 'wb26wrproject' => '.wrproject', + 'wb26wrmakefile' => '.wrmakefile'); +my @tkeys = sort keys %templates; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub crlf { + #my $self = shift; + return "\n"; +} + +sub project_file_name { + my($self, $name, $template) = @_; + + ## Fill in the name and template if they weren't provided + $name = $self->project_name() if (!defined $name); + $template = 'wb26' if (!defined $template || !defined $templates{$template}); + + if ($self->{'make_coexistence'}) { + return $self->get_modified_project_file_name($name, + '/' . $templates{$template}); + } + else { + return $templates{$template}; + } +} + +sub get_template { + #my $self = shift; + return @tkeys; +} + +sub dependency_is_filename { + #my $self = shift; + return 0; +} + +sub requires_forward_slashes { + return 1; +} + +sub file_visible { + ## We only want the project file visible to the workspace creator. + ## There can only be one and this is it. + #my($self, $template) = @_; + return $_[1] eq 'wb26'; +} + +sub get_dll_exe_template_input_file { + #my $self = shift; + return 'wb26exe'; +} + +sub get_dll_template_input_file { + #my $self = shift; + return 'wb26dll'; +} + +1; diff --git a/ACE/MPC/modules/WB26WorkspaceCreator.pm b/ACE/MPC/modules/WB26WorkspaceCreator.pm new file mode 100644 index 00000000000..63ec046ca71 --- /dev/null +++ b/ACE/MPC/modules/WB26WorkspaceCreator.pm @@ -0,0 +1,204 @@ +package WB26WorkspaceCreator; + +# ************************************************************ +# Description : Workbench 2.6 / VxWorks 6.4 generator +# Author : Johnny Willemsen +# Create Date : 07/01/2008 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +use WB26ProjectCreator; +use WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(WorkspaceCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub requires_make_coexistence { + #my $self = shift; + return 1; +} + +sub supports_make_coexistence { + #my $self = shift; + return 1; +} + +sub workspace_file_name { + #my $self = shift; + return 'org.eclipse.core.resources.prefs'; +} + +sub pre_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + ## Optionally print the workspace comment + $self->print_workspace_comment($fh, + '#----------------------------------------------------------------------------', $crlf, + '# WindRiver Workbench generator', $crlf, + '#', $crlf, + '# $Id$', $crlf, + '#', $crlf, + '# This file was generated by MPC. Any changes made directly to', $crlf, + '# this file will be lost the next time it is generated.', $crlf, + '# This file should be placed in the .metadata\.plugins\org.eclipse.core.runtime\.settings directory', $crlf, + '#', $crlf, + '# MPC Command:', $crlf, + "# $0 @ARGV", $crlf, + '#----------------------------------------------------------------------------', $crlf); + + ## Unchanging initial settings + print $fh 'version=1', $crlf, + 'eclipse.preferences.version=1', $crlf, + 'description.defaultbuildorder=false', $crlf; +} + +sub write_comps { + my($self, $fh) = @_; + my $pjs = $self->get_project_info(); + my @list = $self->sort_dependencies($self->get_projects(), 0); + + ## Print out the target + print $fh 'description.buildorder='; + foreach my $project (@list) { + print $fh "$$pjs{$project}->[0]/"; + } + print $fh $self->crlf(); +} + +sub post_workspace { + my($self, $fh, $creator) = @_; + my $crlf = $self->crlf(); + + ## Clear out the seen dependency hash for use within the + ## add_dependencies method. + $self->{'seen_deps'} = {}; + + ## Print out the project dependencies + foreach my $project ($self->sort_dependencies($self->get_projects(), 0)) { + print $fh "$project$crlf"; + $self->add_dependencies($creator, $project); + } +} + +sub get_additional_output { + ## Create the accompanying list file. It always goes in the same + ## directory as the first workspace output file. See + ## WorkspaceCreator.pm for a description of the array elements. + return [[undef, 'wb26projects.lst', \&list_file_body]]; +} + +sub list_file_body { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + ## Optionally print the workspace comment + $self->print_workspace_comment($fh, + '#----------------------------------------------------------------------------', $crlf, + '# WindRiver Workbench generator', $crlf, + '#', $crlf, + '# $Id$', $crlf, + '#', $crlf, + '# This file was generated by MPC. Any changes made directly to', $crlf, + '# this file will be lost the next time it is generated.', $crlf, + '# MPC Command:', $crlf, + "# $0 @ARGV", $crlf, + '#----------------------------------------------------------------------------', $crlf); + + ## Print out each target separately + foreach my $project ($self->sort_dependencies($self->get_projects(), 0)) { + print $fh Cwd::abs_path($self->mpc_dirname($project)), '/.project', $crlf; + } +} + +sub add_dependencies { + my($self, $creator, $proj) = @_; + my $outdir = $self->mpc_dirname($proj); + + ## These values will be changed after the first time through the for + ## loop below. + my $pre = "\t\t" . '<project>'; + my $post = '</project>'; + my $outfile = $outdir . '/.project'; + + ## Go through twice to edit both the .project and .wrproject files + for(my $i = 0; $i < 2; $i++) { + my $fh = new FileHandle(); + if (open($fh, $outfile)) { + ## Get the dependencies and store them based on the directory of + ## the project file. We will check them later. + my $deps = $self->get_validated_ordering($proj); + my $key = $self->mpc_basename($self->mpc_dirname($proj)); + $self->{'seen_deps'}->{$key} = {}; + foreach my $dep (@$deps) { + $self->{'seen_deps'}->{$key}->{$dep} = 1; + } + + my @read = (); + my $cwd = $self->getcwd(); + while(<$fh>) { + ## This is a comment found in wb26.mpd and wb26wrproject.mpd if + ## the project is an executable, contains the 'after' keyword + ## setting, and the 'enable_subprojects' template variable. + if (/MPC\s+ADD\s+DEPENDENCIES/) { + my $crlf = $self->crlf(); + my %seen = (); + my @lines; + foreach my $dep (reverse @$deps) { + ## If we've seen this dependency, we don't need to add it + ## again. The build tool will handle it correctly. + if (!$seen{$dep}) { + my $relative = $self->get_relative_dep_file($creator, + "$cwd/$proj", $dep); + ## Since we're looking at the dependencies in reverse order + ## now, we need to unshift them into another array to keep + ## the correct order. + unshift(@lines, "$pre$dep$post$crlf") if (defined $relative); + + ## We've now seen this dependency and all of the + ## projects upon which this one depends. + $seen{$dep} = 1; + foreach my $key (keys %{$self->{'seen_deps'}->{$dep}}) { + $seen{$key} = 1; + } + } + } + + ## Add the dependency lines to the project file + push(@read, @lines); + } + else { + push(@read, $_); + } + } + close($fh); + + ## We will always rewrite the project file (with or without + ## dependencies). + if (open($fh, ">$outfile")) { + foreach my $line (@read) { + print $fh $line; + } + close($fh); + } + } + + ## The dependencies need to go into the .wrproject too, so transform + ## the name and the pre and post values. + $outfile = $outdir . '/.wrproject'; + $pre = ' <subproject project="/'; + $post = '"/>'; + } +} + + +1; diff --git a/ACE/MPC/modules/WinProjectBase.pm b/ACE/MPC/modules/WinProjectBase.pm new file mode 100644 index 00000000000..0ef49418d93 --- /dev/null +++ b/ACE/MPC/modules/WinProjectBase.pm @@ -0,0 +1,119 @@ +package WinProjectBase; + +# ************************************************************ +# Description : A Windows base module for Project Creators +# Author : Chad Elliott +# Create Date : 1/4/2005 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +# ************************************************************ +# Data Section +# ************************************************************ + +my $max_win_env = 'MPC_MAX_WIN_FILE_LENGTH'; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub convert_slashes { + #my $self = shift; + return 1; +} + + +sub case_insensitive { + #my $self = shift; + return 1; +} + + +sub translate_directory { + my($self, $dir) = @_; + + ## Call the base class version + $dir = $self->DirectoryManager::translate_directory($dir); + + ## Change drive letters and $() macros + $dir =~ s/^([A-Z]):/$1/i; + $dir =~ s/\$\(([^\)]+)\)/$1/g; + + ## We need to make sure that we do not exceed the maximum file name + ## limitation (including the cwd (- c:\) and object file name). So, we + ## check the total length against a predetermined "acceptable" value. + ## This acceptable value is modifiable through the environment. + my $maxenv = $ENV{$max_win_env}; + my $maxlen = (defined $maxenv && $maxenv =~ /^\d+$/ ? $maxenv : 128) + 3; + my $dirlen = length($dir); + my $diff = (length($self->getcwd()) + $dirlen + 1) - $maxlen; + + if ($diff > 0) { + if ($diff > $dirlen) { + $dir = substr($dir, $dirlen - 1); + } + else { + $dir = substr($dir, $diff); + } + while($dir =~ s/^\\//) { + } + } + + return $dir; +} + + +sub validated_directory { + my($self, $dir) = @_; + + ## $(...) could contain a drive letter and Windows can not + ## make a directory that resembles a drive letter. So, we have + ## to exclude those directories with $(...). + if ($dir =~ /\$\([^\)]+\)/ || $dir =~ /\.\.\\/ || $dir =~ /^[A-Z]:/i) { + return '.'; + } + else { + return $dir; + } +} + + +sub crlf { + return $_[0]->windows_crlf(); +} + + +sub get_cmdsep_symbol { + #my $self = shift; + return '&'; +} + + +sub file_sorter { + #my $self = shift; + #my $left = shift; + #my $right = shift; + return lc($_[1]) cmp lc($_[2]); +} + + +sub get_properties { + my $self = shift; + + ## Get the base class properties and add the properties that we + ## support. + my $props = $self->ProjectCreator::get_properties(); + + ## All projects that use this base class are for Windows. + $$props{'windows'} = 1; + + return $props; +} + + +1; diff --git a/ACE/MPC/modules/WinVersionTranslator.pm b/ACE/MPC/modules/WinVersionTranslator.pm new file mode 100644 index 00000000000..ff82a7d2a3e --- /dev/null +++ b/ACE/MPC/modules/WinVersionTranslator.pm @@ -0,0 +1,69 @@ +package WinVersionTranslator; + +# ************************************************************ +# Description : Translate the version value for Windows. +# Windows can not handle letters in the version +# and truncates anything after \d+\.\d+. We +# will convert letters to numbers, retain +# trailing numbers and everything else will be +# converted to a zero. +# +# ex. 1.4.3 => 1.403 +# 1.4a.5 => 1.4005 +# 1.4b.4 => 1.4104 +# +# Author : Chad Elliott +# Create Date : 10/7/2004 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub translate { + my $version = shift; + + ## See if the version contains something other than numbers followed by + ## a decimal point and numbers. + if ($version =~ /^(\d+\.\d+)([^\d].*)$/) { + $version = $1; + my $post = $2; + my $length = length($post); + + ## Convert the non-conforming value to all numbers + for(my $i = 0; $i < $length; ++$i) { + my $ch = substr($post, $i, 1); + if ($ch =~ /[a-z]/i) { + my $digit = ord(lc($ch)) - ord('a'); + $version .= $digit; + } + elsif ($ch =~ /\d/) { + $version .= $ch; + } + else { + $version .= '0'; + } + } + + ## If we have a good version number we need to make sure that the + ## minor version number does not exceed the value of a short unsigned + ## integer. + if ($version =~ /(\d+)\.(\d+)/) { + my($major, $minor) = ($1, $2); + $minor =~ s/^\d+\.//; + while($minor > 65535) { + $minor = substr($minor, 0, length($minor) - 1); + } + $version = $major . '.' . $minor; + } + } + return $version; +} + +1; diff --git a/ACE/MPC/modules/WinWorkspaceBase.pm b/ACE/MPC/modules/WinWorkspaceBase.pm new file mode 100644 index 00000000000..6ffd56efb40 --- /dev/null +++ b/ACE/MPC/modules/WinWorkspaceBase.pm @@ -0,0 +1,35 @@ +package WinWorkspaceBase; + +# ************************************************************ +# Description : A Windows base module for Workspace Creators +# Author : Chad Elliott +# Create Date : 2/26/2007 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub crlf { + return $_[0]->windows_crlf(); +} + + +sub convert_slashes { + #my $self = shift; + return 1; +} + +sub case_insensitive { + #my $self = shift; + return 1; +} + + +1; diff --git a/ACE/MPC/modules/WixProjectCreator.pm b/ACE/MPC/modules/WixProjectCreator.pm new file mode 100644 index 00000000000..1b349e9711b --- /dev/null +++ b/ACE/MPC/modules/WixProjectCreator.pm @@ -0,0 +1,120 @@ +package WixProjectCreator; + +# ************************************************************ +# Description : A Wix Project Creator +# Author : James H. Hill +# Create Date : 6/23/2009 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; +use ProjectCreator; +use WinProjectBase; +use XMLProjectBase; +use GUID; + +use vars qw(@ISA); +@ISA = qw(XMLProjectBase WinProjectBase ProjectCreator); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub expand_variables_from_template_values { + return 1; +} + +sub warn_useless_project { + return 0; +} + +sub convert_slashes { + return 0; +} + +sub fill_value { + my($self, $name) = @_; + + if ($name eq 'guid') { + ## Return a repeatable GUID for use within the template. The values + ## provided will be hashed and returned in a format expected by Wix. + return GUID::generate($self->project_file_name(), + $self->{'current_input'}, $self->getcwd()); + } + elsif ($name eq 'source_directory') { + my $source; + + if ($self->get_assignment('sharedname')) { + $source = $self->get_assignment('dllout'); + + if ($source eq '') { + $source = $self->get_assignment('libout'); + } + } + elsif ($self->get_assignment('staticname')) { + $source = $self->get_assignment('libout'); + } + else { + $source = $self->get_assignment('exeout'); + } + + ## Check for a variable in the source directory. We have to make + ## sure we transform this correctly for WIX by adding the correct + ## prefix. Otherwise, WIX will complain. + if (defined $source && $source =~ /.*?\$\((.+?)\).*/) { + my $prefix; + my $varname = $1; + + if ($ENV{$varname}) { + $prefix = "env"; + } + else { + $prefix = "var"; + } + + ## Add the correct prefix to the variable. + $source =~ s/$varname/$prefix.$varname/g; + } + + return $source; + } + + return undef; +} + +sub project_file_extension { + return '.wxi'; +} + + +sub get_dll_exe_template_input_file { + #my $self = shift; + return 'wix'; +} + + +sub get_lib_exe_template_input_file { + #my $self = shift; + return 'wix'; +} + + +sub get_lib_template_input_file { + #my $self = shift; + return 'wix'; +} + + +sub get_dll_template_input_file { + #my $self = shift; + return 'wix'; +} + +sub get_template { + return 'wix'; +} + +1; diff --git a/ACE/MPC/modules/WixWorkspaceCreator.pm b/ACE/MPC/modules/WixWorkspaceCreator.pm new file mode 100644 index 00000000000..60f42b39200 --- /dev/null +++ b/ACE/MPC/modules/WixWorkspaceCreator.pm @@ -0,0 +1,81 @@ +package WixWorkspaceCreator; + +# ************************************************************ +# Description : A Wix Workspace creator +# Author : James H. Hill +# Create Date : 6/23/2009 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; +use WixProjectCreator; +use WorkspaceCreator; + +use vars qw(@ISA); +@ISA = qw(WorkspaceCreator); + +# ************************************************************ +# Data Section +# ************************************************************ + + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub workspace_file_extension { + return '.wxs'; +} + +sub workspace_file_name { + my $self = shift; + return $self->get_modified_workspace_name($self->get_workspace_name(), + '.wxi'); +} + +sub pre_workspace { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + my $name = $self->get_workspace_name(); + + ## Begin the project definition for the workspace + print $fh '<?xml version="1.0" encoding="utf-8" standalone="yes"?>', $crlf, + '<Include>', $crlf; +} + +sub write_comps { + my($self, $fh) = @_; + my $crlf = $self->crlf(); + + + # print the target for clean + foreach my $project ($self->sort_dependencies($self->get_projects())) { + print $fh " <?include $project ?>", $crlf; + } +} + +sub post_workspace { + my($self, $fh) = @_; + my $info = $self->get_project_info(); + my $crlf = $self->crlf(); + + # Create a component group consisting of all the projects. + print $fh $crlf, + ' <Fragment>', $crlf, + ' <ComponentGroup Id="', + $self->get_workspace_name(), '">', $crlf; + + foreach my $project ($self->sort_dependencies($self->get_projects())) { + print $fh ' <ComponentRef Id="', + $$info{$project}->[0], '" />', $crlf; + } + + print $fh ' </ComponentGroup>', $crlf, + ' </Fragment>', $crlf, + '</Include>', $crlf; +} + +1; diff --git a/ACE/MPC/modules/WorkspaceCreator.pm b/ACE/MPC/modules/WorkspaceCreator.pm new file mode 100644 index 00000000000..0ac462340f7 --- /dev/null +++ b/ACE/MPC/modules/WorkspaceCreator.pm @@ -0,0 +1,2354 @@ +package WorkspaceCreator; + +# ************************************************************ +# Description : Base class for all workspace creators +# Author : Chad Elliott +# Create Date : 5/13/2002 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; +use FileHandle; +use File::Path; + +use Creator; +use Options; +use WorkspaceHelper; + +use vars qw(@ISA); +@ISA = qw(Creator Options); + +# ************************************************************ +# Data Section +# ************************************************************ + +my $wsext = 'mwc'; +my $wsbase = 'mwb'; + +## Valid names for assignments within a workspace +my %validNames = ('cmdline' => 1, + 'implicit' => 1, + ); + +## Singleton hash maps of project information +my %allprinfo; +my %allprojects; +my %allliblocs; + +## Global previous workspace names +my %previous_workspace_name; + +## Constant aggregated workspace type name +my $aggregated = 'aggregated_workspace'; + +my $onVMS = DirectoryManager::onVMS(); + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub new { + my($class, $global, $inc, $template, $ti, $dynamic, $static, $relative, $addtemp, $addproj, $progress, $toplevel, $baseprojs, $gfeature, $relative_f, $feature, $features, $hierarchy, $exclude, $makeco, $nmod, $applypj, $genins, $into, $language, $use_env, $expandvars, $gendot, $comments, $foreclipse) = @_; + my $self = Creator::new($class, $global, $inc, + $template, $ti, $dynamic, $static, + $relative, $addtemp, $addproj, + $progress, $toplevel, $baseprojs, + $feature, $features, + $hierarchy, $nmod, $applypj, + $into, $language, $use_env, $expandvars, + 'workspace'); + + ## These need to be reset at the end of each + ## workspace processed within a .mwc file + $self->{'workspace_name'} = undef; + $self->{'projects'} = []; + $self->{'project_info'} = {}; + $self->{'project_files'} = []; + $self->{'modified_count'} = 0; + $self->{'exclude'} = {}; + $self->{'associated'} = {}; + $self->{'scoped_assign'} = {}; + + ## These are maintained/modified throughout processing + $self->{$self->{'type_check'}} = 0; + $self->{'cacheok'} = 1; + $self->{'lib_locations'} = {}; + $self->{'reading_parent'} = []; + $self->{'global_feature_file'} = $gfeature; + $self->{'relative_file'} = $relative_f; + $self->{'project_file_list'} = {}; + $self->{'ordering_cache'} = {}; + $self->{'handled_scopes'} = {}; + $self->{'scoped_basedir'} = undef; + + ## These are static throughout processing + $self->{'coexistence'} = $self->requires_make_coexistence() ? 1 : $makeco; + $self->{'for_eclipse'} = $foreclipse; + $self->{'generate_dot'} = $gendot; + $self->{'generate_ins'} = $genins; + $self->{'verbose_ordering'} = undef; + $self->{'wctype'} = $self->extractType("$self"); + $self->{'workspace_comments'} = $comments; + + if (defined $$exclude[0]) { + my $type = $self->{'wctype'}; + if (!defined $self->{'exclude'}->{$type}) { + $self->{'exclude'}->{$type} = []; + } + push(@{$self->{'exclude'}->{$type}}, @$exclude); + $self->{'orig_exclude'} = $self->{'exclude'}; + } + else { + $self->{'orig_exclude'} = {}; + } + + ## Add a hash reference for our workspace type + if (!defined $previous_workspace_name{$self->{'wctype'}}) { + $previous_workspace_name{$self->{'wctype'}} = {}; + } + + ## Warn users about unnecessary options + if ($self->get_hierarchy() && $self->workspace_per_project()) { + $self->warning("The -hierarchy option is unnecessary " . + "for the " . $self->{'wctype'} . " type."); + } + if ($self->{'coexistence'} && !$self->supports_make_coexistence()) { + $self->warning("Using the -make_coexistence option has " . + "no effect on the " . $self->{'wctype'} . " type."); + } + return $self; +} + + +sub set_verbose_ordering { + my($self, $value) = @_; + $self->{'verbose_ordering'} = $value; +} + + +sub modify_assignment_value { + ## Workspace assignments do not need modification. + return $_[2]; +} + + +sub parse_line { + my($self, $ih, $line, $flags) = @_; + my($status, $error, @values) = $self->parse_known($line); + + ## Was the line recognized? + if ($status && defined $values[0]) { + if ($values[0] eq $self->{'grammar_type'}) { + my $name = $values[1]; + if (defined $name && $name eq '}') { + if (!defined $self->{'reading_parent'}->[0]) { + ## Fill in all the default values + $self->generate_defaults(); + + ## End of workspace; Have subclass write out the file + ## Generate the project files + my($gstat, $creator, $err) = $self->generate_project_files(); + if ($gstat) { + ($status, $error) = $self->write_workspace($creator, 1); + $self->{'assign'} = {}; + } + else { + $error = $err; + $status = 0; + } + + $self->{'modified_count'} = 0; + $self->{'workspace_name'} = undef; + $self->{'projects'} = []; + $self->{'project_info'} = {}; + $self->{'project_files'} = []; + $self->{'exclude'} = $self->{'orig_exclude'}; + $self->{'associated'} = {}; + $self->{'scoped_assign'} = {}; + } + $self->{$self->{'type_check'}} = 0; + } + else { + ## Workspace Beginning + ## Deal with the inheritance hiearchy first + if (defined $values[2]) { + foreach my $parent (@{$values[2]}) { + ## Read in the parent onto ourself + my $file = $self->search_include_path("$parent.$wsbase"); + if (!defined $file) { + $file = $self->search_include_path("$parent.$wsext"); + } + + if (defined $file) { + push(@{$self->{'reading_parent'}}, 1); + $status = $self->parse_file($file); + pop(@{$self->{'reading_parent'}}); + + $error = "Invalid parent: $parent" if (!$status); + } + else { + $status = 0; + $error = "Unable to locate parent: $parent"; + } + } + } + + ## Set up some initial values + if (defined $name) { + if ($name =~ /[\/\\]/) { + $status = 0; + $error = 'Workspaces can not have a slash ' . + 'or a back slash in the name'; + } + else { + $name =~ s/^\(\s*//; + $name =~ s/\s*\)$//; + + ## Replace any *'s with the default name + if (index($name, '*') >= 0) { + $name = $self->fill_type_name( + $name, + $self->get_default_workspace_name()); + } + + $self->{'workspace_name'} = $name; + } + } + $self->{$self->{'type_check'}} = 1; + } + } + elsif ($values[0] eq '0') { + if (defined $validNames{$values[1]}) { + $self->process_assignment($values[1], $values[2], $flags); + } + else { + $error = "Invalid assignment name: '$values[1]'"; + $status = 0; + } + } + elsif ($values[0] eq '1') { + if (defined $validNames{$values[1]}) { + ## This code only runs when there is a non-scoped assignment. As + ## such, we can safely replace all environment variables here so + ## that they are not incorrectly handled in aggregated + ## workspaces. + $self->replace_env_vars(\$values[2]) if ($values[2] =~ /\$/); + $self->process_assignment_add($values[1], $values[2], $flags); + } + else { + $error = "Invalid addition name: $values[1]"; + $status = 0; + } + } + elsif ($values[0] eq '-1') { + if (defined $validNames{$values[1]}) { + $self->process_assignment_sub($values[1], $values[2], $flags); + } + else { + $error = "Invalid subtraction name: $values[1]"; + $status = 0; + } + } + elsif ($values[0] eq 'component') { + my %copy = %{defined $flags ? $flags : $self->get_assignment_hash()}; + ($status, $error) = $self->parse_scope($ih, + $values[1], + $values[2], + \%validNames, + \%copy); + } + else { + $error = "Unrecognized line: $line"; + $status = 0; + } + } + elsif ($status == -1) { + ## If the line contains a variable, try to replace it with an actual + ## value. + $line = $self->relative($line) if (index($line, '$') >= 0); + + foreach my $expfile ($line =~ /[\?\*\[\]]/ ? $self->mpc_glob($line) : + $line) { + if ($expfile =~ /\.$wsext$/) { + my %copy = %{defined $flags ? $flags : $self->get_assignment_hash()}; + ($status, $error) = $self->aggregated_workspace($expfile, \%copy); + last if (!$status); + } + else { + push(@{$self->{'project_files'}}, $expfile); + $status = 1; + } + } + } + + return $status, $error; +} + + +sub aggregated_workspace { + my($self, $file, $flags) = @_; + my $fh = new FileHandle(); + + if (open($fh, $file)) { + my $oline = $self->get_line_number(); + my $tc = $self->{$self->{'type_check'}}; + my $ag = $self->{'handled_scopes'}->{$aggregated}; + my $psbd = $self->{'scoped_basedir'}; + my($status, $error, @values) = (0, 'No recognizable lines'); + + $self->{'handled_scopes'}->{$aggregated} = undef; + $self->set_line_number(0); + $self->{$self->{'type_check'}} = 0; + $self->{'scoped_basedir'} = $self->mpc_dirname($file); + + ## If the directory name for the file is the current directory, we + ## need to empty it out. If we don't, it will cause the file name to + ## not match up with itself later on where scoped_basedir is used. + $self->{'scoped_basedir'} = undef if ($self->{'scoped_basedir'} eq '.'); + + while(<$fh>) { + my $line = $self->preprocess_line($fh, $_); + ($status, $error, @values) = $self->parse_known($line); + + ## Was the line recognized? + if ($status) { + if (defined $values[0]) { + if ($values[0] eq $self->{'grammar_type'}) { + if (defined $values[2]) { + my $name = $self->mpc_basename($file); + $name =~ s/\.[^\.]+$//; + $status = 0; + $error = 'Aggregated workspace (' . $name . + ') can not inherit from another workspace'; + } + else { + ($status, $error) = $self->parse_scope($fh, + '', + $aggregated, + \%validNames, + $flags); + } + } + else { + $status = 0; + $error = 'Unable to aggregate ' . $file; + } + last; + } + } + else { + last; + } + } + close($fh); + + $self->{'scoped_basedir'} = $psbd; + $self->{'handled_scopes'}->{$aggregated} = $ag; + $self->{$self->{'type_check'}} = $tc; + $self->set_line_number($oline); + + return $status, $error; + } + + return 0, 'Unable to open ' . $file; +} + + +sub parse_scope { + my($self, $fh, $name, $type, $validNames, $flags, $elseflags) = @_; + + if ($type eq $self->get_default_component_name()) { + $type = $self->{'wctype'}; + } + + if ($name eq 'exclude') { + return $self->parse_exclude($fh, $type, $flags); + } + elsif ($name eq 'associate') { + return $self->parse_associate($fh, $type); + } + else { + return $self->SUPER::parse_scope($fh, $name, $type, + $validNames, $flags, $elseflags); + } +} + +sub process_types { + my($self, $typestr) = @_; + my %types; + @types{split(/\s*,\s*/, $typestr)} = (); + + ## If there is a negation at all, add our + ## current type, it may be removed below + if (index($typestr, '!') >= 0) { + $types{$self->{wctype}} = 1; + + ## Process negated exclusions + foreach my $key (keys %types) { + if ($key =~ /^!\s*(\w+)/) { + ## Remove the negated key + delete $types{$key}; + + ## Then delete the key that was negated in the exclusion. + delete $types{$1}; + } + } + } + return \%types; +} + +sub parse_exclude { + my($self, $fh, $typestr, $flags) = @_; + my $status = 0; + my $errorString = 'Unable to process exclude'; + my $negated = (index($typestr, '!') >= 0); + my @exclude; + my $types = $self->process_types($typestr); + my $count = 1; + + if (exists $$types{$self->{wctype}}) { + while(<$fh>) { + my $line = $self->preprocess_line($fh, $_); + + if ($line eq '') { + } + elsif ($line =~ /^}(.*)$/) { + --$count; + if (defined $1 && $1 ne '') { + $status = 0; + $errorString = "Trailing characters found: '$1'"; + } + else { + $status = 1; + $errorString = undef; + } + last if ($count == 0); + } + else { + if ($line =~ /^(\w+)\s*(\([^\)]+\))?\s*{$/) { + ++$count; + } + elsif ($self->parse_assignment($line, [])) { + ## Ignore all assignments + } + else { + if ($line =~ /^"([^"]+)"$/) { + $line = $1; + } + + ## If the line contains a variable, try to replace it with an + ## actual value. + $line = $self->relative($line) if (index($line, '$') >= 0); + + if (defined $self->{'scoped_basedir'} && + $self->path_is_relative($line)) { + $line = $self->{'scoped_basedir'} . '/' . $line; + } + if ($line =~ /[\?\*\[\]]/) { + push(@exclude, $self->mpc_glob($line)); + } + else { + push(@exclude, $line); + } + } + } + } + + foreach my $type (keys %$types) { + if (!defined $self->{'exclude'}->{$type}) { + $self->{'exclude'}->{$type} = []; + } + push(@{$self->{'exclude'}->{$type}}, @exclude); + } + } + else { + if ($negated) { + ($status, $errorString) = $self->SUPER::parse_scope($fh, + 'exclude', + $typestr, + \%validNames, + $flags); + } + else { + ## If this exclude block didn't match the current type and the + ## exclude wasn't negated, we need to eat the exclude block so that + ## these lines don't get included into the workspace. + while(<$fh>) { + my $line = $self->preprocess_line($fh, $_); + + if ($line =~ /^(\w+)\s*(\([^\)]+\))?\s*{$/) { + ++$count; + } + elsif ($line =~ /^}(.*)$/) { + --$count; + if (defined $1 && $1 ne '') { + $status = 0; + $errorString = "Trailing characters found: '$1'"; + } + else { + $status = 1; + $errorString = undef; + } + last if ($count == 0); + } + } + } + } + + return $status, $errorString; +} + + +sub parse_associate { + my($self, $fh, $assoc_key) = @_; + my $status = 0; + my $errorString = 'Unable to process associate'; + my $count = 1; + my @projects; + + if (!defined $self->{'associated'}->{$assoc_key}) { + $self->{'associated'}->{$assoc_key} = {}; + } + + while(<$fh>) { + my $line = $self->preprocess_line($fh, $_); + + if ($line eq '') { + } + elsif ($line =~ /^}(.*)$/) { + --$count; + if (defined $1 && $1 ne '') { + $errorString = "Trailing characters found: '$1'"; + last; + } + else { + $status = 1; + $errorString = undef; + } + last if ($count == 0); + } + else { + if ($line =~ /^(\w+)\s*(\([^\)]+\))?\s*{$/) { + ++$count; + } + elsif ($self->parse_assignment($line, [])) { + $errorString = 'Assignments are not ' . + 'allowed within an associate scope'; + last; + } + else { + if ($line =~ /^"([^"]+)"$/) { + $line = $1; + } + + ## If the line contains a variable, try to replace it with an + ## actual value. + $line = $self->relative($line) if (index($line, '$') >= 0); + + if (defined $self->{'scoped_basedir'} && + $self->path_is_relative($line)) { + $line = $self->{'scoped_basedir'} . '/' . $line; + } + if ($line =~ /[\?\*\[\]]/) { + foreach my $file ($self->mpc_glob($line)) { + $self->{'associated'}->{$assoc_key}->{$file} = 1; + } + } + else { + $self->{'associated'}->{$assoc_key}->{$line} = 1; + } + } + } + } + + return $status, $errorString; +} + + +sub excluded { + my($self, $file) = @_; + + foreach my $excluded (@{$self->{'exclude'}->{$self->{'wctype'}}}) { + return 1 if ($excluded eq $file || index($file, "$excluded/") == 0); + } + + return 0; +} + + +sub handle_scoped_end { + my($self, $type, $flags) = @_; + my $status = 1; + my $error; + + ## Replace instances of $PWD with the current directory plus the + ## scoped_basedir. We have to do it now otherwise, $PWD will be the + ## wrong directory if it's done later. + if (defined $$flags{'cmdline'} && defined $self->{'scoped_basedir'} && + index($$flags{'cmdline'}, '$PWD') >= 0) { + my $dir = $self->getcwd() . '/' . $self->{'scoped_basedir'}; + $$flags{'cmdline'} =~ s/\$PWD(\W)/$dir$1/g; + $$flags{'cmdline'} =~ s/\$PWD$/$dir/; + } + + if ($type eq $aggregated && !defined $self->{'handled_scopes'}->{$type}) { + ## Go back to the previous directory and add the directory contents + ($status, $error) = $self->handle_scoped_unknown(undef, $type, $flags, '.'); + } + + $self->{'handled_scopes'}->{$type} = undef; + return $status, $error; +} + + +sub handle_scoped_unknown { + my($self, $fh, $type, $flags, $line) = @_; + my $status = 1; + my $error; + my $dupchk; + + if ($line =~ /^\w+.*{/) { + if (defined $fh) { + my @values; + my $tc = $self->{$self->{'type_check'}}; + $self->{$self->{'type_check'}} = 1; + ($status, $error, @values) = $self->parse_line($fh, $line, $flags); + $self->{$self->{'type_check'}} = $tc; + } + else { + $status = 0; + $error = 'Unhandled line: ' . $line; + } + return $status, $error; + } + + ## If the line contains a variable, try to replace it with an actual + ## value. + $line = $self->relative($line) if (index($line, '$') >= 0); + + if (defined $self->{'scoped_basedir'}) { + if ($self->path_is_relative($line)) { + $line = $self->{'scoped_basedir'} . ($line ne '.' ? "/$line" : ''); + } + } + + ## We must build up the list of project files and use them as the + ## keys in the duplicate hash check. We need to call + ## search_for_files() because the user may have just listed + ## directories in the workspace and we need to deal with mpc files. + my @files; + $self->search_for_files($self->{'project_files'}, \@files); + my %dup; + @dup{@files} = (); + $dupchk = \%dup; + + ## If the aggregated workspace contains a scope (other than exclude) + ## it will be processed in the block above and we will eventually get + ## here, but by that time $type will no longer be $aggregated. So, + ## we just need to set it here to ensure that we don't add everything + ## in the scoped_basedir directory in handle_scoped_end() + $self->{'handled_scopes'}->{$aggregated} = 1; + + if (-d $line) { + my @files; + $self->search_for_files([ $line ], \@files, $$flags{'implicit'}); + + ## If we are generating implicit projects within a scope, then + ## we need to remove directories and the parent directories for which + ## there is an mpc file. Otherwise, the projects will be added + ## twice. + if ($$flags{'implicit'}) { + my %remove; + foreach my $file (@files) { + if ($file =~ /\.mpc$/) { + my $exc = $file; + do { + $exc = $self->mpc_dirname($exc); + $remove{$exc} = 1; + } while($exc ne '.' && $exc !~ /[a-z]:[\/\\]/i); + } + } + + my @acceptable; + foreach my $file (@files) { + push(@acceptable, $file) if (!defined $remove{$file}); + } + @files = @acceptable; + } + + foreach my $file (@files) { + if (!$self->excluded($file)) { + if (defined $dupchk && exists $$dupchk{$file}) { + $self->information("Duplicate mpc file ($file) added by an " . + 'aggregate workspace. It will be ignored.'); + } + else { + $self->{'scoped_assign'}->{$file} = $flags; + push(@{$self->{'project_files'}}, $file); + } + } + } + } + else { + foreach my $expfile ($line =~ /[\?\*\[\]]/ ? $self->mpc_glob($line) : + $line) { + if ($expfile =~ /\.$wsext$/) { + ## An aggregated workspace within an aggregated workspace or scope. + ($status, $error) = $self->aggregated_workspace($expfile, $flags); + last if (!$status); + } + else { + if (!$self->excluded($expfile)) { + if (defined $dupchk && exists $$dupchk{$expfile}) { + $self->information("Duplicate mpc file ($expfile) added by an " . + 'aggregate workspace. It will be ignored.'); + } + else { + $self->{'scoped_assign'}->{$expfile} = $flags; + push(@{$self->{'project_files'}}, $expfile); + } + } + } + } + } + $self->{'handled_scopes'}->{$type} = 1; + + return $status, $error; +} + + +sub search_for_files { + my($self, $files, $array, $impl) = @_; + my $excluded = 0; + + foreach my $file (@$files) { + if (-d $file) { + my @f = $self->generate_default_file_list( + $file, + $self->{'exclude'}->{$self->{'wctype'}}, + \$excluded); + $self->search_for_files(\@f, $array, $impl); + if ($impl) { + $file =~ s/^\.\///; + + # Strip out ^ symbols + $file =~ s/\^//g if ($onVMS); + + unshift(@$array, $file); + } + } + elsif ($file =~ /\.mpc$/) { + $file =~ s/^\.\///; + + # Strip out ^ symbols + $file =~ s/\^//g if ($onVMS); + + unshift(@$array, $file); + } + } + + return $excluded; +} + + +sub remove_duplicate_projects { + my($self, $list) = @_; + my $count = scalar(@$list); + + for(my $i = 0; $i < $count; ++$i) { + my $file = $$list[$i]; + foreach my $inner (@$list) { + if ($file ne $inner && + $file eq $self->mpc_dirname($inner) && ! -d $inner) { + splice(@$list, $i, 1); + --$count; + --$i; + last; + } + } + } +} + + +sub generate_default_components { + my($self, $files, $impl, $excluded) = @_; + my $pjf = $self->{'project_files'}; + + if (defined $$pjf[0]) { + ## If we have files, then process directories + my @built; + foreach my $file (@$pjf) { + if (!$self->excluded($file)) { + if (-d $file) { + my @found; + my @gen = $self->generate_default_file_list( + $file, + $self->{'exclude'}->{$self->{'wctype'}}); + $self->search_for_files(\@gen, \@found, $impl); + push(@built, @found); + if ($impl || $self->{'scoped_assign'}->{$file}->{'implicit'}) { + push(@built, $file); + } + } + else { + push(@built, $file); + } + } + } + + ## If the workspace is set to implicit remove duplicates from this + ## list. + $self->remove_duplicate_projects(\@built) if ($impl); + + ## Set the project files + $self->{'project_files'} = \@built; + } + else { + ## Add all of the wanted files in this directory + ## and in the subdirectories. + $excluded |= $self->search_for_files($files, $pjf, $impl); + + ## If the workspace is set to implicit remove duplicates from this + ## list. + $self->remove_duplicate_projects($pjf) if ($impl); + + ## If no files were found, then we push the empty + ## string, so the Project Creator will generate + ## the default project file. + push(@$pjf, '') if (!defined $$pjf[0] && !$excluded); + } +} + + +sub get_default_workspace_name { + my $self = shift; + my $name = $self->{'current_input'}; + + if ($name eq '') { + $name = $self->base_directory(); + } + else { + ## Since files on UNIX can have back slashes, we transform them + ## into underscores. + $name =~ s/\\/_/g; + + ## Take off the extension + $name =~ s/\.[^\.]+$//; + } + + return $name; +} + + +sub generate_defaults { + my $self = shift; + + ## Generate default workspace name + if (!defined $self->{'workspace_name'}) { + $self->{'workspace_name'} = $self->get_default_workspace_name(); + } + + ## Modify the exclude list if we have changed directory from the original + ## starting directory. Just take off the difference from the front. + my @original; + my $top = $self->getcwd() . '/'; + my $start = $self->getstartdir() . '/'; + + if ($start ne $top && $top =~ s/^$start//) { + foreach my $exclude (@{$self->{'exclude'}->{$self->{'wctype'}}}) { + push(@original, $exclude); + $exclude =~ s/^$top//; + } + } + + my $excluded = 0; + my @files = $self->generate_default_file_list( + '.', + $self->{'exclude'}->{$self->{'wctype'}}, + \$excluded); + + ## Generate default components + $self->generate_default_components(\@files, + $self->get_assignment('implicit'), + $excluded); + + ## Return the actual exclude list of we modified it + if (defined $original[0]) { + $self->{'exclude'}->{$self->{'wctype'}} = \@original; + } +} + + +sub get_workspace_name { + return $_[0]->{'workspace_name'}; +} + + +sub get_current_output_name { + return $_[0]->{'current_output'}; +} + + +sub write_and_compare_file { + my($self, $outdir, $oname, $func, @params) = @_; + my $fh = new FileHandle(); + my $error = undef; + + ## Set the output directory if one wasn't provided + $outdir = $self->get_outdir() if (!defined $outdir); + + ## Create the full name and pull off the directory. The directory + ## portion may not be the same as $outdir, since $name could possibly + ## contain a directory portion too. + my $name = "$outdir/$oname"; + my $dir = $self->mpc_dirname($name); + + ## Make the full path if necessary + mkpath($dir, 0, 0777) if ($dir ne '.'); + + ## Set the current output data member to our file's full name + $self->{'current_output'} = $name; + + if ($self->compare_output()) { + ## First write the output to a temporary file + my $tmp = "$outdir/MWC$>.$$"; + my $different = 1; + if (open($fh, ">$tmp")) { + &$func($self, $fh, @params); + close($fh); + + $different = 0 if (!$self->files_are_different($name, $tmp)); + } + else { + $error = "Unable to open $tmp for output."; + } + + if (!defined $error) { + if ($different) { + unlink($name); + $error = "Unable to open $name for output" if (!rename($tmp, $name)); + } + else { + ## There is no need to rename, so remove our temp file. + unlink($tmp); + } + } + } + else { + if (open($fh, ">$name")) { + &$func($self, $fh, @params); + close($fh); + } + else { + $error = "Unable to open $name for output."; + } + } + + return $error; +} + +sub write_workspace { + my($self, $creator, $addfile) = @_; + my $status = 1; + my $error; + my $duplicates = 0; + + if ($self->get_toplevel()) { + ## There is usually a progress indicator callback provided, but if + ## the output is being redirected, there will be no progress + ## indicator. + my $progress = $self->get_progress_callback(); + &$progress() if (defined $progress); + + if ($addfile) { + ## To be consistent across multiple project types, we disallow + ## duplicate project names for all types, not just VC6. + ## Note that these name are handled case-insensitive by VC6 + my %names; + foreach my $project (@{$self->{'projects'}}) { + my $name = lc($self->{'project_info'}->{$project}->[0]); + if (defined $names{$name}) { + ++$duplicates; + $self->error("Duplicate case-insensitive project '$name'. " . + "Look in " . $self->mpc_dirname($project) . + " and " . $self->mpc_dirname($names{$name}) . + " for project name conflicts."); + } + else { + $names{$name} = $project; + } + } + } + else { + $self->{'per_project_workspace_name'} = 1; + } + + my $name = $self->transform_file_name($self->workspace_file_name()); + + my $abort_creation = 0; + if ($duplicates > 0) { + $abort_creation = 1; + $error = "Duplicate case-insensitive project names are " . + "not allowed within a workspace."; + $status = 0; + } + else { + if (!defined $self->{'projects'}->[0]) { + $self->information('No projects were created.'); + $abort_creation = 1; + } + } + + if (!$abort_creation) { + ## Verify and possibly modify the dependencies + if ($addfile) { + $self->verify_build_ordering(); + } + + if ($addfile || !$self->file_written($name)) { + $error = $self->write_and_compare_file( + undef, $name, + sub { + my($self, $fh) = @_; + $self->pre_workspace($fh, $creator, $addfile); + $self->write_comps($fh, $creator, $addfile); + + my $wsHelper = WorkspaceHelper::get($self); + $wsHelper->perform_custom_processing($fh, $creator, $addfile); + + $self->post_workspace($fh, $creator, $addfile); + }); + if (defined $error) { + $status = 0; + } + else { + $self->add_file_written($name) if ($addfile); + } + } + + my $additional = $self->get_additional_output(); + foreach my $entry (@$additional) { + $error = $self->write_and_compare_file(@$entry); + if (defined $error) { + $status = 0; + last; + } + } + + if ($addfile && $self->{'generate_dot'}) { + my $dh = new FileHandle(); + my $wsname = $self->get_workspace_name(); + if (open($dh, ">$wsname.dot")) { + my %targnum; + my @list = $self->number_target_deps($self->{'projects'}, + $self->{'project_info'}, + \%targnum, 0); + print $dh "digraph $wsname {\n"; + foreach my $project (@{$self->{'projects'}}) { + if (defined $targnum{$project}) { + my $pname = $self->{'project_info'}->{$project}->[0]; + foreach my $number (@{$targnum{$project}}) { + print $dh " $pname -> ", + "$self->{'project_info'}->{$list[$number]}->[0];\n"; + } + } + } + print $dh "}\n"; + close($dh); + } + else { + $self->warning("Unable to write to $wsname.dot."); + } + } + } + + $self->{'per_project_workspace_name'} = undef if (!$addfile); + } + + return $status, $error; +} + + +sub save_project_info { + my($self, $gen, $gpi, $gll, $dir, $projects, $pi, $ll) = @_; + my $c = 0; + + ## For each file written + foreach my $pj (@$gen) { + ## Save the full path to the project file in the array + my $full = ($dir ne '.' ? "$dir/" : '') . $pj; + push(@$projects, $full); + + ## Get the corresponding generated project info and save it + ## in the hash map keyed on the full project file name + $$pi{$full} = $$gpi[$c]; + $c++; + } + + foreach my $key (keys %$gll) { + $$ll{$key} = $$gll{$key}; + } +} + + +sub topname { + my($self, $file) = @_; + my $dir = '.'; + my $rest = $file; + if ($file =~ /^([^\/\\]+)[\/\\](.*)/) { + $dir = $1; + $rest = $2; + } + return $dir, $rest; +} + + +sub generate_hierarchy { + my($self, $creator, $origproj, $originfo) = @_; + my $current; + my @saved; + my %sinfo; + my $cwd = $self->getcwd(); + + ## Make a copy of these. We will be modifying them. + ## It is necessary to sort the projects to get the correct ordering. + ## Projects in the current directory must come before projects in + ## other directories. + my @projects = sort { return $self->sort_projects_by_directory($a, $b) + 0; + } @{$origproj}; + my %projinfo = %{$originfo}; + + foreach my $prj (@projects) { + my($top, $rest) = $self->topname($prj); + + if (!defined $current) { + $current = $top; + push(@saved, $rest); + $sinfo{$rest} = $projinfo{$prj}; + } + elsif ($top ne $current) { + if ($current ne '.') { + ## Write out the hierachical workspace + $self->cd($current); + $self->generate_hierarchy($creator, \@saved, \%sinfo); + + $self->{'projects'} = \@saved; + $self->{'project_info'} = \%sinfo; + $self->{'workspace_name'} = $self->base_directory(); + + my($status, $error) = $self->write_workspace($creator); + $self->error($error) if (!$status); + + $self->cd($cwd); + } + + ## Start the next one + $current = $top; + @saved = ($rest); + %sinfo = (); + $sinfo{$rest} = $projinfo{$prj}; + } + else { + push(@saved, $rest); + $sinfo{$rest} = $projinfo{$prj}; + } + } + if (defined $current && $current ne '.') { + $self->cd($current); + $self->generate_hierarchy($creator, \@saved, \%sinfo); + + $self->{'projects'} = \@saved; + $self->{'project_info'} = \%sinfo; + $self->{'workspace_name'} = $self->base_directory(); + + my($status, $error) = $self->write_workspace($creator); + $self->error($error) if (!$status); + + $self->cd($cwd); + } +} + + +sub generate_project_files { + my $self = shift; + my $status = (scalar @{$self->{'project_files'}} == 0 ? 1 : 0); + my @projects; + my %pi; + my %liblocs; + my $creator = $self->project_creator(); + my $cwd = $self->getcwd(); + my $impl = $self->get_assignment('implicit'); + my $postkey = $creator->get_dynamic() . + $creator->get_static() . "-$self"; + my $previmpl = $impl; + my $prevcache = $self->{'cacheok'}; + my %gstate = $creator->save_state(); + my $genimpdep = $self->generate_implicit_project_dependencies(); + + ## Save this project creator setting for later use in the + ## number_target_deps() method. + $self->{'dependency_is_filename'} = $creator->dependency_is_filename(); + + ## Remove the address portion of the $self string + $postkey =~ s/=.*//; + + ## Set the source file callback on our project creator + $creator->set_source_listing_callback([\&source_listing_callback, $self]); + + foreach my $ofile (@{$self->{'project_files'}}) { + if (!$self->excluded($ofile)) { + my $file = $ofile; + my $dir = $self->mpc_dirname($file); + my $restore = 0; + + if (defined $self->{'scoped_assign'}->{$ofile}) { + ## Handle the implicit assignment + my $oi = $self->{'scoped_assign'}->{$ofile}->{'implicit'}; + if (defined $oi) { + $previmpl = $impl; + $impl = $oi; + } + + ## Handle the cmdline assignment + my $cmdline = $self->{'scoped_assign'}->{$ofile}->{'cmdline'}; + if (defined $cmdline && $cmdline ne '') { + ## Save the cacheok value + $prevcache = $self->{'cacheok'}; + + ## Get the current parameters and process the command line + my %parameters = $self->current_parameters(); + $self->process_cmdline($cmdline, \%parameters); + + ## Set the parameters on the creator + $creator->restore_state(\%parameters); + $restore = 1; + } + } + + ## If we are generating implicit projects and the file is a + ## directory, then we set the dir to the file and empty the file + if ($impl && -d $file) { + $dir = $file; + $file = ''; + + ## If the implicit assignment value was not a number, then + ## we will add this value to our base projects. + if ($impl !~ /^\d+$/) { + my $bps = $creator->get_baseprojs(); + push(@$bps, split(/\s+/, $impl)); + $restore = 1; + $self->{'cacheok'} = 0; + } + } + + ## Generate the key for this project file + my $prkey = $self->getcwd() . '/' . + ($file eq '' ? $dir : $file) . "-$postkey"; + + ## We must change to the subdirectory for + ## which this project file is intended + if ($self->cd($dir)) { + my $files_written = []; + my $gen_proj_info = []; + my $gen_lib_locs = {}; + if ($self->{'cacheok'} && defined $allprojects{$prkey}) { + $files_written = $allprojects{$prkey}; + $gen_proj_info = $allprinfo{$prkey}; + $gen_lib_locs = $allliblocs{$prkey}; + $status = 1; + } + else { + $status = $creator->generate($self->mpc_basename($file)); + + ## If any one project file fails, then stop + ## processing altogether. + if (!$status) { + ## We don't restore the state before we leave, + ## but that's ok since we will be exiting right now. + return $status, $creator, + "Unable to process " . ($file eq '' ? " in $dir" : $file); + } + + ## Get the individual project information and + ## generated file name(s) + $files_written = $creator->get_files_written(); + $gen_proj_info = $creator->get_project_info(); + $gen_lib_locs = $creator->get_lib_locations(); + + if ($self->{'cacheok'}) { + $allprojects{$prkey} = $files_written; + $allprinfo{$prkey} = $gen_proj_info; + $allliblocs{$prkey} = $gen_lib_locs; + } + } + $self->cd($cwd); + $self->save_project_info($files_written, $gen_proj_info, + $gen_lib_locs, $dir, + \@projects, \%pi, \%liblocs); + } + else { + ## Unable to change to the directory. + ## We don't restore the state before we leave, + ## but that's ok since we will be exiting soon. + return 0, $creator, "Unable to change directory to $dir"; + } + + ## Return things to the way they were + $impl = $previmpl if (defined $self->{'scoped_assign'}->{$ofile}); + if ($restore) { + $self->{'cacheok'} = $prevcache; + $creator->restore_state(\%gstate); + } + } + else { + ## This one was excluded, so status is ok + $status = 1; + } + } + + ## Add implict project dependencies based on source files + ## that have been used by multiple projects. If we do it here + ## before we call generate_hierarchy(), we don't have to call it + ## in generate_hierarchy() for each workspace. + $self->{'projects'} = \@projects; + $self->{'project_info'} = \%pi; + if ($status && $genimpdep) { + $self->add_implicit_project_dependencies($creator, $cwd); + } + + ## If we are generating the hierarchical workspaces, then do so + $self->{'lib_locations'} = \%liblocs; + if ($self->get_hierarchy() || $self->workspace_per_project()) { + my $orig = $self->{'workspace_name'}; + $self->generate_hierarchy($creator, \@projects, \%pi); + $self->{'workspace_name'} = $orig; + } + + ## Reset the projects and project_info + $self->{'projects'} = \@projects; + $self->{'project_info'} = \%pi; + + return $status, $creator; +} + + +sub array_contains { + my($self, $left, $right) = @_; + my %check; + + ## Initialize the hash keys with the left side array + @check{@$left} = (); + + ## Check each element on the right against the left. + foreach my $r (@$right) { + return 1 if (exists $check{$r}); + } + + return 0; +} + + +sub non_intersection { + my($self, $left, $right, $over) = @_; + my $status = 0; + my %check; + + ## Initialize the hash keys with the left side array + @check{@$left} = (); + + ## Check each element on the right against the left. + ## Store anything that isn't in the left side in the over array. + foreach my $r (@$right) { + if (exists $check{$r}) { + $status = 1; + } + else { + push(@$over, $r); + } + } + return $status; +} + + +sub indirect_dependency { + my($self, $dir, $ccheck, $cfile) = @_; + + $self->{'indirect_checked'}->{$ccheck} = 1; + if (index($self->{'project_info'}->{$ccheck}->[1], $cfile) >= 0) { + return 1; + } + else { + my $deps = $self->create_array( + $self->{'project_info'}->{$ccheck}->[1]); + foreach my $dep (@$deps) { + if (defined $self->{'project_info'}->{"$dir$dep"} && + !defined $self->{'indirect_checked'}->{"$dir$dep"} && + $self->indirect_dependency($dir, "$dir$dep", $cfile)) { + return 1; + } + } + } + + return 0; +} + + +sub add_implicit_project_dependencies { + my($self, $creator, $cwd) = @_; + my %bidir; + my %save; + + ## Take the current working directory and regular expression'ize it. + $cwd = $self->escape_regex_special($cwd); + + ## Look at each projects file list and check it against all of the + ## others. If any of the other projects file lists contains anothers + ## file, then they are dependent (due to build parallelism). So, we + ## append the dependency and remove the file in question from the + ## project so that the next time around the foreach, we don't find it + ## as a dependent on the one that we just modified. + my @pflkeys = keys %{$self->{'project_file_list'}}; + foreach my $key (@pflkeys) { + foreach my $ikey (@pflkeys) { + ## Not the same project and + ## The same directory and + ## We've not already added a dependency to this project + if ($key ne $ikey && + ($self->{'project_file_list'}->{$key}->[1] eq + $self->{'project_file_list'}->{$ikey}->[1]) && + (!defined $bidir{$ikey} || + !$self->array_contains($bidir{$ikey}, [$key]))) { + my @over; + if ($self->non_intersection( + $self->{'project_file_list'}->{$key}->[2], + $self->{'project_file_list'}->{$ikey}->[2], + \@over)) { + ## The project contains shared source files, so we need to + ## look into adding an implicit inter-project dependency. + $save{$ikey} = $self->{'project_file_list'}->{$ikey}->[2]; + $self->{'project_file_list'}->{$ikey}->[2] = \@over; + if (defined $bidir{$key}) { + push(@{$bidir{$key}}, $ikey); + } + else { + $bidir{$key} = [$ikey]; + } + my $append = $creator->translate_value('after', $key); + my $file = $self->{'project_file_list'}->{$ikey}->[0]; + my $dir = $self->{'project_file_list'}->{$ikey}->[1]; + my $cfile = $creator->translate_value('after', $ikey); + ## Remove our starting directory from the projects directory + ## to get the right part of the directory to prepend. + $dir =~ s/^$cwd[\/\\]*//; + + ## Turn the append value into a key for 'project_info' and + ## prepend the directory to the file. + my $ccheck = $append; + $ccheck =~ s/"//g; + if ($dir ne '') { + $dir .= '/'; + $ccheck = "$dir$ccheck"; + $file = "$dir$file"; + } + + ## If the append value key contains a reference to the project + ## that we were going to append the dependency value, then + ## ignore the generated dependency. It is redundant and + ## quite possibly wrong. + $self->{'indirect_checked'} = {}; + if (defined $self->{'project_info'}->{$file} && + (!defined $self->{'project_info'}->{$ccheck} || + !$self->indirect_dependency($dir, $ccheck, $cfile))) { + ## Append the dependency + $self->{'project_info'}->{$file}->[1] .= " $append"; + } + } + } + } + } + + ## Restore the modified values in case this method is called again + ## which is the case when using the -hierarchy option. + foreach my $skey (keys %save) { + $self->{'project_file_list'}->{$skey}->[2] = $save{$skey}; + } +} + + +sub get_projects { + return $_[0]->{'projects'}; +} + + +sub get_project_info { + return $_[0]->{'project_info'}; +} + + +sub get_lib_locations { + return $_[0]->{'lib_locations'}; +} + + +sub get_first_level_directory { + my($self, $file) = @_; + + if (($file =~ tr/\///) > 0) { + my $dir = $file; + $dir =~ s/^([^\/]+\/).*/$1/; + $dir =~ s/\/+$//; + return $dir; + } + + return '.'; +} + + +sub get_associated_projects { + return $_[0]->{'associated'}; +} + + +sub sort_within_group { + my($self, $list, $start, $end) = @_; + my $deps; + my %seen; + my $ccount = 0; + my $cmax = ($end - $start) + 1; + my $previ = -1; + my $prevpjs = []; + my $movepjs = []; + + ## Put the projects in the order specified + ## by the project dpendencies. + for(my $i = $start; $i <= $end; ++$i) { + ## If our moved project equals our previously moved project then + ## we count this as a possible circular dependency. + my $key = "@$list"; + if ($seen{$key} || + (defined $$movepjs[0] && defined $$prevpjs[0] && + $$movepjs[0] == $$prevpjs[0] && $$movepjs[1] == $$prevpjs[1])) { + ++$ccount; + } + else { + $ccount = 0; + } + + ## Detect circular dependencies + if ($ccount > $cmax) { + my @prjs; + foreach my $mvgr (@$movepjs) { + push(@prjs, $$list[$mvgr]); + } + my $other = $$movepjs[0] - 1; + if ($other < $start || $other == $$movepjs[1] || !defined $$list[$other]) { + $other = undef; + } + $self->warning('Circular dependency detected while processing the ' . + ($self->{'current_input'} eq '' ? + 'default' : $self->{'current_input'}) . + ' workspace. ' . + 'The following projects are involved: ' . + (defined $other ? "$$list[$other], " : '') . + join(' and ', @prjs)); + return; + } + + ## Keep track of the previous project movement + $seen{$key} = 1; + $prevpjs = $movepjs; + $movepjs = [] if ($previ < $i); + $previ = $i; + + $deps = $self->get_validated_ordering($$list[$i]); + if (defined $$deps[0]) { + my $baseproj = ($self->{'dependency_is_filename'} ? + $self->mpc_basename($$list[$i]) : + $self->{'project_info'}->{$$list[$i]}->[0]); + my $moved = 0; + foreach my $dep (@$deps) { + if ($baseproj ne $dep) { + ## See if the dependency is listed after this project + for(my $j = $i + 1; $j <= $end; ++$j) { + my $ldep = ($self->{'dependency_is_filename'} ? + $self->mpc_basename($$list[$j]) : + $self->{'project_info'}->{$$list[$j]}->[0]); + if ($ldep eq $dep) { + $movepjs = [$i, $j]; + ## If so, move it in front of the current project. + ## The original code, which had splices, didn't always + ## work correctly (especially on AIX for some reason). + my $save = $$list[$j]; + for(my $k = $j; $k > $i; --$k) { + $$list[$k] = $$list[$k - 1]; + } + $$list[$i] = $save; + + ## Mark that an entry has been moved + $moved = 1; + $j--; + } + } + } + } + --$i if ($moved); + } + } +} + + +sub build_dependency_chain { + my($self, $name, $len, $list, $ni, $glen, $groups, $map, $gdeps) = @_; + my $deps = $self->get_validated_ordering($name); + + if (defined $$deps[0]) { + foreach my $dep (@$deps) { + ## Find the item in the list that matches our current dependency + my $mapped = $$map{$dep}; + if (defined $mapped) { + for(my $i = 0; $i < $len; $i++) { + if ($$list[$i] eq $mapped) { + + ## Locate the group number to which the dependency belongs + for(my $j = 0; $j < $glen; $j++) { + if ($i >= $$groups[$j]->[0] && $i <= $$groups[$j]->[1]) { + + if ($j != $ni) { + ## Add every project in the group to the dependency chain + for(my $k = $$groups[$j]->[0]; $k <= $$groups[$j]->[1]; $k++) { + my $ldep = $self->mpc_basename($$list[$k]); + if (!exists $$gdeps{$ldep}) { + $$gdeps{$ldep} = 1; + $self->build_dependency_chain($$list[$k], + $len, $list, $j, + $glen, $groups, + $map, $gdeps); + } + } + } + last; + } + } + last; + } + } + } + + $$gdeps{$dep} = 1; + } + } +} + + +sub sort_by_groups { + my($self, $list, $grindex) = @_; + my @groups = @$grindex; + my $llen = scalar(@$list); + + ## Check for duplicates first before we attempt to sort the groups. + ## If there is a duplicate, we quietly return immediately. The + ## duplicates will be flagged as an error when creating the main + ## workspace. + my %dupcheck; + foreach my $proj (@$list) { + my $base = $self->mpc_basename($proj); + return undef if (defined $dupcheck{$base}); + $dupcheck{$base} = $proj; + } + + my %circular_checked; + for(my $gi = 0; $gi <= $#groups; ++$gi) { + ## Detect circular dependencies + if (!$circular_checked{$gi}) { + $circular_checked{$gi} = 1; + for(my $i = $groups[$gi]->[0]; $i <= $groups[$gi]->[1]; ++$i) { + my %gdeps; + $self->build_dependency_chain($$list[$i], $llen, $list, $gi, + $#groups + 1, \@groups, + \%dupcheck, \%gdeps); + if (exists $gdeps{$self->mpc_basename($$list[$i])}) { + ## There was a cirular dependency, get all of the directories + ## involved. + my %dirs; + foreach my $gdep (keys %gdeps) { + $dirs{$self->mpc_dirname($dupcheck{$gdep})} = 1; + } + + ## If the current directory was involved, translate that into + ## a directory relative to the start directory. + if (defined $dirs{'.'}) { + my $cwd = $self->getcwd(); + my $start = $self->getstartdir(); + if ($cwd ne $start) { + my $startre = $self->escape_regex_special($start); + delete $dirs{'.'}; + $cwd =~ s/^$startre[\\\/]//; + $dirs{$cwd} = 1; + } + } + + ## Display a warining to the user + my @keys = sort keys %dirs; + $self->warning('Circular directory dependency detected in the ' . + ($self->{'current_input'} eq '' ? + 'default' : $self->{'current_input'}) . + ' workspace. ' . + 'The following director' . + ($#keys == 0 ? 'y is' : 'ies are') . + ' involved: ' . join(', ', @keys)); + return; + } + } + } + + ## Build up the group dependencies + my %gdeps; + for(my $i = $groups[$gi]->[0]; $i <= $groups[$gi]->[1]; ++$i) { + my $deps = $self->get_validated_ordering($$list[$i]); + @gdeps{@$deps} = () if (defined $$deps[0]); + } + + ## Search the rest of the groups for any of the group dependencies + for(my $gj = $gi + 1; $gj <= $#groups; ++$gj) { + for(my $i = $groups[$gj]->[0]; $i <= $groups[$gj]->[1]; ++$i) { + if (exists $gdeps{$self->mpc_basename($$list[$i])}) { + ## Move this group ($gj) in front of the current group ($gi) + my @save; + for(my $j = $groups[$gi]->[1] + 1; $j <= $groups[$gj]->[1]; ++$j) { + push(@save, $$list[$j]); + } + my $offset = $groups[$gj]->[1] - $groups[$gi]->[1]; + for(my $j = $groups[$gi]->[1]; $j >= $groups[$gi]->[0]; --$j) { + $$list[$j + $offset] = $$list[$j]; + } + for(my $j = 0; $j <= $#save; ++$j) { + $$list[$groups[$gi]->[0] + $j] = $save[$j]; + } + + ## Update the group indices + my $shiftamt = ($groups[$gi]->[1] - $groups[$gi]->[0]) + 1; + for(my $j = $gi + 1; $j <= $gj; ++$j) { + $groups[$j]->[0] -= $shiftamt; + $groups[$j]->[1] -= $shiftamt; + } + my @grsave = @{$groups[$gi]}; + $grsave[0] += $offset; + $grsave[1] += $offset; + for(my $j = $gi; $j < $gj; ++$j) { + $groups[$j] = $groups[$j + 1]; + $circular_checked{$j} = $circular_checked{$j + 1}; + } + $groups[$gj] = \@grsave; + $circular_checked{$gj} = 1; + + ## Start over from the first group + $gi = -1; + + ## Exit from the outter ($gj) loop + $gj = $#groups; + last; + } + } + } + } +} + + +sub sort_dependencies { + my($self, $projects, $groups) = @_; + my @list = sort { return $self->sort_projects_by_directory($a, $b) + 0; + } @$projects; + ## The list above is sorted by directory in order to keep projects + ## within the same directory together. Otherwise, when groups are + ## created we may get multiple groups for the same directory. + + ## Put the projects in the order specified + ## by the project dpendencies. We only need to do + ## this if there is more than one element in the array. + if ($#list > 0) { + ## If the parameter wasn't passed in or it was passed in + ## and was true, sort with directory groups in mind + if (!defined $groups || $groups) { + ## First determine the individual groups + my @grindex; + my $previous = [0, undef]; + for(my $li = 0; $li <= $#list; ++$li) { + my $dir = $self->get_first_level_directory($list[$li]); + if (!defined $previous->[1]) { + $previous = [$li, $dir]; + } + elsif ($previous->[1] ne $dir) { + push(@grindex, [$previous->[0], $li - 1]); + $previous = [$li, $dir]; + } + } + push(@grindex, [$previous->[0], $#list]); + + ## Next, sort the individual groups + foreach my $gr (@grindex) { + $self->sort_within_group(\@list, @$gr) if ($$gr[0] != $$gr[1]); + } + + ## Now sort the groups as single entities + $self->sort_by_groups(\@list, \@grindex) if ($#grindex > 0); + } + else { + $self->sort_within_group(\@list, 0, $#list); + } + } + + return @list; +} + + +sub number_target_deps { + my($self, $projects, $pjs, $targets, $groups) = @_; + my @list = $self->sort_dependencies($projects, $groups); + + ## This block of code must be done after the list of dependencies + ## has been sorted in order to get the correct project numbers. + for(my $i = 0; $i <= $#list; ++$i) { + my $project = $list[$i]; + if (defined $$pjs{$project}) { + my($name, $deps) = @{$$pjs{$project}}; + if (defined $deps && $deps ne '') { + my @numbers; + my %dhash; + @dhash{@{$self->create_array($deps)}} = (); + + ## For each dependency, search in the sorted list + ## up to the point of this project for the projects + ## that this one depends on. When the project is + ## found, we put the target number in the numbers array. + for(my $j = 0; $j < $i; ++$j) { + ## If the dependency is a filename, then take the basename of + ## the project file. Otherwise, get the project name based on + ## the project file from the "project_info". + my $key = ($self->{'dependency_is_filename'} ? + $self->mpc_basename($list[$j]) : + $self->{'project_info'}->{$list[$j]}->[0]); + push(@numbers, $j) if (exists $dhash{$key}); + } + + ## Store the array in the hash keyed on the project file. + $$targets{$project} = \@numbers if (defined $numbers[0]); + } + } + } + + return @list; +} + + +sub project_target_translation { + my($self, $case) = @_; + my %map; + + ## Translate project names to avoid target collision with + ## some versions of make. + foreach my $key (keys %{$self->{'project_info'}}) { + my $dir = $self->mpc_dirname($key); + my $name = $self->{'project_info'}->{$key}->[0]; + + ## We want to compare to the upper most directory. This will be the + ## one that may conflict with the project name. + $dir =~ s/[\/\\].*//; + if (($case && $dir eq $name) || (!$case && lc($dir) eq lc($name))) { + $map{$key} = "$name-target"; + } + else { + $map{$key} = $name; + } + } + return \%map; +} + + +sub optionError { + my($self, $str) = @_; + $self->warning("$self->{'current_input'}: $str.") if (defined $str); +} + + +sub process_cmdline { + my($self, $cmdline, $parameters) = @_; + + ## It's ok to use the cache + $self->{'cacheok'} = 1; + + if (defined $cmdline && $cmdline ne '') { + my $args = $self->create_array($cmdline); + + ## Look for environment variables + foreach my $arg (@$args) { + $self->replace_env_vars(\$arg) if ($arg =~ /\$/); + } + + my $options = $self->options('MWC', {}, 0, @$args); + if (defined $options) { + foreach my $key (keys %$options) { + my $type = $self->is_set($key, $options); + + if (!defined $type) { + ## This option was not used, so we ignore it + } + elsif ($type eq 'ARRAY') { + push(@{$parameters->{$key}}, @{$options->{$key}}); + } + elsif ($type eq 'HASH') { + foreach my $hk (keys %{$options->{$key}}) { + $parameters->{$key}->{$hk} = $options->{$key}->{$hk}; + } + } + elsif ($type eq 'SCALAR') { + $parameters->{$key} = $options->{$key}; + } + } + + ## Some option data members are named consistently with the MPC + ## option name. In this case, we can use this foreach loop. + foreach my $consistent_opt ('exclude', 'for_eclipse', 'gendot', + 'gfeature_file', 'into', + 'make_coexistence', 'recurse') { + ## Issue warnings for the options provided by the user + if ($self->is_set($consistent_opt, $options)) { + $self->optionError("-$consistent_opt is ignored"); + } + } + + ## For those that are inconsistent, we have special code to deal + ## with them. + if ($self->is_set('reldefs', $options)) { + $self->optionError('-noreldefs is ignored'); + } + + ## Make sure no input files were specified (we can't handle it). + if (defined $options->{'input'}->[0]) { + $self->optionError('Command line files ' . + 'specified in a workspace are ignored'); + } + + ## Determine if it's ok to use the cache + my @cacheInvalidating = ('global', 'include', 'baseprojs', + 'template', 'ti', 'relative', 'language', + 'addtemp', 'addproj', 'feature_file', + 'features', 'use_env', 'expand_vars'); + foreach my $key (@cacheInvalidating) { + if ($self->is_set($key, $options)) { + $self->{'cacheok'} = 0; + last; + } + } + } + } +} + + +sub current_parameters { + my $self = shift; + my %parameters = $self->save_state(); + + ## We always want the project creator to generate a toplevel + $parameters{'toplevel'} = 1; + return %parameters; +} + + +sub project_creator { + my $self = shift; + my $str = "$self"; + + ## NOTE: If the subclassed WorkspaceCreator name prefix does not + ## match the name prefix of the ProjectCreator, this code + ## will not work and the subclassed WorkspaceCreator will + ## need to override this method. + + $str =~ s/Workspace/Project/; + $str =~ s/=HASH.*//; + + ## Set up values for each project creator + ## If we have command line arguments in the workspace, then + ## we process them before creating the project creator + my $cmdline = $self->get_assignment('cmdline'); + my %parameters = $self->current_parameters(); + $self->process_cmdline($cmdline, \%parameters); + + ## Create the new project creator with the updated parameters + return $str->new($parameters{'global'}, + $parameters{'include'}, + $parameters{'template'}, + $parameters{'ti'}, + $parameters{'dynamic'}, + $parameters{'static'}, + $parameters{'relative'}, + $parameters{'addtemp'}, + $parameters{'addproj'}, + $parameters{'progress'}, + $parameters{'toplevel'}, + $parameters{'baseprojs'}, + $self->{'global_feature_file'}, + $parameters{'relative_file'}, + $parameters{'feature_file'}, + $parameters{'features'}, + $parameters{'hierarchy'}, + $self->{'exclude'}->{$self->{'wctype'}}, + $self->make_coexistence(), + $parameters{'name_modifier'}, + $parameters{'apply_project'}, + $self->{'generate_ins'} || $parameters{'genins'}, + $self->get_into(), + $parameters{'language'}, + $parameters{'use_env'}, + $parameters{'expand_vars'}, + $self->{'gendot'}, + $parameters{'comments'}, + $self->{'for_eclipse'}); +} + + +sub sort_files { + #my $self = shift; + return 0; +} + + +sub make_coexistence { + return $_[0]->{'coexistence'}; +} + + +sub get_modified_workspace_name { + my($self, $name, $ext, $nows) = @_; + my $nmod = $self->get_name_modifier(); + my $oname = $name; + + if (defined $nmod) { + $nmod =~ s/\*/$name/g; + $name = $nmod; + } + + ## If this is a per project workspace, then we should not + ## modify the workspace name. It may overwrite another workspace + ## but that's ok, it will only be a per project workspace. + ## Also, if we don't want the workspace name attached ($nows) then + ## we just return the name plus the extension. + return "$name$ext" if ($nows || $self->{'per_project_workspace_name'}); + + my $pwd = $self->getcwd(); + my $type = $self->{'wctype'}; + my $wsname = $self->get_workspace_name(); + + if (!defined $previous_workspace_name{$type}->{$pwd}) { + $previous_workspace_name{$type}->{$pwd} = $wsname; + $self->{'current_workspace_name'} = undef; + } + else { + my $prefix = ($oname eq $wsname ? $name : "$name.$wsname"); + $previous_workspace_name{$type}->{$pwd} = $wsname; + while($self->file_written("$prefix" . + ($self->{'modified_count'} > 0 ? + ".$self->{'modified_count'}" : '') . + "$ext")) { + ++$self->{'modified_count'}; + } + $self->{'current_workspace_name'} = + "$prefix" . ($self->{'modified_count'} > 0 ? + ".$self->{'modified_count'}" : '') . "$ext"; + } + + return (defined $self->{'current_workspace_name'} ? + $self->{'current_workspace_name'} : "$name$ext"); +} + + +sub generate_recursive_input_list { + my($self, $dir, $exclude) = @_; + return $self->extension_recursive_input_list($dir, $exclude, $wsext); +} + + +sub verify_build_ordering { + my $self = shift; + foreach my $project (@{$self->{'projects'}}) { + $self->get_validated_ordering($project); + } +} + + +sub get_validated_ordering { + my($self, $project) = @_; + my $deps; + + if (defined $self->{'ordering_cache'}->{$project}) { + $deps = $self->{'ordering_cache'}->{$project}; + } + else { + $deps = []; + if (defined $self->{'project_info'}->{$project}) { + my($name, $dstr) = @{$self->{'project_info'}->{$project}}; + if (defined $dstr && $dstr ne '') { + $deps = $self->create_array($dstr); + my $dlen = scalar(@$deps); + for(my $i = 0; $i < $dlen; $i++) { + my $dep = $$deps[$i]; + my $found = 0; + ## Avoid circular dependencies + if ($dep ne $name && $dep ne $self->mpc_basename($project)) { + foreach my $p (@{$self->{'projects'}}) { + if ($dep eq $self->{'project_info'}->{$p}->[0] || + $dep eq $self->mpc_basename($p)) { + $found = 1; + last; + } + } + if (!$found) { + if ($self->{'verbose_ordering'}) { + $self->warning("'$name' references '$dep' which has " . + "not been processed."); + } + splice(@$deps, $i, 1); + --$dlen; + --$i; + } + } + else { + ## If a project references itself, we must remove it + ## from the list of dependencies. + splice(@$deps, $i, 1); + --$dlen; + --$i; + } + } + } + + $self->{'ordering_cache'}->{$project} = $deps; + } + } + + return $deps; +} + + +sub source_listing_callback { + my($self, $project_file, $project_name, $list) = @_; + $self->{'project_file_list'}->{$project_name} = [ $project_file, + $self->getcwd(), $list ]; +} + + +sub sort_projects_by_directory { + my($self, $left, $right) = @_; + my $sa = index($left, '/'); + my $sb = index($right, '/'); + + if ($sa >= 0 && $sb == -1) { + return 1; + } + elsif ($sb >= 0 && $sa == -1) { + return -1; + } + return $left cmp $right; +} + + +sub get_relative_dep_file { + my($self, $creator, $project, $dep) = @_; + + ## If the dependency is a filename, we have to find the key that + ## matches the project file. + if ($creator->dependency_is_filename()) { + foreach my $key (keys %{$self->{'project_file_list'}}) { + if ($self->{'project_file_list'}->{$key}->[0] eq $dep) { + $dep = $key; + last; + } + } + } + + if (defined $self->{'project_file_list'}->{$dep}) { + my $base = $self->{'project_file_list'}->{$dep}->[1]; + my @dirs = grep(!/^$/, split('/', $base)); + my $last = -1; + $project =~ s/^\///; + for(my $i = 0; $i <= $#dirs; $i++) { + my $dir = $dirs[$i]; + if ($project =~ s/^$dir\///) { + $last = $i; + } + else { + last; + } + } + + my $dependee = $self->{'project_file_list'}->{$dep}->[0]; + if ($last == -1) { + return $base . '/' . $dependee; + } + else { + my $built = ''; + for(my $i = $last + 1; $i <= $#dirs; $i++) { + $built .= $dirs[$i] . '/'; + } + $built .= $dependee; + my $dircount = ($project =~ tr/\///); + return ('../' x $dircount) . $built; + } + } + return undef; +} + + +sub create_command_line_string { + my $self = shift; + my @args = @_; + my $str; + + foreach my $arg (@args) { + $arg =~ s/^\-\-/-/; + if ($arg =~ /\$/ && $^O ne 'MSWin32') { + ## If we're not running on Windows and the command line argument + ## contains a dollar sign, we need to wrap the argument in single + ## quotes so that the UNIX shell does not interpret it. + $arg = "'$arg'"; + } + else { + ## Unfortunately, the Windows command line shell does not + ## understand single quotes correctly. So, we have the distinction + ## above and handle dollar signs here too. + $arg = "\"$arg\"" if ($arg =~ /[\s\*\$]/); + } + if (defined $str) { + $str .= " $arg"; + } + else { + $str = $arg; + } + } + return $str; +} + + +sub print_workspace_comment { + my $self = shift; + my $fh = shift; + + if ($self->{'workspace_comments'}) { + foreach my $line (@_) { + print $fh $line; + } + } +} + + +sub get_initial_relative_values { + my $self = shift; + return $self->get_relative(), $self->get_expand_vars(); +} + + +sub get_secondary_relative_values { + return \%ENV, $_[0]->get_expand_vars(); +} + + +sub convert_all_variables { + #my $self = shift; + return 1; +} + + +sub workspace_file_name { + my $self = shift; + return $self->get_modified_workspace_name($self->get_workspace_name(), + $self->workspace_file_extension()); +} + + +sub relative { + my $self = shift; + my $line = $self->SUPER::relative(shift); + $line =~ s/\\/\//g; + return $line; +} + +# ************************************************************ +# Virtual Methods To Be Overridden +# ************************************************************ + +sub requires_make_coexistence { + #my $self = shift; + return 0; +} + + +sub supports_make_coexistence { + #my $self = shift; + return 0; +} + + +sub generate_implicit_project_dependencies { + #my $self = shift; + return 0; +} + + +sub workspace_file_extension { + #my $self = shift; + return ''; +} + + +sub workspace_per_project { + #my $self = shift; + return 0; +} + + +sub pre_workspace { + #my $self = shift; + #my $fh = shift; + #my $creator = shift; + #my $top = shift; +} + + +sub write_comps { + #my $self = shift; + #my $fh = shift; + #my $creator = shift; + #my $top = shift; +} + + +sub post_workspace { + #my $self = shift; + #my $fh = shift; + #my $creator = shift; + #my $top = shift; +} + +sub requires_forward_slashes { + #my $self = shift; + return 0; +} + +sub get_additional_output { + #my $self = shift; + + ## This method should return an array reference of array references. + ## For each entry, the array should be laid out as follows: + ## [ <directory or undef to use the current output directory>, + ## <file name>, + ## <function to write body of file, $self and $fh are first params>, + ## <optional additional parameter 1>, + ## ..., + ## <optional additional parameter N> + ## ] + return []; +} + +1; diff --git a/ACE/MPC/modules/WorkspaceHelper.pm b/ACE/MPC/modules/WorkspaceHelper.pm new file mode 100644 index 00000000000..58ff37efdd5 --- /dev/null +++ b/ACE/MPC/modules/WorkspaceHelper.pm @@ -0,0 +1,88 @@ +package WorkspaceHelper; + +# ************************************************************ +# Description : Base class and factory for all workspace helpers +# Author : Chad Elliott +# Create Date : 9/01/2004 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +# ************************************************************ +# Data Section +# ************************************************************ + +my %required; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub get { + my $type = shift; + + ## Create the helper name + $type =~ s/Creator/Helper/; + $type =~ s/=HASH.*//; + + ## If we can find a helper with this name, we will + ## create a singleton of that type and return it. + if (!$required{$type}) { + foreach my $inc (@INC) { + if (-r "$inc/$type.pm") { + require "$type.pm"; + $required{$type} = $type->new(); + last; + } + } + + ## If we can't find the helper, we just create an + ## empty helper and return that. + $required{$type} = new WorkspaceHelper() if (!$required{$type}); + } + + return $required{$type}; +} + + +sub new { + my $class = shift; + return bless {}, $class; +} + + +sub modify_value { + my($self, $name, $value) = @_; + return $value; +} + + +sub modify_libpath { + #my $self = shift; + #my $str = shift; + #my $reldir = shift; + #my $libname = shift; + return undef; +} + + +sub write_settings { + #my $self = shift; + #my $fh = shift; + #my @locals = @_; + return 1, undef; +} + + +sub perform_custom_processing { + #my $self = shift; + #my $fh = shift; + #my $creator = shift; + #my $toplevel = shift; +} + +1; diff --git a/ACE/MPC/modules/XMLProjectBase.pm b/ACE/MPC/modules/XMLProjectBase.pm new file mode 100644 index 00000000000..355c76055bd --- /dev/null +++ b/ACE/MPC/modules/XMLProjectBase.pm @@ -0,0 +1,49 @@ +package XMLProjectBase; + +# ************************************************************ +# Description : An XML base module for Project Creators +# Author : Chad Elliott +# Create Date : 1/30/2006 +# ************************************************************ + +# ************************************************************ +# Pragmas +# ************************************************************ + +use strict; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub get_quote_symbol { + #my $self = shift; + return '"'; +} + + +sub get_escaped_quote_symbol { + #my $self = shift; + return '\\"'; +} + + +sub get_gt_symbol { + #my $self = shift; + return '>'; +} + + +sub get_lt_symbol { + #my $self = shift; + return '<'; +} + + +sub get_and_symbol { + #my $self = shift; + return '&&'; +} + + +1; diff --git a/ACE/MPC/mpc.pl b/ACE/MPC/mpc.pl new file mode 100755 index 00000000000..33ff7bc5c24 --- /dev/null +++ b/ACE/MPC/mpc.pl @@ -0,0 +1,46 @@ +#! /usr/bin/perl +eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' + & eval 'exec perl -w -S $0 $argv:q' + if 0; + +# ****************************************************************** +# Author: Chad Elliott +# Date: 6/17/2002 +# $Id$ +# ****************************************************************** + +# ****************************************************************** +# Pragma Section +# ****************************************************************** + +require 5.006; + +use strict; +use FindBin; +use File::Spec; +use File::Basename; + +my $basePath = $FindBin::RealBin; +my $baseName = $FindBin::RealScript; +if ($^O eq 'VMS') { + $basePath = File::Spec->rel2abs(dirname($0)) if ($basePath eq ''); + $basePath = VMS::Filespec::unixify($basePath); +} +unshift(@INC, $basePath . '/modules'); + +require Driver; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub getBasePath { + return $basePath; +} + +# ************************************************************ +# Main Section +# ************************************************************ + +my $driver = new Driver($basePath, Driver::projects()); +exit($driver->run(@ARGV)); diff --git a/ACE/MPC/mwc.pl b/ACE/MPC/mwc.pl new file mode 100755 index 00000000000..3697ddb3a5c --- /dev/null +++ b/ACE/MPC/mwc.pl @@ -0,0 +1,46 @@ +#! /usr/bin/perl +eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' + & eval 'exec perl -w -S $0 $argv:q' + if 0; + +# ****************************************************************** +# Author: Chad Elliott +# Date: 6/17/2002 +# $Id$ +# ****************************************************************** + +# ****************************************************************** +# Pragma Section +# ****************************************************************** + +require 5.006; + +use strict; +use FindBin; +use File::Spec; +use File::Basename; + +my $basePath = $FindBin::RealBin; +my $baseName = $FindBin::RealScript; +if ($^O eq 'VMS') { + $basePath = File::Spec->rel2abs(dirname($0)) if ($basePath eq ''); + $basePath = VMS::Filespec::unixify($basePath); +} +unshift(@INC, $basePath . '/modules'); + +require Driver; + +# ************************************************************ +# Subroutine Section +# ************************************************************ + +sub getBasePath { + return $basePath; +} + +# ************************************************************ +# Main Section +# ************************************************************ + +my $driver = new Driver($basePath, Driver::workspaces()); +exit($driver->run(@ARGV)); diff --git a/ACE/MPC/prj_install.pl b/ACE/MPC/prj_install.pl new file mode 100755 index 00000000000..0de224abe05 --- /dev/null +++ b/ACE/MPC/prj_install.pl @@ -0,0 +1,402 @@ +#! /usr/bin/perl +eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' + & eval 'exec perl -w -S $0 $argv:q' + if 0; + +# ****************************************************************** +# Author: Chad Elliott +# Create Date: 3/09/2004 +# $Id$ +# ****************************************************************** + +# ****************************************************************** +# Pragma Section +# ****************************************************************** + +use strict; +use Cwd; +use FileHandle; +use File::Copy; +use File::Basename; + +# ****************************************************************** +# Data Section +# ****************************************************************** + +my $insext = 'ins'; +my $version = '1.9'; +my %defaults = ('header_files' => 1, + 'idl_files' => 1, + 'inline_files' => 1, + 'pidl_files' => 1, + 'template_files' => 1, + 'mpb_files' => 1, + ); + +my %special = ('exe_output' => 1, + 'lib_output' => 1, + ); + +my %actual; +my %base; +my %override; +my $keepgoing = 0; + +eval 'symlink("", "");'; +my $hasSymlink = ($@ eq ''); + +# ****************************************************************** +# Subroutine Section +# ****************************************************************** + +sub rm_updirs { + my $path = shift; + my @parts = split(/[\/\\]/, $path); + + ## Split the path into parts and check for '..'. If we find one + ## and the previous entry wasn't one, then we can remove them both. + for(my $i = 0; $i <= $#parts; $i++) { + if ($i > 0 && $parts[$i] eq '..' && $parts[$i - 1] ne '..') { + splice(@parts, $i - 1, 2); + $i -= 2; + } + } + return join('/', @parts); +} + +sub copyFiles { + my($files, $insdir, $symlink, $verbose) = @_; + my $type = ($symlink ? 'link' : 'copy'); + my $cwd = getcwd(); + + foreach my $file (@$files) { + my $dest = rm_updirs($insdir . '/' . + (defined $actual{$file} ? + "$actual{$file}/" . + basename($file) : $file)); + my $fulldir = dirname($dest); + if (! -d $fulldir) { + my $tmp = ''; + foreach my $part (split(/[\/\\]/, $fulldir)) { + $tmp .= $part . '/'; + mkdir($tmp, 0755); + } + } + + if (! -e $dest || (-M $file) < (-M $dest)) { + if ($verbose) { + print '', ($symlink ? 'Linking' : 'Copying'), " to $dest\n"; + } + my $status; + if ($symlink) { + unlink($dest); + $status = symlink("$cwd/$file", $dest); + } + else { + $status = copy($file, $dest); + chmod(0755, $dest) if ($status && -x $file); + } + if (!$status) { + print STDERR "ERROR: Unable to $type $file to $dest\n"; + if (!$keepgoing) { + return 0; + } + } + } + else { + print "Skipping $file\n" if ($verbose); + } + } + return 1; +} + + +sub determineSpecialName { + my($tag, $dir, $info) = @_; + + my($insdir, $name) = split(/\s+/, $info); + if (defined $name) { + $insdir .= '/'; + } + else { + $name = $insdir; + $insdir = ''; + } + + my $odir = ($dir eq '' ? '.' : $dir) . '/' . $insdir; + if ($tag eq 'exe_output') { + my @exes; + my $fh = new FileHandle(); + if (opendir($fh, $odir)) { + foreach my $file (grep(!/^\.\.?$/, readdir($fh))) { + if ($file =~ /^$name$/ || + $file =~ /^$name.*\.exe$/i) { + push(@exes, "$dir$insdir$file"); + } + } + closedir($fh); + } + return @exes; + } + elsif ($tag eq 'lib_output') { + my @libs; + my $fh = new FileHandle(); + if (opendir($fh, $odir)) { + foreach my $file (grep(!/^\.\.?$/, readdir($fh))) { + if ($file =~ /^lib$name\.(a|so|sl)/ || + $file =~ /^(lib)?$name.*\.(dll|lib)$/i) { + push(@libs, "$dir$insdir$file"); + } + } + closedir($fh); + } + return @libs; + } + + return "$dir$name"; +} + + +sub replaceVariables { + my $line = shift; + while($line =~ /(\$\(([^)]+)\))/) { + my $whole = $1; + my $name = $2; + my $val = (defined $ENV{$name} ? $ENV{$name} : ''); + $line =~ s/\$\([^)]+\)/$val/; + } + return $line; +} + + +sub loadInsFiles { + my($files, $tags, $verbose) = @_; + my $fh = new FileHandle(); + my @copy; + + foreach my $file (@$files) { + if (open($fh, $file)) { + if ($verbose) { + print "Loading $file\n"; + } + my $base = dirname($file); + if ($base eq '.') { + $base = ''; + } + else { + $base =~ s/^\.[\/\\]+//; + $base .= '/'; + } + + my $current; + while(<$fh>) { + my $line = $_; + $line =~ s/^\s+//; + $line =~ s/\s+$//; + + if ($line ne '') { + if ($line =~ /^(\w+):$/) { + if (defined $$tags{$1}) { + $current = $1; + } + else { + $current = undef; + } + } + elsif (defined $current) { + $line = replaceVariables($line); + my $start = $#copy + 1; + if (defined $special{$current}) { + push(@copy, determineSpecialName($current, $base, $line)); + } + else { + push(@copy, "$base$line"); + } + if (defined $override{$current}) { + for(my $i = $start; $i <= $#copy; ++$i) { + $actual{$copy[$i]} = $override{$current}; + } + } + elsif (defined $base{$current}) { + for(my $i = $start; $i <= $#copy; ++$i) { + $actual{$copy[$i]} = $base{$current} . '/' . + dirname($copy[$i]); + } + } + } + } + } + close($fh); + } + else { + print STDERR "Unable to open $file\n"; + return (); + } + } + + return @copy; +} + + +sub getInsFiles { + my $file = shift; + my @files; + + if (-d $file) { + my $fh = new FileHandle(); + if (opendir($fh, $file)) { + foreach my $f (grep(!/^\.\.?$/, readdir($fh))) { + push(@files, getInsFiles("$file/$f")); + } + closedir($fh); + } + } + elsif ($file =~ /\.$insext$/) { + push(@files, $file); + } + return @files; +} + + +sub usageAndExit { + my $msg = shift; + + print STDERR "$msg\n" if (defined $msg); + + my $base = basename($0); + my $spc = ' ' x (length($base) + 8); + print STDERR "$base v$version\n", + "Usage: $base [-a tag1[,tagN]] [-b tag=dir] ", + ($hasSymlink ? '[-l] ' : ''), "[-o tag=dir]\n", + $spc, "[-s tag1[,tagN]] [-v] [-k] [install directory]\n", + $spc, "[$insext files or directories]\n\n", + "Install files matching the tag specifications found ", + "in $insext files.\n\n", + "-a Adds to the default set of tags that get copied.\n", + "-b Install tag into dir underneath the install directory.\n", + "-k Keep going if a file to be copied is missing.\n", + ($hasSymlink ? "-l Use symbolic links instead of copying.\n" : ''), + "-o Install tag into dir.\n", + "-s Sets the tags that get copied.\n", + "-v Enables verbose mode.\n", + "\n", + "The default set of tags are:\n"; + my $first = 1; + foreach my $key (sort keys %defaults) { + print STDERR '', ($first ? '' : ', '), $key; + $first = 0; + } + print STDERR "\n"; + + exit(0); +} + +# ****************************************************************** +# Main Section +# ****************************************************************** + +my $verbose; +my $first = 1; +my $insdir; +my $symlink; +my @insfiles; +my %tags = %defaults; + +for(my $i = 0; $i <= $#ARGV; ++$i) { + my $arg = $ARGV[$i]; + if ($arg =~ /^-/) { + if ($arg eq '-a') { + ++$i; + if (defined $ARGV[$i]) { + foreach my $tag (split(',', $ARGV[$i])) { + $tags{$tag} = 1; + } + } + else { + usageAndExit('-a requires a parameter.'); + } + } + elsif ($arg eq '-b') { + ++$i; + if (defined $ARGV[$i]) { + if ($ARGV[$i] =~ /([^=]+)=(.*)/) { + $base{$1} = $2; + } + else { + usageAndExit("Invalid parameter to -b: $ARGV[$i]"); + } + } + else { + usageAndExit('-b requires a parameter.'); + } + } + elsif ($arg eq '-k') { + $keepgoing = 1; + } + elsif ($arg eq '-l') { + $symlink = $hasSymlink; + } + elsif ($arg eq '-o') { + ++$i; + if (defined $ARGV[$i]) { + if ($ARGV[$i] =~ /([^=]+)=(.*)/) { + $override{$1} = $2; + } + else { + usageAndExit("Invalid parameter to -o: $ARGV[$i]"); + } + } + else { + usageAndExit('-o requires a parameter.'); + } + } + elsif ($arg eq '-s') { + ++$i; + if (defined $ARGV[$i]) { + %tags = (); + foreach my $tag (split(',', $ARGV[$i])) { + $tags{$tag} = 1; + } + } + else { + usageAndExit('-s requires a parameter.'); + } + } + elsif ($arg eq '-v') { + $verbose = 1; + } + else { + usageAndExit('Unkown option: ' . $arg); + } + } + elsif (!defined $insdir) { + $arg =~ s/\\/\//g; + $insdir = $arg; + } + else { + if ($first) { + $first = 0; + if ($verbose) { + print "Collecting $insext files...\n"; + } + } + $arg =~ s/\\/\//g; + push(@insfiles, getInsFiles($arg)); + } +} + +if (!defined $insdir) { + usageAndExit(); +} +elsif (!defined $insfiles[0]) { + print "No $insext files were found.\n"; + exit(1); +} + +my $status = 1; +my @files = loadInsFiles(\@insfiles, \%tags, $verbose); +if (defined $files[0]) { + $status = (copyFiles(\@files, $insdir, $symlink, $verbose) ? 0 : 1); +} + +exit($status); diff --git a/ACE/MPC/registry.pl b/ACE/MPC/registry.pl new file mode 100755 index 00000000000..3b7f6270b0a --- /dev/null +++ b/ACE/MPC/registry.pl @@ -0,0 +1,205 @@ +#! /usr/bin/perl +eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' + & eval 'exec perl -w -S $0 $argv:q' + if 0; + +# ****************************************************************** +# Author: Chad Elliott +# Date: 12/05/2005 +# $Id$ +# ****************************************************************** + +# ****************************************************************** +# Pragma Section +# ****************************************************************** + +use strict; +use FindBin; +use FileHandle; +use File::Basename; + +# ****************************************************************** +# Data Section +# ****************************************************************** + +my $Registry; +my $MPC_ROOT = $FindBin::Bin; +$MPC_ROOT =~ s!/!\\!g; + +my $version = '1.4'; +my %types = ('nmake' => ['NMAKE', 'NMAKE'], + 'bmake' => ['Borland Make', 'Borland Make'], + 'vc6' => ['DSW', 'DSP'], + 'vc71' => ['SLN 7.1', 'VCPROJ 7.1'], + 'vc8' => ['SLN 8.0', 'VCPROJ 8.0'], + 'vc9' => ['SLN 9.0', 'VCPROJ 9.0'], + 'vc10' => ['SLN 10.0', 'VCPROJ 10.0'], + 'wix' => ['WiX', 'WiX Project'], + ); + +# ****************************************************************** +# Subroutine Section +# ****************************************************************** + +sub set_ext_icon { + my($ext, $num) = @_; + my $extf = $ext . 'file'; + $Registry->{"HKEY_CLASSES_ROOT/.$ext/"} = {'/' => $extf}; + $Registry->{"HKEY_CLASSES_ROOT/$extf/"} = {}; + $Registry->{"HKEY_CLASSES_ROOT/$extf/DefaultIcon/"} = + {'/' => "$MPC_ROOT\\MPC.ico,$num"}; +} + + +sub set_dir_command { + my($type, $desc) = @_; + my $shell = 'HKEY_CLASSES_ROOT/Directory/shell'; + my $hash = $Registry->{$shell}; + + ## If there is no shell setting, just create an empty one. However, + ## this isn't very likely. + if (!defined $hash) { + $Registry->{$shell} = {}; + $hash = $Registry->{$shell}; + } + + ## Create an entry for this project type (vc6, vc7, etc.) + my $key = 'MPC' . uc($type) . '/'; + $hash->{$key} = {'/' => "MPC -> $desc"}; + + ## Now store the command for creating a workspace for this project + ## type. + $key .= 'command/'; + $hash->{$key} = {'/' => "cmd /c \"cd %L && $MPC_ROOT\\mwc.pl -type $type -recurse || pause\""}; +} + + +sub set_mwc_command { + my($type, $desc) = @_; + my $shell = 'HKEY_CLASSES_ROOT/mwcfile/shell'; + my $hash = $Registry->{$shell}; + + ## Create the new entry for the mwc files. This is likely to not + ## exist. + if (!defined $hash) { + $Registry->{$shell} = {}; + $hash = $Registry->{$shell}; + } + + ## Create an entry for this project type (vc6, vc7, etc.) + my $key = 'MPC' . uc($type) . '/'; + $hash->{$key} = {'/' => "MPC -> $desc"}; + + ## Now store the command for creating a workspace for this project + ## type. + $key .= 'command/'; + $hash->{$key} = {'/' => "cmd /c \"$MPC_ROOT\\mwc.pl -type $type %L || pause\""}; + + ## Since MPC will create a workspace out of a directory, we want to do + ## the same thing for directories too. + set_dir_command($type, $desc); +} + + +sub set_mpc_command { + my($type, $desc) = @_; + my $shell = 'HKEY_CLASSES_ROOT/mpcfile/shell'; + my $hash = $Registry->{$shell}; + + ## Create the new entry for the mpc files. This is likely to not + ## exist. + if (!defined $hash) { + $Registry->{$shell} = {}; + $hash = $Registry->{$shell}; + } + + ## Create an entry for this project type (vc6, vc7, etc.) + my $key = 'MPC' . uc($type) . '/'; + $hash->{$key} = {'/' => "MPC -> $desc"}; + + ## Now store the command for creating a single project for this project + ## type. + $key .= 'command/'; + $hash->{$key} = {'/' => "cmd /c \"$MPC_ROOT\\mpc.pl -type $type %L || pause\""}; +} + + +sub delete_key { + my $key = shift; + my $val = $Registry->{$key}; + + ## Delete everything associated with this key (recursively traversing + ## each key). + if (UNIVERSAL::isa($val, 'HASH')) { + foreach my $k (keys %$val) { + delete_key($key . $k); + } + } + + ## Now get the key itself. + delete $Registry->{$key}; +} + +# ****************************************************************** +# Main Section +# ****************************************************************** + +if ($^O eq 'MSWin32') { + ## Pull in the registry modules and import the necessary items. + require Win32::TieRegistry; + Win32::TieRegistry->import(TiedRef => \$Registry, + Delimiter => '/'); +} +else { + ## Currently, no other registry type is supported. + print "ERROR: This script will only run on Windows.\n"; + exit(1); +} + +if (defined $ARGV[0]) { + if ($ARGV[0] eq '-r') { + ## Get rid of the MPC_ROOT environment variable. + delete $Registry->{'HKEY_CURRENT_USER/Environment/MPC_ROOT'}; + + ## Now delete all the keys that this script knows how to make. + delete_key('HKEY_CLASSES_ROOT/.mwc/'); + delete_key('HKEY_CLASSES_ROOT/mwcfile/'); + delete_key('HKEY_CLASSES_ROOT/.mpc/'); + delete_key('HKEY_CLASSES_ROOT/mpcfile/'); + delete_key('HKEY_CLASSES_ROOT/.mpb/'); + delete_key('HKEY_CLASSES_ROOT/mpbfile/'); + + foreach my $type (keys %types) { + delete_key('HKEY_CLASSES_ROOT/Directory/shell/MPC' . uc($type) . '/'); + } + + exit(0); + } + else { + print STDERR "registry v$version\n", + "Usage: ", basename($0), " [-r]\n\n", + " -r Remove MPC related registry keys.\n\n", + "Set the MPC_ROOT environment variable to the location of this script.\n", + "Also, add context menus for .mwc files and directories.\n"; + exit(0); + } +} + +## Set the MPC_ROOT environment variable. +$Registry->{'HKEY_CURRENT_USER/Environment/MPC_ROOT'} = [$MPC_ROOT, 'REG_SZ']; + +## Associate the icons with the various MPC file types. +set_ext_icon('mwc', 0); +set_ext_icon('mpc', 1); +set_ext_icon('mpb', 1); + +## Create the command settings for each type +foreach my $type (keys %types) { + set_mwc_command($type, $types{$type}->[0]); + set_mpc_command($type, $types{$type}->[1]); +} + +print "You may need to log out and then ", + "log back in for some of these settings to take effect.\n"; + +exit(0); diff --git a/ACE/MPC/rpm/MPC.spec b/ACE/MPC/rpm/MPC.spec new file mode 100644 index 00000000000..cbb6b3d3c6a --- /dev/null +++ b/ACE/MPC/rpm/MPC.spec @@ -0,0 +1,30 @@ +Summary: MPC - The Makefile, Project and Workspace Creator. +Name: MPC +Version: VERSION +Release: 0 +License: Open Software License +Group: Software Development +BuildRoot: /tmp/mpc +Source: %{name}-%{version}.tar.bz2 +URL: http://www.ociweb.com/products/mpc +Vendor: Object Computing, Inc. +Packager: PACKAGER +buildarch: noarch +%description +MPC (Make, Project and workspace Creator) is an open source tool, developed +by OCI and written in Perl. It is designed to generate a variety of tool +specific project files from a common baseline. +%defattr(-,root,root) +%pre +%prep +%setup +%build +%install +tar cf - * | (cd $RPM_BUILD_ROOT && tar xf -) +%post +ln -sf FINALDIR/mwc.pl /usr/bin +ln -sf FINALDIR/mpc.pl /usr/bin +%postun +rm -f /usr/bin/mwc.pl /usr/bin/mpc.pl +%files +FINALDIR diff --git a/ACE/MPC/rpm/buildrpm.sh b/ACE/MPC/rpm/buildrpm.sh new file mode 100755 index 00000000000..98b224d88f7 --- /dev/null +++ b/ACE/MPC/rpm/buildrpm.sh @@ -0,0 +1,96 @@ +#!/bin/sh + +# ****************************************************************** +# Author: Chad Elliott +# Date: 8/13/2009 +# Description: Create an MPC rpm based on the current version number. +# $Id$ +# ****************************************************************** + +## First find out where this script is located +if [ "$0" != "`basename $0`" ]; then + if [ "`echo $0 | cut -c1`" = "/" ]; then + loc="`dirname $0`" + else + loc="`pwd`/`dirname $0`" + fi +else + ## Do my own 'which' here + loc="." + for i in `echo $PATH | tr ':' '\012'`; do + if [ -x "$i/$0" -a ! -d "$i/$0" ]; then + loc="$i" + break + fi + done +fi + +## Now, get back to where the main MPC script is located +while [ ! -x $loc/mpc.pl ]; do + loc=`dirname $loc` +done + +## Build up the packager name and email address +if [ -z "REPLYTO" ]; then + DOMAIN=`hostname | sed 's/[^\.][^\.]*\.//'` + if [ -z "$DOMAIN" ]; then + DOMAIN=`grep '^search' /etc/resolv.conf | sed 's/.* //'` + fi + REPLYTO="$LOGNAME@$DOMAIN" +fi +PACKAGER=`grep $LOGNAME /etc/passwd | cut -d: -f5` +if [ -z "$PACKAGER" ]; then + PACKAGER=$CL_USERNAME +fi +if [ -z "$PACKAGER" ]; then + PACKAGER="<$REPLYTO>" +else + PACKAGER="$PACKAGER <$REPLYTO>" +fi + +## Save the MPC version +VERSION=`$loc/mpc.pl --version | sed 's/.*v//'` + +## This is where we'll create the spec file and do the work +WDIR=/tmp/mpc.$$ + +## This is the directory name that RPM expects +MDIR=MPC-$VERSION + +## This corresponds to BuildRoot in MPC.spec +BDIR=/tmp/mpc + +## This is the final install directory and corresponds to the %files section +## of MPC.spec +FDIR=/usr/lib/MPC + +## The directory where RPM will place the resulting file +if [ -x /usr/src/redhat ]; then + RPMLOC=/usr/src/redhat +else + RPMLOC=/usr/src/packages +fi + +## Create our working directory and make the spec file +mkdir -p $WDIR +cd $WDIR +sed "s/VERSION/$VERSION/; s/PACKAGER/$PACKAGER/; s!FINALDIR!$FDIR!" $loc/rpm/MPC.spec > MPC.spec + +## Make a copy of the original MPC source to the new directory +mkdir -p $MDIR/$FDIR +cd $loc +tar --exclude=.svn -cf - . | (cd $WDIR/$MDIR/$FDIR; tar -xf -) + +## Create the build source tar.bz2 +cd $WDIR +tar cf $RPMLOC/SOURCES/$MDIR.tar $MDIR +bzip2 -9f $RPMLOC/SOURCES/$MDIR.tar + +## Perform the RPM creation step +rm -rf $BDIR +mkdir -p $BDIR +rpmbuild -bb MPC.spec + +## Clean everything up +cd .. +rm -rf $WDIR $BDIR diff --git a/ACE/MPC/templates/automake.mpd b/ACE/MPC/templates/automake.mpd new file mode 100644 index 00000000000..d317a0eceb6 --- /dev/null +++ b/ACE/MPC/templates/automake.mpd @@ -0,0 +1,355 @@ +# @file <%project_file%> +# +# $Id$ +<%marker(top)%> +<%if(requires || avoids)%> + +<%foreach(uniq(requires))%> +if BUILD_<%uc(require)%> +<%endfor%> +<%foreach(uniq(avoids))%> +if !BUILD_<%uc(avoid)%> +<%endfor%> +<%endif%> +<%marker(macros)%> +<%if(man_files)%> + +man_MANS += <%man_files%> +<%endif%> +<%if(script_files)%> + +<%if(install_this_target)%>bin<%else%>noinst<%endif%>_SCRIPTS += <%script_files%> +<%endif%> +<%if(custom_types)%> +<%foreach(custom_types)%> +<%foreach(custom_type->input_files)%> +<%if(custom_type->input_file->output_files)%> + +BUILT_SOURCES += \ +<%foreach(output_file, sort(custom_type->input_file->output_files))%> + <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>/<%basename(output_file)%><%else%><%output_file%><%endif%><%fornotlast(" \\")%> +<%endfor%> + +CLEANFILES += \ +<%if(multiple(custom_type->input_file->output_files))%> + <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>/<%basenoextension(custom_type->input_file)%><%else%><%noextension(custom_type->input_file)%><%endif%>-stamp<%keyname_used(custom_type->input_file, first)%> \ +<%endif%> +<%foreach(output_file, sort(custom_type->input_file->output_files))%> + <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>/<%basename(output_file)%><%else%><%output_file%><%endif%><%fornotlast(" \\")%> +<%endfor%> + +<%if(multiple(custom_type->input_file->output_files))%> +<%foreach(output_file, sort(custom_type->input_file->output_files))%><%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>/<%basename(output_file)%><%else%><%output_file%><%endif%><%fornotlast(" ")%><%endfor%>: <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>/<%basenoextension(custom_type->input_file)%><%else%><%noextension(custom_type->input_file)%><%endif%>-stamp<%keyname_used(custom_type->input_file, second)%> + +<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>/<%basenoextension(custom_type->input_file)%><%else%><%noextension(custom_type->input_file)%><%endif%>-stamp<%keyname_used(custom_type->input_file, third)%>: $(srcdir)/<%custom_type->input_file%><%if(custom_type->input_file->dependencies)%><%foreach(custom_type->input_file->dependencies)%> <%scope(enter, escape, \\s)%><%custom_type->input_file->dependencie%><%scope(leave)%><%endfor%><%endif%><%if(flag_overrides(custom_type->input_file, dependent))%><%foreach(dep, flag_overrides(custom_type->input_file, dependent))%> <%scope(enter, escape, \\s)%><%dep%><%scope(leave)%><%endfor%><%else%><%if(custom_type->dependent)%><%foreach(custom_type->dependent)%> <%scope(enter, escape, \\s)%><%custom_type->dependent%><%scope(leave)%><%endfor%><%endif%><%endif%> +<%else%> +<%foreach(custom_type->input_file->output_files)%><%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>/<%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%><%fornotlast(" ")%><%endfor%>: $(srcdir)/<%custom_type->input_file%><%if(custom_type->input_file->dependencies)%><%foreach(custom_type->input_file->dependencies)%> <%scope(enter, escape, \\s)%><%custom_type->input_file->dependencie%><%scope(leave)%><%endfor%><%endif%><%if(flag_overrides(custom_type->input_file, dependent))%><%foreach(dep, flag_overrides(custom_type->input_file, dependent))%> <%scope(enter, escape, \\s)%><%dep%><%scope(leave)%><%endfor%><%else%><%if(custom_type->dependent)%><%foreach(custom_type->dependent)%> <%scope(enter, escape, \\s)%><%custom_type->dependent%><%scope(leave)%><%endfor%><%endif%><%endif%> +<%endif%> +<%if(flag_overrides(custom_type->input_file, gendir))%> + mkdir -p <%flag_overrides(custom_type->input_file, gendir)%> +<%endif%> + <%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%if(custom_type->output_option)%>$(srcdir)/<%custom_type->input_file%> <%custom_type->output_option%> <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>/<%basename(custom_type->input_file->output_files)%><%else%><%custom_type->input_file->output_files%><%endif%><%else%>$(srcdir)/<%custom_type->input_file%><%endif%> +<%if(flag_overrides(custom_type->input_file, postcommand))%> +<%foreach(custom_type->input_file)%> + <%flag_overrides(custom_type->input_file, postcommand)%> +<%endfor%> +<%else%> +<%if(custom_type->postcommand)%> +<%foreach(custom_type->input_file)%> + <%custom_type->postcommand%> +<%endfor%> +<%endif%> +<%endif%> +<%if(multiple(custom_type->input_file->output_files))%> + @touch "$@" +<%endif%> +<%endif%> +<%endfor%> +<%endfor%> +<%endif%> +<%marker(local)%> +<%if(exename || sharedname || staticname)%> +<%if(source_files)%> + +<%if(configurations)%> +<%foreach(configurations)%> +<%if(exename)%> +<%if(install_this_target)%>bin<%else%>noinst<%endif%>_PROGRAMS += <%exename%><%lib_modifier%> +<%configuration%> : <%exename%><%lib_modifier%> +<%else%> +<%if(install_this_target)%>lib<%else%>noinst<%endif%>_LTLIBRARIES += lib<%libname_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%><%lib_modifier%>.la +<%configuration%> : lib<%libname_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%><%lib_modifier%>.la +<%endif%> +<%endfor%> +<%else%> +<%if(exename)%> +<%if(install_this_target)%>bin<%else%>noinst<%endif%>_PROGRAMS += <%exename%> +<%else%> +<%if(install_this_target)%>lib<%else%>noinst<%endif%>_LTLIBRARIES += lib<%libname_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%>.la +<%endif%> +<%endif%> +<%endif%> +<%if(includes || defines || common_defines || macros || need_staticflags || dynamicflags || compile_flags)%> + +<%if(exename)%> +<%normalize(exename)%>_CPPFLAGS<%if(configurations)%>_COMMON<%endif%> = \ +<%else%> +lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%><%if(!configurations)%>_la<%endif%>_CPPFLAGS<%if(configurations)%>_COMMON<%endif%> = \ +<%endif%> +<%foreach(includes)%> + -I<%include%><%if(defines || common_defines || macros || need_staticflags || dynamicflags || compile_flags && !configurations)%> \<%else%><%fornotlast(" \\")%><%endif%> +<%endfor%> +<%foreach(defines common_defines macros)%> + -D<%define%><%if(need_staticflags || dynamicflags || compile_flags && !configurations)%> \<%else%><%fornotlast(" \\")%><%endif%> +<%endfor%> +<%if(compile_flags && !configurations)%> +<%foreach(compile_flags)%> + <%compile_flag%><%if(need_staticflags || dynamicflags)%> \<%else%><%fornotlast(" \\")%><%endif%> +<%endfor%> +<%endif%> +<%if(need_staticflags)%> +<%if(staticflags)%> +<%foreach(staticflags)%> + -D<%staticflag%><%fornotlast(" \\")%> +<%endfor%> +<%else%> + -D__NO_STATIC_FLAGS_AVAILABLE__ +<%endif%> +<%else%> +<%foreach(dynamicflags)%> + -D<%dynamicflag%><%fornotlast(" \\")%> +<%endfor%> +<%endif%> +<%if(configurations)%> + +<%foreach(configurations)%> +<%if(exename)%> +<%normalize(exename)%><%lib_modifier%>_CPPFLAGS = $(<%normalize(exename)%>_CPPFLAGS_COMMON)<%if(compile_flags)%> <%compile_flags%><%endif%> +<%else%> +lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%><%lib_modifier%>_la_CPPFLAGS = $(lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%>_CPPFLAGS_COMMON)<%if(compile_flags)%> <%compile_flags%><%endif%> +<%endif%> +<%endfor%> +<%endif%> +<%endif%> +<%if(source_files)%> + +<%if(exename)%> +<%normalize(exename)%>_SOURCES<%if(configurations)%>_COMMON<%endif%> = \ +<%else%> +lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%><%if(!configurations)%>_la<%endif%>_SOURCES<%if(configurations)%>_COMMON<%endif%> = \ +<%endif%> +<%foreach(source_file, sort(source_files))%> +<%if(!flag_overrides(source_file, buildflags))%> + <%source_file%> \ +<%endif%> +<%endfor%> +<%if(exename)%> +<%foreach(header_file, sort(header_files inline_files))%> + <%header_file%><%fornotlast(" \\")%> +<%endfor%> +<%endif%> +<%if(configurations)%> + +<%foreach(configurations)%> +<%if(exename)%> +<%normalize(exename)%><%lib_modifier%>_SOURCES = $(<%normalize(exename)%>_SOURCES_COMMON) +<%else%> +lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%><%lib_modifier%>_la_SOURCES = $(lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%>_SOURCES_COMMON) +<%endif%> +<%endfor%> +<%endif%> +<%if(libpaths && contains(libpaths, \.\./))%> + +<%foreach(libpaths)%> +<%if(contains(libpath, \.\./))%> +<%libpath%>: + mkdir -p <%libpath%> + +<%endif%> +<%endfor%> + +<%if(exename)%> +<%normalize(exename)%>_DEPENDENCIES<%if(configurations)%>_COMMON<%endif%> = \ +<%else%> +lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%><%if(!configurations)%>_la<%endif%>_DEPENDENCIES<%if(configurations)%>_COMMON<%endif%> = \ +<%endif%> +<%foreach(libpaths)%><%if(contains(libpath, \.\./))%> <%libpath%><%endif%><%endfor%> +<%if(configurations)%> + +<%foreach(configurations)%> +<%if(exename)%> +<%normalize(exename)%><%lib_modifier%>_DEPENDENCIES += $(<%normalize(exename)%>_DEPENDENCIES_COMMON) +<%else%> +lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%><%lib_modifier%>_la_DEPENDENCIES += \ + $(lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%>_DEPENDENCIES_COMMON) +<%endif%> +<%endfor%> +<%endif%> +<%endif%> +<%if(exename)%> +<%if(linkflags || libpaths)%> + +<%normalize(exename)%>_LDFLAGS<%if(configurations)%>_COMMON<%endif%> = \ + <%linkflags%><%foreach(libpaths)%> -L<%libpath%><%endfor%> +<%if(configurations)%> + +<%foreach(configurations)%> +<%normalize(exename)%><%lib_modifier%>_LDFLAGS = $(<%normalize(exename)%>_LDFLAGS_COMMON) +<%endfor%> +<%endif%> +<%endif%> +<%else%> +<%if(linkflags || libpaths || am_version && install_this_target || am_release && install_this_target)%> + +lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%><%if(!configurations)%>_la<%endif%>_LDFLAGS<%if(configurations)%>_COMMON<%endif%> = \ +<%if(am_version && install_this_target)%> -version-number <%am_version%><%else%><%if(am_release && install_this_target)%> -release <%am_release%><%endif%><%endif%><%if(linkflags)%> <%linkflags%><%endif%><%foreach(libpaths)%> -L<%libpath%><%endfor%> +<%if(configurations)%> + +<%foreach(configurations)%> +lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%><%lib_modifier%>_la_LDFLAGS = $(lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%>_LDFLAGS_COMMON) +<%endfor%> +<%endif%> +<%endif%> +<%endif%> +<%endif%> +<%if(configurations)%> +<%foreach(configurations)%> +<%if(exename)%> +<%if(libs || pure_libs || lit_libs)%> + +<%normalize(exename)%><%lib_modifier%>_LDADD = \ +<%foreach(libs)%> + lib<%libname_prefix%><%lib%><%lib_modifier%>.la<%if(lit_libs || pure_libs)%> \<%else%><%fornotlast(" \\")%><%endif%> +<%endfor%> +<%foreach(lit_libs)%> + -l<%lit_lib%><%if(use_lib_modifier_for_lit_libs)%><%lib_modifier%><%endif%><%if(pure_libs)%> \<%else%><%fornotlast(" \\")%><%endif%> +<%endfor%> +<%foreach(pure_libs)%> + <%pure_lib%><%fornotlast(" \\")%> +<%endfor%> +<%endif%> +<%else%> +<%if(install_this_target)%> +<%if(libs || pure_libs || lit_libs)%> + +lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%><%lib_modifier%>_la_LIBADD = \ +<%foreach(libs)%> + lib<%libname_prefix%><%lib%><%lib_modifier%>.la<%if(lit_libs || pure_libs)%> \<%else%><%fornotlast(" \\")%><%endif%> +<%endfor%> +<%foreach(lit_libs)%> + -l<%lit_lib%><%if(use_lib_modifier_for_lit_libs)%><%lib_modifier%><%endif%><%if(pure_libs)%> \<%else%><%fornotlast(" \\")%><%endif%> +<%endfor%> +<%foreach(pure_libs)%> + <%pure_lib%><%fornotlast(" \\")%> +<%endfor%> +<%endif%> +<%endif%> +<%endif%> +<%endfor%> +<%else%> +<%if(exename)%> +<%if(libs || pure_libs || lit_libs)%> + +<%normalize(exename)%>_LDADD = \ +<%foreach(libs)%> + lib<%libname_prefix%><%lib%>.la<%if(lit_libs || pure_libs)%> \<%else%><%fornotlast(" \\")%><%endif%> +<%endfor%> +<%foreach(lit_libs)%> + -l<%lit_lib%><%if(use_lib_modifier_for_lit_libs)%><%lib_modifier%><%endif%><%if(pure_libs)%> \<%else%><%fornotlast(" \\")%><%endif%> +<%endfor%> +<%foreach(pure_libs)%> + <%pure_lib%><%fornotlast(" \\")%> +<%endfor%> +<%endif%> +<%else%> +<%if(install_this_target)%> +<%if(libs || pure_libs || lit_libs)%> + +lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%><%lib_modifier%>_la_LIBADD = \ +<%foreach(libs)%> + lib<%libname_prefix%><%lib%><%lib_modifier%>.la<%if(lit_libs || pure_libs)%> \<%else%><%fornotlast(" \\")%><%endif%> +<%endfor%> +<%foreach(lit_libs)%> + -l<%lit_lib%><%if(use_lib_modifier_for_lit_libs)%><%lib_modifier%><%endif%><%if(pure_libs)%> \<%else%><%fornotlast(" \\")%><%endif%> +<%endfor%> +<%foreach(pure_libs)%> + <%pure_lib%><%fornotlast(" \\")%> +<%endfor%> +<%endif%> +<%endif%> +<%endif%> +<%endif%> +<%endif%> +<%if(!exename)%> +<%if(header_files || inline_files || template_files || idl_files || pidl_files)%> + +<%if(includedir)%> +<%project_name%>_includedir = <%includedir%> + +<%endif%> +<%if(install_headers)%><%project_name%>_include<%else%>noinst<%endif%>_HEADERS += \ +<%foreach(header, sort(header_files inline_files template_files idl_files pidl_files))%> + <%header%><%fornotlast(" \\")%> +<%endfor%> +<%endif%> +<%endif%> +<%if(pkgconfig_files)%> + +pkgconfig_DATA += \ +<%foreach(pkgconfig_files)%> + <%basenoextension(pkgconfig_file)%><%fornotlast(" \\")%> +<%endfor%> + +CLEANFILES += \ +<%foreach(pkgconfig_files)%> + <%basenoextension(pkgconfig_file)%><%fornotlast(" \\")%> +<%endfor%> +<%foreach(pkgconfig_files)%> + +<%basenoextension(pkgconfig_file)%>: ${top_builddir}/config.status ${srcdir}/<%pkgconfig_file%> + ${top_builddir}/config.status --file "$@":${srcdir}/<%pkgconfig_file%> +<%endfor%> +<%endif%> +<%foreach(sort(source_files))%> +<%if(flag_overrides(source_file, buildflags))%> + +<%if(configurations)%> +<%foreach(configurations)%> +<%if(exename)%><%normalize(exename)%><%lib_modifier%>_LDADD<%else%>lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%><%lib_modifier%>_la_LIBADD<%endif%> += lib<%normalize(source_file)%>_convenience<%forcount%><%lib_modifier%>.la +noinst_LTLIBRARIES += lib<%normalize(source_file)%>_convenience<%forcount%><%lib_modifier%>.la +lib<%normalize(source_file)%>_convenience<%forcount%><%lib_modifier%>_la_SOURCES = <%source_file%> +lib<%normalize(source_file)%>_convenience<%forcount%><%lib_modifier%>_la_CPPFLAGS = $(<%if(exename)%><%normalize(exename)%><%lib_modifier%><%else%>lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%><%lib_modifier%>_la<%endif%>_CPPFLAGS) <%flag_overrides(source_file, buildflags)%><%if(compile_flags)%> <%compile_flags%><%endif%> +<%endfor%> +<%else%> +<%if(exename)%><%normalize(exename)%>_LDADD<%else%>lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%>_la_LIBADD<%endif%> += lib<%normalize(source_file)%>_convenience<%forcount%>.la +noinst_LTLIBRARIES += lib<%normalize(source_file)%>_convenience<%forcount%>.la +lib<%normalize(source_file)%>_convenience<%forcount%>_la_SOURCES = <%source_file%> +lib<%normalize(source_file)%>_convenience<%forcount%>_la_CPPFLAGS = $(<%if(exename)%><%normalize(exename)%><%else%>lib<%libname_prefix%><%if(sharedname)%><%normalize(sharedname)%><%else%><%normalize(staticname)%><%endif%>_la<%endif%>_CPPFLAGS) <%flag_overrides(source_file, buildflags)%><%if(compile_flags)%> <%compile_flags%><%endif%> +<%endif%> +<%endif%> +<%endfor%> +<%if(postbuild)%> + +all: __postbuild__ + +__postbuild__: + @<%eval(postbuild)%> +<%endif%> +<%if(avoids || requires)%> + +<%foreach(reverse(uniq(avoids)))%> +endif !BUILD_<%uc(avoid)%> +<%endfor%> +<%foreach(reverse(uniq(requires)))%> +endif BUILD_<%uc(require)%> +<%endfor%> +<%endif%> +<%if(pkgconfig_files || resource_files)%> + +EXTRA_DIST += \ +<%foreach(extra_dist, sort(pkgconfig_files resource_files))%> + <%extra_dist%><%fornotlast(" \\")%> +<%endfor%> + +<%endif%> +<%marker(bottom)%> diff --git a/ACE/MPC/templates/automakedll.mpt b/ACE/MPC/templates/automakedll.mpt new file mode 100644 index 00000000000..2bffa67ffb9 --- /dev/null +++ b/ACE/MPC/templates/automakedll.mpt @@ -0,0 +1,14 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" + +lib_prefix = lib +lib_ext = .la +dll_ext = .la +exe_ext = + +linkflags = +includedir = + +conditional_include "user_automakedll" diff --git a/ACE/MPC/templates/automakeexe.mpt b/ACE/MPC/templates/automakeexe.mpt new file mode 100644 index 00000000000..b053d04c2f8 --- /dev/null +++ b/ACE/MPC/templates/automakeexe.mpt @@ -0,0 +1,5 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "automakedll" +conditional_include "user_automakeexe" diff --git a/ACE/MPC/templates/bcb2007.mpd b/ACE/MPC/templates/bcb2007.mpd new file mode 100644 index 00000000000..5785cabe4e5 --- /dev/null +++ b/ACE/MPC/templates/bcb2007.mpd @@ -0,0 +1,177 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <ProjectGuid>{f76f525d-aee9-4af7-a366-e9119e55548d}</ProjectGuid> + <ProjectType>CppDynamicLibrary</ProjectType> + <Config Condition="'$(Config)'==''">Debug Build</Config> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Debug Build' or '$(Cfg_1)'!=''"> + <Base>true</Base> + <Cfg_1>true</Cfg_1> + <CfgParent>Base</CfgParent> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Release Build' or '$(Cfg_2)'!=''"> + <Base>true</Base> + <Cfg_2>true</Cfg_2> + <CfgParent>Base</CfgParent> + </PropertyGroup> + <PropertyGroup Condition="'$(Base)'!=''"> + <OutputExt>dll</OutputExt> + <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput> + <DCC_ObjPath><%foreach(includes)%><%include%><%fornotlast(";")%><%endfor%></DCC_ObjPath> + <BCC_wccc>false</BCC_wccc> + <DynamicRTL>true</DynamicRTL> + <BCC_PCHName>$(BDS)\lib\vcl100.csm</BCC_PCHName> + <ILINK_GenerateImportLibrary>true</ILINK_GenerateImportLibrary> + <ILINK_ObjectSearchPath><%foreach(includes)%><%include%><%fornotlast(";")%><%endfor%></ILINK_ObjectSearchPath> + <NoVCL><%if(use_vcl)%>false<%else%>true<%endif%></NoVCL> + <BCC_wrvl>false</BCC_wrvl> + <PackageImports>vcl.bpi;rtl.bpi;vclx.bpi;dbrtl.bpi;vcldb.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;vclib.bpi;ibxpress.bpi;xmlrtl.bpi;vclactnband.bpi;inet.bpi;IntrawebDB_80_100.bpi;Intraweb_80_100.bpi;vclie.bpi;inetdbbde.bpi;inetdbxpress.bpi;IndyCore.bpi;IndySystem.bpi;bcbofficexp.bpi;bcbsmp.bpi;soaprtl.bpi;dsnap.bpi;IndyProtocols.bpi;bcbie.bpi;bdertl.bpi;teeui.bpi;teedb.bpi;tee.bpi;vcldbx.bpi;dsnapcon.bpi;websnap.bpi;webdsnap.bpi</PackageImports> + <DCC_UnitSearchPath><%foreach(includes)%><%include%>;<%endfor%>.\;$(BDS)\lib;$(BDS)\lib\obj</DCC_UnitSearchPath> + <ILINK_WinAppType>DLL</ILINK_WinAppType> + <BCC_GenerateMultithreaded>true</BCC_GenerateMultithreaded> + <BCC_PCHCache>true</BCC_PCHCache> + <BCC_IntegerSizedEnums>false</BCC_IntegerSizedEnums> + <TASM_IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..</TASM_IncludePath> + <BRCC_IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..</BRCC_IncludePath> + <DCC_IncludePath><%foreach(includes)%><%include%>;<%endfor%>;.\;$(BDS)\lib;$(BDS)\lib\obj</DCC_IncludePath> + <BCC_IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..</BCC_IncludePath> + <ILINK_LibraryPath><%foreach(libpaths)%><%libpath%>;<%endfor%>;$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</ILINK_LibraryPath> + <BCC_InternalDefines>NO_STRICT</BCC_InternalDefines> + <TASM_Defines><%foreach(defines)%><%define%><%fornotlast(";")%><%endfor%></TASM_Defines> + <BRCC_Defines><%foreach(defines)%><%define%><%fornotlast(";")%><%endfor%></BRCC_Defines> + <BCC_GenerateDLL>true</BCC_GenerateDLL> + <BCC_Defines><%foreach(defines)%><%define%><%fornotlast(";")%><%endfor%></BCC_Defines> + <DCC_ResourcePath><%foreach(includes)%><%include%>;<%endfor%></DCC_ResourcePath> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_1)'!=''"> + <DCC_Optimize>false</DCC_Optimize> + <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe> + <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo> + <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion> + <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking> + <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define> + <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers> + <IntermediateOutputDir>Debug_Build</IntermediateOutputDir> + <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines> + <BCC_StackFrames>true</BCC_StackFrames> + <ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath> + <BCC_Defines>_DEBUG;$(BCC_Defines)</BCC_Defines> + <TASM_Debugging>Full</TASM_Debugging> + <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_2)'!=''"> + <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed> + <DCC_DebugInformation>false</DCC_DebugInformation> + <IntermediateOutputDir>Release_Build</IntermediateOutputDir> + <ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath> + <BCC_Defines>NDEBUG;$(BCC_Defines)</BCC_Defines> + <TASM_Debugging>None</TASM_Debugging> + </PropertyGroup> + <ProjectExtensions> + <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality> + <Borland.ProjectType>CppDynamicLibrary</Borland.ProjectType> + <BorlandProject> +<BorlandProject> <CPlusPlusBuilder.Personality> <VersionInfo> + <VersionInfo Name="IncludeVerInfo">False</VersionInfo> + <VersionInfo Name="AutoIncBuild">False</VersionInfo> + <VersionInfo Name="MajorVer">1</VersionInfo> + <VersionInfo Name="MinorVer">0</VersionInfo> + <VersionInfo Name="Release">0</VersionInfo> + <VersionInfo Name="Build">0</VersionInfo> + <VersionInfo Name="Debug">False</VersionInfo> + <VersionInfo Name="PreRelease">False</VersionInfo> + <VersionInfo Name="Special">False</VersionInfo> + <VersionInfo Name="Private">False</VersionInfo> + <VersionInfo Name="DLL">False</VersionInfo> + <VersionInfo Name="Locale">1043</VersionInfo> + <VersionInfo Name="CodePage">1252</VersionInfo> + </VersionInfo> + <VersionInfoKeys> + <VersionInfoKeys Name="CompanyName"></VersionInfoKeys> + <VersionInfoKeys Name="FileDescription"></VersionInfoKeys> + <VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys> + <VersionInfoKeys Name="InternalName"></VersionInfoKeys> + <VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys> + <VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys> + <VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys> + <VersionInfoKeys Name="ProductName"></VersionInfoKeys> + <VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys> + <VersionInfoKeys Name="Comments"></VersionInfoKeys> + </VersionInfoKeys> + <Debugging> + <Debugging Name="DebugSourceDirs"></Debugging> + </Debugging> + <Parameters> + <Parameters Name="RunParams"></Parameters> + <Parameters Name="Launcher"></Parameters> + <Parameters Name="UseLauncher">False</Parameters> + <Parameters Name="DebugCWD"></Parameters> + <Parameters Name="HostApplication"></Parameters> + <Parameters Name="RemoteHost"></Parameters> + <Parameters Name="RemotePath"></Parameters> + <Parameters Name="RemoteParams"></Parameters> + <Parameters Name="RemoteLauncher"></Parameters> + <Parameters Name="UseRemoteLauncher">False</Parameters> + <Parameters Name="RemoteCWD"></Parameters> + <Parameters Name="RemoteDebug">False</Parameters> + <Parameters Name="Debug Symbols Search Path"></Parameters> + <Parameters Name="LoadAllSymbols">True</Parameters> + <Parameters Name="LoadUnspecifiedSymbols">False</Parameters> + </Parameters> + <Linker> + <Linker Name="LibPrefix"></Linker> + <Linker Name="LibSuffix"></Linker> + <Linker Name="LibVersion"></Linker> + </Linker> + <ProjectProperties> + <ProjectProperties Name="AutoShowDeps">False</ProjectProperties> + <ProjectProperties Name="ManagePaths">True</ProjectProperties> + <ProjectProperties Name="VerifyPackages">True</ProjectProperties> + </ProjectProperties> + </CPlusPlusBuilder.Personality> </BorlandProject></BorlandProject> + </ProjectExtensions> + <Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" /> + <ItemGroup> +<%if(source_files)%> +<%foreach(source_files)%> + <CppCompile Include="<%source_file%>"> + </CppCompile> +<%endfor%> +<%endif%> +<%if(header_files)%> +<%foreach(header_files)%> + <None Include="<%header_file%>"> + </None> +<%endfor%> +<%endif%> +<%if(inline_files)%> +<%foreach(inline_files)%> + <None Include="<%inline_file%>"> + </None> +<%endfor%> +<%endif%> +<%if(template_files)%> +<%foreach(template_files)%> + <None Include="<%template_file%>"> + </None> +<%endfor%> +<%endif%> +<%if(documentation_files)%> +<%foreach(documentation_files)%> + <None Include="<%documentation_file%>"> + </None> +<%endfor%> +<%endif%> +<%if(resource_files)%> +<%foreach(resource_files)%> + <ResourceCompile Include="<%resource_file%>"> + </ResourceCompile> +<%endfor%> +<%endif%> + </ItemGroup> + <Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" /> +</Project> diff --git a/ACE/MPC/templates/bcb2007dll.mpt b/ACE/MPC/templates/bcb2007dll.mpt new file mode 100644 index 00000000000..a8d4998de5d --- /dev/null +++ b/ACE/MPC/templates/bcb2007dll.mpt @@ -0,0 +1,9 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +common_defines = WIN32 + +conditional_include "user_bdsdll" diff --git a/ACE/MPC/templates/bcb2007exe.mpt b/ACE/MPC/templates/bcb2007exe.mpt new file mode 100644 index 00000000000..8e7081e8e48 --- /dev/null +++ b/ACE/MPC/templates/bcb2007exe.mpt @@ -0,0 +1,9 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +common_defines = WIN32 + +conditional_include "user_bdsexe" diff --git a/ACE/MPC/templates/bcb2009.mpd b/ACE/MPC/templates/bcb2009.mpd new file mode 100644 index 00000000000..7e0b33bbeb2 --- /dev/null +++ b/ACE/MPC/templates/bcb2009.mpd @@ -0,0 +1,178 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <ProjectGuid>{f76f525d-aee9-4af7-a366-e9119e55548d}</ProjectGuid> + <ProjectType>CppDynamicLibrary</ProjectType> + <Config Condition="'$(Config)'==''">Debug Build</Config> + <ProjectVersion>12.0</ProjectVersion> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Debug Build' or '$(Cfg_1)'!=''"> + <Cfg_1>true</Cfg_1> + <CfgParent>Base</CfgParent> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Release Build' or '$(Cfg_2)'!=''"> + <Cfg_2>true</Cfg_2> + <CfgParent>Base</CfgParent> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Base)'!=''"> + <OutputExt>dll</OutputExt> + <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput> + <DCC_ObjPath><%foreach(includes)%><%include%><%fornotlast(";")%><%endfor%></DCC_ObjPath> + <BCC_wccc>false</BCC_wccc> + <DynamicRTL>true</DynamicRTL> + <BCC_PCHName>$(BDS)\lib\vcl100.csm</BCC_PCHName> + <ILINK_GenerateImportLibrary>true</ILINK_GenerateImportLibrary> + <ILINK_ObjectSearchPath><%foreach(includes)%><%include%><%fornotlast(";")%><%endfor%></ILINK_ObjectSearchPath> + <NoVCL><%if(use_vcl)%>false<%else%>true<%endif%></NoVCL> + <BCC_wrvl>false</BCC_wrvl> + <PackageImports>vcl.bpi;rtl.bpi;vclx.bpi;dbrtl.bpi;vcldb.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;vclib.bpi;ibxpress.bpi;xmlrtl.bpi;vclactnband.bpi;inet.bpi;IntrawebDB_80_100.bpi;Intraweb_80_100.bpi;vclie.bpi;inetdbbde.bpi;inetdbxpress.bpi;IndyCore.bpi;IndySystem.bpi;bcbofficexp.bpi;bcbsmp.bpi;soaprtl.bpi;dsnap.bpi;IndyProtocols.bpi;bcbie.bpi;bdertl.bpi;teeui.bpi;teedb.bpi;tee.bpi;vcldbx.bpi;dsnapcon.bpi;websnap.bpi;webdsnap.bpi</PackageImports> + <DCC_UnitSearchPath><%foreach(includes)%><%include%>;<%endfor%>.\;$(BDS)\lib;$(BDS)\lib\obj</DCC_UnitSearchPath> + <ILINK_WinAppType>DLL</ILINK_WinAppType> + <BCC_GenerateMultithreaded>true</BCC_GenerateMultithreaded> + <BCC_PCHCache>true</BCC_PCHCache> + <BCC_IntegerSizedEnums>false</BCC_IntegerSizedEnums> + <TASM_IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..</TASM_IncludePath> + <BRCC_IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..</BRCC_IncludePath> + <DCC_IncludePath><%foreach(includes)%><%include%>;<%endfor%>;.\;$(BDS)\lib;$(BDS)\lib\obj</DCC_IncludePath> + <BCC_IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..</BCC_IncludePath> + <ILINK_LibraryPath><%foreach(libpaths)%><%libpath%>;<%endfor%>;$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</ILINK_LibraryPath> + <BCC_InternalDefines>NO_STRICT</BCC_InternalDefines> + <TASM_Defines><%foreach(defines)%><%define%><%fornotlast(";")%><%endfor%></TASM_Defines> + <BRCC_Defines><%foreach(defines)%><%define%><%fornotlast(";")%><%endfor%></BRCC_Defines> + <BCC_GenerateDLL>true</BCC_GenerateDLL> + <BCC_Defines><%foreach(defines)%><%define%><%fornotlast(";")%><%endfor%></BCC_Defines> + <DCC_ResourcePath><%foreach(includes)%><%include%>;<%endfor%></DCC_ResourcePath> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_1)'!=''"> + <DCC_Optimize>false</DCC_Optimize> + <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe> + <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo> + <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion> + <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking> + <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define> + <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers> + <IntermediateOutputDir>Debug_Build</IntermediateOutputDir> + <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines> + <BCC_StackFrames>true</BCC_StackFrames> + <ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath> + <BCC_Defines>_DEBUG;$(BCC_Defines)</BCC_Defines> + <TASM_Debugging>Full</TASM_Debugging> + <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_2)'!=''"> + <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed> + <DCC_DebugInformation>false</DCC_DebugInformation> + <IntermediateOutputDir>Release_Build</IntermediateOutputDir> + <ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath> + <BCC_Defines>NDEBUG;$(BCC_Defines)</BCC_Defines> + <TASM_Debugging>None</TASM_Debugging> + </PropertyGroup> + <ProjectExtensions> + <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality> + <Borland.ProjectType>CppDynamicLibrary</Borland.ProjectType> + <BorlandProject> +<BorlandProject> <CPlusPlusBuilder.Personality> <VersionInfo> + <VersionInfo Name="IncludeVerInfo">False</VersionInfo> + <VersionInfo Name="AutoIncBuild">False</VersionInfo> + <VersionInfo Name="MajorVer">1</VersionInfo> + <VersionInfo Name="MinorVer">0</VersionInfo> + <VersionInfo Name="Release">0</VersionInfo> + <VersionInfo Name="Build">0</VersionInfo> + <VersionInfo Name="Debug">False</VersionInfo> + <VersionInfo Name="PreRelease">False</VersionInfo> + <VersionInfo Name="Special">False</VersionInfo> + <VersionInfo Name="Private">False</VersionInfo> + <VersionInfo Name="DLL">False</VersionInfo> + <VersionInfo Name="Locale">1043</VersionInfo> + <VersionInfo Name="CodePage">1252</VersionInfo> + </VersionInfo> + <VersionInfoKeys> + <VersionInfoKeys Name="CompanyName"></VersionInfoKeys> + <VersionInfoKeys Name="FileDescription"></VersionInfoKeys> + <VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys> + <VersionInfoKeys Name="InternalName"></VersionInfoKeys> + <VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys> + <VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys> + <VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys> + <VersionInfoKeys Name="ProductName"></VersionInfoKeys> + <VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys> + <VersionInfoKeys Name="Comments"></VersionInfoKeys> + </VersionInfoKeys> + <Debugging> + <Debugging Name="DebugSourceDirs"></Debugging> + </Debugging> + <Parameters> + <Parameters Name="RunParams"></Parameters> + <Parameters Name="Launcher"></Parameters> + <Parameters Name="UseLauncher">False</Parameters> + <Parameters Name="DebugCWD"></Parameters> + <Parameters Name="HostApplication"></Parameters> + <Parameters Name="RemoteHost"></Parameters> + <Parameters Name="RemotePath"></Parameters> + <Parameters Name="RemoteParams"></Parameters> + <Parameters Name="RemoteLauncher"></Parameters> + <Parameters Name="UseRemoteLauncher">False</Parameters> + <Parameters Name="RemoteCWD"></Parameters> + <Parameters Name="RemoteDebug">False</Parameters> + <Parameters Name="Debug Symbols Search Path"></Parameters> + <Parameters Name="LoadAllSymbols">True</Parameters> + <Parameters Name="LoadUnspecifiedSymbols">False</Parameters> + </Parameters> + <Linker> + <Linker Name="LibPrefix"></Linker> + <Linker Name="LibSuffix"></Linker> + <Linker Name="LibVersion"></Linker> + </Linker> + <ProjectProperties> + <ProjectProperties Name="AutoShowDeps">False</ProjectProperties> + <ProjectProperties Name="ManagePaths">True</ProjectProperties> + <ProjectProperties Name="VerifyPackages">True</ProjectProperties> + </ProjectProperties> + </CPlusPlusBuilder.Personality> </BorlandProject></BorlandProject> + </ProjectExtensions> + <Import Project="$(BDS)\Bin\CodeGear.Cpp.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Cpp.Targets')"/> + <ItemGroup> +<%if(source_files)%> +<%foreach(source_files)%> + <CppCompile Include="<%source_file%>"> + </CppCompile> +<%endfor%> +<%endif%> +<%if(header_files)%> +<%foreach(header_files)%> + <None Include="<%header_file%>"> + </None> +<%endfor%> +<%endif%> +<%if(inline_files)%> +<%foreach(inline_files)%> + <None Include="<%inline_file%>"> + </None> +<%endfor%> +<%endif%> +<%if(template_files)%> +<%foreach(template_files)%> + <None Include="<%template_file%>"> + </None> +<%endfor%> +<%endif%> +<%if(documentation_files)%> +<%foreach(documentation_files)%> + <None Include="<%documentation_file%>"> + </None> +<%endfor%> +<%endif%> +<%if(resource_files)%> +<%foreach(resource_files)%> + <ResourceCompile Include="<%resource_file%>"> + </ResourceCompile> +<%endfor%> +<%endif%> + </ItemGroup> + <Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" /> +</Project> diff --git a/ACE/MPC/templates/bcb2009dll.mpt b/ACE/MPC/templates/bcb2009dll.mpt new file mode 100644 index 00000000000..a8d4998de5d --- /dev/null +++ b/ACE/MPC/templates/bcb2009dll.mpt @@ -0,0 +1,9 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +common_defines = WIN32 + +conditional_include "user_bdsdll" diff --git a/ACE/MPC/templates/bcb2009exe.mpt b/ACE/MPC/templates/bcb2009exe.mpt new file mode 100644 index 00000000000..8e7081e8e48 --- /dev/null +++ b/ACE/MPC/templates/bcb2009exe.mpt @@ -0,0 +1,9 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +common_defines = WIN32 + +conditional_include "user_bdsexe" diff --git a/ACE/MPC/templates/bds4.mpd b/ACE/MPC/templates/bds4.mpd new file mode 100644 index 00000000000..6fb5c3c884a --- /dev/null +++ b/ACE/MPC/templates/bds4.mpd @@ -0,0 +1,268 @@ +<?xml version="1.0" encoding="utf-8"?> +<BorlandProject> + <PersonalityInfo> + <Option> + <Option Name="Personality">CPlusPlusBuilder.Personality</Option> + <Option Name="ProjectType">CppDynamicLibrary</Option> + <Option Name="Version">1.0</Option> + <Option Name="GUID">{1AAB501A-BAB8-4041-8F7F-4B2CB54610E3}</Option> + </Option> + </PersonalityInfo> + <CPlusPlusBuilder.Personality> + <Source> + <Source Name="MainSource">ace.bpf</Source> + </Source> + <BCBPROJECT> + <project version="10.0"> + <property category="build.config" name="active" value="0"/> + <property category="build.config" name="count" value="1"/> + <property category="build.config" name="excludedefaultforzero" value="0"/> + <property category="build.config.0" name="builddir" value="Debug"/> + <property category="build.config.0" name="key" value="Debug_Build"/> + <property category="build.config.0" name="name" value="Debug Build"/> + <property category="build.config.0" name="settings.win32b" value="default"/> + <property category="build.config.0" name="type" value="Toolset"/> + <property category="build.config.0" name="win32.win32b.builddir" value="Debug_Build"/> + <property category="build.config.1" name="key" value="Release_Build"/> + <property category="build.config.1" name="name" value="Release Build"/> + <property category="build.config.1" name="settings.win32b" value="default"/> + <property category="build.config.1" name="type" value="Toolset"/> + <property category="build.config.1" name="win32.win32b.builddir" value="Release_Build"/> + <property category="build.node" name="name" value="ace.dll"/> + <property category="build.node" name="packages" value="vcl;rtl;vclx;dbrtl;vcldb;adortl;dbxcds;dbexpress;vclib;ibxpress;xmlrtl;vclactnband;inet;IntrawebDB_80_100;Intraweb_80_100;vclie;inetdbbde;inetdbxpress;IndyCore;IndySystem;bcbofficexp;bcbsmp;soaprtl;dsnap;IndyProtocols;bcbie;bdertl;teeui;teedb;tee;vcldbx;dsnapcon;websnap;webdsnap"/> + <property category="build.node" name="use_packages" value="0"/> + <property category="build.platform" name="active" value="win32"/> + <property category="build.platform" name="win32.Debug_Build.toolset" value="win32b"/> + <property category="build.platform" name="win32.Release_Build.toolset" value="win32b"/> + <property category="build.platform" name="win32.default" value="win32b"/> + <property category="build.platform" name="win32.enabled" value="1"/> + <property category="build.platform" name="win32.win32b.enabled" value="1"/> + <property category="win32.Debug_Build.win32b.bcc32" name="option.D.arg.1" value="_DEBUG"/> + <property category="win32.Debug_Build.win32b.bcc32" name="option.D.arg.merge" value="1"/> + <property category="win32.Debug_Build.win32b.bcc32" name="option.D.enabled" value="1"/> + <property category="win32.Debug_Build.win32b.bcc32" name="option.Od.enabled" value="1"/> + <property category="win32.Debug_Build.win32b.bcc32" name="option.k.enabled" value="1"/> + <property category="win32.Debug_Build.win32b.bcc32" name="option.r.enabled" value="0"/> + <property category="win32.Debug_Build.win32b.bcc32" name="option.v.enabled" value="1"/> + <property category="win32.Debug_Build.win32b.bcc32" name="option.vi.enabled" value="0"/> + <property category="win32.Debug_Build.win32b.bcc32" name="option.y.enabled" value="1"/> + <property category="win32.Debug_Build.win32b.dcc32" name="option.$D.enabled" value="1"/> + <property category="win32.Debug_Build.win32b.dcc32" name="option.$O.enabled" value="0"/> + <property category="win32.Debug_Build.win32b.dcc32" name="option.D.arg.1" value="DEBUG"/> + <property category="win32.Debug_Build.win32b.dcc32" name="option.D.arg.merge" value="1"/> + <property category="win32.Debug_Build.win32b.dcc32" name="option.D.enabled" value="1"/> + <property category="win32.Debug_Build.win32b.dcc32" name="option.V.enabled" value="1"/> + <property category="win32.Debug_Build.win32b.ilink32" name="option.L.arg.1" value="$(BDS)\lib\debug"/> + <property category="win32.Debug_Build.win32b.ilink32" name="option.L.arg.merge" value="1"/> + <property category="win32.Debug_Build.win32b.ilink32" name="option.L.enabled" value="1"/> + <property category="win32.Debug_Build.win32b.tasm32" name="option.z.enabled" value="1"/> + <property category="win32.Debug_Build.win32b.tasm32" name="option.zd.enabled" value="0"/> + <property category="win32.Debug_Build.win32b.tasm32" name="option.zi.enabled" value="1"/> + <property category="win32.Release_Build.win32b.bcc32" name="option.D.arg.1" value="NDEBUG"/> + <property category="win32.Release_Build.win32b.bcc32" name="option.D.arg.merge" value="1"/> + <property category="win32.Release_Build.win32b.bcc32" name="option.D.enabled" value="1"/> + <property category="win32.Release_Build.win32b.bcc32" name="option.O2.enabled" value="1"/> + <property category="win32.Release_Build.win32b.bcc32" name="option.k.enabled" value="0"/> + <property category="win32.Release_Build.win32b.bcc32" name="option.r.enabled" value="1"/> + <property category="win32.Release_Build.win32b.bcc32" name="option.vi.enabled" value="1"/> + <property category="win32.Release_Build.win32b.dcc32" name="option.$D.enabled" value="0"/> + <property category="win32.Release_Build.win32b.dcc32" name="option.$O.enabled" value="1"/> + <property category="win32.Release_Build.win32b.dcc32" name="option.V.enabled" value="0"/> + <property category="win32.Release_Build.win32b.ilink32" name="option.L.arg.1" value="$(BDS)\lib\release"/> + <property category="win32.Release_Build.win32b.ilink32" name="option.L.arg.merge" value="1"/> + <property category="win32.Release_Build.win32b.ilink32" name="option.L.enabled" value="1"/> + <property category="win32.Release_Build.win32b.tasm32" name="option.z.enabled" value="0"/> + <property category="win32.Release_Build.win32b.tasm32" name="option.zd.enabled" value="0"/> + <property category="win32.Release_Build.win32b.tasm32" name="option.zi.enabled" value="0"/> + <property category="win32.Release_Build.win32b.tasm32" name="option.zn.enabled" value="1"/> + <optionset name="all_configurations"> + <property category="node" name="displayname" value="All Configurations"/> +<%foreach(defines common_defines macros)%> + <property category="win32.*.win32b.bcc32" name="option.D.arg.<%forcount%>" value="<%define%>"/> +<%endfor%> +<%if(type_is_dynamic)%> +<%foreach(dynamicflags)%> + <property category="win32.*.win32b.bcc32" name="option.D.arg.<%forcount%>" value="<%dynamicflag%>"/> +<%endfor%> +<%endif%> +<%if(need_staticflags)%> +<%foreach(staticflags)%> + <property category="win32.*.win32b.bcc32" name="option.D.arg.<%forcount%>" value="<%libflag%>"/> +<%endfor%> +<%endif%> + <property category="win32.*.win32b.bcc32" name="option.D.arg.merge" value="1"/> + <property category="win32.*.win32b.bcc32" name="option.D.enabled" value="1"/> + <property category="win32.*.win32b.bcc32" name="option.H=.arg.1" value="$(BDS)\lib\vcl100.csm"/> + <property category="win32.*.win32b.bcc32" name="option.H=.arg.merge" value="1"/> + <property category="win32.*.win32b.bcc32" name="option.H=.enabled" value="1"/> + <property category="win32.*.win32b.bcc32" name="option.Hc.enabled" value="1"/> + <property category="win32.*.win32b.bcc32" name="option.I.arg.1" value="$(BDS)\include"/> + <property category="win32.*.win32b.bcc32" name="option.I.arg.2" value="$(BDS)\include\dinkumware"/> + <property category="win32.*.win32b.bcc32" name="option.I.arg.3" value="$(BDS)\include\vcl"/> +<%foreach(4, includes)%> + <property category="win32.*.win32b.bcc32" name="option.I.arg.<%forcount%>" value="<%include%>"/> +<%endfor%> + <property category="win32.*.win32b.bcc32" name="option.I.arg.merge" value="1"/> + <property category="win32.*.win32b.bcc32" name="option.I.enabled" value="1"/> + <property category="win32.*.win32b.bcc32" name="option.Ve.enabled" value="0"/> + <property category="win32.*.win32b.bcc32" name="option.b.enabled" value="0"/> + <property category="win32.*.win32b.bcc32" name="option.sysdefines.arg.1" value="_RTLDLL"/> + <property category="win32.*.win32b.bcc32" name="option.sysdefines.arg.2" value="NO_STRICT"/> + <property category="win32.*.win32b.bcc32" name="option.sysdefines.arg.3" value="_NO_VCL"/> + <property category="win32.*.win32b.bcc32" name="option.sysdefines.arg.merge" value="1"/> + <property category="win32.*.win32b.bcc32" name="option.sysdefines.enabled" value="1"/> + <property category="win32.*.win32b.bcc32" name="option.tW.enabled" value="0"/> + <property category="win32.*.win32b.bcc32" name="option.tWC.enabled" value="0"/> +<%if(type_is_dynamic)%> + <property category="win32.*.win32b.bcc32" name="option.tWD.enabled" value="1"/> +<%endif%> + <property category="win32.*.win32b.bcc32" name="option.tWM.enabled" value="1"/> + <property category="win32.*.win32b.bcc32" name="option.w.enabled" value="0"/> + <property category="win32.*.win32b.bcc32" name="option.wrvl.enabled" value="0"/> + <property category="win32.*.win32b.bcc32" name="option.wccc.enabled" value="0"/> + <property category="win32.*.win32b.dcc32" name="option.I.arg.1" value="C:\ACE\latest\ACE_wrappers\ace"/> + <property category="win32.*.win32b.dcc32" name="option.I.arg.merge" value="1"/> + <property category="win32.*.win32b.dcc32" name="option.I.enabled" value="0"/> + <property category="win32.*.win32b.dcc32" name="option.O.arg.1" value="C:\ACE\latest\ACE_wrappers\ace"/> + <property category="win32.*.win32b.dcc32" name="option.O.arg.merge" value="1"/> + <property category="win32.*.win32b.dcc32" name="option.O.enabled" value="0"/> + <property category="win32.*.win32b.dcc32" name="option.R.arg.1" value="C:\ACE\latest\ACE_wrappers\ace"/> + <property category="win32.*.win32b.dcc32" name="option.R.arg.merge" value="1"/> + <property category="win32.*.win32b.dcc32" name="option.R.enabled" value="0"/> + <property category="win32.*.win32b.dcc32" name="option.U.arg.1" value="C:\ACE\latest\ACE_wrappers\ace"/> + <property category="win32.*.win32b.dcc32" name="option.U.arg.2" value=".\"/> + <property category="win32.*.win32b.dcc32" name="option.U.arg.3" value="$(BDS)\lib"/> + <property category="win32.*.win32b.dcc32" name="option.U.arg.4" value="$(BDS)\lib\obj"/> + <property category="win32.*.win32b.dcc32" name="option.U.arg.merge" value="1"/> + <property category="win32.*.win32b.dcc32" name="option.U.enabled" value="1"/> + <property category="win32.*.win32b.dcc32" name="param.filenames.merge" value="1"/> + <property category="win32.*.win32b.idl2cpp" name="option.I.arg.1" value="C:\ACE\latest\ACE_wrappers\ace"/> + <property category="win32.*.win32b.idl2cpp" name="option.I.arg.merge" value="1"/> + <property category="win32.*.win32b.idl2cpp" name="option.I.enabled" value="1"/> + <property category="win32.*.win32b.ilink32" name="option.Gi.enabled" value="1"/> + <property category="win32.*.win32b.ilink32" name="option.L.arg.1" value="C:\ACE\latest\ACE_wrappers\ace"/> + <property category="win32.*.win32b.ilink32" name="option.L.arg.2" value="$(BDS)\lib"/> + <property category="win32.*.win32b.ilink32" name="option.L.arg.3" value="$(BDS)\lib\obj"/> + <property category="win32.*.win32b.ilink32" name="option.L.arg.4" value="$(BDS)\lib\psdk"/> + <property category="win32.*.win32b.ilink32" name="option.L.arg.merge" value="1"/> + <property category="win32.*.win32b.ilink32" name="option.L.enabled" value="1"/> + <property category="win32.*.win32b.ilink32" name="option.Tpd.enabled" value="1"/> + <property category="win32.*.win32b.ilink32" name="option.Tpe.enabled" value="0"/> + <property category="win32.*.win32b.ilink32" name="option.Tpp.enabled" value="0"/> +<%if(contains(linkflags, -aa))%> + <property category="win32.*.win32b.ilink32" name="option.aa.enabled" value="1"/> +<%else%> + <property category="win32.*.win32b.ilink32" name="option.aa.enabled" value="0"/> +<%endif%> + <property category="win32.*.win32b.ilink32" name="option.ap.enabled" value="0"/> + <property category="win32.*.win32b.ilink32" name="option.dynamicrtl.enabled" value="1"/> + <property category="win32.*.win32b.ilink32" name="option.j.arg.1" value="C:\ACE\latest\ACE_wrappers\ace"/> + <property category="win32.*.win32b.ilink32" name="option.j.arg.merge" value="1"/> + <property category="win32.*.win32b.ilink32" name="option.j.enabled" value="0"/> + <property category="win32.*.win32b.ilink32" name="param.libfiles.1" value="import32.lib"/> + <property category="win32.*.win32b.ilink32" name="param.libfiles.2" value="cw32mti.lib"/> + <property category="win32.*.win32b.ilink32" name="param.libfiles.merge" value="0"/> + <property category="win32.*.win32b.ilink32" name="param.objfiles.1" value="c0d32.obj"/> + <property category="win32.*.win32b.ilink32" name="param.objfiles.2" value="$(PACKAGES)"/> + <property category="win32.*.win32b.ilink32" name="param.objfiles.merge" value="1"/> + </optionset> + </project> + <FILELIST> +<%if(source_files)%> +<%foreach(source_files)%> + <FILE FILENAME="<%source_file%>" CONTAINERID="CCompiler" LOCALCOMMAND="" UNITNAME="" FORMNAME="" DESIGNCLASS=""/> +<%endfor%> +<%endif%> +<%if(header_files)%> +<%foreach(header_files)%> + <FILE FILENAME="<%header_file%>" CONTAINERID=""/> +<%endfor%> +<%endif%> +<%if(inline_files)%> +<%foreach(inline_files)%> + <FILE FILENAME="<%inline_file%>" CONTAINERID="" /> +<%endfor%> +<%endif%> +<%foreach(custom_types)%> +<%if(custom_type->input_files)%> +<%foreach(custom_type->input_files)%> + <FILE FILENAME="<%custom_type->input_file%>" CONTAINERID="CCompiler" LOCALCOMMAND="" UNITNAME="" FORMNAME="" DESIGNCLASS=""/> +<%endfor%> +<%endif%> +<%endfor%> +<%if(template_files)%> +<%foreach(template_files)%> + <FILE FILENAME="<%template_file%>" CONTAINERID=""/> +<%endfor%> +<%endif%> +<%if(documentation_files)%> +<%foreach(documentation_files)%> + <FILE FILENAME="<%documentation_file%>" CONTAINERID=""/> +<%endfor%> +<%endif%> +<%if(resource_files)%> +<%foreach(resource_files)%> + <FILE FILENAME="<%resource_file%>" CONTAINERID="ResTool" LOCALCOMMAND="" UNITNAME="" FORMNAME="" DESIGNCLASS=""/> +<%endfor%> +<%endif%> + </FILELIST> + <IDEOPTIONS> + <VersionInfo> + <VersionInfo Name="IncludeVerInfo">False</VersionInfo> + <VersionInfo Name="AutoIncBuild">False</VersionInfo> + <VersionInfo Name="MajorVer">1</VersionInfo> + <VersionInfo Name="MinorVer">0</VersionInfo> + <VersionInfo Name="Release">0</VersionInfo> + <VersionInfo Name="Build">0</VersionInfo> + <VersionInfo Name="Debug">False</VersionInfo> + <VersionInfo Name="PreRelease">False</VersionInfo> + <VersionInfo Name="Special">False</VersionInfo> + <VersionInfo Name="Private">False</VersionInfo> + <VersionInfo Name="DLL">False</VersionInfo> + <VersionInfo Name="Locale">1043</VersionInfo> + <VersionInfo Name="CodePage">1252</VersionInfo> + </VersionInfo> + <VersionInfoKeys> + <VersionInfoKeys Name="CompanyName"></VersionInfoKeys> + <VersionInfoKeys Name="FileDescription"></VersionInfoKeys> + <VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys> + <VersionInfoKeys Name="InternalName"></VersionInfoKeys> + <VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys> + <VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys> + <VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys> + <VersionInfoKeys Name="ProductName"></VersionInfoKeys> + <VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys> + <VersionInfoKeys Name="Comments"></VersionInfoKeys> + </VersionInfoKeys> + <Debugging> + <Debugging Name="DebugSourceDirs"></Debugging> + </Debugging> + <Parameters> + <Parameters Name="RunParams"></Parameters> + <Parameters Name="Launcher"></Parameters> + <Parameters Name="UseLauncher">False</Parameters> + <Parameters Name="DebugCWD"></Parameters> + <Parameters Name="HostApplication"></Parameters> + <Parameters Name="RemoteHost"></Parameters> + <Parameters Name="RemotePath"></Parameters> + <Parameters Name="RemoteParams"></Parameters> + <Parameters Name="RemoteLauncher"></Parameters> + <Parameters Name="UseRemoteLauncher">False</Parameters> + <Parameters Name="RemoteCWD"></Parameters> + <Parameters Name="RemoteDebug">False</Parameters> + <Parameters Name="Debug Symbols Search Path"></Parameters> + <Parameters Name="LoadAllSymbols">True</Parameters> + <Parameters Name="LoadUnspecifiedSymbols">False</Parameters> + </Parameters> + <Linker> + <Linker Name="LibPrefix"></Linker> + <Linker Name="LibSuffix"></Linker> + <Linker Name="LibVersion"></Linker> + </Linker> + </IDEOPTIONS> + </BCBPROJECT> + </CPlusPlusBuilder.Personality> + <StarTeamAssociation></StarTeamAssociation> + <StarTeamNonRelativeFiles></StarTeamNonRelativeFiles> +</BorlandProject> + diff --git a/ACE/MPC/templates/bds4dll.mpt b/ACE/MPC/templates/bds4dll.mpt new file mode 100644 index 00000000000..a8d4998de5d --- /dev/null +++ b/ACE/MPC/templates/bds4dll.mpt @@ -0,0 +1,9 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +common_defines = WIN32 + +conditional_include "user_bdsdll" diff --git a/ACE/MPC/templates/bds4exe.mpt b/ACE/MPC/templates/bds4exe.mpt new file mode 100644 index 00000000000..8e7081e8e48 --- /dev/null +++ b/ACE/MPC/templates/bds4exe.mpt @@ -0,0 +1,9 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +common_defines = WIN32 + +conditional_include "user_bdsexe" diff --git a/ACE/MPC/templates/bmake.mpd b/ACE/MPC/templates/bmake.mpd new file mode 100644 index 00000000000..c61b40a3547 --- /dev/null +++ b/ACE/MPC/templates/bmake.mpd @@ -0,0 +1,374 @@ +#---------------------------------------------------------------------------- +# Borland Makefile +# +# This file was automatically generated by MPC. Any changes made directly to +# this file will be lost the next time it is generated. +# +#---------------------------------------------------------------------------- +<%marker(top)%> +<%foreach(configurations)%> +!ifdef <%normalize(uc(configuration))%> +OCFLAGS = <%if(optimize)%>-O2<%else%><%if(debug_prj)%>-v -y -Od -vi- -k<%foreach(debug_macros)%> -D<%debug_macro%><%endfor%><%endif%><%endif%><%foreach(defines)%> -D<%define%><%endfor%> +CFG_DIR = <%intermediate_dir%>\\ +LIBMODIFIER = <%if(use_lib_modifier)%><%lib_modifier%><%endif%> +EXEMODIFIER = <%if(use_exe_modifier)%><%lib_modifier%><%endif%> +<%if(type_is_static)%> +STATIC_CFG = 1 +<%endif%> +<%if(type_is_static || need_staticflags)%> +<%if(staticflags)%> +STATIC_FLAGS =<%foreach(staticflags)%> -D<%staticflag%><%endfor%> +<%endif%> +<%else%> +<%if(dynamicflags)%> +DYN_FLAGS =<%foreach(dynamicflags)%> -D<%dynamicflag%><%endfor%> +<%endif%> +<%endif%> +<%if(postlinkrmext)%> +POSTLINKRM = <%postlinkrmext%> +<%endif%> +<%if(exename)%> +EXEOUTPUTDIR = <%if(exeout)%><%exeout%><%if(windows_style)%>\<%output_dir("Debug")%><%endif%><%else%><%if(windows_style)%><%output_dir("Debug")%><%else%><%output_dir(".")%><%endif%><%endif%>\\ +<%endif%> +!else +<%endfor%> +!error You must define one of these valid configurations:<%foreach(configurations)%> <%normalize(uc(configuration))%><%endfor%> +<%foreach(configurations)%> +!endif +<%endfor%> + +!ifdef UNICODE +UC_CFLAGS = <%unicode_flags%> +UNICODE_DIR = Unicode\\ +UC_MAIN = w +ULIBMODIFIER = <%unicode_lib_modifier%> +UEXEMODIFIER = <%unicode_lib_modifier%> +!endif + +!ifdef CODEGUARD +CG_CFLAGS = -vG +CG_LIB = cg32.lib +!endif + +<%if(use_vcl)%> +STARTUP_LETTER = <%if(exename)%>w<%else%><%startup_letter%><%endif%> +<%else%> +VCL_CFLAGS = -D_NO_VCL +STARTUP_LETTER = <%startup_letter%> +<%endif%> +STARTUP_OBJ = c0$(STARTUP_LETTER)32$(UC_MAIN)$(OBJ_EXT) + +OBJ_EXT = <%obj_ext%> +DLL_EXT = <%dll_ext%> +LIB_EXT = <%lib_ext%> +EXE_EXT = <%exe_ext%> +CC = <%cc%> +RC = <%rc%> +LINK = <%link%> +TLIB = <%tlib%> +THREADFLAGS = <%thflags%> +DLLFLAGS = <%dllflags%> +LIBFLAGS = <%libflags%> +EXEFLAGS = <%exeflags%> +WARNFLAGS = <%warnflags%> +CCFLAGS = <%ccflags%><%if(type_is_binary)%> <%binary_compile_flags("-tWR -tWD")%><%endif%><%if(compile_flags)%> <%compile_flags%><%endif%> + +INTERMEDIATE = $(CFG_DIR)$(UNICODE_DIR)<%noextension(project_name)%> +<%if(exename)%> +NAME = <%exename%>$(EXEMODIFIER) +<%else%> +<%if(sharedname)%> +NAME = <%libname_prefix%><%sharedname%>$(LIBMODIFIER)$(ULIBMODIFIER) +<%else%> +<%if(staticname)%> +NAME = <%libname_prefix%><%staticname%>$(LIBMODIFIER)$(ULIBMODIFIER) +<%endif%> +<%endif%> +<%endif%> +CPPDIR = <%cppdir%> +RESDIR = <%rcdir%> +<%if(exename || sharedname || staticname)%> + +OBJFILES = \ +<%foreach(source_files)%> + "$(INTERMEDIATE)\<%transdir(source_file)%><%basenoextension(source_file)%>$(OBJ_EXT)"<%fornotlast(" \\")%> +<%endfor%> +<%endif%> +<%if(libpaths)%> + +LFLAGS = \ +<%if(linkflags)%> + <%linkflags%> \ +<%endif%> +<%if(StackReserveSize)%> + /S:<%StackReserveSize%> \ +<%endif%> +<%if(StackCommitSize)%> + /Sc:<%StackCommitSize%> \ +<%endif%> +<%if(!optimize)%> + -v<%if(libpaths)%> \<%endif%> +<%endif%> +<%foreach(libpaths)%> + -L"<%libpath%>" -j"<%libpath%>"<%fornotlast(" \\")%> +<%endfor%> +<%endif%> + +LIBFILES = \ +<%foreach(reverse(libs))%> + <%libname_prefix%><%lib%>$(LIBMODIFIER)$(ULIBMODIFIER)$(LIB_EXT) \ +<%endfor%> +<%foreach(reverse(lit_libs))%> + <%lit_lib%>$(LIB_EXT) \ +<%endfor%> +<%foreach(reverse(pure_libs))%> + <%pure_lib%> \ +<%endfor%> + $(CG_LIB) <%common_libs%> +<%if(resource_files)%> + +!ifndef STATIC_CFG +RESOURCE = \ +<%foreach(resource_files)%> + $(INTERMEDIATE)\<%transdir(resource_file)%><%basenoextension(resource_file)%>.res<%fornotlast(" \\")%> +<%endfor%> +<%if(includes)%> + +RC_FLAGS = \ +<%foreach(includes)%> + -i"<%include%>"<%fornotlast(" \\")%> +<%endfor%> +<%endif%> +!endif +<%endif%> +<%if(pch_header)%> + +# Borland precompiled headers can choke on some header files. +# Set NO_USE_PCH if you do not want to use precompiled headers. +!ifndef NO_USE_PCH +PCH_CFLAGS = \ +<%foreach(pch_defines)%> + -D<%pch_define%> \ +<%endfor%> + -H=$(INTERMEDIATE)\<%noextension(project_name)%>.csm -Hh=<%pch_header%> +!endif +<%endif%> + +CFLAGS = \ +<%foreach(cflags)%> + <%cflag%> \ +<%endfor%> +<%foreach(common_flags)%> + <%common_flag%> \ +<%endfor%> +<%foreach(macros common_defines)%> + -D<%macro%> \ +<%endfor%> +<%foreach(includes)%> + -I"<%include%>" \ +<%endfor%> + $(PCH_CFLAGS) \ + $(VCL_CFLAGS) + +<%marker(macros)%> +<%if(exename)%> +OUTPUTDIR = $(EXEOUTPUTDIR) +all:<%if(prebuild)%> __prebuild__<%endif%> $(OUTPUTDIR)$(NAME)$(EXE_EXT)<%if(postbuild)%> __postbuild__<%endif%> + +$(OUTPUTDIR)$(NAME)$(EXE_EXT): $(OBJFILES) $(RESOURCE) + @if not exist "$(OUTPUTDIR)" mkdir "$(OUTPUTDIR)" +<%if(prelink)%> + <%eval(prelink)%> +<%endif%> + $(LINK) @&&! + $(EXEFLAGS) $(LFLAGS) $(STARTUP_OBJ) $(OBJFILES), $(OUTPUTDIR)$(NAME)$(EXE_EXT),, $(LIBFILES),, $(RESOURCE) +! + +<%endif%> +<%if(sharedname)%> +!ifndef STATIC_CFG +OUTPUTDIR = <%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\\ +all:<%if(prebuild)%> __prebuild__<%endif%> $(OUTPUTDIR)$(NAME)$(DLL_EXT)<%if(postbuild)%> __postbuild__<%endif%> + +$(OUTPUTDIR)$(NAME)$(DLL_EXT): $(OBJFILES) $(RESOURCE) + @if not exist "$(OUTPUTDIR)" mkdir "$(OUTPUTDIR)" +<%if(prelink)%> + <%eval(prelink)%> +<%endif%> + $(LINK) @&&! + $(DLLFLAGS) $(LFLAGS) $(STARTUP_OBJ) $(OBJFILES), $(OUTPUTDIR)$(NAME)$(DLL_EXT),, $(LIBFILES),, $(RESOURCE) +! +!endif + +<%endif%> +<%if(staticname)%> +!ifdef STATIC_CFG +OUTPUTDIR = <%libout%>\\ +all:<%if(prebuild)%> __prebuild__<%endif%> $(OUTPUTDIR)$(NAME)$(LIB_EXT)<%if(postbuild)%> __postbuild__<%endif%> + +$(OUTPUTDIR)$(NAME)$(LIB_EXT): $(OBJFILES) + @if not exist "$(OUTPUTDIR)" mkdir "$(OUTPUTDIR)" + $(TLIB) $(LIBFLAGS) $(OUTPUTDIR)$(NAME)$(LIB_EXT) @&&! ++ $(**: = &^ ++ ) +! +!endif + +<%endif%> +<%if(!exename && !sharedname && !staticname)%> +all:<%if(prebuild)%> __prebuild__<%endif%><%if(postbuild)%> __postbuild__<%endif%> + @-rem + +<%endif%> +<%if(custom_types)%> +GENERATED_DIRTY =<%foreach(custom_types)%><%foreach(custom_type->input_files)%><%if(custom_type->input_file->output_files)%><%foreach(custom_type->input_file->output_files)%> <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%><%endfor%><%endif%><%endfor%><%endfor%> +<%foreach(custom_types)%> +<%if(custom_type->libpath)%> +PATH = $(PATH);<%custom_type->libpath%> +<%endif%> +<%foreach(custom_type->input_files)%> +<%if(custom_type->input_file->output_files)%> +<%foreach(custom_type->input_file->output_files)%><%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%><%fornotlast(" ")%><%endfor%>: <%custom_type->input_file%><%if(custom_type->input_file->dependencies)%> <%custom_type->input_file->dependencies%><%endif%> +<%if(flag_overrides(custom_type->input_file, gendir))%> + @if not exist "<%flag_overrides(custom_type->input_file, gendir)%>" mkdir "<%flag_overrides(custom_type->input_file, gendir)%>" +<%endif%> + <%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%if(custom_type->output_option)%><%custom_type->input_file%> <%custom_type->output_option%> $@<%else%><%custom_type->input_file%><%endif%> +<%if(flag_overrides(custom_type->input_file, postcommand))%> +<%foreach(custom_type->input_file)%> + <%flag_overrides(custom_type->input_file, postcommand)%> +<%endfor%> +<%else%> +<%if(custom_type->postcommand)%> +<%foreach(custom_type->input_file)%> + <%custom_type->postcommand%> +<%endfor%> +<%endif%> +<%endif%> +<%if(pch_header)%> +<%if(custom_type->pch_postrule)%> +<%foreach(custom_type->input_file->source_output_files)%> + @echo \#include "<%pch_header%>" > temporary.src + @type <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->source_output_file)%><%else%><%custom_type->input_file->source_output_file%><%endif%> >> temporary.src + @move /y temporary.src <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->source_output_file)%><%else%><%custom_type->input_file->source_output_file%><%endif%> +<%endfor%> +<%endif%> +<%endif%> + +<%endif%> +<%endfor%> +<%endfor%> +<%if(exename || sharedname || staticname)%> +<%if(source_files)%> +$(OBJFILES): $(GENERATED_DIRTY) +<%else%> +all:<%if(prebuild)%> __prebuild__<%endif%> $(GENERATED_DIRTY)<%if(postbuild)%> __postbuild__<%endif%> +<%endif%> +<%else%> +all:<%if(prebuild)%> __prebuild__<%endif%> $(GENERATED_DIRTY)<%if(postbuild)%> __postbuild__<%endif%> +<%endif%> + +<%endif%> +generated: $(GENERATED_DIRTY) + @-rem + +.path$(OBJ_EXT) = $(INTERMEDIATE) + +.path.cpp = $(CPPDIR) +.cpp$(OBJ_EXT): + @if not exist "$(INTERMEDIATE)" mkdir "$(INTERMEDIATE)" + $(CC) $(DYN_FLAGS) $(STATIC_FLAGS) $(OCFLAGS) $(CG_CFLAGS) $(UC_CFLAGS) $(THREADFLAGS) $(CCFLAGS) $(CFLAGS) $(WARNFLAGS) -c -n$(@D) $< + +.path.cxx = $(CPPDIR) +.cxx$(OBJ_EXT): + @if not exist "$(INTERMEDIATE)" mkdir "$(INTERMEDIATE)" + $(CC) $(DYN_FLAGS) $(STATIC_FLAGS) $(OCFLAGS) $(CG_CFLAGS) $(UC_CFLAGS) $(THREADFLAGS) $(CCFLAGS) $(CFLAGS) $(WARNFLAGS) -c -n$(@D) $< + +.path.cc = $(CPPDIR) +.cc$(OBJ_EXT): + @if not exist "$(INTERMEDIATE)" mkdir "$(INTERMEDIATE)" + $(CC) $(DYN_FLAGS) $(STATIC_FLAGS) $(OCFLAGS) $(CG_CFLAGS) $(UC_CFLAGS) $(THREADFLAGS) $(CCFLAGS) $(CFLAGS) $(WARNFLAGS) -c -n$(@D) $< + +.path.C = $(CPPDIR) +.C$(OBJ_EXT): + @if not exist "$(INTERMEDIATE)" mkdir "$(INTERMEDIATE)" + $(CC) $(DYN_FLAGS) $(STATIC_FLAGS) $(OCFLAGS) $(CG_CFLAGS) $(UC_CFLAGS) $(THREADFLAGS) $(CCFLAGS) $(CFLAGS) $(WARNFLAGS) -c -n$(@D) $< + +.path.c = $(CPPDIR) +.c$(OBJ_EXT): + @if not exist "$(INTERMEDIATE)" mkdir "$(INTERMEDIATE)" + $(CC) $(DYN_FLAGS) $(STATIC_FLAGS) $(OCFLAGS) $(CG_CFLAGS) $(UC_CFLAGS) $(THREADFLAGS) $(CCFLAGS) $(CFLAGS) $(WARNFLAGS) -c -n$(@D) $< + +<%foreach(source_files)%> +<%if(transdir(source_file) || flag_overrides(source_file, buildflags))%> +"$(INTERMEDIATE)\<%transdir(source_file)%><%basenoextension(source_file)%>$(OBJ_EXT)": + @if not exist "$(INTERMEDIATE)\<%transdir(source_file)%>" mkdir "$(INTERMEDIATE)\<%transdir(source_file)%>" + $(CC) <%if(flag_overrides(source_file, buildflags))%><%flag_overrides(source_file, buildflags)%> <%endif%>$(DYN_FLAGS) $(STATIC_FLAGS) $(OCFLAGS) $(CG_CFLAGS) $(UC_CFLAGS) $(THREADFLAGS) $(CCFLAGS) $(CFLAGS) $(WARNFLAGS) -c -n$(@D) <%source_file%> + +<%endif%> +<%endfor%> +<%if(resource_files)%> +!ifndef STATIC_CFG +.path.res = $(INTERMEDIATE) + +.path.rc = $(RESDIR) +.rc.res: + @if not exist "$(INTERMEDIATE)" mkdir "$(INTERMEDIATE)" + $(RC) $(RC_FLAGS) -fo$@ $< + +<%foreach(resource_files)%> +<%if(transdir(resource_file))%> +"$(INTERMEDIATE)\<%transdir(resource_file)%><%basenoextension(resource_file)%>.res": + @if not exist "$(INTERMEDIATE)\<%transdir(resource_file)%>" mkdir "$(INTERMEDIATE)\<%transdir(resource_file)%>" + $(RC) -fo$@ <%resource_file%> + +<%endif%> +<%endfor%> +!endif + +<%endif%> +clean: + @if exist "$(INTERMEDIATE)" rmdir /s/q $(INTERMEDIATE) + +realclean: clean +<%foreach(custom_types)%> +<%foreach(custom_type->input_files)%> +<%if(custom_type->input_file->output_files)%> +<%foreach(custom_type->input_file->output_files)%> +<%if(flag_overrides(custom_type->input_file, gendir))%> + @del "<%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_file)%>" 2>NUL +<%else%> + @del "<%custom_type->input_file->output_file%>" 2>NUL +<%endif%> +<%endfor%> +<%endif%> +<%endfor%> +<%endfor%> +<%if(exename)%> + @del "$(OUTPUTDIR)$(NAME)$(EXE_EXT)" del "$(OUTPUTDIR)$(NAME)$(EXE_EXT)" 2>NUL +<%else%> +<%if(sharedname)%> + @del "$(OUTPUTDIR)$(NAME)$(DLL_EXT)" del "$(OUTPUTDIR)$(NAME)$(DLL_EXT)" 2>NUL +<%endif%> +<%if(staticname)%> + @del "$(OUTPUTDIR)$(NAME)$(LIB_EXT)" del "$(OUTPUTDIR)$(NAME)$(LIB_EXT)" 2>NUL +<%endif%> +<%endif%> +<%if(exename || sharedname || staticname)%> + @del "$(OUTPUTDIR)$(NAME)$(POSTLINKRM)" 2>NUL +<%endif%> +<%if(postclean)%> + -<%eval(postclean)%> +<%endif%> + +<%if(prebuild)%> +__prebuild__: + @<%eval(prebuild)%> + +<%endif%> +<%if(postbuild)%> +__postbuild__: + @<%eval(postbuild)%> + +<%endif%> +<%marker(local)%> +<%marker(bottom)%> diff --git a/ACE/MPC/templates/bmakecommon.mpt b/ACE/MPC/templates/bmakecommon.mpt new file mode 100644 index 00000000000..51bfaa1f247 --- /dev/null +++ b/ACE/MPC/templates/bmakecommon.mpt @@ -0,0 +1,28 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" + +configurations = Debug Release +common_defines = WIN32 _WINDOWS +common_libs = import32$(LIB_EXT) cw32mti.lib ws2_32.lib +common_flags = -a8 +unicode_flags = -WU +unicode_lib_modifier = u +unicode_exe_modifier = u + +obj_ext = .obj +dll_ext = .dll +lib_ext = .lib +exe_ext = .exe +cc = bcc32 +rc = brcc32 +tlib = tlib +link = ilink32 +thflags = -tWM +dllflags = -Tpd -Gi -x -Gn -w-dup +libflags = /C +ccflags = -q +exeflags = -Tpe -x -Gn +warnflags = -w-rvl -w-rch -w-ccc -w-obs -w-aus -w-pia -w-inl + diff --git a/ACE/MPC/templates/bmakedll.mpt b/ACE/MPC/templates/bmakedll.mpt new file mode 100644 index 00000000000..218d0e20087 --- /dev/null +++ b/ACE/MPC/templates/bmakedll.mpt @@ -0,0 +1,45 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "bmakecommon" + +configurations = Debug Release "Static Debug" "Static Release" +startup_letter = d + +Release { + optimize = 1 + defines = NDEBUG + intermediate_dir = Release + lib_modifier = _br + postlinkrmext = .tds +} + +Debug { + optimize = + debug_prj = 1 + defines = _DEBUG + intermediate_dir = Debug + lib_modifier = _bd + postlinkrmext = .tds +} + +Static Release { + optimize = 1 + defines = NDEBUG + output_dir = Static_Release + intermediate_dir = Static_Release + lib_modifier = _bsr + type_is_static = 1 +} + +Static Debug { + optimize = + debug_prj = 1 + defines = _DEBUG + output_dir = Static_Debug + intermediate_dir = Static_Debug + lib_modifier = _bsd + type_is_static = 1 +} + +conditional_include "user_bmakedll" diff --git a/ACE/MPC/templates/bmakedllexe.mpt b/ACE/MPC/templates/bmakedllexe.mpt new file mode 100644 index 00000000000..0aa0d7eb35f --- /dev/null +++ b/ACE/MPC/templates/bmakedllexe.mpt @@ -0,0 +1,48 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "bmakecommon" + +configurations = Debug Release "Static Debug" "Static Release" +startup_letter = x + +Release { + optimize = 1 + defines = NDEBUG + output_dir = Release + intermediate_dir = Release + lib_modifier = _br + postlinkrmext = .tds +} + +Debug { + optimize = + debug_prj = 1 + defines = _DEBUG + intermediate_dir = Debug + lib_modifier = _bd + postlinkrmext = .tds +} + +Static Release { + optimize = 1 + defines = NDEBUG + output_dir = Static_Release + intermediate_dir = Static_Release + lib_modifier = _bsr + postlinkrmext = .tds + type_is_static = 1 +} + +Static Debug { + optimize = + debug_prj = 1 + defines = _DEBUG + output_dir = Static_Debug + intermediate_dir = Static_Debug + lib_modifier = _bsd + postlinkrmext = .tds + type_is_static = 1 +} + +conditional_include "user_bmakedllexe" diff --git a/ACE/MPC/templates/bmakelib.mpt b/ACE/MPC/templates/bmakelib.mpt new file mode 100644 index 00000000000..2091ce2c512 --- /dev/null +++ b/ACE/MPC/templates/bmakelib.mpt @@ -0,0 +1,21 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "bmakecommon" + +Release { + optimize = 1 + defines = NDEBUG + intermediate_dir = Static_Release + lib_modifier = _bsr +} + +Debug { + optimize = + debug_prj = 1 + defines = _DEBUG + intermediate_dir = Static_Debug + lib_modifier = _bsd +} + +conditional_include "user_bmakelib" diff --git a/ACE/MPC/templates/bmakelibexe.mpt b/ACE/MPC/templates/bmakelibexe.mpt new file mode 100644 index 00000000000..ea4acddff05 --- /dev/null +++ b/ACE/MPC/templates/bmakelibexe.mpt @@ -0,0 +1,27 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "bmakecommon" + +startup_letter = x + +Release { + optimize = 1 + defines = NDEBUG + output_dir = Static_Release + intermediate_dir = Static_Release + lib_modifier = _bsr + postlinkrmext = .tds +} + +Debug { + optimize = + debug_prj = 1 + defines = _DEBUG + output_dir = Static_Debug + intermediate_dir = Static_Debug + lib_modifier = _bsd + postlinkrmext = .tds +} + +conditional_include "user_bmakelibexe" diff --git a/ACE/MPC/templates/cc.mpd b/ACE/MPC/templates/cc.mpd new file mode 100644 index 00000000000..912dc41a206 --- /dev/null +++ b/ACE/MPC/templates/cc.mpd @@ -0,0 +1,93 @@ +; Code Composer Project File, Version <%ccversion("2.0")%> (do not modify or remove this line) + +[Project Settings] +ProjectDir="<%cwd%>" +ProjectType=<%if(exename)%>Executable<%else%>Library<%endif%> +CPUFamily=<%cpufamily("TMS320C64XX")%> +<%if(exename)%> +Tool="Linker" +<%else%> +Tool="Archiver" +<%endif%> +Tool="Compiler" +Tool="CustomBuilder" +Tool="DspBiosBuilder" +<%foreach(configurations)%> +Config="<%configuration%>" +<%endfor%> + +<%if(after)%> +; MPC ADD DEPENDENCIES +<%endif%> +[Source Files] +<%foreach(source_files)%> +Source="<%source_file%>" +<%endfor%> + +<%if(prebuild || postbuild)%> +<%foreach(configurations)%> +["<%configuration%>" Settings] +<%if(prebuild)%> +InitialBuildCmd=<%eval(prebuild)%>;Run=Always +<%endif%> +<%if(postbuild)%> +FinalBuildCmd=<%eval(postbuild)%>;Run=Always +<%endif%> + +<%endfor%> +<%endif%> +<%if(custom_types)%> +[Generated Files] +<%foreach(custom_types)%> +<%foreach(custom_type->input_files)%> +<%foreach(custom_type->input_file->output_files)%> +Source="<%custom_type->input_file->output_file%>" +<%endfor%> +<%endfor%> +<%endfor%> + +<%endif%> +<%foreach(configurations)%> +["Compiler" Settings: "<%configuration%>"] +Options=<%if(optimize)%>-o3<%else%>-g<%endif%> <%if(rtti)%>-rtti <%endif%><%if(compile_flags)%><%compile_flags%> <%endif%>-fr"$(Proj_dir)\<%intermediate_dir%>" <%foreach(includes)%>-i"<%include%>" <%endfor%><%foreach(macros defines)%>-d"<%macro%>" <%endfor%><%if(need_staticflags)%><%foreach(staticflags)%>-d"<%staticflag%>" <%endfor%><%endif%><%if(big_endian)%>-me <%endif%><%target_version("-mv6400")%> + +<%endfor%> +<%foreach(configurations)%> +<%if(exename)%> +["Linker" Settings: "<%configuration%>"] +Options=-c -m"<%if(exeout)%><%exeout%>\<%endif%><%if(windows_style)%><%output_dir%>\<%endif%><%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%>.map" -o"<%if(exeout)%><%exeout%>\<%endif%><%if(windows_style)%><%output_dir%>\<%endif%><%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%><%exe_ext%>" -w -x<%foreach(libpaths)%> -i"<%libpath%>"<%endfor%><%foreach(libs)%> -l"<%lib%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%>"<%endfor%><%foreach(lit_libs)%> -l"<%lit_lib%><%lib_ext%>"<%endfor%> +<%else%> +["Archiver" Settings: "<%configuration%>"] +Options=-r -o<%libout%>\<%lib_prefix%><%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%> +<%endif%> + +<%endfor%> +<%foreach(source_files)%> +<%if(flag_overrides(source_file, buildflags))%> +<%foreach(configurations)%> +["<%source_file%>" Settings: "<%configuration%>"] +Options="Compiler" +{<%flag_overrides(source_file, buildflags)%>} + +<%endfor%> +<%endif%> +<%endfor%> +<%foreach(custom_types)%> +<%foreach(custom_types->input_files)%> +<%if(ends_with(custom_types->input_file, \.cmd))%> +<%foreach(configurations)%> +["<%custom_types->input_file%>" Settings: "<%configuration%>"] +LinkOrder=1 + +<%endfor%> +<%endif%> +<%endfor%> +<%endfor%> +<%foreach(source_files)%> +<%if(ends_with(source_file, \.cmd))%> +<%foreach(configurations)%> +["<%source_file%>" Settings: "<%configuration%>"] +LinkOrder=1 + +<%endfor%> +<%endif%> +<%endfor%> diff --git a/ACE/MPC/templates/cccommon.mpt b/ACE/MPC/templates/cccommon.mpt new file mode 100644 index 00000000000..c6739dbc156 --- /dev/null +++ b/ACE/MPC/templates/cccommon.mpt @@ -0,0 +1,29 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" + +lib_prefix = +lib_ext = .lib +dll_ext = .dll +exe_ext = .out + +configurations = Debug Release +common_defines = +rtti = 1 +big_endian = +windows_style = 1 + +Release { + optimize = 1 + output_dir = Release + intermediate_dir = Release +} + +Debug { + optimize = + defines = _DEBUG + output_dir = Debug + intermediate_dir = Debug + lib_modifier = d +} diff --git a/ACE/MPC/templates/ccexe.mpt b/ACE/MPC/templates/ccexe.mpt new file mode 100644 index 00000000000..3c553b6125c --- /dev/null +++ b/ACE/MPC/templates/ccexe.mpt @@ -0,0 +1,5 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "cccommon" +conditional_include "user_ccexe" diff --git a/ACE/MPC/templates/cclib.mpt b/ACE/MPC/templates/cclib.mpt new file mode 100644 index 00000000000..d3201932fb6 --- /dev/null +++ b/ACE/MPC/templates/cclib.mpt @@ -0,0 +1,5 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "cccommon" +conditional_include "user_cclib" diff --git a/ACE/MPC/templates/common.mpt b/ACE/MPC/templates/common.mpt new file mode 100644 index 00000000000..2fb7f5e506a --- /dev/null +++ b/ACE/MPC/templates/common.mpt @@ -0,0 +1,8 @@ +// -*- MPC -*- +// $Id$ + +// This file contains assignments that are common to all templates + +pch_defines += USING_PCH +use_lib_modifier = 1 +use_exe_modifier = diff --git a/ACE/MPC/templates/em3.mpd b/ACE/MPC/templates/em3.mpd new file mode 100644 index 00000000000..9ecb384500b --- /dev/null +++ b/ACE/MPC/templates/em3.mpd @@ -0,0 +1,395 @@ +# Microsoft eMbedded Visual Tools Project File - Name="<%project_name%>" - Package Owner=<4> +# Microsoft eMbedded Visual Tools Generated Build File, Format Version 6.02 +# ** DO NOT EDIT ** + +<%foreach(platforms)%> +# TARGTYPE "<%operating_system("Win32")%> (<%platform%>) <%if(exename || sharedname || staticname)%><%if(type_is_static && staticname)%>Static Library<%else%><%type_description%><%endif%><%else%>Dynamic-Link Library<%endif%>" <%type_code%> +<%endfor%> + +CFG=<%project_name%> - <%operating_system("Win32")%> (<%default_platform%>) <%default_configuration%> +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE run the tool that generated this project file and specify the +!MESSAGE nmake output type. You can then use the following command: +!MESSAGE +!MESSAGE NMAKE. +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE CFG="<%project_name%> - <%operating_system%> (<%default_platform%>) <%default_configuration%>" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +<%foreach(platforms)%> +<%foreach(configurations)%> +!MESSAGE "<%project_name%> - <%operating_system%> (<%platform%>) <%configuration%>" (based on "<%operating_system%> (<%platform%>) <%if(exename || sharedname || staticname)%><%if(type_is_static && staticname)%>Static Library<%else%><%type_description%><%endif%><%else%>Dynamic-Link Library<%endif%>") +<%endfor%> +<%endfor%> +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +# PROP ATL_Project <%atl_project("2")%> + +<%foreach(platforms)%> +<%foreach(configurations)%> +!<%fornotfirst("ELSE")%>IF "$(CFG)" == "<%project_name%> - <%operating_system%> (<%platform%>) <%configuration%>" + +# PROP Use_MFC <%use_mfc("0")%> +# PROP Use_Debug_Libraries <%if(use_debug_libraries)%><%use_debug_libraries%><%else%>0<%endif%> +<%if(exename)%> +# PROP Output_Dir "<%if(windows_style)%><%output_dir("Debug")%><%else%><%output_dir(".")%><%endif%>\<%machine%>" +<%endif%> +<%if(type_is_static)%> +# PROP Output_Dir "<%output_dir%>\<%machine%>" +<%endif%> +<%if(type_is_dynamic)%> +# PROP Output_Dir "<%libout%>\<%machine%>" +<%endif%> +# PROP Intermediate_Dir "<%intermediate_dir%>\<%noextension(project_file)%>\<%machine%>" +# PROP CPU_ID "{<%cpu_id%>}" +# PROP Platform_ID "{<%platform_id%>}" +<%if(type_is_dynamic)%> +# PROP Ignore_Export_Lib 0 +<%endif%> +# PROP Target_Dir "" +<%if(type_is_static)%> +LINK32=link.exe -lib +<%endif%> +RSC=rc.exe +# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "$(CePlatform)"<%foreach(defines common_defines cpu_defines macros)%> /d <%define%><%endfor%><%foreach(includes)%> /i "<%include%>"<%endfor%> /r +CPP=<%cpp("cl.exe")%> +# ADD CPP /nologo <%if(optimize)%>/O2<%else%>/Ob0<%endif%> <%compile_flags%><%foreach(DisableSpecificWarnings)%> /wd<%DisableSpecificWarning%><%endfor%><%if(pdbc)%> /Fd"<%if(type_is_static)%><%libout%>\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.pdb<%else%><%intermediate_dir%>\<%noextension(project_file)%>\<%machine%>/<%endif%>"<%endif%> <%cpu_options%> <%foreach(includes)%>/I "<%include%>" <%endfor%>/D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D UNDER_CE=$(CEVersion) <%foreach(defines common_defines cpu_defines macros)%>/D <%define%> <%endfor%><%if(type_is_dynamic)%><%foreach(dynamicflags)%>/D <%dynamicflag%> <%endfor%><%endif%><%if(need_staticflags)%><%foreach(staticflags)%>/D <%staticflag%> <%endfor%><%endif%><%if(pch_header)%><%foreach(pch_defines)%>/D <%pch_define%> <%endfor%><%if(pch_source)%>/Yu<%else%>/YX<%endif%>"<%pch_header%>" /Fp"<%intermediate_dir%>\<%noextension(project_file)%>\<%machine%>\<%noextension(pch_header)%>.pch" <%endif%> /FD /Gy /c +<%if(compile_flags_removed)%> +# SUBTRACT CPP <%compile_flags_removed%> +<%endif%> +BSC32=bscmake.exe +# ADD BSC32 /nologo <%if(sharedname || staticname)%>/o"<%libout%>\<%libname_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%>.bsc"<%endif%> +<%if(type_is_binary)%> +LINK32=link.exe +# ADD LINK32 <%systemlibs("winsock.lib commctrl.lib coredll.lib iphlpapi.lib")%><%if(link_options)%> <%link_options%><%endif%> /INCREMENTAL:<%incremental("NO")%> <%foreach(reverse(libs))%><%libname_prefix%><%lib%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%> <%endfor%><%foreach(reverse(lit_libs))%><%lit_lib%>.lib <%endfor%><%foreach(reverse(pure_libs))%><%pure_lib%> <%endfor%><%foreach(libpaths)%>/libpath:"<%libpath%>\<%machine%>" <%endfor%>/nologo /base:"<%base("0x00010000")%>" <%if(type_is_dynamic)%> /implib:"<%libout%>\<%machine%>\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%>" /entry:"_DllMainCRTStartup"<%endif%> /nodefaultlib:"$(CENoDefaultLib)<%foreach(ignore_libs)%>,<%ignore_lib%><%endfor%>"<%if(win_version)%> /version:<%win_version%><%endif%><%if(StackReserveSize)%> /stack:<%StackReserveSize%><%if(StackCommitSize)%>,<%StackCommitSize%><%endif%><%endif%> /subsystem:$(CESubsystem) /align:"<%align("4096")%>"<%if(pdbl)%><%if(sharedname)%> /pdb:"<%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%machine%>\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.pdb"<%else%><%if(exename)%> /pdb:"<%if(exeout)%><%exeout%><%if(windows_style)%>\<%output_dir%><%endif%><%else%><%output_dir%><%endif%>\<%machine%>\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%>.pdb"<%endif%><%endif%><%else%> /pdb:none<%endif%> <%if(type_is_dynamic)%> <%if(!source_files)%>/noentry <%endif%>/dll<%endif%> <%if(unicode && unicode_mfc_entry && exename && source_files)%>/entry:"<%unicode_mfc_entry%>" <%endif%><%if(use_debug_libraries)%>/debug <%endif%>/machine:<%machine%> /out:"<%if(sharedname)%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%machine%>\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%dll_ext%><%endif%><%if(exename)%><%if(exeout)%><%exeout%><%if(windows_style)%>\<%output_dir%><%endif%><%else%><%output_dir%><%endif%>\<%machine%>\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%><%exe_ext%><%endif%>" +<%if(link_flags_removed)%> +# SUBTRACT LINK32 <%link_flags_removed%> +<%endif%> +<%endif%> +<%if(type_is_static)%> +LIB32=link.exe -lib +# ADD LIB32 /nologo /out:"<%libout%>\<%machine%>\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%>" +<%endif%> +<%if(postbuild)%> +# Begin Special Build Tool +SOURCE="$(InputPath)" +PostBuild_Cmds=<%eval(postbuild)%> +# End Special Build Tool +<%endif%> + +<%endfor%> +!ENDIF +<%endfor%> + + +# Begin Target + +<%foreach(platforms)%> +<%foreach(configurations)%> +# Name "<%project_name%> - <%operating_system%> (<%platform%>) <%configuration%>" +<%endfor%> +<%endfor%> +<%if(exename || sharedname || staticname)%> +# Begin Group "Source Files" + +# PROP Default_Filter "<%foreach(ext, extensions(source_files))%><%ext%><%fornotlast(";")%><%endfor%>" +<%if(pch_source)%> +<%if(pch_header)%> +# Begin Source File + +SOURCE="<%pch_source%>" +# ADD CPP /Yc"<%pch_header%>" +# End Source File +<%endif%> +<%endif%> +<%if(grouped_source_files)%> +<%foreach(sort(grouped_source_files))%> +# Begin Group "<%grouped_source_file%>" + +# PROP Default_Filter "" +<%foreach(grouped_source_file->files)%> +# Begin Source File + +SOURCE="<%grouped_source_file->file%>" +<%if(duplicate_index(grouped_source_file->file))%> +<%foreach(platforms)%> +<%foreach(configurations)%> +!<%fornotfirst("ELSE")%>IF "$(CFG)" == "<%project_name%> - <%operating_system%> (<%platform%>) <%configuration%>" +# ADD CPP <%if(flag_overrides(grouped_source_file->file, buildflags))%><%flag_overrides(grouped_source_file->file, buildflags)%> <%endif%>/Fo"<%intermediate_dir%>\<%noextension(project_file)%>\<%machine%>\<%basenoextension(grouped_source_file->file)%><%duplicate_index(grouped_source_file->file)%>.obj" +<%if(flag_overrides(grouped_source_file->file, no_pch))%> +# SUBTRACT CPP /YX /Yc /Yu +<%endif%> +<%endfor%> +!ENDIF +<%endfor%> +<%else%> +<%if(flag_overrides(grouped_source_file->file, buildflags))%> +# ADD CPP <%flag_overrides(grouped_source_file->file, buildflags)%> +<%endif%> +<%if(flag_overrides(grouped_source_file->file, no_pch))%> +# SUBTRACT CPP /YX /Yc /Yu +<%endif%> +<%endif%> +# End Source File +<%endfor%> +# End Group +<%endfor%> +<%else%> +<%foreach(source_files)%> +# Begin Source File + +SOURCE="<%source_file%>" +<%if(duplicate_index(source_file))%> +<%foreach(platforms)%> +<%foreach(configurations)%> +!<%fornotfirst("ELSE")%>IF "$(CFG)" == "<%project_name%> - <%operating_system%> (<%platform%>) <%configuration%>" +# ADD CPP <%if(flag_overrides(source_file, buildflags))%><%flag_overrides(source_file, buildflags)%> <%endif%>/Fo"<%intermediate_dir%>\<%noextension(project_file)%>\<%machine%>\<%basenoextension(source_file)%><%duplicate_index(source_file)%>.obj" +<%if(flag_overrides(source_file, no_pch))%> +# SUBTRACT CPP /YX /Yc /Yu +<%endif%> +<%endfor%> +!ENDIF +<%endfor%> +<%else%> +<%if(flag_overrides(source_file, buildflags))%> +# ADD CPP <%flag_overrides(source_file, buildflags)%> +<%endif%> +<%if(flag_overrides(source_file, no_pch))%> +# SUBTRACT CPP /YX /Yc /Yu +<%endif%> +<%endif%> +# End Source File +<%endfor%> +<%endif%> +# End Group +<%endif%> +<%if(header_files)%> +# Begin Group "Header Files" + +# PROP Default_Filter "<%foreach(ext, extensions(header_files))%><%ext%><%fornotlast(";")%><%endfor%>" +<%if(pch_header)%> +# Begin Source File + +SOURCE="<%pch_header%>" +# End Source File +<%endif%> +<%if(grouped_header_files)%> +<%foreach(sort(grouped_header_files))%> +# Begin Group "<%grouped_header_file%>" + +# PROP Default_Filter "" +<%foreach(grouped_header_file->files)%> +# Begin Source File + +SOURCE="<%grouped_header_file->file%>" +# End Source File +<%endfor%> +# End Group +<%endfor%> +<%else%> +<%foreach(header_files)%> +# Begin Source File + +SOURCE="<%header_file%>" +# End Source File +<%endfor%> +<%endif%> +# End Group +<%endif%> +<%if(inline_files)%> +# Begin Group "Inline Files" + +# PROP Default_Filter "<%foreach(ext, extensions(inline_files))%><%ext%><%fornotlast(";")%><%endfor%>" +<%if(grouped_inline_files)%> +<%foreach(sort(grouped_inline_files))%> +# Begin Group "<%grouped_inline_file%>" + +# PROP Default_Filter "" +<%foreach(grouped_inline_file->files)%> +# Begin Source File + +SOURCE="<%grouped_inline_file->file%>" +# End Source File +<%endfor%> +# End Group +<%endfor%> +<%else%> +<%foreach(inline_files)%> +# Begin Source File + +SOURCE="<%inline_file%>" +# End Source File +<%endfor%> +<%endif%> +# End Group +<%endif%> +<%if(template_files)%> +# Begin Group "Template Files" + +# PROP Default_Filter "" +<%if(grouped_template_files)%> +<%foreach(sort(grouped_template_files))%> +# Begin Group "<%grouped_template_file%>" + +# PROP Default_Filter "" +<%foreach(grouped_template_file->files)%> +# Begin Source File + +SOURCE="<%grouped_template_file->file%>" +# PROP Exclude_From_Build 1 +# End Source File +<%endfor%> +# End Group +<%endfor%> +<%else%> +<%foreach(template_files)%> +# Begin Source File + +SOURCE="<%template_file%>" +# PROP Exclude_From_Build 1 +# End Source File +<%endfor%> +<%endif%> +# End Group +<%endif%> +<%if(documentation_files)%> +# Begin Group "Documentation" + +# PROP Default_Filter "" +<%if(grouped_documentation_files)%> +<%foreach(sort(grouped_documentation_files))%> +# Begin Group "<%grouped_documentation_file%>" + +# PROP Default_Filter "" +<%foreach(grouped_documentation_file->files)%> +# Begin Source File + +SOURCE="<%grouped_documentation_file->file%>" +# End Source File +<%endfor%> +# End Group +<%endfor%> +<%else%> +<%foreach(documentation_files)%> +# Begin Source File + +SOURCE="<%documentation_file%>" +# End Source File +<%endfor%> +<%endif%> +# End Group +<%endif%> +<%if(resource_files && !type_is_static)%> +# Begin Group "Resource Files" + +# PROP Default_Filter "rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" +<%if(grouped_resource_files)%> +<%foreach(sort(grouped_resource_files))%> +# Begin Group "<%grouped_resource_file%>" + +# PROP Default_Filter "" +<%foreach(grouped_resource_file->files)%> +# Begin Source File + +SOURCE="<%grouped_resource_file->file%>" +# End Source File +<%endfor%> +# End Group +<%endfor%> +<%else%> +<%foreach(resource_files)%> +# Begin Source File + +SOURCE="<%resource_file%>" +# End Source File +<%endfor%> +<%endif%> +# End Group +<%endif%> +<%foreach(custom_types)%> +<%if(custom_type->input_files)%> +# Begin Group "<%ucw(custom_type)%>" + +# PROP Default_Filter "<%foreach(custom_type->inputexts)%><%custom_type->inputext%><%fornotlast(";")%><%endfor%>" +<%foreach(custom_type->input_files)%> +# Begin Source File + +SOURCE="<%custom_type->input_file%>" +<%if(custom_type->input_file->output_files)%> + +<%foreach(platforms)%> +<%foreach(configurations)%> +!<%fornotfirst("ELSE")%>IF "$(CFG)" == "<%project_name%> - <%operating_system%> (<%platform%>) <%configuration%>" + +<%if(flag_overrides(custom_type->input_file, dependent))%> +USERDEP__<%basenoextension(custom_type->input_file)%>=<%foreach(dep, flag_overrides(custom_type->input_file, dependent))%>"<%dep%><%if(!has_extension(dep))%><%exe_ext%><%endif%>"<%fornotlast(" ")%><%endfor%><%foreach(custom_type->input_file->dependencies)%> "<%custom_type->input_file->dependencie%>"<%endfor%> +<%else%> +<%if(custom_type->dependent)%> +USERDEP__<%basenoextension(custom_type->input_file)%>=<%foreach(custom_type->dependent)%>"<%custom_type->dependent%><%if(!has_extension(custom_type->dependent))%><%exe_ext%><%endif%>"<%fornotlast(" ")%><%endfor%><%foreach(custom_type->input_file->dependencies)%> "<%custom_type->input_file->dependencie%>"<%endfor%> +<%else%> +<%if(custom_type->input_file->dependencies)%> +USERDEP__<%basenoextension(custom_type->input_file)%>=<%foreach(custom_type->input_file->dependencies)%>"<%custom_type->input_file->dependencie%>"<%fornotlast(" ")%><%endfor%> +<%endif%> +<%endif%> +<%endif%> +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Invoking <%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> on $(InputPath) +InputPath="<%custom_type->input_file%>" + +BuildCmds= \ +<%if(custom_type->libpath)%> + PATH=%PATH%;<%custom_type->libpath%> \ +<%endif%> +<%if(flag_overrides(custom_type->input_file, gendir))%> + mkdir <%flag_overrides(custom_type->input_file, gendir)%> 2> nul \ +<%endif%> + <%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%if(custom_type->output_option)%>$(InputPath) <%custom_type->output_option%><%foreach(custom_type->input_file->output_files)%> "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%>"<%endfor%><%else%>$(InputPath)<%endif%> \ +<%if(flag_overrides(custom_type->input_file, postcommand))%> +<%foreach(custom_type->input_file)%> + <%flag_overrides(custom_type->input_file, postcommand)%> \ +<%endfor%> +<%else%> +<%if(custom_type->postcommand)%> +<%foreach(custom_type->input_file)%> + <%custom_type->postcommand%> \ +<%endfor%> +<%endif%> +<%endif%> +<%if(pch_header)%> +<%if(custom_type->pch_postrule)%> +<%foreach(custom_type->input_file->source_output_files)%> + echo #include "<%pch_header%>" > temporary.src \ + type "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->source_output_file)%><%else%><%custom_type->input_file->source_output_file%><%endif%>" >> temporary.src \ + move /y temporary.src "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->source_output_file)%><%else%><%custom_type->input_file->source_output_file%><%endif%>" +<%endfor%> +<%endif%> +<%endif%> +<%foreach(custom_type->input_file->output_files)%> + +"<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%>" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +<%endfor%> +# End Custom Build + +<%endfor%> +!ENDIF +<%endfor%> + +<%else%> +# PROP Exclude_From_Build 1 +<%endif%> +# End Source File +<%endfor%> +# End Group +<%endif%> +<%endfor%> +# End Target +# End Project diff --git a/ACE/MPC/templates/em3vcpdll.mpt b/ACE/MPC/templates/em3vcpdll.mpt new file mode 100644 index 00000000000..16d53fe6848 --- /dev/null +++ b/ACE/MPC/templates/em3vcpdll.mpt @@ -0,0 +1,104 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +type_description = "Dynamic-Link Library" +configurations = Debug Release +platforms = "WCE ARM" "WCE ARMV4" "WCE emulator" "WCE x86" +default_configuration = Debug +default_platform = "WCE ARM" +common_defines = UNICODE _UNICODE +unicode = 1 + +WCE x86 { + type_code = 0x8302 + cpu_id = D6518FF3-710F-11D3-99F2-00105A0DF099 + platform_id = 8A9A2F80-6887-11D3-842E-005004848CBA + machine = IX86 + cpu_defines = _i386_ _X86_ x86 + ignore_libs = OLDNAMES.lib + pure_libs += $(CEx86Corelibc) +} + +WCE emulator { + type_code = 0xa602 + cpu_id = D6518FF3-710F-11D3-99F2-00105A0DF099 + platform_id = 8A9A2F80-6887-11D3-842E-005004848CBA + machine = IX86 + cpu_defines = _i386_ _X86_ x86 + ignore_libs = OLDNAMES.lib + pure_libs += $(CEx86Corelibc) +} + +WCE ARM { + type_code = 0x8502 + cpu_id = D6518FFC-710F-11D3-99F2-00105A0DF099 + platform_id = 8A9A2F80-6887-11D3-842E-005004848CBA + machine = ARM + cpp = clarm.exe + cpu_defines = ARM _ARM_ +} + +WCE ARMV4 { + type_code = 0xa302 + cpu_id = D6518FF3-710F-11D3-99F2-00105A0DF099 + platform_id = 8A9A2F80-6887-11D3-842E-005004848CBA + machine = ARM + cpp = clarm.exe + cpu_defines = ARM _ARM_ ARMV4 + cpu_options = /QRxscale +} + +Release { + use_debug_libraries = + optimize = 1 + compile_flags = /W3 /GR + defines = NDEBUG + compile_flags_removed = /YX + output_dir = Release + intermediate_dir = Release +} + +Debug { + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /Zi /GR /Gy + defines = _DEBUG + compile_flags_removed = /Fr /YX + output_dir = . + intermediate_dir = Debug + lib_modifier = d + pdbl = 1 + pdbc = 1 +} + +MFC Release { + use_debug_libraries = + optimize = 1 + compile_flags = /W3 /GR + defines = NDEBUG + compile_flags_removed = /YX + output_dir = MFC_Release + intermediate_dir = MFC_Release + lib_modifier = mfc + use_mfc = 2 +} + +MFC Debug { + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /Zi /GR /Gy + defines = _DEBUG + compile_flags_removed = /Fr /YX + output_dir = MFC_Debug + intermediate_dir = MFC_Debug + lib_modifier = mfcd + pdbl = 1 + pdbc = 1 + use_mfc = 2 +} + +conditional_include "vcpartialmacros" +conditional_include "user_em3vcpdll" diff --git a/ACE/MPC/templates/em3vcpdllexe.mpt b/ACE/MPC/templates/em3vcpdllexe.mpt new file mode 100644 index 00000000000..9fbc03d82ce --- /dev/null +++ b/ACE/MPC/templates/em3vcpdllexe.mpt @@ -0,0 +1,105 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +type_description = Application +platforms = "WCE ARM" "WCE ARMV4" "WCE emulator" "WCE x86" +default_configuration = Debug +default_platform = "WCE ARM" +configurations = Debug Release +common_defines = UNICODE _UNICODE +unicode = 1 + +WCE x86 { + type_code = 0x8301 + cpu_id = D6518FF3-710F-11D3-99F2-00105A0DF099 + platform_id = 8A9A2F80-6887-11D3-842E-005004848CBA + machine = IX86 + cpu_defines = _i386_ _X86_ x86 + ignore_libs = OLDNAMES.lib + pure_libs += $(CEx86Corelibc) +} + +WCE emulator { + type_code = 0xa601 + cpu_id = D6518FF3-710F-11D3-99F2-00105A0DF099 + platform_id = 8A9A2F80-6887-11D3-842E-005004848CBA + machine = IX86 + cpu_defines = _i386_ _X86_ x86 + ignore_libs = OLDNAMES.lib + pure_libs += $(CEx86Corelibc) +} + +WCE ARM { + type_code = 0x8501 + cpu_id = D6518FFC-710F-11D3-99F2-00105A0DF099 + platform_id = 8A9A2F80-6887-11D3-842E-005004848CBA + machine = ARM + cpp = clarm.exe + cpu_defines = ARM _ARM_ +} + +WCE ARMV4 { + type_code = 0xa301 + cpu_id = D6518FF3-710F-11D3-99F2-00105A0DF099 + platform_id = 8A9A2F80-6887-11D3-842E-005004848CBA + machine = ARM + cpp = clarm.exe + cpu_defines = ARM _ARM_ ARMV4 + cpu_options = /QRxscale +} + +Release { + use_debug_libraries = + optimize = 1 + compile_flags = /W3 /GR + defines = NDEBUG + compile_flags_removed = /YX + output_dir = Release + intermediate_dir = Release +} + +Debug { + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /Zi /GR /Gy + defines = _DEBUG + compile_flags_removed = /YX + intermediate_dir = Debug + lib_modifier = d + pdbl = 1 + pdbc = 1 +} + +MFC Release { + use_debug_libraries = + optimize = 1 + compile_flags = /W3 /GR + defines = NDEBUG _AFXDLL + compile_flags_removed = /YX + output_dir = MFC_Release + intermediate_dir = MFC_Release + lib_modifier = mfc + use_mfc = 2 + unicode_mfc_entry = wWinMainCRTStartup +} + +MFC Debug { + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /Zi /GR /Gy + defines = _DEBUG _AFXDLL + compile_flags_removed = /YX + output_dir = MFC_Debug + intermediate_dir = MFC_Debug + lib_modifier = mfcd + pdbl = 1 + pdbc = 1 + use_mfc = 2 + unicode_mfc_entry = wWinMainCRTStartup +} + +conditional_include "vcpartialmacros" +conditional_include "user_em3vcpdllexe" diff --git a/ACE/MPC/templates/em3vcplib.mpt b/ACE/MPC/templates/em3vcplib.mpt new file mode 100644 index 00000000000..1f1c6e378c1 --- /dev/null +++ b/ACE/MPC/templates/em3vcplib.mpt @@ -0,0 +1,100 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +type_description = "Static Library" +platforms = "WCE ARM" "WCE ARMV4" "WCE emulator" "WCE x86" +default_configuration = Debug +default_platform = "WCE ARM" +configurations = Debug Release +common_defines = UNICODE _UNICODE +unicode = 1 + +WCE x86 { + type_code = 0x8304 + cpu_id = D6518FF3-710F-11D3-99F2-00105A0DF099 + platform_id = 8A9A2F80-6887-11D3-842E-005004848CBA + machine = IX86 + cpu_defines = _i386_ _X86_ x86 +} + +WCE emulator { + type_code = 0xa604 + cpu_id = D6518FF3-710F-11D3-99F2-00105A0DF099 + platform_id = 8A9A2F80-6887-11D3-842E-005004848CBA + machine = IX86 + cpu_defines = _i386_ _X86_ x86 +} + +WCE ARM { + type_code = 0x8504 + cpu_id = D6518FFC-710F-11D3-99F2-00105A0DF099 + platform_id = 8A9A2F80-6887-11D3-842E-005004848CBA + machine = ARM + cpp = clarm.exe + cpu_defines = ARM _ARM_ +} + +WCE ARMV4 { + type_code = 0xa304 + cpu_id = D6518FF3-710F-11D3-99F2-00105A0DF099 + platform_id = 8A9A2F80-6887-11D3-842E-005004848CBA + machine = ARM + cpp = clarm.exe + cpu_defines = ARM _ARM_ ARMV4 + cpu_options = /QRxscale +} + +Release { + use_debug_libraries = + optimize = 1 + compile_flags = /W3 /GR + defines = NDEBUG + compile_flags_removed = /YX + output_dir = Static_Release + intermediate_dir = Static_Release + lib_modifier = s +} + +Debug { + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /Zi /GR /Gy + defines = _DEBUG + compile_flags_removed = /Fr /YX + output_dir = Static_Debug + intermediate_dir = Static_Debug + lib_modifier = sd + pdbc = 1 +} + +MFC Release { + use_debug_libraries = + optimize = 1 + compile_flags = /W3 /GR + defines = NDEBUG + compile_flags_removed = /YX + output_dir = Static_MFC_Release + intermediate_dir = Static_MFC_Release + lib_modifier = mfcs + use_mfc = 2 +} + +MFC Debug { + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /Zi /GR /Gy + defines = _DEBUG + compile_flags_removed = /Fr /YX + output_dir = Static_MFC_Debug + intermediate_dir = Static_MFC_Debug + lib_modifier = mfcsd + pdbc = 1 + use_mfc = 2 +} + +conditional_include "vcpartialmacros" +conditional_include "user_em3vcplib" + diff --git a/ACE/MPC/templates/em3vcplibexe.mpt b/ACE/MPC/templates/em3vcplibexe.mpt new file mode 100644 index 00000000000..3d992af9f80 --- /dev/null +++ b/ACE/MPC/templates/em3vcplibexe.mpt @@ -0,0 +1,108 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +type_description = Application +platforms = "WCE ARM" "WCE ARMV4" "WCE emulator" "WCE x86" +default_configuration = Debug +default_platform = "WCE ARM" +configurations = Debug Release +common_defines = UNICODE _UNICODE +unicode = 1 + +WCE x86 { + type_code = 0x8301 + cpu_id = D6518FF3-710F-11D3-99F2-00105A0DF099 + platform_id = 8A9A2F80-6887-11D3-842E-005004848CBA + machine = IX86 + cpu_defines = _i386_ _X86_ x86 + ignore_libs = OLDNAMES.lib + pure_libs += $(CEx86Corelibc) +} + +WCE emulator { + type_code = 0xa601 + cpu_id = D6518FF3-710F-11D3-99F2-00105A0DF099 + platform_id = 8A9A2F80-6887-11D3-842E-005004848CBA + machine = IX86 + cpu_defines = _i386_ _X86_ x86 + ignore_libs = OLDNAMES.lib + pure_libs += $(CEx86Corelibc) +} + +WCE ARM { + type_code = 0x8501 + cpu_id = D6518FFC-710F-11D3-99F2-00105A0DF099 + platform_id = 8A9A2F80-6887-11D3-842E-005004848CBA + machine = ARM + cpp = clarm.exe + cpu_defines = ARM _ARM_ +} + +WCE ARMV4 { + type_code = 0xa301 + cpu_id = D6518FF3-710F-11D3-99F2-00105A0DF099 + platform_id = 8A9A2F80-6887-11D3-842E-005004848CBA + machine = ARM + cpp = clarm.exe + cpu_defines = ARM _ARM_ ARMV4 + cpu_options = /QRxscale +} + +Release { + use_debug_libraries = + optimize = 1 + compile_flags = /W3 /GR + defines = NDEBUG + compile_flags_removed = /YX + lib_modifier = s + output_dir = Static_Release + intermediate_dir = Static_Release +} + +Debug { + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /Zi /GR /Gy + defines = _DEBUG + compile_flags_removed = /YX + lib_modifier = sd + output_dir = Static_Debug + intermediate_dir = Static_Debug + pdbl = 1 + pdbc = 1 +} + +MFC Release { + use_debug_libraries = + optimize = 1 + compile_flags = /W3 /GR + defines = NDEBUG _AFXDLL + compile_flags_removed = /YX + lib_modifier = mfcs + output_dir = Static_MFC_Release + intermediate_dir = Static_MFC_Release + use_mfc = 2 + unicode_mfc_entry = wWinMainCRTStartup +} + +MFC Debug { + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /Zi /GR /Gy + defines = _DEBUG _AFXDLL + compile_flags_removed = /YX + lib_modifier = mfcsd + output_dir = Static_MFC_Debug + intermediate_dir = Static_MFC_Debug + pdbl = 1 + pdbc = 1 + use_mfc = 2 + unicode_mfc_entry = wWinMainCRTStartup +} + +conditional_include "vcpartialmacros" +conditional_include "user_em3vcplibexe" + diff --git a/ACE/MPC/templates/ghs.mpd b/ACE/MPC/templates/ghs.mpd new file mode 100644 index 00000000000..c0279c0dcfe --- /dev/null +++ b/ACE/MPC/templates/ghs.mpd @@ -0,0 +1,195 @@ +#!gbuild +#primaryTarget=<%primaryTarget("ppc_integrity.tgt")%> +<%if(exename)%> + [Program] + -o <%if(exeout)%><%reltop_exeout%><%else%><%reltop%><%endif%>/<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%><%exe_ext%> +<%if(need_staticflags)%> + {optional} -non_shared +<%endif%> +<%else%> +<%if(sharedname)%> + [Shared Object] + -o <%if(dllout)%><%reltop_dllout%><%else%><%reltop_libout%><%endif%>/<%lib_prefix%><%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%libext(".so")%> +<%else%> +<%if(staticname)%> + [Library] + -o <%reltop_libout%>/<%lib_prefix%><%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%libext(".a")%> +<%else%> + [Subproject] +<%endif%> +<%endif%> +<%endif%> +<%if(bsp)%> + -bsp <%bsp%> +<%endif%> +<%if(os_dir)%> + -os_dir <%os_dir%> +<%endif%> +<%if(optimize)%> + -Ospeed + -OI +<%else%> + -G +<%endif%> +<%if(exceptions)%> + --exceptions +<%endif%> +<%if(pch_header && !no_use_pch)%> + --pch +<%foreach(pch_defines)%> + -D<%pch_define%> +<%endfor%> +<%endif%> +<%foreach(reltop_includes)%> + -I<%reltop_include%> +<%endfor%> +<%foreach(reltop_libpaths)%> + -L<%reltop_libpath%> +<%endfor%> +<%if(libs || lit_libs || pure_libs)%> +<%if(exename || sharedname)%> +<%foreach(libs)%> + -l<%libname_prefix%><%lib%><%if(use_lib_modifier)%><%lib_modifier%><%endif%> +<%endfor%> +<%foreach(lit_libs)%> + -l<%lit_lib%> +<%endfor%> +<%foreach(pure_libs)%> + <%pure_lib%> +<%endfor%> +<%endif%> +<%endif%> +<%if(sharedname)%> +<%foreach(dynamicflags)%> + -D<%dynamicflag%> +<%endfor%> +<%endif%> +<%if(need_staticflags)%> +<%foreach(staticflags)%> + -D<%staticflag%> +<%endfor%> +<%endif%> +<%if(macros)%> +<%foreach(macros)%> + -D<%macro%> +<%endfor%> +<%endif%> +<%if(compile_flags)%> +<%foreach(compile_flags)%> + <%compile_flag%> +<%endfor%> +<%endif%> +<%if(custom_only || !source_files && custom_types)%> +.custom_build_rule [HTML Source] +<%endif%> +<%scope(enter, escape, \\)%> +<%foreach(custom_types)%> +<%foreach(custom_type->input_files)%> +<%if(!custom_only && source_files)%> +<%custom_type->input_file%> [Text] +<%endif%> +<%if(custom_type->input_file->output_files)%> +<%if(custom_type->output_option)%> +<%foreach(custom_type->input_file->output_files)%> +<%if(!custom_only && source_files)%> +<%custom_type->input_file->output_file%> +<%endif%> +<%if(flag_overrides(custom_type->input_file, dependent))%> +<%foreach(dep, flag_overrides(custom_type->input_file, dependent))%> + :dependsRelative=<%dep%><%if(!has_extension(dep))%><%exe_ext%><%endif%> +<%endfor%> +<%else%> +<%foreach(custom_type->dependent)%> + :dependsRelative=<%custom_type->dependent%><%if(!has_extension(custom_type->dependent))%><%exe_ext%><%endif%> +<%endfor%> +<%endif%> + :dependsRelative=<%custom_type->input_file%> +<%if(custom_type->input_file->dependencies)%> +<%foreach(custom_type->input_file->dependencies)%> + :dependsRelative=<%custom_type->input_file->dependencie%> +<%endfor%> +<%endif%> +<%if(flag_overrides(custom_type->input_file, gendir))%> + :preexecShell='cd <%reltop%> && <%mkdir%> <%flag_overrides(custom_type->input_file, gendir)%><%postmkdir%>' +<%endif%> + :preexecShell='cd <%reltop%> && <%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%><%if(custom_type->output_option)%> <%custom_type->input_file%> <%custom_type->output_option%> <%custom_type->input_file->output_file%><%else%> <%custom_type->input_file%><%endif%>' +<%endfor%> +<%else%> +<%if(!custom_only && source_files)%> +<%foreach(custom_type->input_file->source_output_files)%> +<%if(forfirst)%> +<%custom_type->input_file->source_output_file%> +<%endif%> +<%endfor%> +<%endif%> +<%if(flag_overrides(custom_type->input_file, dependent))%> +<%foreach(dep, flag_overrides(custom_type->input_file, dependent))%> + :dependsRelative=<%dep%><%if(!has_extension(dep))%><%exe_ext%><%endif%> +<%endfor%> +<%else%> +<%foreach(custom_type->dependent)%> + :dependsRelative=<%custom_type->dependent%><%if(!has_extension(custom_type->dependent))%><%exe_ext%><%endif%> +<%endfor%> +<%endif%> + :dependsRelative=<%custom_type->input_file%> +<%if(custom_type->input_file->dependencies)%> +<%foreach(custom_type->input_file->dependencies)%> + :dependsRelative=<%custom_type->input_file->dependencie%> +<%endfor%> +<%endif%> +<%if(flag_overrides(custom_type->input_file, gendir))%> + :preexecShell='cd <%reltop%> && <%mkdir%> <%flag_overrides(custom_type->input_file, gendir)%><%postmkdir%>' +<%endif%> + :preexecShell='cd <%reltop%> && <%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%custom_type->input_file%>' +<%if(flag_overrides(custom_type->input_file, postcommand))%> +<%foreach(custom_type->input_file)%> + :preexecShell='cd <%reltop%> && <%flag_overrides(custom_type->input_file, postcommand)%>' +<%endfor%> +<%else%> +<%if(custom_type->postcommand)%> +<%foreach(custom_type->input_file)%> + :preexecShell='cd <%reltop%> && <%custom_type->postcommand%>' +<%endfor%> +<%endif%> +<%endif%> +<%if(pch_header && !no_use_pch && custom_type->pch_postrule)%> +<%foreach(custom_type->input_file->source_output_files)%> + :preexecShell='cd <%reltop%> && echo #include "<%pch_header%>" > temporary.src' + :preexecShell='cd <%reltop%> && <%cat%> <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%><%slash%><%basename(custom_type->input_file->source_output_file)%><%else%><%custom_type->input_file->source_output_file%><%endif%> >> temporary.src' + :preexecShell='cd <%reltop%> && <%mv%> temporary.src <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%><%slash%><%basename(custom_type->input_file->source_output_file)%><%else%><%custom_type->input_file->source_output_file%><%endif%>' +<%endfor%> +<%endif%> +<%endif%> +<%foreach(custom_type->input_file->output_files)%> + :extraOutputFile=<%custom_type->input_file->output_file%> +<%endfor%> +<%if(custom_only || !source_files)%> + -c + :postexecShell='<%rm%> .c && <%rm%> .h' +<%endif%> +<%endif%> +<%endfor%> +<%endfor%> +<%scope(leave)%> +<%foreach(source_files)%> +<%source_file%> +<%if(compile_flags)%> + -cxx_compiler.args=<%compile_flags%><%if(flag_overrides(source_file, buildflags))%> <%flag_overrides(source_file, buildflags)%><%endif%> +<%else%> +<%if(flag_overrides(source_file, buildflags))%> + -cxx_compiler.args=<%flag_overrides(source_file, buildflags)%> +<%endif%> +<%endif%> +<%endfor%> +<%foreach(header_files)%> +<%header_file%> +<%endfor%> +<%foreach(inline_files)%> +<%inline_file%> +<%endfor%> +<%foreach(resource_files)%> +<%resource_file%> +<%endfor%> +<%foreach(documentation_files)%> +<%documentation_file%> [Documentation] +<%endfor%> diff --git a/ACE/MPC/templates/ghscommon.mpt b/ACE/MPC/templates/ghscommon.mpt new file mode 100644 index 00000000000..05f0c84e222 --- /dev/null +++ b/ACE/MPC/templates/ghscommon.mpt @@ -0,0 +1,9 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "unixcommon" + +optimize = 1 +exceptions = 1 +lib_modifier = diff --git a/ACE/MPC/templates/ghsdll.mpt b/ACE/MPC/templates/ghsdll.mpt new file mode 100644 index 00000000000..deead6e85a6 --- /dev/null +++ b/ACE/MPC/templates/ghsdll.mpt @@ -0,0 +1,6 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "ghscommon" + +conditional_include "user_ghsdll" diff --git a/ACE/MPC/templates/ghsdllexe.mpt b/ACE/MPC/templates/ghsdllexe.mpt new file mode 100644 index 00000000000..7a8aee0a98c --- /dev/null +++ b/ACE/MPC/templates/ghsdllexe.mpt @@ -0,0 +1,6 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "ghscommon" + +conditional_include "user_ghsdllexe" diff --git a/ACE/MPC/templates/ghslib.mpt b/ACE/MPC/templates/ghslib.mpt new file mode 100644 index 00000000000..9a8942112fa --- /dev/null +++ b/ACE/MPC/templates/ghslib.mpt @@ -0,0 +1,6 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "ghscommon" + +conditional_include "user_ghslib" diff --git a/ACE/MPC/templates/ghslibexe.mpt b/ACE/MPC/templates/ghslibexe.mpt new file mode 100644 index 00000000000..bb3becb0187 --- /dev/null +++ b/ACE/MPC/templates/ghslibexe.mpt @@ -0,0 +1,6 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "ghscommon" + +conditional_include "user_ghslibexe" diff --git a/ACE/MPC/templates/html.mpd b/ACE/MPC/templates/html.mpd new file mode 100644 index 00000000000..cc0fbdcbd03 --- /dev/null +++ b/ACE/MPC/templates/html.mpd @@ -0,0 +1,176 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> + <title><%project_name%></title> + <style type="text/css"> + p {font: 9pt verdana, lucida; width:800px; color: slategray;} + h1 {font: 36pt verdana, lucida; width: 800px; color: darkcyan;} + h2 {font: 16pt "trebuchet ms", helvetica; color: white; padding: 3px; background-color: teal;} + a {text-decoration: none; } + td {font: 12pt verdana, lucida; color: white; padding: 3px; background-color: cadetblue;} + td.sub {font: 12pt verdana, lucida; color: white; padding: 3px; background-color: darkcyan;} + td.subsub {font: 12pt verdana, lucida; color: white; padding: 3px; padding-left: 12px; background-color: darkcyan;} + thead tr td {font: 16pt "trebuchet ms", helvetica; color: white; padding: 3px; background-color: teal;} + th {font: 14pt bold verdana, lucida; background-color: teal; color: white; padding: 3px;} + + div { + font: bold 12pt verdana, lucida; + color: white; + text-overflow: ellipsis; + overflow: hidden; + border: 2px outset darkgray; + margin: 3px; + width: 3in; + padding: 2px; + padding-left: 6px; + } +<%foreach(tree_styles)%> + <%tree_style%> +<%endfor%> + </style> + <script type="text/javascript"> + <!-- + function popup(mylink, windowname) { + if (!window.focus) { + return true; + } + else { + var href; + if (typeof(mylink) == 'string') { + href=mylink; + } + else { + href=mylink.href; + } + window.open(href, windowname, 'width=535,height=465,scrollbars=yes,menubar=yes,resizable=yes'); + return false; + } + } + //--> + </script> +</head> +<body> +<h1><%project_name%></h1> + +<%foreach(inheritance_nodes)%> +<%forfirst("<h2>MPC Inheritance Hierarchy</h2>")%> +<%inheritance_node%> +<%forlast("<br>")%> +<%endfor%> + +<table style="table-layout:fixed" width="800" summary="MPC Project Information"> +<col width="200"> +<col width="600"> +<thead> +<tr><td colspan="2">MPC Project Settings</td></tr> +<tr><th>Name</th><th>Value</th></tr> +</thead> +<tbody> +<tr><td>after</td><td><%after%></td></tr> +<tr><td>avoids</td><td><%avoids%></td></tr> +<tr><td>custom_only</td><td><%custom_only%></td></tr> +<tr><td>dllout</td><td><%dllout%></td></tr> +<tr><td>dynamicflags</td><td><%dynamicflags%></td></tr> +<tr><td>exename</td><td><%exename%></td></tr> +<tr><td>includes</td><td><%includes%></td></tr> +<tr><td>exeout</td><td><%exeout%></td></tr> +<tr><td>libout</td><td><%libout%></td></tr> +<tr><td>libpaths</td><td><%libpaths%></td></tr> +<tr><td>libs</td><td><%foreach(libs)%><%libname_prefix%><%lib%><%fornotlast(" ")%><%endfor%></td></tr> +<tr><td>lit_libs</td><td><%lit_libs%></td></tr> +<tr><td>macros</td><td><%macros%></td></tr> +<tr><td>pch_header</td><td><%pch_header%></td></tr> +<tr><td>pch_source</td><td><%pch_source%></td></tr> +<tr><td>prebuild</td><td><%prebuild%></td></tr> +<tr><td>postbuild</td><td><%postbuild%></td></tr> +<tr><td>postclean</td><td><%postclean%></td></tr> +<tr><td>pure_libs</td><td><%pure_libs%></td></tr> +<tr><td>recurse</td><td><%recurse%></td></tr> +<tr><td>requires</td><td><%requires%></td></tr> +<tr><td>sharedname</td><td><%libname_prefix%><%sharedname%></td></tr> +<tr><td>staticflags</td><td><%staticflags%></td></tr> +<tr><td>staticname</td><td><%libname_prefix%><%staticname%></td></tr> +<tr><td>tagname *</td><td><%tagname%></td></tr> +<tr><td>tagchecks *</td><td><%tagchecks%></td></tr> +<tr><td>version</td><td><%version%></td></tr> +</tbody> +<thead> +<tr><td colspan="2">MPC Project Files</td></tr> +<tr><th>Name</th><th>Value</th></tr> +</thead> +<tbody> +<tr><td>Source Files</td><td><%source_files%></td></tr> +<tr><td>Header Files</td><td><%header_files%></td></tr> +<tr><td>Inline Files</td><td><%inline_files%></td></tr> +<tr><td>Template Files</td><td><%template_files%></td></tr> +<tr><td>Resource Files</td><td><%resource_files%></td></tr> +<tr><td>Documentation Files</td><td><%documentation_files%></td></tr> +<%foreach(custom_types)%> +<tr><td><%ucw(custom_type)%></td><td><%custom_type->input_files%></td></tr> +<%endfor%> +<%if(configurations || pch_defines)%> +</tbody> +<thead> +<tr><td colspan="2">MPC Template Settings</td></tr> +<tr><th>Name</th><th>Value</th></tr> +</thead> +<tbody> +<%comment("common to all mpt files")%> +<%if(pch_defines)%> +<tr><td>pch_defines</td><td><%pch_defines%></td></tr> +<%endif%> +<%foreach(configurations)%> +<tr><td class="sub" colspan="2">Configuration: <%configuration%></td></tr> +<%comment("borland, nmake, va4, em3, vc6, vc7 and vc71 mpt files")%> +<%if(defines || common_defines)%> +<tr><td>defines</td><td><%defines%> <%common_defines%></td></tr> +<%endif%> +<%if(compile_flags)%> +<tr><td>compile_flags</td><td><%compile_flags%></td></tr> +<%endif%> +<%comment("make mpt files")%> +<%if(cxx)%> +<tr><td>cxx</td><td><%cxx%></td></tr> +<%endif%> +<%if(compilerflags)%> +<tr><td>compilerflags</td><td><%compilerflags%></td></tr> +<%endif%> +<%if(linkflags)%> +<tr><td>linkflags</td><td><%linkflags%></td></tr> +<%endif%> +<%foreach(platforms)%> +<tr><td class="subsub" colspan="2">Platform: <%platform%></td></tr> +<%if(shflags)%> +<tr><td>shflags</td><td><%shflags%></td></tr> +<%endif%> +<%if(ldlibs)%> +<tr><td>ldlibs</td><td><%ldlibs%></td></tr> +<%endif%> +<%if(extracppflags)%> +<tr><td>extracppflags</td><td><%extracppflags%></td></tr> +<%endif%> +<%if(dll_ext)%> +<tr><td>dll_ext</td><td><%dll_ext%></td></tr> +<%endif%> +<%comment("em3 mpt files")%> +<%if(cpu_id)%> +<tr><td>cpu_id</td><td><%cpu_id%></td></tr> +<%endif%> +<%if(platform_id)%> +<tr><td>platform_id</td><td><%platform_id%></td></tr> +<%endif%> +<%if(cpu_defines)%> +<tr><td>cpu_defines</td><td><%cpu_defines%></td></tr> +<%endif%> +<%endfor%> +<%endfor%> +<%endif%> +</tbody> +</table> + +<p> +* This keyword is specific to the gnuace project type. +</p> + +</body> +</html> diff --git a/ACE/MPC/templates/make.mpd b/ACE/MPC/templates/make.mpd new file mode 100644 index 00000000000..fa2e67dab9b --- /dev/null +++ b/ACE/MPC/templates/make.mpd @@ -0,0 +1,362 @@ +#---------------------------------------------------------------------------- +# Macros +#---------------------------------------------------------------------------- +<%marker(top)%> +<%if(multiple(configurations) || multiple(platforms))%> +<%foreach(configurations)%> +<%if(forfirst)%> +<%if(multiple(platforms))%> +<%foreach(platforms)%> +<%if(forfirst)%> +CFG = <%platform%> <%configuration%> +<%endif%> +<%endfor%> +<%else%> +CFG = <%configuration%> +<%endif%> + +<%endif%> +<%endfor%> +<%endif%> +<%foreach(compilers)%> +<%foreach(platforms)%> +<%foreach(configurations)%> +<%if(multiple(platforms))%> +ifeq ($(CFG), <%platform%> <%configuration%>) +<%else%> +<%if(multiple(configurations))%> +ifeq ($(CFG), <%configuration%>) +<%endif%> +<%endif%> +CC = <%cc%> +CXX = <%cxx%> +<%if(ld)%> +LD = <%ld%> +<%else%> +LD = $(CXX) $(CCFLAGS) $(CPPFLAGS) +<%endif%> +AR = <%ar("ar")%> +<%if(nm)%> +NM = <%nm%> +<%endif%> +<%if(cxxint)%> +CXXINT = <%cxxint%> +<%endif%> +<%if(cputype)%> +CPUTYPE = <%cputype%> +<%endif%> +<%if(cpu)%> +CPU = <%cpu%> +<%endif%> +<%if(dll_ext && pic)%> +PICFLAGS = <%pic%> +<%endif%> +CPPFLAGS = <%if(visibility && visopt)%><%visopt%> <%endif%>$(PICFLAGS) $(GENFLAGS)<%if(compile_flags)%> <%compile_flags%><%endif%><%if(cpu)%> -DCPU=$(CPU)<%endif%><%if(tempincopt)%> <%tempincopt%>$(TEMPINCDIR)<%endif%><%if(compilerflags)%> <%compilerflags%><%endif%><%if(build64bit && compilerflags64)%> <%compilerflags64%><%endif%><%if(pch_source && pchsupport)%><%foreach(pch_defines)%> -D<%pch_define%><%endfor%><%endif%><%if(extracppflags)%><%foreach(extracppflags)%><%if(!starts_with(extracppflag, -D) || !contains(language, java))%> <%extracppflag%><%endif%><%endfor%><%endif%><%if(includes)%><%foreach(includes)%> -I"<%include%>"<%endfor%><%endif%><%if(!contains(language, java) && macros)%><%foreach(macros)%> -D<%macro%><%endfor%><%endif%> +OBJEXT = <%obj_ext%> +OUTPUT_OPTION = <%output_option(-o \"$@\")%> +COMPILE.c = $(CC) $(CCFLAGS) $(CPPFLAGS) <%compile_option("-c")%> +COMPILE.cc = $(CXX) $(CCFLAGS) $(CPPFLAGS) <%compile_option%> +<%if(rc)%> +RESEXT = <%res_ext%> +<%endif%> +<%if(build64bit && arflags64)%> +ARFLAGS = <%if(extraarflags)%><%extraarflags%> <%endif%><%arflags64%> +<%else%> +<%if(arflags)%> +ARFLAGS = <%if(extraarflags)%><%extraarflags%> <%endif%><%arflags%> +<%endif%> +<%endif%> +<%if(tempinc)%> +TEMPINCDIR = <%tempinc%><%if(tempincopt)%><%slash%><%project_name%><%endif%> +<%endif%> +LDFLAGS =<%if(libpaths)%><%foreach(libpaths)%><%if(targetoutdir)%> <%libpathopt(-L)%>"<%libpath%><%slash%><%targetoutdir%>"<%endif%> <%libpathopt(-L)%>"<%libpath%>"<%endfor%><%endif%><%if(linkflags)%> <%linkflags%><%endif%><%if(build64bit && linkflags64)%> <%linkflags64%><%endif%> +CCC = $(CXX) +MAKEFILE = <%project_file%> +DEPENDENCIES = <%if(supports_include)%>.depend.<%endif%>$(MAKEFILE) +<%if(exename)%> +BTARGETDIR = <%if(exeout)%><%exeout%><%else%>.<%endif%><%slash%><%targetoutdir%> +BIN = $(BTARGETDIR)<%exename%>$(EXESUFFIX)$(EXEEXT) +<%else%> +LTARGETDIR = <%libout%><%slash%><%targetoutdir%> +<%endif%> +CAT = <%type("cat")%> +MV = <%move("mv -f")%> +RM = <%delete("rm -rf")%> +CP = <%copy("cp -p")%> +NUL = <%devnull("/dev/null")%> +MKDIR = <%makedir("mkdir -p")%> +TESTDIRSTART = <%testdirstart("test -d")%> +TESTDIREND = <%testdirend("||")%> +TOUCH = <%touch("touch")%> +EXEEXT = <%exe_ext%> +LIBPREFIX = <%lib_prefix%><%libname_prefix%> +<%if(use_lib_modifier)%> +LIBSUFFIX = <%lib_modifier%> +<%endif%> +<%if(use_exe_modifier)%> +EXESUFFIX = <%lib_modifier%> +<%endif%> +GENFLAGS =<%if(!contains(configuration, Release) || optimize)%> <%genflags%><%endif%> +LDLIBS =<%foreach(libs)%> <%libopt%>"<%libname_prefix%><%lib%>$(LIBSUFFIX)"<%endfor%><%foreach(lit_libs)%> <%libopt%>"<%lit_lib%>"<%endfor%><%foreach(pure_libs)%> "<%pure_lib%>"<%endfor%> <%ldlibs%> +OBJS =<%if(pch_source && pchsupport)%> <%targetoutdir%><%obj_dir%><%noextension(pch_source)%>$(OBJEXT)<%endif%><%foreach(source_files)%> <%targetoutdir%><%obj_dir%><%noextension(source_file)%>$(OBJEXT)<%endfor%><%if(rc)%><%foreach(resource_files)%> <%targetoutdir%><%obj_dir%><%resource_file%>$(RESEXT)<%endfor%><%endif%> +<%if(lib_ext)%> +<%if(staticname)%> +AREXT = <%lib_ext%> +LIB = $(LTARGETDIR)$(LIBPREFIX)<%staticname%>$(LIBSUFFIX)$(AREXT) +<%endif%> +<%endif%> +<%if(dll_ext && sharedname)%> +SOEXT = <%dll_ext%> +SHTARGETDIR = <%if(dllout)%><%dllout%><%else%><%libout%><%endif%><%slash%><%targetoutdir%> +<%if(version && versupport)%> +SHLIB_BASE = $(LIBPREFIX)<%sharedname%>$(LIBSUFFIX)$(SOEXT) +<%endif%> +SHLIB = $(SHTARGETDIR)$(LIBPREFIX)<%sharedname%>$(LIBSUFFIX)$(SOEXT) +<%if(shflags)%> +SHFLAGS = <%shflags%> +<%endif%> +<%endif%> +SRC =<%if(pch_source && pchsupport)%> <%pch_source%><%endif%> <%source_files%> +LINK.cc = $(LD) $(LDFLAGS) +<%if(!contains(language, java))%> +<%if(dynamicflags)%> +DYNAMICFLAGS =<%foreach(dynamicflags)%> -D<%dynamicflag%><%endfor%> +<%endif%> +<%if(staticflags)%> +STATICFLAGS =<%foreach(staticflags)%> -D<%staticflag%><%endfor%> +<%endif%> +EXPORTFLAGS = <%if(exename)%><%if(need_staticflags)%>$(STATICFLAGS)<%endif%><%else%><%if(dll_ext && sharedname)%>$(DYNAMICFLAGS)<%else%>$(STATICFLAGS)<%endif%><%endif%> +<%endif%> +<%if(gnumake && exename && libpaths && need_staticflags)%> +DEPLIBS = $(foreach lib,<%foreach(libs)%> <%libname_prefix%><%lib%><%endfor%> <%lit_libs%>, $(foreach libpath,<%foreach(libpaths)%><%if(targetoutdir)%> <%libpath%>/<%targetoutdir%><%endif%> <%libpath%><%endfor%>, $(wildcard $(libpath)/lib$(lib).a))) +<%endif%> +<%if(multiple(configurations) || multiple(platforms))%> +endif +<%endif%> +<%endfor%> +<%if(supports_include && make_include)%> + +include <%make_include%> +<%endif%> +<%marker(macros)%> + +#---------------------------------------------------------------------------- +# Local targets +#---------------------------------------------------------------------------- + +<%if(exename)%> +all:<%if(prebuild)%> __prebuild__<%endif%> $(BIN)<%if(postbuild)%> __postbuild__<%endif%> + +<%if(specialscript)%> +specialscript: + @echo '<%specialscript%>' > $@ + @<%chmod("chmod")%> 755 $@ + +<%endif%> +<%if(prelinktarget)%> +<%prelinktarget%>: specialscript $(OBJS) + @specialscript "$(NM)" "$(OBJS)" "$(LDLIBS)" "<%if(libpaths)%><%foreach(libpaths)%><%if(targetoutdir)%><%libpath%><%slash%><%targetoutdir%> <%endif%><%libpath%><%fornotlast(" ")%><%endfor%><%else%>.<%endif%>" "$(BIN)" "$@" + @$(RM) specialscript + +<%if(prelinktargetobj)%> +<%targetoutdir%><%obj_dir%><%prelinktargetobj%>: <%prelinktarget%> + $(COMPILE.cc) $(OUTPUT_OPTION) <%prelinktarget%> + @$(RM) <%prelinktarget%> + +<%endif%> +<%endif%> +$(BIN):<%if(tempinc)%> $(TEMPINCDIR)<%endif%><%if(prelinktargetobj)%> <%targetoutdir%><%obj_dir%><%prelinktargetobj%><%else%><%if(prelinktarget)%> <%prelinktarget%><%endif%><%endif%> $(OBJS)<%if(gnumake && exename && libpaths && need_staticflags)%> $(DEPLIBS)<%endif%> + @$(TESTDIRSTART) "$(BTARGETDIR)" $(TESTDIREND) $(MKDIR) "$(BTARGETDIR)" +<%if(prelink)%> + <%eval(prelink)%> +<%endif%> + $(LINK.cc) $(OBJS) $(LDLIBS)<%if(exe_linkflags)%> <%eval(exe_linkflags)%><%endif%> $(OUTPUT_OPTION) +<%if(postlinkbinary)%> + <%postlinkbinary%> +<%endif%> + +<%endif%> +<%if(dll_ext && sharedname)%> +all:<%if(prebuild)%> __prebuild__<%endif%><%if(version && versupport)%> $(SHLIB).<%version%><%endif%> $(SHLIB)<%if(postbuild)%> __postbuild__<%endif%> + +<%if(version && versupport)%> +$(SHLIB): + cd $(SHTARGETDIR) && ln -s $(SHLIB_BASE).<%version%> $(SHLIB_BASE) + +<%endif%> +$(SHLIB)<%if(version && versupport)%>.<%version%><%endif%>: <%if(tempinc)%>$(TEMPINCDIR) <%endif%>$(OBJS) + @$(TESTDIRSTART) "$(SHTARGETDIR)" $(TESTDIREND) $(MKDIR) "$(SHTARGETDIR)" +<%if(prelink)%> + <%eval(prelink)%> +<%endif%> +<%if(dmclink)%> + link /impl <%if(pch_source && pchsupport)%><%targetoutdir%><%obj_dir%><%noextension(pch_source)%>$(OBJEXT)+<%endif%><%foreach(source_files)%><%targetoutdir%><%obj_dir%><%noextension(source_file)%>$(OBJEXT)<%fornotlast("+")%><%endfor%>,$@,<%ldlibs%><%if(rc)%><%foreach(resource_files)%><%forfirst(",,")%><%targetoutdir%><%obj_dir%><%resource_file%>$(RESEXT)<%fornotlast("+")%><%endfor%><%endif%> +<%else%> + <%if(dld)%><%dld%> $(LDFLAGS)<%else%>$(LINK.cc)<%endif%> $(SHFLAGS) $(OBJS) $(LDLIBS) $(OUTPUT_OPTION) +<%endif%> + +<%else%> +<%if(staticname)%> +all:<%if(prebuild)%> __prebuild__<%endif%> $(LIB)<%if(postbuild)%> __postbuild__<%endif%> + +<%endif%> +<%endif%> +<%if(staticname)%> +$(LIB): <%if(tempinc)%>$(TEMPINCDIR) <%endif%>$(OBJS) + @$(TESTDIRSTART) "$(LTARGETDIR)" $(TESTDIREND) $(MKDIR) "$(LTARGETDIR)" + $(AR) $(ARFLAGS) <%libgenopt%>$(LIB) $(OBJS)<%if(tempinc)%> `find $(TEMPINCDIR) -name \*.o\*`<%endif%> +<%if(ranlib)%> + ranlib $(LIB) +<%endif%> + +<%endif%> +<%if(custom_types)%> +<%if(gnumake)%> +SPACE = $(should_be_unset) $(should_be_unset) +<%endif%> +GENERATED_DIRTY =<%foreach(custom_types)%><%foreach(custom_type->input_files)%><%if(custom_type->input_file->output_files)%><%foreach(custom_type->input_file->output_files)%> <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%><%slash%><%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%><%endfor%><%endif%><%endfor%><%endfor%> + +<%foreach(custom_types)%> +<%if(expanded_variable_assignment && custom_type->libpath)%> +DYLD_LIBRARY_PATH := $(DYLD_LIBRARY_PATH):<%custom_type->libpath%> +LD_LIBRARY_PATH := $(LD_LIBRARY_PATH):<%custom_type->libpath%> +SHLIB_PATH := $(SHLIB_PATH):<%custom_type->libpath%> +LIBPATH := $(LIBPATH):<%custom_type->libpath%> +PATH := $(PATH):<%custom_type->libpath%> + +<%endif%> +<%foreach(custom_type->input_files)%> +<%if(custom_type->input_file->output_files)%> +<%if(multiple(custom_type->input_file->output_files))%> +.NOTPARALLEL: +<%endif%> +<%foreach(custom_type->input_file->output_files)%><%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%><%slash%><%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%><%fornotlast(" ")%><%endfor%>: <%custom_type->input_file%><%if(custom_type->input_file->dependencies)%><%foreach(custom_type->input_file->dependencies)%><%if(gnumake)%><%if(contains(custom_type->input_file->dependencie, \$))%> $(subst $(SPACE),\$(SPACE),<%custom_type->input_file->dependencie%>)<%else%> <%scope(enter, escape, \\s)%><%custom_type->input_file->dependencie%><%scope(leave)%><%endif%><%else%><%if(!contains(custom_type->input_file->dependencie, \$))%> <%scope(enter, escape, \\s)%><%custom_type->input_file->dependencie%><%scope(leave)%><%endif%><%endif%><%endfor%><%endif%><%if(flag_overrides(custom_type->input_file, dependent))%><%foreach(dep, flag_overrides(custom_type->input_file, dependent))%><%if(gnumake)%><%if(contains(dep, \$))%> $(subst $(SPACE),\$(SPACE),<%dep%>)<%else%> <%scope(enter, escape, \\s)%><%dep%><%scope(leave)%><%endif%><%else%><%if(!contains(dep, \$))%> <%scope(enter, escape, \\s)%><%dep%><%scope(leave)%><%endif%><%endif%><%endfor%><%else%><%if(custom_type->dependent)%><%foreach(custom_type->dependent)%><%if(gnumake)%><%if(contains(custom_type->dependent, \$))%> $(subst $(SPACE),\$(SPACE),<%custom_type->dependent%>)<%else%> <%scope(enter, escape, \\s)%><%custom_type->dependent%><%scope(leave)%><%endif%><%else%><%if(!contains(custom_type->dependent, \$))%> <%scope(enter, escape, \\s)%><%custom_type->dependent%><%scope(leave)%><%endif%><%endif%><%endfor%><%endif%><%endif%> +<%if(flag_overrides(custom_type->input_file, gendir))%> + @$(TESTDIRSTART) "<%flag_overrides(custom_type->input_file, gendir)%>" $(TESTDIREND) $(MKDIR) "<%flag_overrides(custom_type->input_file, gendir)%>" +<%endif%> + <%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%if(custom_type->output_option)%><%custom_type->input_file%> <%custom_type->output_option%> "$@"<%else%><%custom_type->input_file%><%endif%> +<%if(flag_overrides(custom_type->input_file, postcommand))%> +<%foreach(custom_type->input_file)%> + <%flag_overrides(custom_type->input_file, postcommand)%> +<%endfor%> +<%else%> +<%if(custom_type->postcommand)%> +<%foreach(custom_type->input_file)%> + <%custom_type->postcommand%> +<%endfor%> +<%endif%> +<%endif%> +<%if(pch_header)%> +<%if(custom_type->pch_postrule)%> +<%foreach(custom_type->input_file->source_output_files)%> + @echo '#include "<%pch_header%>"' > temp.$$$$ && $(CAT) <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%><%slash%><%basename(custom_type->input_file->source_output_file)%><%else%><%custom_type->input_file->source_output_file%><%endif%> >> temp.$$$$ && $(MV) temp.$$$$ <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%><%slash%><%basename(custom_type->input_file->source_output_file)%><%else%><%custom_type->input_file->source_output_file%><%endif%> +<%endfor%> +<%endif%> +<%endif%> + +<%endif%> +<%endfor%> +<%endfor%> +.PRECIOUS: $(GENERATED_DIRTY) +<%if(source_files)%> +$(OBJS): $(GENERATED_DIRTY) +<%else%> +all:<%if(prebuild)%> __prebuild__<%endif%> $(GENERATED_DIRTY)<%if(postbuild)%> __postbuild__<%endif%> +<%endif%> + +<%endif%> +generated: $(GENERATED_DIRTY) + @-: + +<%if(tempinc)%> +$(TEMPINCDIR): + @-$(TESTDIRSTART) "$(TEMPINCDIR)" $(TESTDIREND) $(MKDIR) "$(TEMPINCDIR)" 2> $(NUL) + +<%endif%> +<%if(pch_source && pchsupport)%> +<%targetoutdir%><%obj_dir%><%noextension(pch_source)%>$(OBJEXT): <%pch_source%> +<%if(targetoutdir || obj_dir)%> + @$(TESTDIRSTART) "<%targetoutdir%><%obj_dir%><%dirname(pch_source)%>" $(TESTDIREND) $(MKDIR) "<%targetoutdir%><%obj_dir%><%dirname(pch_source)%>" +<%endif%> + <%if(ends_with(pch_source, \.c))%>$(COMPILE.c)<%else%>$(COMPILE.cc)<%endif%> <%if(pchcreate)%><%pchcreate%><%targetoutdir%><%obj_dir%><%pch_header%><%pchext%> <%endif%>$(EXPORTFLAGS)<%if(!pchnobj)%> $(OUTPUT_OPTION)<%endif%> <%pch_source%> +<%if(pchnobj)%> + @$(CP) <%targetoutdir%><%obj_dir%><%pch_header%><%pchext%> <%targetoutdir%><%obj_dir%><%noextension(pch_source)%>$(OBJEXT) +<%endif%> + +<%endif%> +<%foreach(source_files)%> +<%targetoutdir%><%obj_dir%><%noextension(source_file)%>$(OBJEXT): <%source_file%> +<%if(targetoutdir || obj_dir)%> + @$(TESTDIRSTART) "<%targetoutdir%><%obj_dir%><%dirname(source_file)%>" $(TESTDIREND) $(MKDIR) "<%targetoutdir%><%obj_dir%><%dirname(source_file)%>" +<%endif%> + <%if(ends_with(source_file, \.c))%>$(COMPILE.c)<%else%>$(COMPILE.cc)<%endif%> <%if(flag_overrides(source_file, buildflags))%><%flag_overrides(source_file, buildflags)%> <%endif%><%if(pchuse && pch_source && pchsupport)%><%pchuse%><%pch_header%><%pchext%> <%if(pchstop)%><%pchstop%><%pch_header%><%endif%><%endif%>$(EXPORTFLAGS) $(OUTPUT_OPTION) <%source_file%> + +<%endfor%> +<%if(resource_files)%> +<%if(rc)%> +<%foreach(resource_files)%> +<%targetoutdir%><%obj_dir%><%resource_file%>$(RESEXT): +<%if(targetoutdir || obj_dir)%> + @$(TESTDIRSTART) "<%targetoutdir%><%obj_dir%><%dirname(resource_file)%>" $(TESTDIREND) $(MKDIR) "<%targetoutdir%><%obj_dir%><%dirname(resource_file)%>" +<%endif%> + <%rc%><%foreach(includes)%> -I<%include%><%endfor%> <%resource_file%> <%targetoutdir%><%obj_dir%><%resource_file%>$(RESEXT) + +<%endfor%> +<%endif%> +<%endif%> +clean: + -$(RM) $(OBJS) +<%if(pch_source && pchsupport)%> + -$(RM) <%targetoutdir%><%obj_dir%><%pch_header%><%pchext%> +<%endif%> +<%if(clean)%> + -$(RM) <%clean%><%if(sharedname)%><%foreach(dir, clean)%> $(SHTARGETDIR)<%dir%><%endfor%><%endif%><%if(staticname || sharedname)%><%foreach(dir, clean)%> $(LTARGETDIR)<%dir%><%endfor%><%endif%><%if(exename)%><%foreach(dir, clean)%> $(BTARGETDIR)<%dir%><%endfor%><%endif%> +<%endif%> + +realclean: clean + -$(RM) <%if(exename)%>$(BIN)<%else%><%if(dll_ext && sharedname && version && versupport)%>$(SHLIB).<%version%> <%endif%>$(SHLIB) $(LIB)<%endif%> +<%if(custom_types)%> + -$(RM) $(GENERATED_DIRTY) +<%endif%> +<%if(obj_dir)%> + -$(RM) <%targetoutdir%><%obj_dir%> +<%endif%> +<%if(postclean)%> + -<%eval(postclean)%> +<%endif%> + +<%if(prebuild)%> +__prebuild__: + @<%eval(prebuild)%> + +<%endif%> +<%if(postbuild)%> +__postbuild__: + @<%eval(postbuild)%> + +<%endif%> +<%marker(local)%> +#---------------------------------------------------------------------------- +# Dependencies +#---------------------------------------------------------------------------- + +$(DEPENDENCIES): + @$(TOUCH) $(DEPENDENCIES) + +depend: +<%if(source_files || pch_source)%> + -<%if(targetoutdir || obj_dir)%>VDIR=<%targetoutdir%><%obj_dir%> <%endif%><%depgen("$(MPC_ROOT)/depgen.pl")%> <%depgen_flags%> $(CFLAGS) $(CCFLAGS) $(CPPFLAGS) -f $(DEPENDENCIES) $(SRC) 2> $(NUL) +<%else%> + @-: +<%endif%> + +<%if(forlast)%> +<%if(supports_include)%> +include $(DEPENDENCIES) +<%else%> +# DO NOT DELETE THIS LINE +<%endif%> +<%endif%> +<%endfor%> +<%endfor%> +<%marker(bottom)%> diff --git a/ACE/MPC/templates/make.net.mpd b/ACE/MPC/templates/make.net.mpd new file mode 100644 index 00000000000..5816f37b1a3 --- /dev/null +++ b/ACE/MPC/templates/make.net.mpd @@ -0,0 +1,131 @@ +#---------------------------------------------------------------------------- +# Macros +#---------------------------------------------------------------------------- +<%marker(top)%> +<%foreach(compilers)%> + +ICONOPT =<%foreach(ico_files)%><%if(forfirst)%> <%ico_flag%><%ico_file%><%endif%><%endfor%> +RESXOPT =<%foreach(resx_files)%> <%resx_flag%><%resx_file%><%endfor%> +TARGETDIR = <%if(exename && exeout)%><%exeout%><%slash%><%targetoutdir%><%else%><%if(sharedname && libout)%><%libout%><%slash%><%targetoutdir%><%else%>.<%slash%><%targetoutdir%><%endif%><%endif%> +TARGET =<%if(exename)%> $(TARGETDIR)<%exename%><%exe_ext%><%else%><%if(sharedname)%> $(TARGETDIR)<%lib_prefix%><%libname_prefix%><%sharedname%><%dll_ext%><%endif%><%endif%> +LDFLAGS =<%if(libpaths)%> <%lib_flag%><%foreach(libpaths)%><%libpath%><%fornotlast(",")%><%endfor%><%endif%><%if(libs)%> <%ref_flag%><%foreach(libs)%><%lib%><%fornotlast(",")%><%endfor%><%endif%><%if(packages)%> <%pkg_flag%><%foreach(packages)%><%package%><%fornotlast(",")%><%endfor%><%endif%> +CFLAGS =<%if(compile_flags)%> <%compile_flags%><%endif%> <%if(optimize)%><%opt_flag%><%else%><%def_flag%>DESIGN,DEBUG<%endif%><%if(trace)%> <%def_flag%>TRACE<%endif%><%if(macros)%> <%def_flag%><%foreach(macros)%><%macro%><%fornotlast(",")%><%endfor%><%endif%><%if(keyfile)%> <%key_flag%><%keyfile%><%endif%><%if(compares(allowunsafeblocks, true))%> <%unsafe_flag%><%endif%> +TESTDIRSTART = <%testdirstart("test -d")%> +TESTDIREND = <%testdirend("||")%> +CAT = <%type("cat")%> +MV = <%move("mv -f")%> +RM = <%delete("rm -rf")%> +CP = <%copy("cp -p")%> +NUL = <%devnull("/dev/null")%> +MKDIR = <%makedir("mkdir -p")%> +<%if(custom_types)%> +GENERATED_DIRTY =<%foreach(custom_types)%><%foreach(custom_type->input_files)%><%if(custom_type->input_file->output_files)%><%foreach(custom_type->input_file->output_files)%> <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%><%slash%><%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%><%endfor%><%endif%><%endfor%><%endfor%> +<%endif%> +<%if(exename)%> +MONO_ETC = /etc/mono +MONO_CONFIG = $(MONO_ETC)/config +BIN = $(TARGETDIR)<%exename%> +<%endif%> +<%if(supports_include && make_include)%> + +include <%make_include%> +<%endif%> +<%marker(macros)%> + +#---------------------------------------------------------------------------- +# Local targets +#---------------------------------------------------------------------------- + +all:<%if(prebuild)%> __prebuild__<%endif%> $(GENERATED_DIRTY) $(TARGET)<%if(postbuild)%> __postbuild__<%endif%> + +<%if(exename)%> +$(TARGET): <%source_files%> + @$(TESTDIRSTART) "$(TARGETDIR)" $(TESTDIREND) $(MKDIR) "$(TARGETDIR)" + <%compiler%> <%if(winapp)%><%winexe_flag%><%else%><%exe_flag%><%endif%> <%out_flag%>$(TARGET) $(CFLAGS) $(LDFLAGS) $(ICONOPT) $(RESXOPT) <%source_files%> + +$(BIN): $(TARGET) + <%mkbundle%> --static --deps -z --config $(MONO_CONFIG) $(TARGET) $(CONFIG_DIR_OPT) -o $(BIN) + strip $(BIN) + +bundle: $(BIN) + +<%else%> +<%if(sharedname)%> +$(TARGET): <%source_files%> + @$(TESTDIRSTART) "$(TARGETDIR)" $(TESTDIREND) $(MKDIR) "$(TARGETDIR)" + <%compiler%> <%shared_flag%> <%out_flag%>$(TARGET) $(CFLAGS) $(LDFLAGS) $(ICONOPT) $(RESXOPT) <%source_files%> + +bundle: + +<%endif%> +<%endif%> +<%if(custom_types)%> +<%foreach(custom_types)%> +<%if(expanded_variable_assignment && custom_type->libpath)%> +DYLD_LIBRARY_PATH := $(DYLD_LIBRARY_PATH):<%custom_type->libpath%> +LD_LIBRARY_PATH := $(LD_LIBRARY_PATH):<%custom_type->libpath%> +SHLIB_PATH := $(SHLIB_PATH):<%custom_type->libpath%> +LIBPATH := $(LIBPATH):<%custom_type->libpath%> +PATH := $(PATH):<%custom_type->libpath%> + +<%endif%> +<%foreach(custom_type->input_files)%> +<%if(custom_type->input_file->output_files)%> +<%if(multiple(custom_type->input_file->output_files))%> +.NOTPARALLEL: +<%endif%> +<%foreach(custom_type->input_file->output_files)%><%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%><%slash%><%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%><%fornotlast(" ")%><%endfor%>: <%custom_type->input_file%><%if(custom_type->input_file->dependencies)%> <%custom_type->input_file->dependencies%><%endif%><%if(flag_overrides(custom_type->input_file, dependent))%> <%flag_overrides(custom_type->input_file, dependent)%><%else%><%if(custom_type->dependent)%> <%custom_type->dependent%><%endif%><%endif%> +<%if(flag_overrides(custom_type->input_file, gendir))%> + @$(TESTDIRSTART) "<%flag_overrides(custom_type->input_file, gendir)%>" $(TESTDIREND) $(MKDIR) "<%flag_overrides(custom_type->input_file, gendir)%>" +<%endif%> + <%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%if(custom_type->output_option)%><%custom_type->input_file%> <%custom_type->output_option%> "$@"<%else%><%custom_type->input_file%><%endif%> +<%if(flag_overrides(custom_type->input_file, postcommand))%> +<%foreach(custom_type->input_file)%> + <%flag_overrides(custom_type->input_file, postcommand)%> +<%endfor%> +<%else%> +<%if(custom_type->postcommand)%> +<%foreach(custom_type->input_file)%> + <%custom_type->postcommand%> +<%endfor%> +<%endif%> +<%endif%> + +<%endif%> +<%endfor%> +<%endfor%> +.PRECIOUS: $(GENERATED_DIRTY) +<%endif%> +generated: $(GENERATED_DIRTY) + @-: + +clean: + -$(RM) $(TARGET)<%if(exename)%> $(BIN)<%endif%><%if(clean)%> <%clean%><%endif%> + +realclean: clean +<%if(custom_types)%> + -$(RM) $(GENERATED_DIRTY) +<%endif%> +<%if(postclean)%> + -<%eval(postclean)%> +<%endif%> + +<%if(prebuild)%> +__prebuild__: + @<%eval(prebuild)%> + +<%endif%> +<%if(postbuild)%> +__postbuild__: + @<%eval(postbuild)%> + +<%endif%> +<%marker(local)%> +#---------------------------------------------------------------------------- +# Dependencies +#---------------------------------------------------------------------------- + +depend: + @-: +<%endfor%> +<%marker(bottom)%> diff --git a/ACE/MPC/templates/make.net.mpt b/ACE/MPC/templates/make.net.mpt new file mode 100644 index 00000000000..599b6f9ebae --- /dev/null +++ b/ACE/MPC/templates/make.net.mpt @@ -0,0 +1,40 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "windowscommon" + +mcs { + main_flag = -main: + out_flag = -out: + lib_flag = -lib: + def_flag = -define: + exe_flag = -target:exe + winexe_flag = -target:winexe + opt_flag = -optimize + key_flag = -keyfile: + unsafe_flag = -unsafe + shared_flag = -target:library + ref_flag = -r: + pkg_flag = -pkg: + mkbundle = mkbundle + resx_flag = -resource: + ico_flag = -win32icon: +} + +gmcs { + main_flag = -main: + out_flag = -out: + lib_flag = -lib: + def_flag = -define: + exe_flag = -target:exe + winexe_flag = -target:winexe + opt_flag = -optimize + key_flag = -keyfile: + unsafe_flag = -unsafe + shared_flag = -target:library + ref_flag = -r: + pkg_flag = -pkg: + mkbundle = mkbundle2 + resx_flag = -resource: + ico_flag = -win32icon: +} diff --git a/ACE/MPC/templates/makedll.mpt b/ACE/MPC/templates/makedll.mpt new file mode 100644 index 00000000000..f79093fd858 --- /dev/null +++ b/ACE/MPC/templates/makedll.mpt @@ -0,0 +1,428 @@ +// -*- MPC -*- +// $Id$ + +// *********************************************************************** +// The default compiler for the 'make' project type is gcc (provided by +// the fill_value() method in MakeProjectCreator.pm). This can be +// controlled by setting the compilers template variable. It may be +// changed on the MPC command line via the -value_template option. +// Additionally, each compiler has a default platform. The default +// platform for gcc is linux. This too can be changed via the +// -value_template option. Below are some examples. +// +// Use SunCC on the default platform (solaris): +// mwc.pl -type make -value_template compilers=SunCC +// Use the default compiler (gcc) on LynxOS: +// mwc.pl -type make -value_template platforms=lynxos +// Use HP-UX aCC on the default platform (HP-UX): +// mwc.pl -type make -value_template compilers=aCC +// *********************************************************************** + +conditional_include "common" +conditional_include "unixcommon" + +configurations = Release +obj_ext = .o +res_ext = .res +compile_flags = +arflags = +pchsupport = 1 +targetoutdir = +libopt = -l +build64bit = 1 +pchext = .gch +versupport = 1 +supports_include = 1 +visibility = +depgen_flags = +cc = cc + +// *********************************************************************** +// Configuration Section +// *********************************************************************** + +Debug { + lib_modifier = d + genflags = -g +} + +Release { + optimize = 1 + genflags = -O +} + +// *********************************************************************** +// Compiler Section +// *********************************************************************** + +java { + cc = javac + cxx = javac + ld = : + obj_ext = .class + output_option = + compile_option = + ar = jar + arflags = cvf + platforms = jvm +} + +gcj { + cc = gcj + cxx = gcj + pic = -fPIC + shflags = -shared + platforms = linux + exe_linkflags = --main=<%main%> +} + +cxx_tru64 { + cxx = cxx + clean = cxx_repository so_locations + tempincopt = "-ptr " + tempinc = cxx_repository + platforms = tru64 + pchcreate = "-nopch_messages -create_pch " + pchuse = "-nopch_messages -use_pch " +} + +cxx_vms { + cxx = cxx + arflags = r + compilerflags = -ieee -names_as_is_short + linkflags = -threads + shflags = -shared -auto_symvec + clean = cxx_repository + tempinc = cxx_repository + platforms = openvms +} + +dmc { + cc = dmc + cxx = dmc + dmclink = 1 + ar = lib + arflags = -c + obj_ext = .obj + platforms = dmc_win +} + +gcc { + cc = gcc + cxx = g++ + pic = -fPIC + shflags = -shared + platforms = linux + pchcreate = "-o " + pchnobj = 1 + visopt = -fvisibility=hidden -fvisibility-inlines-hidden +} + +arm_elf_gcc { + cc = arm-elf-gcc + cxx = arm-elf-g++ + ar = arm-elf-ar + arflags = rcs + compilerflags = -isystem "$(SYSTEMDIR)/arm-elf/include" + shflags = -shared + platforms = nucleus + pchcreate = "-o " + pchnobj = 1 + visopt = -fvisibility=hidden -fvisibility-inlines-hidden +} + +Intel { + cxx = icpc + pic = -fPIC + shflags = -shared + platforms = linux + visopt = -fvisibility=hidden +} + +SunCC { + cxx = CC + pic = -KPIC + shflags = -G + compilerflags64 = -xarch=v9 + linkflags = -library=Cstd -library=Crun + clean = SunWS_cache ir.out + platforms = solaris + pchcreate = -xpch=collect: + pchuse = -xpch=use: + pchstop = -xpchstop= + pchext = .Cpch + visopt = -xldscope=hidden +} + +aCC { + cxx = aCC + pic = +Z + shflags = -b + platforms = hpux + compilerflags = -AA -D_RWSTD_MULTI_THREAD +W336 + compilerflags64 = +DA2.0W +DS2.0W + linkflags = -Wl,+s + linkflags64 = -Wl,-x -Wl,+h$(@F) -ldl + pchcreate = "+hdr_create " + pchuse = "+hdr_use " +} + +xlC_r { + cc = xlc_r + cxx = xlC_r + arflags64 += -X64 -rv + compilerflags64 = -q64 + platforms = aix + pchcreate = -qgenpcomp= + pchuse = -qusepcomp= +} + +SGICC { + cxx = CC + pic = -KPIC + shflags = -shared + compilerflags64 = -64 + linkflags = -Wl,-woff,84 + clean = ii_files + platforms = irix + pchcreate = -LANG:create_pch= + pchuse = -diag_suppress 3056 -LANG:use_pch= +} + +wrsppc { + cc = gcc$(CPUTYPE) + cxx = g++$(CPUTYPE) + cputype = ppc + cpu = PPC604 + ar = ar$(CPUTYPE) + nm = nm$(CPUTYPE) + compilerflags = -mlongcall + platforms = vxworks +} + +wrspentium { + cc = gcc$(CPUTYPE) + cxx = g++$(CPUTYPE) + cputype = pentium + cpu = PENTIUM + ar = ar$(CPUTYPE) + nm = nm$(CPUTYPE) + platforms = vxworks +} + +NCC { + cxx = NCC + pic = -KPIC + platforms = tandem +} + +ghsppc { + cc = cc$(CXXINT)$(CPUTYPE) + cxx = cx$(CXXINT)$(CPUTYPE) + ar = cx$(CXXINT)$(CPUTYPE) + cputype = ppc + arflags = --one_instantiation_per_object -archive -o + compilerflags = --new_style_casts --one_instantiation_per_object --exceptions --std --long_long + platforms = integrity +} + +// *********************************************************************** +// Platform Section +// *********************************************************************** + +jvm { + versupport = + lib_prefix = + dll_ext = + lib_ext = .jar +} + +tru64 { + shflags = -shared /usr/lib/libcxxstd.a + ldlibs = -ltli -lrt + extracppflags = -D__USE_STD_IOSTREAM -D_REENTRANT +} + +openvms { + // If you want to create shareable images, you can + // set dll_ext to .exe using the -value_template option of MPC. + versupport = + lib_prefix = + dll_ext = + exe_ext = .exe + ldlibs = -lpthread + extracppflags = -D__USE_STD_IOSTREAM -D_REENTRANT +} + +linux { + gnumake = 1 + ldlibs = -ldl $(subst lib,-l,$(sort $(basename $(notdir $(wildcard /usr/lib/librt.so /lib/librt.so))))) -lpthread + extracppflags = -D_REENTRANT +} + +nucleus { + gnumake = 1 + extracppflags = -mcpu=arm7tdmi -msoft-float -mthumb-interwork +} + +solaris { + shflags = -G + ldlibs = -lsocket -ldl -lnsl -lgen -lposix4 -lthread + extracppflags = -D_REENTRANT +} + +hpux { + dll_ext = .sl + ldlibs = -lxti -lrt -lpthread -ldld + extracppflags = -D_REENTRANT +} + +aix { + dll_ext = + ldlibs = -ldl -lpthread + extracppflags = -D_REENTRANT + supports_include = +} + +irix { + ldlibs = -lsocket -lgen -lpthread +} + +lynxos { + dll_ext = + extracppflags = -D__NO_INCLUDE_WARN__ -mthreads -mminimal-toc +} + +macos { + dld = libtool + ranlib = 1 + dll_ext = .dylib + shflags = -dynamic + ldlibs = -lcc_dynamic -lstdc++ -lSystem -ldl +} + +unixware { + ldlibs = -lsocket -ldl -lnsl -lgen -lposix4 -lthread + extracppflags = -D_REENTRANT +} + +qnx { + ldlibs = -lsocket + extracppflags = -D__GCC_BUILTIN +} + +vxworks { + versupport = + dll_ext = + exe_ext = .out + specialscript = "for i in $$3; do for j in $$4; do i=`echo $$i | sed sa\^-laa`;[ -r \"$$j/lib$$i.a\" ] && libs=\"$$libs $$j/lib$$i.a\" && break;done;done;$$1 $$2 $$libs | munch | grep -v \\.cpp > $$6" + prelinktarget = __ctordtor.c + prelinktargetobj = __ctordtor$(OBJEXT) + clean = __ctordtor$(OBJEXT) + ldlibs = -L$(WIND_BASE)/target/lib/$(CPUTYPE)/$(CPU)/common$(CPU_SPECIFIC) -larch + extracppflags = -nostdlib -I$(WIND_BASE)/target/h + ld = ld$(CPUTYPE) + linkflags = -X -r +} + +vxworks_rtp { + versupport = + dll_ext = + exe_ext = .vxe + extracppflags = -I$(WIND_BASE)/target/usr/h -I$(WIND_BASE)/target/usr/h/wrn/coreip -mrtp + ldlibs = -ldl + linkflags = -L$(WIND_BASE)/target/usr/lib/$(CPUTYPE)/$(CPU)/common +} + +cygwin { + gnumake = 1 + versupport = + dll_ext = .dll + exe_ext = .exe + rc = windres + res_ext = .o + depgen_flags = -t make +} + +// MinGW compiler with the MSYS shell, make, etc. +mingw_msys { + versupport = + lib_prefix = + dll_ext = .dll + lib_ext = .lib + exe_ext = .exe + ldlibs = -lwsock32 -lnetapi32 + rc = rc + pic = + depgen_flags = -t make +} + +// MinGW compiler with either: +// a) a native Windows shell and make, or +// b) MSYS's make passing --win32 (which will use cmd.exe as its subshell) +mingw { + versupport = + lib_prefix = + dll_ext = .dll + lib_ext = .lib + exe_ext = .exe + ldlibs = -lwsock32 -lnetapi32 + rc = rc + devnull = nul + delete = del /f/s/q + type = type + copy = copy /y + makedir = mkdir + move = move /y + testdirstart = if not exist + testdirend = + pic = + slash = \\ + depgen_flags = -t make +} + +dmc_win { + versupport = + lib_prefix = + dll_ext = .dll + lib_ext = .lib + exe_ext = .exe + ldlibs = wsock32+kernel32 + rc = rc + devnull = nul + delete = del /f/s/q + type = type + copy = copy /y + makedir = mkdir + move = move /y + supports_include = + testdirstart = if not exist + testdirend = + depgen_flags = -t make +} + +tandem { + shflags = -shared -all + ldlibs = -lsocket -ldl -lnsl -lgen -lthread + extracppflags = -D_REENTRANT +} + +// For Integrity, the following should be set as environment variables, on +// the make command line or within a verbatim section in your mpc file. +// +// OS_DIR The full path to your BSP installation. +// BSP The BSP name (ex. sim800). +// +integrity { + cxxint = int + versupport = + dll_ext = + ldlibs = -lshm_client -lnet -lsocket -lposix + extraarflags = -bsp $(BSP) -os_dir $(OS_DIR) --one_instantiation_per_object + extracppflags = -integrate -dynamic -bsp $(BSP) -os_dir $(OS_DIR) --one_instantiation_per_object -non_shared -Uvector + specialscript = "echo Kernel > $$6; echo Filename DynamicDownload >> $$6;echo EndKernel >> $$6; echo AddressSpace >> $$6;echo Filename $$5 >> $$6;echo Language C++ >> $$6;echo Library libINTEGRITY.so >> $$6;echo Library libc.so >> $$6;echo Library libscxx_e.so >> $$6;echo Task Initial >> $$6;echo StackLength 0x8000 >> $$6;echo EndTask >> $$6;echo EndAddressSpace >> $$6" + prelinktarget = $(notdir $(BIN).int) + postlinkbinary = $(MV) $(BIN) $(BIN).tmp && intex -bsp $(BSP) -os_dir $(OS_DIR) -intfile $(notdir $(BIN).int) -o $(BIN) $(BIN).tmp +} + +conditional_include "user_makedll" diff --git a/ACE/MPC/templates/makeexe.mpt b/ACE/MPC/templates/makeexe.mpt new file mode 100644 index 00000000000..dfe00e2e9db --- /dev/null +++ b/ACE/MPC/templates/makeexe.mpt @@ -0,0 +1,5 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "makedll" +conditional_include "user_makeexe" diff --git a/ACE/MPC/templates/nmake.mpd b/ACE/MPC/templates/nmake.mpd new file mode 100644 index 00000000000..d56443503db --- /dev/null +++ b/ACE/MPC/templates/nmake.mpd @@ -0,0 +1,346 @@ +# Microsoft Developer Studio Generated NMAKE File +<%marker(top)%> +<%foreach(platforms)%> +!<%fornotfirst("ELSE")%>IF "$(CFG)" == "" +CFG=<%platform%> <%default_configuration%> +!MESSAGE No configuration specified. Defaulting to <%platform%> <%default_configuration%>. +<%endfor%> +!ENDIF + +<%foreach(platforms)%> +!IF <%foreach(configurations)%>"$(CFG)" == "<%platform%> <%configuration%>"<%fornotlast(" || ")%><%endfor%> +!ELSE +<%endfor%> +!MESSAGE Invalid configuration "$(CFG)" specified. +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +<%foreach(platforms)%> +!MESSAGE NMAKE /f "<%project_file%>" CFG="<%platform%> <%default_configuration%>" +<%endfor%> +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +<%foreach(platforms)%> +<%foreach(configurations)%> +!MESSAGE "<%platform%> <%configuration%>" (based on "<%platform%> (<%machine_description%>) <%type_description("Dynamic-Link Library")%>") +<%endfor%> +<%endfor%> +!MESSAGE +!ERROR An invalid configuration was specified. +<%foreach(platforms)%> +!ENDIF +<%endfor%> + +!IF "$(OS)" == "Windows_NT" +NULL= +!ELSE +NULL=nul +!ENDIF + +!IF "$(DEPGEN)" == "" +!IF EXISTS("$(MPC_ROOT)/depgen.pl") +DEPGEN=perl $(MPC_ROOT)/depgen.pl -i -t nmake +!ELSEIF EXISTS("$(DEPGEN_ROOT)/depgen.pl") +DEPGEN=perl $(DEPGEN_ROOT)/depgen.pl -i -t nmake +!ELSEIF EXISTS("$(ACE_ROOT)/bin/depgen.pl") +DEPGEN=perl $(ACE_ROOT)/bin/depgen.pl -i -t nmake +!ENDIF +!ENDIF + +GENERATED_DIRTY =<%foreach(custom_types)%><%foreach(custom_type->input_files)%><%foreach(custom_type->input_file->output_files)%> "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%>"<%endfor%><%endfor%><%endfor%> + +<%foreach(platforms)%> +<%foreach(configurations)%> +!<%fornotfirst("ELSE")%>IF "$(CFG)" == "<%platform%> <%configuration%>" + +<%if(exename)%> +OUTDIR=<%if(windows_style)%><%output_dir("Debug")%><%else%><%output_dir(".")%><%endif%> +INSTALLDIR=<%if(exeout)%><%exeout%><%if(windows_style)%>\<%output_dir%><%endif%><%else%><%output_dir%><%endif%> +<%else%> +<%if(type_is_static)%> +OUTDIR=<%libout%> +<%else%> +<%if(type_is_dynamic)%> +OUTDIR=<%if(dllout)%><%dllout%><%else%><%libout%><%endif%> +<%endif%> +<%endif%> +<%endif%> +INTDIR=<%intermediate_dir%>\<%project_name%>\<%machine%> + +ALL : "$(INTDIR)" "$(OUTDIR)"<%if(exename)%><%if(exeout)%> "$(INSTALLDIR)"<%endif%><%endif%><%if(prebuild)%> __prebuild__<%endif%> DEPENDCHECK $(GENERATED_DIRTY)<%if(type_is_dynamic)%><%if(sharedname || staticname)%> "<%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%libname_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%dll_ext%>"<%endif%><%endif%><%if(staticname && type_is_static)%> "$(OUTDIR)\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%>"<%endif%><%if(exename)%> "$(INSTALLDIR)\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%><%exe_ext%>"<%endif%><%if(postbuild)%> __postbuild__<%endif%> + +DEPEND : +!IF "$(DEPGEN)" == "" + @echo No suitable dependency generator could be found. + @echo One comes with MPC, just set the MPC_ROOT environment variable + @echo to the full path of MPC. You can download MPC from + @echo http://www.ociweb.com/products/mpc/down.html +!ELSE +<%if(source_files || pch_source)%> + $(DEPGEN)<%foreach(includes)%> -I"<%include%>"<%endfor%><%foreach(defines cpu_defines common_defines platform_defines macros)%> -D<%define%><%endfor%><%if(unicode)%> -DUNICODE -D_UNICODE<%endif%><%if(type_is_dynamic)%><%foreach(dynamicflags)%> -D<%dynamicflag%><%endfor%><%endif%><%if(need_staticflags)%><%foreach(staticflags)%> -D<%staticflag%><%endfor%><%endif%><%if(pch_header)%><%foreach(pch_defines)%> -D<%pch_define%><%endfor%><%endif%> -f "<%noextension(project_file)%>.dep"<%foreach(source_files)%> "<%source_file%>"<%endfor%><%if(pch_source)%> "<%pch_source%>"<%endif%> +<%else%> + -@rem +<%endif%> +!ENDIF + +REALCLEAN : CLEAN +<%if(pdbl && exename)%> + -@del /f/q "$(INSTALLDIR)\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%>.pdb" +<%endif%> +<%if(sharedname && type_is_dynamic)%> +<%if(pdbl)%> + -@del /f/q "$(OUTDIR)\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.pdb" +<%endif%> + -@del /f/q "<%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%dll_ext%>" + -@del /f/q "$(OUTDIR)\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%>" + -@del /f/q "$(OUTDIR)\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.exp" + -@del /f/q "$(OUTDIR)\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.ilk" +<%else%> +<%if(staticname && type_is_dynamic)%> +<%if(pdbl || pdbc)%> + -@del /f/q "$(OUTDIR)\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.pdb" +<%endif%> + -@del /f/q "<%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%dll_ext%>" +<%endif%> +<%endif%> +<%if(staticname && type_is_static || !sharedname && type_is_dynamic)%> + -@del /f/q "$(OUTDIR)\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%>" + -@del /f/q "$(OUTDIR)\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.exp" + -@del /f/q "$(OUTDIR)\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.ilk" +<%endif%> +<%if(pdbc && type_is_static)%> + -@del /f/q "<%libout%>\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.pdb" +<%endif%> +<%if(exename)%> + -@del /f/q "$(INSTALLDIR)\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%><%exe_ext%>" + -@del /f/q "$(INSTALLDIR)\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%>.ilk" +<%endif%> +<%foreach(custom_types)%> +<%foreach(custom_type->input_files)%> +<%foreach(custom_type->input_file->output_files)%> + -@del /f/q "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%>" +<%endfor%> +<%endfor%> +<%endfor%> +<%if(postclean)%> + -<%eval(postclean)%> +<%endif%> + +"$(INTDIR)" : + if not exist "<%intermediate_dir%>\$(NULL)" mkdir "<%intermediate_dir%>" + if not exist "<%intermediate_dir%>\<%project_name%>\$(NULL)" mkdir "<%intermediate_dir%>\<%project_name%>" + if not exist "$(INTDIR)\$(NULL)" mkdir "$(INTDIR)" + +CPP=<%cc("cl.exe")%> +CPP_COMMON=<%if(TreatWChar_tAsBuiltInType)%>/Zc:wchar_t <%endif%>/nologo <%if(add_compile)%><%add_compile%> <%endif%><%if(optimize)%><%optimize_flags("/O2")%><%else%><%debug_flags("/Ob0")%><%endif%> <%compile_flags%><%foreach(DisableSpecificWarnings)%> /wd<%DisableSpecificWarning%><%endfor%><%if(managed)%> /EHsc- /Gm- /clr<%endif%><%if(pdbc)%> /Fd"<%if(type_is_static)%><%libout%>\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.pdb<%else%>$(INTDIR)/<%endif%>"<%endif%> <%foreach(includes)%>/I "<%include%>" <%endfor%><%foreach(defines cpu_defines common_defines platform_defines macros)%>/D <%define%> <%endfor%><%if(unicode)%>/D UNICODE /D _UNICODE <%endif%><%if(type_is_dynamic)%><%foreach(dynamicflags)%>/D <%dynamicflag%> <%endfor%><%endif%><%if(need_staticflags)%><%foreach(staticflags)%>/D <%staticflag%> <%endfor%><%endif%><%if(macro_for_lib_modifier)%><%if(use_lib_modifier)%><%if(lib_modifier)%>/D MPC_LIB_MODIFIER=\"<%lib_modifier%>\"<%endif%><%endif%><%endif%> /FD /c +<%if(pch_header)%>CPP_PCH=<%foreach(pch_defines)%>/D <%pch_define%> <%endfor%><%if(pch_source)%>/Yu<%else%>/YX<%endif%>"<%pch_header%>" /Fp"$(INTDIR)\<%transdir(pch_header)%><%basenoextension(pch_header)%>.pch"<%endif%> +CPP_PROJ=$(CPP_COMMON) <%if(pch_header)%>$(CPP_PCH) <%endif%>/Fo"<%fo_flag("$(INTDIR)\\\\")%>" + +<%if(!type_is_static)%> +RSC=<%rc("rc.exe")%> +<%endif%> + +<%if(exename || sharedname || staticname)%> +<%if(type_is_binary)%> +LINK32=<%link("link.exe")%> +LINK32_FLAGS=<%systemlibs%><%if(link_options)%> <%link_options%><%endif%> <%if(managed)%>/FIXED:NO <%endif%>/INCREMENTAL:<%incremental("NO")%> <%foreach(reverse(libs))%><%libname_prefix%><%lib%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%> <%endfor%><%foreach(reverse(lit_libs))%><%lit_lib%>.lib <%endfor%><%foreach(reverse(pure_libs))%><%pure_lib%> <%endfor%><%foreach(libpaths)%>/libpath:"<%libpath%>" <%endfor%>/nologo<%if(win_version)%> /version:<%win_version%><%endif%><%if(StackReserveSize)%> /stack:<%StackReserveSize%><%if(StackCommitSize)%>,<%StackCommitSize%><%endif%><%endif%> /subsystem:<%subsystem("windows")%><%if(type_is_dynamic)%> <%if(!source_files)%>/noentry <%endif%>/dll<%endif%> <%if(unicode && unicode_mfc_entry && exename && source_files)%>/entry:"<%unicode_mfc_entry%>" <%endif%><%debug_switch("/debug")%> <%if(pdbl)%>/pdb:"<%if(type_is_dynamic)%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%libname_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.pdb<%endif%><%if(exename)%>$(INSTALLDIR)\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%>.pdb<%endif%><%if(type_is_static)%>$(OUTDIR)\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.pdb<%endif%>" <%endif%>/machine:<%machine("I386")%> /out:"<%if(type_is_dynamic)%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%libname_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%dll_ext%><%endif%><%if(exename)%>$(INSTALLDIR)\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%><%exe_ext%><%endif%>"<%if(type_is_dynamic)%> /implib:"$(OUTDIR)\<%libname_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%>"<%endif%> +<%endif%> +<%if(type_is_static)%> +LINK32=<%link("link.exe")%> -lib +LINK32_FLAGS=/nologo /machine:<%machine("I386")%><%if(link_options)%> <%link_options%><%endif%> /out:"<%libout%>\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%>" +<%endif%> +LINK32_OBJS= \ +<%if(!type_is_static)%> +<%foreach(resource_files)%> + "$(INTDIR)\<%transdir(resource_file)%><%basenoextension(resource_file)%>.res" \ +<%endfor%> +<%endif%> +<%if(pch_source)%> + "$(INTDIR)\<%transdir(pch_source)%><%basenoextension(pch_source)%>.obj" \ +<%endif%> +<%foreach(source_files)%> + "$(INTDIR)\<%transdir(source_file)%><%basenoextension(source_file)%>.obj"<%fornotlast(" \\")%> +<%endfor%> + +"<%if(type_is_dynamic)%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%libname_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%dll_ext%><%endif%><%if(type_is_static)%>$(OUTDIR)\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%><%endif%><%if(exename)%>$(INSTALLDIR)\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%><%exe_ext%><%endif%>" : $(DEF_FILE) $(LINK32_OBJS) +<%if(prelink)%> + <%eval(prelink)%> +<%endif%> + $(LINK32) @<< + $(LINK32_FLAGS) $(LINK32_OBJS) +<< + if exist "<%if(type_is_dynamic)%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%dll_ext%>.manifest<%endif%><%if(exename)%>$(INSTALLDIR)\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%><%exe_ext%>.manifest<%endif%><%if(type_is_static)%>$(OUTDIR)\<%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%>.manifest<%endif%>" mt.exe -manifest "<%if(type_is_dynamic)%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%dll_ext%>.manifest<%endif%><%if(exename)%>$(INSTALLDIR)\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%><%exe_ext%>.manifest<%endif%><%if(type_is_static)%>$(OUTDIR)\<%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%>.manifest<%endif%>" -outputresource:$@;<%if(type_is_dynamic)%>2<%endif%><%if(exename)%>1<%endif%><%if(type_is_static)%>2<%endif%> +<%endif%> + +<%if(prebuild)%> +__prebuild__: + @<%eval(prebuild)%> + +<%endif%> +<%if(postbuild)%> +__postbuild__: + @<%eval(postbuild)%> + +<%endif%> +<%endfor%> +!ENDIF +<%endfor%> + +CLEAN : + -@del /f/s/q "$(INTDIR)" + +<%if(exeout)%> +"$(INSTALLDIR)" : + if not exist "$(INSTALLDIR)\$(NULL)" mkdir "$(INSTALLDIR)" + +<%endif%> +"$(OUTDIR)" : + if not exist "$(OUTDIR)\$(NULL)" mkdir "$(OUTDIR)" + +.c{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.c{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +!IF "$(NO_EXTERNAL_DEPS)" != "1" +!IF EXISTS("<%noextension(project_file)%>.dep") +!INCLUDE "<%noextension(project_file)%>.dep" +!ENDIF +!ENDIF + +<%marker(macros)%> +<%foreach(platforms)%> +!IF <%foreach(configurations)%>"$(CFG)" == "<%platform%> <%configuration%>" <%fornotlast("|| ")%><%endfor%> +<%if(pch_source && pch_header)%> +SOURCE="<%pch_source%>" + +<%foreach(configurations)%> +!<%fornotfirst("ELSE")%>IF "$(CFG)" == "<%platform%> <%configuration%>" + +CPP_SWITCHES=<%if(TreatWChar_tAsBuiltInType)%>/Zc:wchar_t <%endif%>/nologo <%if(add_compile)%><%add_compile%> <%endif%><%if(optimize)%><%optimize_flags%><%else%><%debug_flags%><%endif%> <%compile_flags%><%foreach(DisableSpecificWarnings)%> /wd<%DisableSpecificWarning%><%endfor%><%if(pdbc)%> /Fd"<%if(type_is_static)%><%libout%>\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.pdb<%else%>$(INTDIR)/<%endif%>"<%endif%> <%foreach(includes)%>/I "<%include%>" <%endfor%><%foreach(defines cpu_defines common_defines platform_defines macros)%>/D <%define%> <%endfor%><%if(unicode)%>/D UNICODE /D _UNICODE <%endif%><%if(type_is_dynamic)%><%foreach(dynamicflags)%>/D <%dynamicflag%> <%endfor%><%endif%><%if(need_staticflags)%><%foreach(staticflags)%>/D <%staticflag%> <%endfor%><%endif%><%if(pch_header)%><%foreach(pch_defines)%>/D <%pch_define%> <%endfor%>/Fp"$(INTDIR)\<%transdir(pch_header)%><%basenoextension(pch_header)%>.pch" /Yc"<%pch_header%>" <%endif%>/FD /c + +"$(INTDIR)\<%transdir(pch_source)%><%basenoextension(pch_source)%>.obj" "$(INTDIR)\<%transdir(pch_header)%><%basenoextension(pch_header)%>.pch" : $(SOURCE) +<%if(transdir(pch_source))%> + @if not exist "$(INTDIR)\<%transdir(pch_source)%>$(NULL)" mkdir "$(INTDIR)\<%transdir(pch_source)%>" +<%endif%> + $(CPP) @<< + $(CPP_SWITCHES) /Fo"$(INTDIR)\<%transdir(pch_source)%><%basenoextension(pch_source)%>.obj" $(SOURCE) +<< + +<%endfor%> +!ENDIF + +<%endif%> +<%if(exename || sharedname || staticname)%> +<%foreach(source_files)%> +SOURCE="<%source_file%>" + +"$(INTDIR)\<%transdir(source_file)%><%basenoextension(source_file)%>.obj" : $(SOURCE) +<%if(transdir(source_file))%> + @if not exist "$(INTDIR)\<%transdir(source_file)%>$(NULL)" mkdir "$(INTDIR)\<%transdir(source_file)%>" +<%endif%> + $(CPP) <%if(pch_header && !flag_overrides(source_file, no_pch))%>$(CPP_PCH) <%endif%>$(CPP_COMMON) <%if(flag_overrides(source_file, buildflags))%><%flag_overrides(source_file, buildflags)%> <%endif%><%if(flag_overrides(source_file, managed))%>/EHsc- /Gm- /clr <%endif%>/Fo"$(INTDIR)\<%transdir(source_file)%><%basenoextension(source_file)%>.obj" $(SOURCE) + +<%endfor%> +<%endif%> +<%foreach(custom_types)%> +<%foreach(custom_type->input_files)%> +<%if(custom_type->input_file->output_files)%> +SOURCE="<%custom_type->input_file%>" + +InputPath=<%custom_type->input_file%> + +<%foreach(custom_type->input_file->output_files)%>"<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%>" <%endfor%>: $(SOURCE) <%foreach(custom_type->input_file->dependencies)%> "<%custom_type->input_file->dependencie%>"<%endfor%><%if(flag_overrides(custom_type->input_file, dependent))%><%foreach(dep, flag_overrides(custom_type->input_file, dependent))%> "<%dep%><%if(!has_extension(dep))%><%exe_ext%><%endif%>"<%endfor%><%else%><%if(custom_type->dependent)%><%foreach(custom_type->dependent)%> "<%custom_type->dependent%><%if(!has_extension(custom_type->dependent))%><%exe_ext%><%endif%>"<%endfor%><%endif%><%endif%> + <<tempfile.bat + @echo off +<%if(custom_type->libpath)%> + PATH=%PATH%;<%custom_type->libpath%> +<%endif%> +<%if(flag_overrides(custom_type->input_file, gendir))%> + if not exist <%flag_overrides(custom_type->input_file, gendir)%> mkdir <%flag_overrides(custom_type->input_file, gendir)%> +<%endif%> + <%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%if(custom_type->output_option)%>"$(InputPath)" <%custom_type->output_option%><%foreach(custom_type->input_file->output_files)%> "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%>"<%endfor%><%else%>"$(InputPath)"<%endif%> +<%if(flag_overrides(custom_type->input_file, postcommand))%> +<%foreach(custom_type->input_file)%> + <%flag_overrides(custom_type->input_file, postcommand)%> +<%endfor%> +<%else%> +<%if(custom_type->postcommand)%> +<%foreach(custom_type->input_file)%> + <%custom_type->postcommand%> +<%endfor%> +<%endif%> +<%endif%> +<%if(pch_header)%> +<%if(custom_type->pch_postrule)%> +<%foreach(custom_type->input_file->source_output_files)%> + echo #include "<%pch_header%>" > temporary.src + type "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->source_output_file)%><%else%><%custom_type->input_file->source_output_file%><%endif%>" >> temporary.src + move /y temporary.src "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->source_output_file)%><%else%><%custom_type->input_file->source_output_file%><%endif%>" +<%endfor%> +<%endif%> +<%endif%> +<< + +<%endif%> +<%endfor%> +<%endfor%> +<%if(!type_is_static)%> +<%foreach(resource_files)%> +SOURCE="<%resource_file%>" + +"$(INTDIR)\<%transdir(resource_file)%><%basenoextension(resource_file)%>.res" : $(SOURCE) +<%if(transdir(resource_file))%> + @if not exist "$(INTDIR)\<%transdir(resource_file)%>$(NULL)" mkdir "$(INTDIR)\<%transdir(resource_file)%>" +<%endif%> + $(RSC) /l 0x409 /fo"$(INTDIR)\<%transdir(resource_file)%><%basenoextension(resource_file)%>.res"<%foreach(defines cpu_defines platform_defines macros)%> /d <%define%><%endfor%><%if(unicode)%> /d UNICODE /d _UNICODE<%endif%><%foreach(includes)%> /i "<%include%>"<%endfor%> $(SOURCE) + + +<%endfor%> +<%endif%> +<%marker(local)%> + +!ENDIF +<%endfor%> + +GENERATED : "$(INTDIR)" "$(OUTDIR)" $(GENERATED_DIRTY) + -@rem + +DEPENDCHECK : +!IF "$(NO_EXTERNAL_DEPS)" != "1" +!IF EXISTS("<%noextension(project_file)%>.dep") + @echo Using "<%noextension(project_file)%>.dep" +<%if(source_files || pch_source)%> +!ELSE + @echo Warning: cannot find "<%noextension(project_file)%>.dep" +<%endif%> +!ENDIF +!ENDIF + +<%marker(bottom)%> diff --git a/ACE/MPC/templates/nmakedll.mpt b/ACE/MPC/templates/nmakedll.mpt new file mode 100644 index 00000000000..4f60c82c057 --- /dev/null +++ b/ACE/MPC/templates/nmakedll.mpt @@ -0,0 +1,177 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +configurations = Debug Release "Static Debug" "Static Release" +platforms = Win32 +default_configuration = Debug +common_defines = WIN32 _WINDOWS +TreatWChar_tAsBuiltInType = true +systemlibs = advapi32.lib user32.lib + +Win32 { + machine_description = x86 + machine = I386 +} + +Win64 { + machine_description = IA64 + machine = IA64 + cpu_defines = WIN64 + add_compile = /Wp64 +} + +x64 { + machine_description = x64 + machine = AMD64 + cpu_defines = _AMD64_ + add_compile = /Wp64 + platform_defines = _WIN64 +} + +Release { + type_code = 0x0102 + use_debug_libraries = 0 + optimize = 1 + compile_flags = /W3 /EHsc /MD /GR + defines = NDEBUG + compile_flags_removed = /YX + output_dir = Release + intermediate_dir = Release + debug_switch = + type_is_static = + type_is_dynamic = 1 + type_is_binary = 1 + need_staticflags = +} + +Debug { + type_code = 0x0102 + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /EHsc /Zi /MDd /GR /Gy + defines = _DEBUG + compile_flags_removed = /Fr /YX + output_dir = . + intermediate_dir = Debug + lib_modifier = d + type_is_static = + type_is_dynamic = 1 + type_is_binary = 1 + need_staticflags = + pdbl = 1 + pdbc = 1 +} + +Static Release { + type_description = "Static Library" + type_code = 0x0104 + use_debug_libraries = 0 + optimize = 1 + compile_flags = /W3 /EHsc /MD /GR + defines = NDEBUG + compile_flags_removed = /YX + output_dir = Static_Release + intermediate_dir = Static_Release + lib_modifier = s + debug_switch = + type_is_static = 1 + type_is_binary = + type_is_dynamic = + need_staticflags = 1 +} + +Static Debug { + type_description = "Static Library" + type_code = 0x0104 + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /EHsc /Zi /GR /Gy /MDd + defines = _DEBUG + compile_flags_removed = /Fr /YX + output_dir = Static_Debug + intermediate_dir = Static_Debug + lib_modifier = sd + type_is_static = 1 + type_is_binary = + type_is_dynamic = + need_staticflags = 1 + pdbc = 1 +} + +MFC Release { + type_code = 0x0102 + use_debug_libraries = 0 + optimize = 1 + compile_flags = /W3 /EHsc /MD /GR + defines = NDEBUG + compile_flags_removed = /YX + output_dir = MFC_Release + intermediate_dir = MFC_Release + lib_modifier = mfc + debug_switch = + type_is_static = + type_is_dynamic = 1 + type_is_binary = 1 + need_staticflags = +} + +MFC Debug { + type_code = 0x0102 + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /EHsc /Zi /MDd /GR /Gy + defines = _DEBUG + compile_flags_removed = /Fr /YX + output_dir = MFC_Debug + intermediate_dir = MFC_Debug + lib_modifier = mfcd + type_is_static = + type_is_dynamic = 1 + type_is_binary = 1 + need_staticflags = + pdbl = 1 + pdbc = 1 +} + +Static MFC Release { + type_description = "Static Library" + type_code = 0x0104 + use_debug_libraries = 0 + optimize = 1 + compile_flags = /W3 /EHsc /MD /GR + defines = NDEBUG + compile_flags_removed = /YX + output_dir = Static_MFC_Release + intermediate_dir = Static_MFC_Release + lib_modifier = mfcs + debug_switch = + type_is_static = 1 + type_is_binary = + type_is_dynamic = + need_staticflags = 1 +} + +Static MFC Debug { + type_description = "Static Library" + type_code = 0x0104 + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /EHsc /Zi /GR /Gy /MDd + defines = _DEBUG + compile_flags_removed = /Fr /YX + output_dir = Static_MFC_Debug + intermediate_dir = Static_MFC_Debug + lib_modifier = mfcsd + type_is_static = 1 + type_is_binary = + type_is_dynamic = + need_staticflags = 1 + pdbc = 1 +} + +conditional_include "vcfullmacros" +conditional_include "user_nmakedll" + diff --git a/ACE/MPC/templates/nmakeexe.mpt b/ACE/MPC/templates/nmakeexe.mpt new file mode 100644 index 00000000000..ad879179560 --- /dev/null +++ b/ACE/MPC/templates/nmakeexe.mpt @@ -0,0 +1,153 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +type_description = "Console Application" +type_code = 0x0103 +configurations = Debug Release "Static Debug" "Static Release" +platforms = Win32 +default_configuration = Debug +common_defines = WIN32 _CONSOLE +subsystem = console +TreatWChar_tAsBuiltInType = true +systemlibs = advapi32.lib user32.lib + +Win32 { + machine_description = x86 + machine = I386 +} + +Win64 { + machine_description = IA64 + machine = IA64 + cpu_defines = WIN64 + add_compile = /Wp64 +} + +x64 { + machine_description = x64 + machine = AMD64 + cpu_defines = _AMD64_ + add_compile = /Wp64 + platform_defines = _WIN64 +} + +Release { + use_debug_libraries = 0 + optimize = 1 + compile_flags = /W3 /EHsc /MD /GR + defines = NDEBUG + compile_flags_removed = /YX + output_dir = Release + intermediate_dir = Release + need_staticflags = + debug_switch = +} + +Debug { + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /EHsc /Zi /MDd /GR /Gy + defines = _DEBUG + compile_flags_removed = /YX + intermediate_dir = Debug + lib_modifier = d + need_staticflags = + pdbl = 1 + pdbc = 1 +} + +Static Release { + use_debug_libraries = 0 + optimize = 1 + compile_flags = /W3 /EHsc /MD /GR + defines = NDEBUG + compile_flags_removed = /YX + lib_modifier = s + need_staticflags = 1 + output_dir = Static_Release + intermediate_dir = Static_Release + debug_switch = +} + +Static Debug { + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /EHsc /Zi /MDd /GR /Gy + defines = _DEBUG + compile_flags_removed = /YX + lib_modifier = sd + need_staticflags = 1 + output_dir = Static_Debug + intermediate_dir = Static_Debug + pdbl = 1 + pdbc = 1 +} + +MFC Release { + subsystem = windows + use_debug_libraries = 0 + optimize = 1 + compile_flags = /W3 /EHsc /MD /GR + defines = NDEBUG _AFXDLL + compile_flags_removed = /YX + output_dir = MFC_Release + intermediate_dir = MFC_Release + lib_modifier = mfc + need_staticflags = + debug_switch = + unicode_mfc_entry = wWinMainCRTStartup +} + +MFC Debug { + subsystem = windows + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /EHsc /Zi /MDd /GR /Gy + defines = _DEBUG _AFXDLL + compile_flags_removed = /YX + output_dir = MFC_Debug + intermediate_dir = MFC_Debug + lib_modifier = mfcd + need_staticflags = + pdbl = 1 + pdbc = 1 + unicode_mfc_entry = wWinMainCRTStartup +} + +Static MFC Release { + subsystem = windows + use_debug_libraries = 0 + optimize = 1 + compile_flags = /W3 /EHsc /MD /GR + defines = NDEBUG _AFXDLL + compile_flags_removed = /YX + lib_modifier = mfcs + need_staticflags = 1 + output_dir = Static_MFC_Release + intermediate_dir = Static_MFC_Release + debug_switch = + unicode_mfc_entry = wWinMainCRTStartup +} + +Static MFC Debug { + subsystem = windows + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /EHsc /Zi /MDd /GR /Gy + defines = _DEBUG _AFXDLL + compile_flags_removed = /YX + lib_modifier = mfcsd + need_staticflags = 1 + output_dir = Static_MFC_Debug + intermediate_dir = Static_MFC_Debug + pdbl = 1 + pdbc = 1 + unicode_mfc_entry = wWinMainCRTStartup +} + +conditional_include "vcfullmacros" +conditional_include "user_nmakeexe" + diff --git a/ACE/MPC/templates/sle.mpd b/ACE/MPC/templates/sle.mpd new file mode 100644 index 00000000000..4bd23e55df0 --- /dev/null +++ b/ACE/MPC/templates/sle.mpd @@ -0,0 +1,254 @@ +<!DOCTYPE Project SYSTEM "http://www.slickedit.com/dtd/vse/8.1/vpj.dtd"> +<Project + Version="8.1" + VendorName="SlickEdit" + WorkingDir="." + BuildSystem="vsbuild"> + <Config + Name="Debug" + Type="gnuc" + DebugCallbackName="gdb" + Version="1" + OutputFile="<%if(sharedname)%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%dll_ext%><%endif%><%if(exename)%><%if(exeout)%><%exeout%><%else%><%output_dir%><%endif%>\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%><%exe_ext%><%endif%>"> + <Menu> + <Target + Name="Compile" + MenuCaption="&Compile" + Dialog="_gnuc_options_form Compile" + CaptureOutputWith="ProcessBuffer" + Deletable="0" + OutputExts="*.o" + SaveOption="SaveCurrent" + RunFromDir="%rw"> + <Exec + CmdLine='g++ -c %xup -g -o "%bd%n%oe" %i "%f" %~other' + OtherOptions="-W -Wall -Wpointer-arith -mcpu=pentiumpro -mthreads -pipe -fno-exceptions -fcheck-new <%compile_flags%> <%foreach(includes)%>-I'<%include%>' <%endfor%><%foreach(defines common_defines macros)%>-D<%define%> <%endfor%><%if(type_is_dynamic)%><%foreach(dynamicflags)%>-D <%dynamicflag%> <%endfor%><%endif%><%if(need_staticflags)%><%foreach(staticflags)%>-D <%staticflag%> <%endfor%><%endif%>"/> + </Target> + <Target + Name="Link" + MenuCaption="&Link" + ShowOnMenu="Never" + Dialog="_gnuc_options_form Link" + CaptureOutputWith="ProcessBuffer" + Deletable="0" + SaveOption="SaveCurrent" + RunFromDir="%rw"> + <Exec + CmdLine='g++ %xup -g -o "%o" %f %libs %~other' + OtherOptions="-Wl,--enable-auto-import -Wl,-E -lws2_32 -lmswsock -lwsock32 -lnetapi32 <%foreach(libs)%>-l<%libname_prefix%><%lib%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%> <%endfor%><%foreach(lit_libs)%>-l<%lit_lib%>.lib <%endfor%><%foreach(pure_libs)%>-l<%pure_lib%> <%endfor%><%foreach(libpaths)%>-L'<%libpath%>' <%endfor%>"/> + </Target> + <Target + Name="Build" + MenuCaption="&Build" + Dialog="_gnuc_options_form Compile" + CaptureOutputWith="ProcessBuffer" + Deletable="0" + SaveOption="SaveWorkspaceFiles" + RunFromDir="%rw"> + <Exec CmdLine='"%(VSLICKBIN1)vsbuild" "%w" "%r" -t build'/> + </Target> + <Target + Name="Rebuild" + MenuCaption="&Rebuild" + Dialog="_gnuc_options_form Compile" + CaptureOutputWith="ProcessBuffer" + Deletable="0" + SaveOption="SaveWorkspaceFiles" + RunFromDir="%rw"> + <Exec CmdLine='"%(VSLICKBIN1)vsbuild" "%w" "%r" -t rebuild'/> + </Target> + <Target + Name="Debug" + MenuCaption="&Debug" + Dialog="_gnuc_options_form Run/Debug" + BuildFirst="1" + CaptureOutputWith="ProcessBuffer" + Deletable="0" + SaveOption="SaveNone" + RunFromDir="%rw"> + <Exec CmdLine='vsdebugio -prog "%o"'/> + </Target> + <Target + Name="Execute" + MenuCaption="E&xecute" + Dialog="_gnuc_options_form Run/Debug" + BuildFirst="1" + CaptureOutputWith="ProcessBuffer" + Deletable="0" + SaveOption="SaveWorkspaceFiles" + RunFromDir="%rw"> + <Exec CmdLine='"%o"'/> + </Target> + <Target + Name="dash" + MenuCaption="-" + Deletable="0"> + <Exec/> + </Target> + <Target + Name="GNU C Options" + MenuCaption="GNU C &Options..." + ShowOnMenu="HideIfNoCmdLine" + Deletable="0" + SaveOption="SaveNone"> + <Exec + CmdLine="gnucoptions" + Type="Slick-C"/> + </Target> + </Menu> + <Libs/> + <Includes/> + </Config> + <Config + Name="Release" + Type="gnuc" + DebugCallbackName="gdb" + Version="1" + OutputFile="<%if(sharedname)%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%dll_ext%><%endif%><%if(exename)%><%if(exeout)%><%exeout%><%else%><%output_dir%><%endif%>\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%><%exe_ext%><%endif%>"> + <Menu> + <Target + Name="Compile" + MenuCaption="&Compile" + Dialog="_gnuc_options_form Compile" + CaptureOutputWith="ProcessBuffer" + Deletable="0" + OutputExts="*.o" + SaveOption="SaveCurrent" + RunFromDir="%rw"> + <Exec + CmdLine='g++ -c %xup -o "%bd%n%oe" %i "%f" %~other' + OtherOptions="-W -Wall -Wpointer-arith -mcpu=pentiumpro -mthreads -pipe -fno-exceptions -fcheck-new <%foreach(includes)%>-I'<%include%>' <%endfor%><%foreach(defines common_defines macros)%>-D<%define%> <%endfor%><%if(type_is_dynamic)%><%foreach(dynamicflags)%>-D <%dynamicflag%> <%endfor%><%endif%><%if(need_staticflags)%><%foreach(staticflags)%>-D <%staticflag%> <%endfor%><%endif%>"/> + </Target> + <Target + Name="Link" + MenuCaption="&Link" + ShowOnMenu="Never" + Dialog="_gnuc_options_form Link" + CaptureOutputWith="ProcessBuffer" + Deletable="0" + SaveOption="SaveCurrent" + RunFromDir="%rw"> + <Exec + CmdLine='g++ %xup -o "%o" %f %libs %~other' + OtherOptions="-Wl,--enable-auto-import -Wl,-E -lws2_32 -lmswsock -lwsock32 -lnetapi32 <%foreach(libs)%>-l<%libname_prefix%><%lib%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%> <%endfor%><%foreach(lit_libs)%>-l<%lit_lib%>.lib <%endfor%><%foreach(pure_libs)%>-l<%pure_lib%> <%endfor%><%foreach(libpaths)%>-L'<%libpath%>' <%endfor%>"/> + </Target> + <Target + Name="Build" + MenuCaption="&Build" + Dialog="_gnuc_options_form Compile" + CaptureOutputWith="ProcessBuffer" + Deletable="0" + SaveOption="SaveWorkspaceFiles" + RunFromDir="%rw"> + <Exec CmdLine='"%(VSLICKBIN1)vsbuild" "%w" "%r" -t build'/> + </Target> + <Target + Name="Rebuild" + MenuCaption="&Rebuild" + Dialog="_gnuc_options_form Compile" + CaptureOutputWith="ProcessBuffer" + Deletable="0" + SaveOption="SaveWorkspaceFiles" + RunFromDir="%rw"> + <Exec CmdLine='"%(VSLICKBIN1)vsbuild" "%w" "%r" -t rebuild'/> + </Target> + <Target + Name="Debug" + MenuCaption="&Debug" + Dialog="_gnuc_options_form Run/Debug" + BuildFirst="1" + CaptureOutputWith="ProcessBuffer" + Deletable="0" + SaveOption="SaveNone" + RunFromDir="%rw"> + <Exec CmdLine='vsdebugio -prog "%o"'/> + </Target> + <Target + Name="Execute" + MenuCaption="E&xecute" + Dialog="_gnuc_options_form Run/Debug" + BuildFirst="1" + CaptureOutputWith="ProcessBuffer" + Deletable="0" + SaveOption="SaveWorkspaceFiles" + RunFromDir="%rw"> + <Exec CmdLine='"%o"'/> + </Target> + <Target + Name="dash" + MenuCaption="-" + Deletable="0"> + <Exec/> + </Target> + <Target + Name="GNU C Options" + MenuCaption="GNU C &Options..." + ShowOnMenu="HideIfNoCmdLine" + Deletable="0" + SaveOption="SaveNone"> + <Exec + CmdLine="gnucoptions" + Type="Slick-C"/> + </Target> + </Menu> + <Libs/> + <Includes/> + </Config> + <Files> + <Folder + Name="Source Files" + Filters="*.c;*.C;*.cc;*.cpp;*.cp;*.cxx;*.prg;*.pas;*.dpr;*.asm;*.s;*.bas;*.java;*.sc;*.e;*.cob;*.html;*.rc;*.tcl;*.py;*.pl"> +<%foreach(source_files)%> + <F N="<%source_file%>"/> +<%endfor%> + </Folder> +<%if(header_files)%> + <Folder + Name="Header Files" + Filters="*.h;*.H;*.hh;*.hpp;*.hxx;*.inc;*.sh;*.cpy;*.if"> +<%if(pch_header)%> + <F N="<%pch_header%>"/> +<%endif%> +<%foreach(header_files)%> + <F N="<%header_file%>"/> +<%endfor%> + </Folder> +<%endif%> +<%if(inline_files)%> + <Folder + Name="Inline Files" + Filters="*.i;*.inl"> +<%foreach(inline_files)%> + <F N="<%inline_file%>"/> +<%endfor%> + </Folder> +<%endif%> +<%if(template_files)%> + <Folder + Name="Template Files" + Filters="*_T.cpp"> +<%foreach(template_files)%> + <F N="<%template_file%>"/> +<%endfor%> + </Folder> +<%endif%> +<%if(documentation_files)%> + <Folder + Name="Documentation Files" + Filters="*.txt;*.doc"> +<%foreach(documentation_files)%> + <F N="<%documentation_file%>"/> +<%endfor%> + </Folder> +<%endif%> +<%if(resource_files)%> + <Folder + Name="Resource Files" + Filters="*.rc"> +<%foreach(resource_files)%> + <F N="<%resource_file%>"/> +<%endfor%> + </Folder> +<%endif%> + </Files> +</Project> diff --git a/ACE/MPC/templates/sledll.mpt b/ACE/MPC/templates/sledll.mpt new file mode 100644 index 00000000000..0feb63167ed --- /dev/null +++ b/ACE/MPC/templates/sledll.mpt @@ -0,0 +1,7 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +conditional_include "user_sledll" diff --git a/ACE/MPC/templates/sleexe.mpt b/ACE/MPC/templates/sleexe.mpt new file mode 100644 index 00000000000..f7192f6de99 --- /dev/null +++ b/ACE/MPC/templates/sleexe.mpt @@ -0,0 +1,7 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +conditional_include "user_sleexe" diff --git a/ACE/MPC/templates/unixcommon.mpt b/ACE/MPC/templates/unixcommon.mpt new file mode 100644 index 00000000000..acba75fd968 --- /dev/null +++ b/ACE/MPC/templates/unixcommon.mpt @@ -0,0 +1,7 @@ +// -*- MPC -*- +// $Id$ + +lib_prefix = lib +lib_ext = .a +dll_ext = .so +exe_ext = diff --git a/ACE/MPC/templates/vc6.mpd b/ACE/MPC/templates/vc6.mpd new file mode 100644 index 00000000000..14dbb29bc64 --- /dev/null +++ b/ACE/MPC/templates/vc6.mpd @@ -0,0 +1,380 @@ +# Microsoft Developer Studio Project File - Name="<%project_name%>" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "<%platform("Win32")%> (<%platform_hardware("x86")%>) <%if(exename || sharedname || staticname)%><%if(type_is_static && staticname)%>Static Library" 0x0104<%else%><%type_description%>" <%type_code%><%endif%><%else%>Generic Project" 0x010a<%endif%> + +CFG=<%project_name%> - <%platform("Win32")%> <%default_configuration("Debug")%> +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE run the tool that generated this project file and specify the +!MESSAGE nmake output type. You can then use the following command: +!MESSAGE +!MESSAGE NMAKE. +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE CFG="<%project_name%> - <%platform%> <%default_configuration%>" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +<%foreach(configurations)%> +!MESSAGE "<%project_name%> - <%platform%> <%configuration%>" (based on "<%platform%> (<%platform_hardware%>) <%if(exename || sharedname || staticname)%><%if(type_is_static && staticname)%>Static Library<%else%><%type_description%><%endif%><%else%>Generic Project<%endif%>") +<%endfor%> +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +<%foreach(configurations)%> +!<%fornotfirst("ELSE")%>IF "$(CFG)" == "<%project_name%> - <%platform%> <%configuration%>" + +# PROP Use_MFC <%use_mfc("0")%> +# PROP Use_Debug_Libraries <%use_debug_libraries("1")%> +<%if(exename)%> +# PROP Output_Dir "<%if(windows_style)%><%output_dir("Debug")%><%else%><%output_dir(".")%><%endif%>" +<%endif%> +<%if(type_is_static)%> +# PROP Output_Dir "<%output_dir%>" +<%endif%> +<%if(type_is_dynamic)%> +# PROP Output_Dir "<%libout%>" +<%endif%> +# PROP Intermediate_Dir "<%intermediate_dir%>\<%noextension(project_file)%>" +<%if(type_is_dynamic)%> +# PROP Ignore_Export_Lib 0 +<%endif%> +# PROP Target_Dir "" +<%if(type_is_static)%> +LINK32=link.exe -lib +<%endif%> +# ADD CPP /nologo <%if(optimize)%><%optimize_flags("/O2")%><%else%><%debug_flags("/Ob0")%><%endif%> <%compile_flags%><%foreach(DisableSpecificWarnings)%> /wd<%DisableSpecificWarning%><%endfor%><%if(pdbc)%> /Fd"<%if(type_is_static)%><%libout%>\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.pdb<%else%><%intermediate_dir%>\<%noextension(project_file)%>/<%endif%>"<%endif%> <%foreach(includes)%>/I "<%include%>" <%endfor%><%foreach(defines common_defines macros)%>/D <%define%> <%endfor%><%if(unicode)%>/D UNICODE /D _UNICODE <%endif%><%if(type_is_dynamic)%><%foreach(dynamicflags)%>/D <%dynamicflag%> <%endfor%><%endif%><%if(need_staticflags)%><%foreach(staticflags)%>/D <%staticflag%> <%endfor%><%endif%><%if(pch_header)%><%foreach(pch_defines)%>/D <%pch_define%> <%endfor%><%if(pch_source)%>/Yu<%else%>/YX<%endif%>"<%pch_header%>" /Fp"<%intermediate_dir%>\<%noextension(project_file)%>\<%noextension(pch_header)%>.pch" <%endif%>/FD /c +<%if(compile_flags_removed)%> +# SUBTRACT CPP <%compile_flags_removed%> +<%endif%> +<%if(midl_includes)%># ADD MTL <%foreach(midl_includes)%>/I "<%midl_include%>" <%endfor%><%endif%> +# ADD MTL <%foreach(defines)%>/D "<%define%>" <%endfor%><%if(unicode)%>/D UNICODE /D _UNICODE <%endif%><%foreach(midl_defines)%>/D "<%midl_define%>" <%endfor%><%midl_flags%> +# ADD RSC /l 0x409<%foreach(defines macros)%> /d <%define%><%endfor%><%if(unicode)%> /d UNICODE /d _UNICODE<%endif%><%foreach(includes)%> /i "<%include%>"<%endfor%> +BSC32=bscmake.exe +# ADD BSC32 /nologo <%if(sharedname || staticname)%>/o"<%libout%>\<%libname_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%>.bsc"<%endif%> +<%if(type_is_binary)%> +LINK32=link.exe +# ADD LINK32 <%systemlibs("advapi32.lib user32.lib")%><%if(link_options)%> <%link_options%><%endif%> /INCREMENTAL:<%incremental("NO")%> <%foreach(reverse(libs))%><%libname_prefix%><%lib%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%> <%endfor%><%foreach(reverse(lit_libs))%><%lit_lib%>.lib <%endfor%><%foreach(reverse(pure_libs))%><%pure_lib%> <%endfor%><%foreach(libpaths)%>/libpath:"<%libpath%>" <%endfor%>/nologo<%if(win_version)%> /version:<%win_version%><%endif%><%if(StackReserveSize)%> /stack:<%StackReserveSize%><%if(StackCommitSize)%>,<%StackCommitSize%><%endif%><%endif%> /subsystem:<%subsystem("windows")%><%if(pdbl)%><%if(sharedname)%> /pdb:"<%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.pdb"<%else%><%if(exename)%> /pdb:"<%if(exeout)%><%exeout%><%if(windows_style)%>\<%output_dir%><%endif%><%else%><%output_dir%><%endif%>\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%>.pdb"<%endif%><%endif%><%else%> /pdb:none<%endif%><%if(type_is_dynamic)%> /implib:"<%libout%>\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%>" <%if(!source_files)%>/noentry <%endif%>/dll<%endif%> <%if(unicode && unicode_mfc_entry && exename && source_files)%>/entry:"<%unicode_mfc_entry%>" <%endif%><%debug_switch("/debug")%> /machine:<%machine("I386")%> /out:"<%if(sharedname)%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%dll_ext%><%endif%><%if(exename)%><%if(exeout)%><%exeout%><%if(windows_style)%>\<%output_dir%><%endif%><%else%><%output_dir%><%endif%>\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%><%exe_ext%><%endif%>" +<%if(link_flags_removed)%> +# SUBTRACT LINK32 <%link_flags_removed%> +<%endif%> +<%endif%> +<%if(type_is_static)%> +LIB32=link.exe -lib +# ADD LIB32 /nologo /out:"<%libout%>\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%>" +<%endif%> +<%if(postbuild)%> +# Begin Special Build Tool +SOURCE="$(InputPath)" +PostBuild_Cmds=<%eval(postbuild)%> +# End Special Build Tool +<%endif%> + +<%endfor%> +!ENDIF + +# Begin Target + +<%foreach(configurations)%> +# Name "<%project_name%> - <%platform%> <%configuration%>" +<%endfor%> +<%if(exename || sharedname || staticname)%> +# Begin Group "Source Files" + +# PROP Default_Filter "<%foreach(ext, extensions(source_files))%><%ext%><%fornotlast(";")%><%endfor%>" +<%if(pch_source)%> +<%if(pch_header)%> +# Begin Source File + +SOURCE="<%pch_source%>" +# ADD CPP /Yc"<%pch_header%>" +# End Source File +<%endif%> +<%endif%> +<%if(grouped_source_files)%> +<%foreach(sort(grouped_source_files))%> +# Begin Group "<%grouped_source_file%>" + +# PROP Default_Filter "" +<%foreach(grouped_source_file->files)%> +# Begin Source File + +SOURCE="<%grouped_source_file->file%>" +<%if(duplicate_index(grouped_source_file->file))%> +<%foreach(configurations)%> +!<%fornotfirst("ELSE")%>IF "$(CFG)" == "<%project_name%> - <%platform%> <%configuration%>" +# ADD CPP <%if(flag_overrides(grouped_source_file->file, buildflags))%><%flag_overrides(grouped_source_file->file, buildflags)%> <%endif%>/Fo"<%intermediate_dir%>\<%noextension(project_file)%>\<%basenoextension(grouped_source_file->file)%><%duplicate_index(grouped_source_file->file)%>.obj" +<%if(flag_overrides(grouped_source_file->file, no_pch))%> +# SUBTRACT CPP /YX /Yc /Yu +<%endif%> +<%endfor%> +!ENDIF +<%else%> +<%if(flag_overrides(grouped_source_file->file, buildflags))%> +# ADD CPP <%flag_overrides(grouped_source_file->file, buildflags)%> +<%endif%> +<%if(flag_overrides(grouped_source_file->file, no_pch))%> +# SUBTRACT CPP /YX /Yc /Yu +<%endif%> +<%endif%> +# End Source File +<%endfor%> +# End Group +<%endfor%> +<%else%> +<%foreach(source_files)%> +# Begin Source File + +SOURCE="<%source_file%>" +<%if(duplicate_index(source_file))%> +<%foreach(configurations)%> +!<%fornotfirst("ELSE")%>IF "$(CFG)" == "<%project_name%> - <%platform%> <%configuration%>" +# ADD CPP <%if(flag_overrides(source_file, buildflags))%><%flag_overrides(source_file, buildflags)%> <%endif%>/Fo"<%intermediate_dir%>\<%noextension(project_file)%>\<%basenoextension(source_file)%><%duplicate_index(source_file)%>.obj" +<%if(flag_overrides(source_file, no_pch))%> +# SUBTRACT CPP /YX /Yc /Yu +<%endif%> +<%endfor%> +!ENDIF +<%else%> +<%if(flag_overrides(source_file, buildflags))%> +# ADD CPP <%flag_overrides(source_file, buildflags)%> +<%endif%> +<%if(flag_overrides(source_file, no_pch))%> +# SUBTRACT CPP /YX /Yc /Yu +<%endif%> +<%endif%> +# End Source File +<%endfor%> +<%endif%> +# End Group +<%endif%> +<%if(header_files)%> +# Begin Group "Header Files" + +# PROP Default_Filter "<%foreach(ext, extensions(header_files))%><%ext%><%fornotlast(";")%><%endfor%>" +<%if(pch_header)%> +# Begin Source File + +SOURCE="<%pch_header%>" +# End Source File +<%endif%> +<%if(grouped_header_files)%> +<%foreach(sort(grouped_header_files))%> +# Begin Group "<%grouped_header_file%>" + +# PROP Default_Filter "" +<%foreach(grouped_header_file->files)%> +# Begin Source File + +SOURCE="<%grouped_header_file->file%>" +# End Source File +<%endfor%> +# End Group +<%endfor%> +<%else%> +<%foreach(header_files)%> +# Begin Source File + +SOURCE="<%header_file%>" +# End Source File +<%endfor%> +<%endif%> +# End Group +<%endif%> +<%if(inline_files)%> +# Begin Group "Inline Files" + +# PROP Default_Filter "<%foreach(ext, extensions(inline_files))%><%ext%><%fornotlast(";")%><%endfor%>" +<%if(grouped_inline_files)%> +<%foreach(sort(grouped_inline_files))%> +# Begin Group "<%grouped_inline_file%>" + +# PROP Default_Filter "" +<%foreach(grouped_inline_file->files)%> +# Begin Source File + +SOURCE="<%grouped_inline_file->file%>" +# End Source File +<%endfor%> +# End Group +<%endfor%> +<%else%> +<%foreach(inline_files)%> +# Begin Source File + +SOURCE="<%inline_file%>" +# End Source File +<%endfor%> +<%endif%> +# End Group +<%endif%> +<%if(template_files)%> +# Begin Group "Template Files" + +# PROP Default_Filter "" +<%if(grouped_template_files)%> +<%foreach(sort(grouped_template_files))%> +# Begin Group "<%grouped_template_file%>" + +# PROP Default_Filter "" +<%foreach(grouped_template_file->files)%> +# Begin Source File + +SOURCE="<%grouped_template_file->file%>" +# PROP Exclude_From_Build 1 +# End Source File +<%endfor%> +# End Group +<%endfor%> +<%else%> +<%foreach(template_files)%> +# Begin Source File + +SOURCE="<%template_file%>" +# PROP Exclude_From_Build 1 +# End Source File +<%endfor%> +<%endif%> +# End Group +<%endif%> +<%if(documentation_files)%> +# Begin Group "Documentation" + +# PROP Default_Filter "" +<%if(grouped_documentation_files)%> +<%foreach(sort(grouped_documentation_files))%> +# Begin Group "<%grouped_documentation_file%>" + +# PROP Default_Filter "" +<%foreach(grouped_documentation_file->files)%> +# Begin Source File + +SOURCE="<%grouped_documentation_file->file%>" +# End Source File +<%endfor%> +# End Group +<%endfor%> +<%else%> +<%foreach(documentation_files)%> +# Begin Source File + +SOURCE="<%documentation_file%>" +# End Source File +<%endfor%> +<%endif%> +# End Group +<%endif%> +<%if(resource_files && !type_is_static)%> +# Begin Group "Resource Files" + +# PROP Default_Filter "rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" +<%if(grouped_resource_files)%> +<%foreach(sort(grouped_resource_files))%> +# Begin Group "<%grouped_resource_file%>" + +# PROP Default_Filter "" +<%foreach(grouped_resource_file->files)%> +# Begin Source File + +SOURCE="<%grouped_resource_file->file%>" +# End Source File +<%endfor%> +# End Group +<%endfor%> +<%else%> +<%foreach(resource_files)%> +# Begin Source File + +SOURCE="<%resource_file%>" +# End Source File +<%endfor%> +<%endif%> +# End Group +<%endif%> +<%foreach(custom_types)%> +<%if(custom_type->input_files)%> +# Begin Group "<%ucw(custom_type)%>" + +# PROP Default_Filter "<%foreach(custom_type->inputexts)%><%custom_type->inputext%><%fornotlast(";")%><%endfor%>" +<%foreach(custom_type->input_files)%> +# Begin Source File + +SOURCE="<%custom_type->input_file%>" +<%if(custom_type->input_file->output_files)%> + +<%foreach(configurations)%> +!<%fornotfirst("ELSE")%>IF "$(CFG)" == "<%project_name%> - <%platform%> <%configuration%>" + +<%if(flag_overrides(custom_type->input_file, dependent))%> +USERDEP__<%basenoextension(custom_type->input_file)%>=<%foreach(dep, flag_overrides(custom_type->input_file, dependent))%>"<%dep%><%if(!has_extension(dep))%><%exe_ext%><%endif%>"<%fornotlast(" ")%><%endfor%><%foreach(custom_type->input_file->dependencies)%> "<%custom_type->input_file->dependencie%>"<%endfor%> +<%else%> +<%if(custom_type->dependent)%> +USERDEP__<%basenoextension(custom_type->input_file)%>=<%foreach(custom_type->dependent)%>"<%custom_type->dependent%><%if(!has_extension(custom_type->dependent))%><%exe_ext%><%endif%>"<%fornotlast(" ")%><%endfor%><%foreach(custom_type->input_file->dependencies)%> "<%custom_type->input_file->dependencie%>"<%endfor%> +<%else%> +<%if(custom_type->input_file->dependencies)%> +USERDEP__<%basenoextension(custom_type->input_file)%>=<%foreach(custom_type->input_file->dependencies)%>"<%custom_type->input_file->dependencie%>"<%fornotlast(" ")%><%endfor%> +<%endif%> +<%endif%> +<%endif%> +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Invoking <%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> on $(InputPath) +InputPath="<%custom_type->input_file%>" + +BuildCmds= \ +<%if(custom_type->libpath)%> + PATH=%PATH%;<%custom_type->libpath%> \ +<%endif%> +<%if(flag_overrides(custom_type->input_file, gendir))%> + mkdir <%flag_overrides(custom_type->input_file, gendir)%> 2> nul \ +<%endif%> + <%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%if(custom_type->output_option)%>$(InputPath) <%custom_type->output_option%><%foreach(custom_type->input_file->output_files)%> "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%>"<%endfor%><%else%>$(InputPath)<%endif%> \ +<%if(flag_overrides(custom_type->input_file, postcommand))%> +<%foreach(custom_type->input_file)%> + <%flag_overrides(custom_type->input_file, postcommand)%> \ +<%endfor%> +<%else%> +<%if(custom_type->postcommand)%> +<%foreach(custom_type->input_file)%> + <%custom_type->postcommand%> \ +<%endfor%> +<%endif%> +<%endif%> +<%if(pch_header)%> +<%if(custom_type->pch_postrule)%> +<%foreach(custom_type->input_file->source_output_files)%> + echo #include "<%pch_header%>" > temporary.src \ + type "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->source_output_file)%><%else%><%custom_type->input_file->source_output_file%><%endif%>" >> temporary.src \ + move /y temporary.src "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->source_output_file)%><%else%><%custom_type->input_file->source_output_file%><%endif%>" +<%endfor%> +<%endif%> +<%endif%> +<%foreach(custom_type->input_file->output_files)%> + +"<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%>" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +<%endfor%> +# End Custom Build + +<%endfor%> +!ENDIF + +<%else%> +# PROP Exclude_From_Build 1 +<%endif%> +# End Source File +<%endfor%> +# End Group +<%endif%> +<%endfor%> +# End Target +# End Project diff --git a/ACE/MPC/templates/vc6dspdll.mpt b/ACE/MPC/templates/vc6dspdll.mpt new file mode 100644 index 00000000000..061e50dfd6b --- /dev/null +++ b/ACE/MPC/templates/vc6dspdll.mpt @@ -0,0 +1,64 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "vccommon" +conditional_include "windowscommon" + +type_description = "Dynamic-Link Library" +type_code = 0x0102 +configurations = Debug Release +common_defines = WIN32 _WINDOWS + +Release { + use_debug_libraries = 0 + optimize = 1 + compile_flags = /W3 /GX /MD /GR + defines = NDEBUG + compile_flags_removed = /YX + output_dir = Release + intermediate_dir = Release + debug_switch = +} + +Debug { + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /GX /Zi /MDd /GR /Gy + defines = _DEBUG + compile_flags_removed = /Fr /YX + intermediate_dir = Debug + lib_modifier = d + pdbl = 1 + pdbc = 1 +} + +MFC Release { + use_debug_libraries = 0 + optimize = 1 + compile_flags = /W3 /GX /MD /GR + defines = NDEBUG _WINDLL _AFXDLL + compile_flags_removed = /YX + output_dir = MFC_Release + intermediate_dir = MFC_Release + debug_switch = + lib_modifier = mfc + use_mfc = 2 +} + +MFC Debug { + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /GX /Zi /MDd /GR /Gy + defines = _DEBUG _WINDLL _AFXDLL + compile_flags_removed = /Fr /YX + output_dir = MFC_Debug + intermediate_dir = MFC_Debug + lib_modifier = mfcd + pdbl = 1 + pdbc = 1 + use_mfc = 2 +} + +conditional_include "vcpartialmacros" +conditional_include "user_vc6dspdll" diff --git a/ACE/MPC/templates/vc6dspdllexe.mpt b/ACE/MPC/templates/vc6dspdllexe.mpt new file mode 100644 index 00000000000..92e3a40ddeb --- /dev/null +++ b/ACE/MPC/templates/vc6dspdllexe.mpt @@ -0,0 +1,71 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "vccommon" +conditional_include "windowscommon" + +type_description = "Console Application" +type_code = 0x0103 +configurations = Debug Release +common_defines = WIN32 _CONSOLE +subsystem = console + +Release { + use_debug_libraries = 0 + optimize = 1 + compile_flags = /W3 /GX /MD /GR + defines = NDEBUG + compile_flags_removed = /YX + output_dir = Release + intermediate_dir = Release + debug_switch = +} + +Debug { + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /GX /Zi /MDd /GR /Gy + defines = _DEBUG + compile_flags_removed = /YX + intermediate_dir = Debug + lib_modifier = d + pdbl = 1 + pdbc = 1 +} + +MFC Release { + subsystem = windows + use_debug_libraries = 0 + optimize = 1 + compile_flags = /W3 /GX /MD /GR + common_defines = WIN32 _WINDOWS + defines = NDEBUG _AFXDLL + compile_flags_removed = /YX + output_dir = MFC_Release + intermediate_dir = MFC_Release + debug_switch = + lib_modifier = mfc + use_mfc = 2 + unicode_mfc_entry = wWinMainCRTStartup +} + +MFC Debug { + subsystem = windows + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /GX /Zi /MDd /GR /Gy + common_defines = WIN32 _WINDOWS + defines = _DEBUG _AFXDLL + compile_flags_removed = /YX + intermediate_dir = MFC_Debug + output_dir = MFC_Debug + lib_modifier = mfcd + pdbl = 1 + pdbc = 1 + use_mfc = 2 + unicode_mfc_entry = wWinMainCRTStartup +} + +conditional_include "vcpartialmacros" +conditional_include "user_vc6dspdllexe" diff --git a/ACE/MPC/templates/vc6dsplib.mpt b/ACE/MPC/templates/vc6dsplib.mpt new file mode 100644 index 00000000000..2e6c7d298da --- /dev/null +++ b/ACE/MPC/templates/vc6dsplib.mpt @@ -0,0 +1,64 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "vccommon" +conditional_include "windowscommon" + +type_description = "Static Library" +type_code = 0x0104 +configurations = Debug Release +common_defines = WIN32 _WINDOWS + +Release { + use_debug_libraries = 0 + optimize = 1 + compile_flags = /W3 /GX /MD /GR + defines = NDEBUG + compile_flags_removed = /YX + output_dir = Static_Release + intermediate_dir = Static_Release + lib_modifier = s + debug_switch = +} + +Debug { + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /GX /Zi /MDd /GR /Gy + defines = _DEBUG + compile_flags_removed = /Fr /YX + output_dir = Static_Debug + intermediate_dir = Static_Debug + lib_modifier = sd + pdbc = 1 +} + +MFC Release { + use_debug_libraries = 0 + optimize = 1 + compile_flags = /W3 /GX /MD /GR + defines = NDEBUG + compile_flags_removed = /YX + output_dir = Static_MFC_Release + intermediate_dir = Static_MFC_Release + lib_modifier = mfcs + debug_switch = + use_mfc = 2 +} + +MFC Debug { + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /GX /Zi /MDd /GR /Gy + defines = _DEBUG + compile_flags_removed = /Fr /YX + output_dir = Static_MFC_Debug + intermediate_dir = Static_MFC_Debug + lib_modifier = mfcsd + pdbc = 1 + use_mfc = 2 +} + +conditional_include "vcpartialmacros" +conditional_include "user_vc6dsplib" diff --git a/ACE/MPC/templates/vc6dsplibexe.mpt b/ACE/MPC/templates/vc6dsplibexe.mpt new file mode 100644 index 00000000000..020c61e88bf --- /dev/null +++ b/ACE/MPC/templates/vc6dsplibexe.mpt @@ -0,0 +1,74 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "vccommon" +conditional_include "windowscommon" + +type_description = "Console Application" +type_code = 0x0103 +configurations = Debug Release +default_configuration = Debug +common_defines = WIN32 _CONSOLE +subsystem = console + +Release { + use_debug_libraries = 0 + optimize = 1 + compile_flags = /W3 /GX /MD /GR + defines = NDEBUG + compile_flags_removed = /YX + lib_modifier = s + output_dir = Static_Release + intermediate_dir = Static_Release + debug_switch = +} + +Debug { + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /GX /Zi /MDd /GR /Gy + defines = _DEBUG + compile_flags_removed = /YX + intermediate_dir = Static_Debug + output_dir = Static_Debug + lib_modifier = sd + pdbl = 1 + pdbc = 1 +} + +MFC Release { + subsystem = windows + use_debug_libraries = 0 + optimize = 1 + compile_flags = /W3 /GX /MD /GR + common_defines = WIN32 _WINDOWS + defines = NDEBUG _AFXDLL + compile_flags_removed = /YX + output_dir = Static_MFC_Release + intermediate_dir = Static_MFC_Release + debug_switch = + lib_modifier = mfcs + use_mfc = 2 + unicode_mfc_entry = wWinMainCRTStartup +} + +MFC Debug { + subsystem = windows + use_debug_libraries = 1 + optimize = + compile_flags = /W3 /Gm /GX /Zi /MDd /GR /Gy + common_defines = WIN32 _WINDOWS + defines = _DEBUG _AFXDLL + compile_flags_removed = /YX + intermediate_dir = Static_MFC_Debug + output_dir = Static_MFC_Debug + lib_modifier = mfcsd + pdbl = 1 + pdbc = 1 + use_mfc = 2 + unicode_mfc_entry = wWinMainCRTStartup +} + +conditional_include "vcpartialmacros" +conditional_include "user_vc6dsplibexe" diff --git a/ACE/MPC/templates/vc7.mpd b/ACE/MPC/templates/vc7.mpd new file mode 100644 index 00000000000..5bbea79d7bf --- /dev/null +++ b/ACE/MPC/templates/vc7.mpd @@ -0,0 +1,656 @@ +<?xml version="<%xml_version("1.0")%>" encoding="<%encoding("Windows-1252")%>"?> +<VisualStudioProject + ProjectType="<%vcprojecttype("Visual C++")%>" + Version="<%vcversion%>" + Name="<%project_name%>" + ProjectGUID="{<%guid%>}" + SccProjectName="" + SccLocalPath=""> + <Platforms> + <Platform + Name="<%platform("Win32")%>"/> + </Platforms> + <Configurations> +<%foreach(configurations)%> + <Configuration + Name="<%configuration%>|<%platform%>" + OutputDirectory="<%if(type_is_dynamic)%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%><%else%><%if(type_is_static)%><%libout%><%else%><%if(exeout)%><%exeout%><%if(windows_style)%>\<%output_dir("Debug")%><%endif%><%else%><%if(windows_style)%><%output_dir("Debug")%><%else%><%output_dir(".")%><%endif%><%endif%><%endif%><%endif%>" + IntermediateDirectory="<%intermediate_dir%>\<%noextension(project_file)%><%if(output_subdir)%>\<%output_subdir%><%endif%>" +<%if(type_is_static && staticname)%> + ConfigurationType="4" +<%else%> +<%if(custom_only)%> + ConfigurationType="10" +<%else%> + ConfigurationType="<%configuration_type("2")%>" +<%endif%> +<%endif%> + UseOfMFC="<%use_mfc("0")%>" +<%if(UseOfATL)%> + UseOfATL="<%UseOfATL%>" +<%endif%> + ATLMinimizesCRunTimeLibraryUsage="FALSE" +<%if(managed)%> + ManagedExtensions="1" +<%endif%> + CharacterSet="<%charset("0")%>"> +<%if(!custom_only)%> + <Tool + Name="VCCLCompilerTool" +<%if(compile_flags || DisableSpecificWarnings)%> + AdditionalOptions="<%compile_flags%><%foreach(DisableSpecificWarnings)%> /wd<%DisableSpecificWarning%><%endfor%>" +<%endif%> +<%if(optimize)%> + Optimization="<%optimize%>" +<%else%> + Optimization="0" +<%endif%> +<%if(InlineFunctionExpansion)%> + InlineFunctionExpansion="<%InlineFunctionExpansion%>" +<%endif%> + AdditionalIncludeDirectories="<%foreach(includes)%><%include%><%fornotlast(",")%><%endfor%>" + PreprocessorDefinitions="<%if(unicode)%>UNICODE;_UNICODE;<%endif%><%if(type_is_dynamic)%><%foreach(dynamicflags)%><%dynamicflag%>;<%endfor%><%endif%><%if(need_staticflags)%><%foreach(staticflags)%><%staticflag%>;<%endfor%><%endif%><%if(pch_header)%><%foreach(pch_defines)%><%pch_define%>;<%endfor%><%endif%><%foreach(defines common_defines macros)%><%define%><%fornotlast(";")%><%endfor%><%if(macro_for_lib_modifier)%><%if(use_lib_modifier)%><%if(lib_modifier)%>;MPC_LIB_MODIFIER=\"<%lib_modifier%>\"<%endif%><%endif%><%endif%>" + MinimalRebuild="<%MinimalRebuild("FALSE")%>" + ExceptionHandling="<%exceptions("TRUE")%>" +<%if(!managed)%> +<%if(optimize)%> +<%if(BasicRuntimeChecks)%> + BasicRuntimeChecks="<%BasicRuntimeChecks%>" +<%endif%> +<%else%> + BasicRuntimeChecks="<%BasicRuntimeChecks("3")%>" +<%endif%> +<%endif%> +<%if(StringPooling)%> + StringPooling="<%StringPooling%>" +<%endif%> +<%if(runtime_library)%> + RuntimeLibrary="<%runtime_library%>" +<%else%> + RuntimeLibrary="<%if(type_is_static || need_staticflags)%><%if(debug_prj)%>1<%else%>0<%endif%><%else%><%if(debug_prj)%>3<%else%>2<%endif%><%endif%>" +<%endif%> + BufferSecurityCheck="<%BufferSecurityCheck("TRUE")%>" + EnableFunctionLevelLinking="<%EnableFunctionLevelLinking("TRUE")%>" + TreatWChar_tAsBuiltInType="<%wchar_t("TRUE")%>" +<%if(forloopscope)%> + ForceConformanceInForLoopScope="<%forloopscope%>" +<%endif%> + RuntimeTypeInfo="<%rtti("TRUE")%>" +<%if(pch_header)%> +<%if(pch_source)%> + UsePrecompiledHeader="3" +<%else%> + UsePrecompiledHeader="2" +<%endif%> + PrecompiledHeaderThrough="<%pch_header%>" +<%endif%> +<%if(pdbc)%> + ProgramDataBaseFileName="<%if(type_is_static)%><%libout%>\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.pdb<%else%><%intermediate_dir%>\<%noextension(project_file)%><%if(output_subdir)%>\<%output_subdir%><%endif%>/<%endif%>" +<%endif%> + WarningLevel="<%warning_level("3")%>" + SuppressStartupBanner="TRUE" + Detect64BitPortabilityProblems="<%Detect64BitPortabilityProblems("FALSE")%>" + DebugInformationFormat="<%debug_format("3")%>"/> +<%endif%> + <Tool + Name="VCCustomBuildTool"/> +<%if(!custom_only)%> + <Tool +<%if(type_is_static)%> + Name="VCLibrarianTool" +<%if(staticname)%> + OutputFile="<%libout%>\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%>" +<%endif%> +<%else%> + Name="VCLinkerTool" +<%if(!source_files || link_options)%> + AdditionalOptions="<%if(!source_files)%>/noentry <%endif%><%if(link_options)%><%link_options%><%endif%>" +<%endif%> +<%if(type_is_binary)%> + AdditionalDependencies="<%foreach(reverse(libs))%><%fornotfirst(" ")%><%libname_prefix%><%lib%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%><%endfor%><%foreach(reverse(lit_libs))%> <%lit_lib%>.lib<%endfor%><%foreach(reverse(pure_libs))%> <%pure_lib%><%endfor%>" +<%endif%> +<%if(exename || sharedname || staticname)%> + OutputFile="$(OutDir)\<%if(type_is_dynamic)%><%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%dll_ext%><%else%><%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%><%exe_ext%><%endif%>" +<%endif%> +<%if(win_version)%> + Version="<%win_version%>" +<%endif%> + LinkIncremental="<%LinkIncremental("2")%>" + SuppressStartupBanner="TRUE" + AdditionalLibraryDirectories="<%foreach(libpaths)%><%libpath%><%fornotlast(";")%><%endfor%>" +<%if(ignore_default_library_names)%> + IgnoreDefaultLibraryNames="<%foreach(ignore_default_library_names)%><%ignore_default_library_name%><%fornotlast(";")%><%endfor%>" +<%endif%> +<%if(IgnoreAllDefaultLibraries)%> + IgnoreAllDefaultLibraries="<%IgnoreAllDefaultLibraries%>" +<%endif%> +<%if(ModuleDefinitionFile)%> + ModuleDefinitionFile="<%ModuleDefinitionFile%>" +<%endif%> + GenerateDebugInformation="TRUE" +<%if(pdbl)%> +<%if(sharedname)%> + ProgramDatabaseFile="$(OutDir)\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.pdb" +<%else%> +<%if(exename)%> + ProgramDatabaseFile="$(OutDir)\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%>.pdb" +<%endif%> +<%endif%> +<%endif%> +<%if(GenerateMapFile)%> + GenerateMapFile="<%GenerateMapFile%>" +<%endif%> + SubSystem="<%subsystem("1")%>" +<%if(StackReserveSize)%> + StackReserveSize="<%StackReserveSize%>" +<%endif%> +<%if(StackCommitSize)%> + StackCommitSize="<%StackCommitSize%>" +<%endif%> +<%if(optimize)%> + OptimizeReferences="<%optref("2")%>" + EnableCOMDATFolding="<%opticf("2")%>" +<%endif%> +<%if(unicode && unicode_mfc_entry && exename && source_files)%> + EntryPointSymbol="<%unicode_mfc_entry%>" +<%endif%> +<%if(type_is_dynamic && sharedname)%> + ImportLibrary="<%libout%>\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%>" +<%endif%> +<%endif%> +<%if(FixedBaseAddress || managed)%> + FixedBaseAddress="<%FixedBaseAddress("1")%>" +<%endif%> + TargetMachine="<%machine("1")%>"/> +<%endif%> + <Tool + Name="VCMIDLTool" +<%if(midl_flags)%> + AdditionalOptions="<%midl_flags%>" +<%endif%> +<%if(midl_includes)%> + AdditionalIncludeDirectories="<%foreach(midl_includes)%><%midl_include%><%fornotlast(",")%><%endfor%>" +<%endif%> +<%if(midl_defines)%> + PreprocessorDefinitions="<%foreach(midl_defines)%><%midl_define%><%fornotlast(";")%><%endfor%>" +<%endif%> +<%if(midl_notlb)%> + GenerateTypeLibrary="FALSE" +<%endif%> + TypeLibraryName="$(InputName).tlb" + HeaderFileName="$(InputName).h" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c" + /> + <Tool + Name="VCPostBuildEventTool" +<%if(postbuild)%> + CommandLine="<%eval(postbuild)%>" +<%endif%> + /> + <Tool + Name="VCPreBuildEventTool" +<%if(prebuild)%> + CommandLine="<%eval(prebuild)%>" +<%endif%> + /> +<%if(!custom_only)%> + <Tool + Name="VCPreLinkEventTool" +<%if(prelink)%> + CommandLine="<%eval(prelink)%>" +<%endif%> + /> +<%if(postclean)%> + <Tool + Name="VCPostCleanEventTool" + CommandLine="<%eval(postclean)%>" + /> +<%endif%> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="<%if(unicode)%>UNICODE;_UNICODE;<%endif%><%foreach(defines macros)%><%define%><%fornotlast(";")%><%endfor%>" + Culture="<%culture("1033")%>" + AdditionalIncludeDirectories="<%foreach(includes)%><%include%><%fornotlast(",")%><%endfor%>"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> +<%endif%> + </Configuration> +<%endfor%> + </Configurations> + <Files> +<%if(exename || sharedname || staticname)%> +<%if(source_files)%> + <Filter + Name="Source Files" + Filter="<%foreach(ext, extensions(source_files))%><%ext%><%fornotlast(";")%><%endfor%>"> +<%if(pch_source)%> + <File + RelativePath="<%pch_source%>"> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="1"/> + </FileConfiguration> +<%endfor%> + </File> +<%endif%> +<%if(grouped_source_files)%> +<%foreach(sort(grouped_source_files))%> +<%if(compares(grouped_source_file, default_group))%> +<%foreach(grouped_source_file->files)%> + <File + RelativePath="<%grouped_source_file->file%>"> +<%if(duplicate_index(grouped_source_file->file))%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>"> + <Tool + Name="VCCLCompilerTool" +<%if(flag_overrides(grouped_source_file->file, buildflags))%> + AdditionalOptions="<%flag_overrides(grouped_source_file->file, buildflags)%>" +<%endif%> +<%if(flag_overrides(grouped_source_file->file, no_pch))%> + UsePrecompiledHeader="0" +<%endif%> +<%if(flag_overrides(grouped_source_file->file, managed))%> + BasicRuntimeChecks="0" + CompileAsManaged="2" +<%endif%> + ObjectFile="$(IntDir)\$(InputName)<%duplicate_index(grouped_source_file->file)%>.obj"/> + </FileConfiguration> +<%endfor%> +<%else%> +<%if(flag_overrides(grouped_source_file->file, buildflags) || flag_overrides(grouped_source_file->file, no_pch) || flag_overrides(grouped_source_file->file, managed))%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>"> + <Tool + Name="VCCLCompilerTool" +<%if(flag_overrides(grouped_source_file->file, buildflags))%> + AdditionalOptions="<%flag_overrides(grouped_source_file->file, buildflags)%>" +<%endif%> +<%if(flag_overrides(grouped_source_file->file, no_pch))%> + UsePrecompiledHeader="0" +<%endif%> +<%if(flag_overrides(grouped_source_file->file, managed))%> + BasicRuntimeChecks="0" + CompileAsManaged="2" +<%endif%> + /> + </FileConfiguration> +<%endfor%> +<%endif%> +<%endif%> + </File> +<%endfor%> +<%else%> + <Filter + Name="<%grouped_source_file%>" + Filter=""> +<%foreach(grouped_source_file->files)%> + <File + RelativePath="<%grouped_source_file->file%>"> +<%if(duplicate_index(grouped_source_file->file))%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>"> + <Tool + Name="VCCLCompilerTool" +<%if(flag_overrides(grouped_source_file->file, buildflags))%> + AdditionalOptions="<%flag_overrides(grouped_source_file->file, buildflags)%>" +<%endif%> +<%if(flag_overrides(grouped_source_file->file, no_pch))%> + UsePrecompiledHeader="0" +<%endif%> +<%if(flag_overrides(grouped_source_file->file, managed))%> + BasicRuntimeChecks="0" + CompileAsManaged="2" +<%endif%> + ObjectFile="$(IntDir)\$(InputName)<%duplicate_index(grouped_source_file->file)%>.obj"/> + </FileConfiguration> +<%endfor%> +<%else%> +<%if(flag_overrides(grouped_source_file->file, buildflags) || flag_overrides(grouped_source_file->file, no_pch) || flag_overrides(grouped_source_file->file, managed))%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>"> + <Tool + Name="VCCLCompilerTool" +<%if(flag_overrides(grouped_source_file->file, buildflags))%> + AdditionalOptions="<%flag_overrides(grouped_source_file->file, buildflags)%>" +<%endif%> +<%if(flag_overrides(grouped_source_file->file, no_pch))%> + UsePrecompiledHeader="0" +<%endif%> +<%if(flag_overrides(grouped_source_file->file, managed))%> + BasicRuntimeChecks="0" + CompileAsManaged="2" +<%endif%> + /> + </FileConfiguration> +<%endfor%> +<%endif%> +<%endif%> + </File> +<%endfor%> + </Filter> +<%endif%> +<%endfor%> +<%else%> +<%foreach(source_files)%> + <File + RelativePath="<%source_file%>"> +<%if(duplicate_index(source_file))%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>"> + <Tool + Name="VCCLCompilerTool" +<%if(flag_overrides(source_file, buildflags))%> + AdditionalOptions="<%flag_overrides(source_file, buildflags)%>" +<%endif%> +<%if(flag_overrides(source_file, no_pch))%> + UsePrecompiledHeader="0" +<%endif%> +<%if(flag_overrides(source_file, managed))%> + BasicRuntimeChecks="0" + CompileAsManaged="2" +<%endif%> + ObjectFile="$(IntDir)\$(InputName)<%duplicate_index(source_file)%>.obj"/> + </FileConfiguration> +<%endfor%> +<%else%> +<%if(flag_overrides(source_file, buildflags) || flag_overrides(source_file, no_pch) || flag_overrides(source_file, managed))%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>"> + <Tool + Name="VCCLCompilerTool" +<%if(flag_overrides(source_file, buildflags))%> + AdditionalOptions="<%flag_overrides(source_file, buildflags)%>" +<%endif%> +<%if(flag_overrides(source_file, no_pch))%> + UsePrecompiledHeader="0" +<%endif%> +<%if(flag_overrides(source_file, managed))%> + BasicRuntimeChecks="0" + CompileAsManaged="2" +<%endif%> + /> + </FileConfiguration> +<%endfor%> +<%endif%> +<%endif%> + </File> +<%endfor%> +<%endif%> + </Filter> +<%endif%> +<%endif%> +<%if(header_files)%> + <Filter + Name="Header Files" + Filter="<%foreach(ext, extensions(header_files))%><%ext%><%fornotlast(";")%><%endfor%>"> +<%if(pch_header)%> + <File + RelativePath="<%pch_header%>"> + </File> +<%endif%> +<%if(grouped_header_files)%> +<%foreach(sort(grouped_header_files))%> +<%if(compares(grouped_header_file, default_group))%> +<%foreach(grouped_header_file->files)%> + <File + RelativePath="<%grouped_header_file->file%>"> + </File> +<%endfor%> +<%else%> + <Filter + Name="<%grouped_header_file%>" + Filter=""> +<%foreach(grouped_header_file->files)%> + <File + RelativePath="<%grouped_header_file->file%>"> + </File> +<%endfor%> + </Filter> +<%endif%> +<%endfor%> +<%else%> +<%foreach(header_files)%> + <File + RelativePath="<%header_file%>"> + </File> +<%endfor%> +<%endif%> + </Filter> +<%endif%> +<%foreach(custom_types)%> +<%if(custom_type->input_files)%> + <Filter + Name="<%ucw(custom_type)%>" + Filter="<%foreach(custom_type->inputexts)%><%custom_type->inputext%><%fornotlast(";")%><%endfor%>"> +<%foreach(custom_type->input_files)%> + <File + RelativePath="<%custom_type->input_file%>"> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>" +<%if(!custom_type->input_file->output_files)%> + ExcludedFromBuild="TRUE" +<%endif%> + > +<%if(custom_type->input_file->output_files)%> + <Tool + Name="VCCustomBuildTool" + Description="Invoking <%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> on <%custom_type->input_file%>" + CommandLine="<%if(custom_type->libpath)%>PATH=%PATH%;<%custom_type->libpath%>
<%endif%><%if(flag_overrides(custom_type->input_file, gendir))%>if not exist <%flag_overrides(custom_type->input_file, gendir)%> mkdir <%flag_overrides(custom_type->input_file, gendir)%>
<%endif%><%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%if(custom_type->output_option)%>"<%custom_type->input_file%>" <%custom_type->output_option%><%foreach(custom_type->input_file->output_files)%> "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%>"<%endfor%><%else%>"<%custom_type->input_file%>"<%endif%><%if(flag_overrides(custom_type->input_file, postcommand))%><%foreach(custom_type->input_file)%> && <%flag_overrides(custom_type->input_file, postcommand)%><%endfor%><%else%><%if(custom_type->postcommand)%><%foreach(custom_type->input_file)%> && <%custom_type->postcommand%><%endfor%><%endif%><%endif%><%if(pch_header)%><%if(custom_type->pch_postrule)%><%foreach(custom_type->input_file->source_output_files)%> && echo #include "<%pch_header%>" > temporary.src && type "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->source_output_file)%><%else%><%custom_type->input_file->source_output_file%><%endif%>" >> temporary.src && move /y temporary.src "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->source_output_file)%><%else%><%custom_type->input_file->source_output_file%><%endif%>"<%endfor%><%endif%><%endif%>" +<%if(flag_overrides(custom_type->input_file, dependent))%> + AdditionalDependencies="<%foreach(dep, flag_overrides(custom_type->input_file, dependent))%><%dep%><%if(!has_extension(dep))%><%exe_ext%><%endif%><%fornotlast(";")%><%endfor%><%foreach(custom_type->input_file->dependencies)%>;<%custom_type->input_file->dependencie%><%endfor%>" +<%else%> +<%if(custom_type->dependent)%> + AdditionalDependencies="<%foreach(custom_type->dependent)%><%custom_type->dependent%><%if(!has_extension(custom_type->dependent))%><%exe_ext%><%endif%><%fornotlast(";")%><%endfor%><%foreach(custom_type->input_file->dependencies)%>;<%custom_type->input_file->dependencie%><%endfor%>" +<%else%> +<%if(custom_type->input_file->dependencies)%> + AdditionalDependencies="<%foreach(custom_type->input_file->dependencies)%><%custom_type->input_file->dependencie%><%fornotlast(";")%><%endfor%>" +<%endif%> +<%endif%> +<%endif%> + Outputs="<%foreach(custom_type->input_file->output_files)%><%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%><%fornotlast(";")%><%endfor%>"/> +<%endif%> + </FileConfiguration> +<%endfor%> + </File> +<%endfor%> + </Filter> +<%endif%> +<%endfor%> +<%if(inline_files)%> + <Filter + Name="Inline Files" + Filter="<%foreach(ext, extensions(inline_files))%><%ext%><%fornotlast(";")%><%endfor%>"> +<%if(grouped_inline_files)%> +<%foreach(sort(grouped_inline_files))%> +<%if(compares(grouped_inline_file, default_group))%> +<%foreach(grouped_inline_file->files)%> + <File + RelativePath="<%grouped_inline_file->file%>"> + </File> +<%endfor%> +<%else%> + <Filter + Name="<%grouped_inline_file%>" + Filter=""> +<%foreach(grouped_inline_file->files)%> + <File + RelativePath="<%grouped_inline_file->file%>"> + </File> +<%endfor%> + </Filter> +<%endif%> +<%endfor%> +<%else%> +<%foreach(inline_files)%> + <File + RelativePath="<%inline_file%>"> + </File> +<%endfor%> +<%endif%> + </Filter> +<%endif%> +<%if(template_files)%> + <Filter + Name="Template Files" + Filter=""> +<%if(grouped_template_files)%> +<%foreach(sort(grouped_template_files))%> +<%if(compares(grouped_template_file, default_group))%> +<%foreach(grouped_template_file->files)%> + <File + RelativePath="<%grouped_template_file->file%>"> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>" + ExcludedFromBuild="TRUE"> + <Tool + Name="VCCLCompilerTool"/> + </FileConfiguration> +<%endfor%> + </File> +<%endfor%> +<%else%> + <Filter + Name="<%grouped_template_file%>" + Filter=""> +<%foreach(grouped_template_file->files)%> + <File + RelativePath="<%grouped_template_file->file%>"> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>" + ExcludedFromBuild="TRUE"> + <Tool + Name="VCCLCompilerTool"/> + </FileConfiguration> +<%endfor%> + </File> +<%endfor%> + </Filter> +<%endif%> +<%endfor%> +<%else%> +<%foreach(template_files)%> + <File + RelativePath="<%template_file%>"> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>" + ExcludedFromBuild="TRUE"> + <Tool + Name="VCCLCompilerTool"/> + </FileConfiguration> +<%endfor%> + </File> +<%endfor%> +<%endif%> + </Filter> +<%endif%> +<%if(documentation_files)%> + <Filter + Name="Documentation" + Filter=""> +<%if(grouped_documentation_files)%> +<%foreach(sort(grouped_documentation_files))%> +<%if(compares(grouped_documentation_file, default_group))%> +<%foreach(grouped_documentation_file->files)%> + <File + RelativePath="<%grouped_documentation_file->file%>"> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>" + ExcludedFromBuild="TRUE"> + <Tool + Name="VCCustomBuildTool"/> + </FileConfiguration> +<%endfor%> + </File> +<%endfor%> +<%else%> + <Filter + Name="<%grouped_documentation_file%>" + Filter=""> +<%foreach(grouped_documentation_file->files)%> + <File + RelativePath="<%grouped_documentation_file->file%>"> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>" + ExcludedFromBuild="TRUE"> + <Tool + Name="VCCustomBuildTool"/> + </FileConfiguration> +<%endfor%> + </File> +<%endfor%> + </Filter> +<%endif%> +<%endfor%> +<%else%> +<%foreach(documentation_files)%> + <File + RelativePath="<%documentation_file%>"> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>" + ExcludedFromBuild="TRUE"> + <Tool + Name="VCCustomBuildTool"/> + </FileConfiguration> +<%endfor%> + </File> +<%endfor%> +<%endif%> + </Filter> +<%endif%> +<%if(resource_files && !type_is_static)%> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"> +<%if(grouped_resource_files)%> +<%foreach(sort(grouped_resource_files))%> +<%if(compares(grouped_resource_file, default_group))%> +<%foreach(grouped_resource_file->files)%> + <File + RelativePath="<%grouped_resource_file->file%>"> + </File> +<%endfor%> +<%else%> + <Filter + Name="<%grouped_resource_file%>" + Filter=""> +<%foreach(grouped_resource_file->files)%> + <File + RelativePath="<%grouped_resource_file->file%>"> + </File> +<%endfor%> + </Filter> +<%endif%> +<%endfor%> +<%else%> +<%foreach(resource_files)%> + <File + RelativePath="<%resource_file%>"> + </File> +<%endfor%> +<%endif%> + </Filter> +<%endif%> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/ACE/MPC/templates/vc7csharp.mpd b/ACE/MPC/templates/vc7csharp.mpd new file mode 100644 index 00000000000..287c2f6a69c --- /dev/null +++ b/ACE/MPC/templates/vc7csharp.mpd @@ -0,0 +1,141 @@ +<VisualStudioProject> + <CSHARP + ProjectType = "Local" + ProductVersion = "<%prversion("7.10.3077")%>" + SchemaVersion = "<%schemaversion("2.0")%>" + ProjectGuid = "{<%guid%>}" +<%if(scc)%> + SccProjectName = "<%scc%>" + SccLocalPath = "<%scc%>" + SccAuxPath = "<%scc%>" + SccProvider = "<%scc%>" +<%endif%> + > + <Build> + <Settings +<%if(ico_files)%> +<%foreach(ico_files)%> +<%if(forfirst)%> + ApplicationIcon = "<%ico_file%>" +<%endif%> +<%endfor%> +<%else%> + ApplicationIcon = "" +<%endif%> + AssemblyKeyContainerName = "" +<%if(exename || sharedname || staticname)%> + AssemblyName = "<%if(exename)%><%exename%><%else%><%libname_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%><%endif%>" +<%endif%> + AssemblyOriginatorKeyFile = "<%keyfile%>" + DefaultClientScript = "JScript" + DefaultHTMLPageLayout = "Grid" + DefaultTargetSchema = "IE50" + DelaySign = "<%DelaySign("false")%>" +<%if(exename || sharedname || staticname)%> + OutputType = "<%if(exename)%><%if(winapp)%>Win<%endif%>Exe<%else%>Library<%endif%>" +<%endif%> + PreBuildEvent = "<%if(prebuild)%><%eval(prebuild)%><%endif%>" + PostBuildEvent = "<%if(postbuild)%><%eval(postbuild)%><%endif%>" + RootNamespace = "" + RunPostBuildEvent = "OnBuildSuccess" + StartupObject = "<%startupobject%>" +<%if(libpaths)%> + ReferencePath = "<%foreach(libpaths)%><%libpath%><%fornotlast(";")%><%endfor%>" +<%endif%> + > +<%foreach(configurations)%> + <Config + Name = "<%configuration%>" + AllowUnsafeBlocks = "<%allowunsafeblocks(false)%>" + BaseAddress = "285212672" + CheckForOverflowUnderflow = "false" + ConfigurationOverrideFile = "" + DefineConstants = "<%foreach(defines common_defines macros)%><%define%>;<%endfor%><%if(!optimize)%>DESIGN;DEBUG;<%endif%><%if(trace)%>TRACE<%endif%>" + DocumentationFile = "" + DebugSymbols = "<%if(optimize)%>false<%else%>true<%endif%>" + FileAlignment = "4096" + IncrementalBuild = "<%incremental("false")%>" + NoStdLib = "false" + NoWarn = "" + Optimize = "<%if(optimize)%>true<%else%>false<%endif%>" +<%if(exename || sharedname || staticname)%> + OutputPath = "<%if(exename)%><%if(exeout)%><%exeout%><%if(windows_style)%>\<%output_dir%><%endif%><%else%>.\<%output_dir%><%endif%><%else%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%output_dir%><%endif%>\" +<%endif%> + RegisterForComInterop = "false" + RemoveIntegerChecks = "false" + TreatWarningsAsErrors = "false" + WarningLevel = "4" + /> +<%endfor%> + </Settings> + <References> +<%foreach(libs)%> + <Reference + Name = "<%libname_prefix%><%lib%>" + AssemblyName = "<%libname_prefix%><%lib%>" + /> +<%endfor%> +<%foreach(lib, lit_libs pure_libs)%> + <Reference + Name = "<%lib%>" + AssemblyName = "<%lib%>" + /> +<%endfor%> + </References> + </Build> + <Files> + <Include> +<%foreach(source_files)%> + <File + RelPath = "<%source_file%>" + SubType = "<%if(flag_overrides(source_file, subtype))%><%flag_overrides(source_file, subtype)%><%else%>Code<%endif%>" + BuildAction = "Compile" + /> +<%endfor%> +<%foreach(resx_files)%> + <File + RelPath = "<%resx_file%>" + BuildAction = "EmbeddedResource" + /> +<%endfor%> +<%foreach(custom_types)%> +<%foreach(custom_type->input_files)%> + <File + RelPath = "<%custom_type->input_file%>" +<%if(custom_type->input_file->output_files)%> + BuildAction = "Compile" + Generator = "<%if(custom_type->libpath)%>PATH=%PATH%;<%custom_type->libpath%>
<%endif%><%if(flag_overrides(custom_type->input_file, gendir))%>if not exist <%flag_overrides(custom_type->input_file, gendir)%> mkdir <%flag_overrides(custom_type->input_file, gendir)%>
<%endif%><%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%if(custom_type->output_option)%><%custom_type->input_file%> <%custom_type->output_option%> <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_files)%><%else%><%custom_type->input_file->output_files%><%endif%><%else%><%custom_type->input_file%><%endif%><%if(flag_overrides(custom_type->input_file, postcommand))%><%foreach(custom_type->input_file)%>&&<%flag_overrides(custom_type->input_file, postcommand)%><%endfor%><%else%><%if(custom_type->postcommand)%><%foreach(custom_type->input_file)%>&&<%custom_type->postcommand%><%endfor%><%endif%><%endif%>" +<%else%> + BuildAction = "None" +<%endif%> + /> +<%endfor%> +<%endfor%> +<%foreach(aspx_files)%> + <File + RelPath = "<%aspx_file%>" + BuildAction = "Content" + /> +<%endfor%> +<%foreach(ico_files)%> + <File + RelPath = "<%ico_file%>" + BuildAction = "Content" + /> +<%endfor%> +<%foreach(config_files)%> + <File + RelPath = "<%config_file%>" + BuildAction = "None" + /> +<%endfor%> +<%foreach(documentation_files)%> + <File + RelPath = "<%documentation_file%>" + BuildAction = "None" + /> +<%endfor%> + </Include> + </Files> + </CSHARP> +</VisualStudioProject> diff --git a/ACE/MPC/templates/vc7csharp.mpt b/ACE/MPC/templates/vc7csharp.mpt new file mode 100644 index 00000000000..2964f1d2209 --- /dev/null +++ b/ACE/MPC/templates/vc7csharp.mpt @@ -0,0 +1,20 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +configurations = Debug Release +trace = 1 + +Release { + optimize = 1 + output_dir = Release +} + +Debug { + optimize = + output_dir = Debug +} + +conditional_include "user_vc7csharp" diff --git a/ACE/MPC/templates/vc7dll.mpt b/ACE/MPC/templates/vc7dll.mpt new file mode 100644 index 00000000000..0e2fffeaf0f --- /dev/null +++ b/ACE/MPC/templates/vc7dll.mpt @@ -0,0 +1,101 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +configurations = Debug Release +common_defines = WIN32 _WINDOWS +output_subdir = I386 + +Release { + LinkIncremental = 1 + optimize = 3 + defines = NDEBUG + output_dir = Release + intermediate_dir = Release +} + +Debug { + optimize = + debug_prj = 1 + defines = _DEBUG + output_dir = . + intermediate_dir = Debug + lib_modifier = d + pdbl = 1 + pdbc = 1 +} + +Memcheck Release { + optimize = 3 + defines = NDEBUG + output_dir = Release + intermediate_dir = Release + BasicRuntimeChecks = 0 + LinkIncremental = 1 + FixedBaseAddress = 1 + pdbl = 1 +} + +Memcheck Debug { + optimize = + debug_prj = 1 + defines = _DEBUG + output_dir = . + intermediate_dir = Debug + lib_modifier = d + pdbc = 1 + BasicRuntimeChecks = 0 + LinkIncremental = 1 + FixedBaseAddress = 1 + pdbl = 1 +} + +MFC Release { + LinkIncremental = 1 + optimize = 3 + defines = NDEBUG + output_dir = MFC_Release + intermediate_dir = MFC_Release + lib_modifier = mfc + use_mfc = 2 +} + +MFC Debug { + optimize = + debug_prj = 1 + defines = _DEBUG + output_dir = MFC_Debug + intermediate_dir = MFC_Debug + lib_modifier = mfcd + pdbl = 1 + pdbc = 1 + use_mfc = 2 +} + +ETS Release { + optimize = 3 + defines = NDEBUG + output_dir = ETS_Release + intermediate_dir = ETS_Release + runtime_library = 2 + GenerateMapFile = TRUE + lit_libs += etsapi wsock32 +} + +ETS Debug { + optimize = + defines = _DEBUG + output_dir = ETS_Debug + intermediate_dir = ETS_Debug + lib_modifier = d + runtime_library = 3 + pdbl = 1 + pdbc = 1 + GenerateMapFile = TRUE + lit_libs += etsapi wsock32 +} + +conditional_include "vcpartialmacros" +conditional_include "user_vc7dll" diff --git a/ACE/MPC/templates/vc7exe.mpt b/ACE/MPC/templates/vc7exe.mpt new file mode 100644 index 00000000000..62d0968dd1c --- /dev/null +++ b/ACE/MPC/templates/vc7exe.mpt @@ -0,0 +1,106 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +configurations = Debug Release +common_defines = WIN32 _CONSOLE +configuration_type = 1 +subsystem = 1 +output_subdir = I386 + +Release { + LinkIncremental = 1 + optimize = 3 + defines = NDEBUG + output_dir = Release + intermediate_dir = Release +} + +Debug { + optimize = + debug_prj = 1 + defines = _DEBUG + intermediate_dir = Debug + lib_modifier = d + pdbl = 1 + pdbc = 1 +} + +Memcheck Release { + optimize = 3 + defines = NDEBUG + output_dir = Release + intermediate_dir = Release + BasicRuntimeChecks = 0 + LinkIncremental = 1 + FixedBaseAddress = 1 + pdbl = 1 +} + +Memcheck Debug { + optimize = + debug_prj = 1 + defines = _DEBUG + intermediate_dir = Debug + lib_modifier = d + pdbc = 1 + BasicRuntimeChecks = 0 + LinkIncremental = 1 + FixedBaseAddress = 1 + pdbl = 1 +} + +MFC Release { + LinkIncremental = 1 + optimize = 3 + common_defines = WIN32 _WINDOWS + defines = NDEBUG _AFXDLL + output_dir = MFC_Release + intermediate_dir = MFC_Release + lib_modifier = mfc + use_mfc = 2 + unicode_mfc_entry = wWinMainCRTStartup +} + +MFC Debug { + optimize = + debug_prj = 1 + common_defines = WIN32 _WINDOWS + defines = _DEBUG _AFXDLL + output_dir = MFC_Debug + intermediate_dir = MFC_Debug + lib_modifier = mfcd + pdbl = 1 + pdbc = 1 + use_mfc = 2 + unicode_mfc_entry = wWinMainCRTStartup + +} + +ETS Release { + optimize = 3 + defines = NDEBUG + output_dir = ETS_Release + intermediate_dir = ETS_Release + runtime_library = 2 + GenerateMapFile = TRUE + lit_libs += etsapi wsock32 +} + +ETS Debug { + optimize = + defines = _DEBUG + output_dir = ETS_Debug + intermediate_dir = ETS_Debug + lib_modifier = d + runtime_library = 3 + pdbl = 1 + pdbc = 1 + GenerateMapFile = TRUE + lit_libs += etsapi wsock32 +} + +conditional_include "vcpartialmacros" +conditional_include "user_vc7exe" diff --git a/ACE/MPC/templates/vc7java.mpd b/ACE/MPC/templates/vc7java.mpd new file mode 100644 index 00000000000..7cd08e7b81e --- /dev/null +++ b/ACE/MPC/templates/vc7java.mpd @@ -0,0 +1,104 @@ +<VisualStudioProject> + <VISUALJSHARP + ProjectType = "Local" + ProductVersion = "<%prversion("7.10.3077")%>" + SchemaVersion = "<%schemaversion("2.0")%>" + ProjectGuid = "{<%guid%>}" +<%if(scc)%> + SccProjectName = "<%scc%>" + SccLocalPath = "<%scc%>" + SccAuxPath = "<%scc%>" + SccProvider = "<%scc%>" +<%endif%> + > + <Build> + <Settings + AssemblyKeyContainerName = "" +<%if(exename || sharedname || staticname)%> + AssemblyName = "<%if(exename)%><%exename%><%else%><%libname_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%><%endif%>" +<%endif%> + AssemblyOriginatorKeyFile = "<%keyfile%>" + DefaultClientScript = "JScript" + DefaultHTMLPageLayout = "Grid" + DefaultTargetSchema = "IE50" + DelaySign = "<%DelaySign("false")%>" +<%if(exename || sharedname || staticname)%> + OutputType = "<%if(exename)%><%if(winapp)%>Win<%endif%>Exe<%else%>Library<%endif%>" +<%endif%> + PreBuildEvent = "<%if(prebuild)%><%eval(prebuild)%><%endif%>" + PostBuildEvent = "<%if(postbuild)%><%eval(postbuild)%><%endif%>" + RootNamespace = "" + RunPostBuildEvent = "OnBuildSuccess" + StartupObject = "<%startupobject%>" +<%if(libpaths)%> + ReferencePath = "<%foreach(libpaths)%><%libpath%><%fornotlast(";")%><%endfor%>" +<%endif%> + > +<%foreach(configurations)%> + <Config + Name = "<%configuration%>" + AllowUnsafeBlocks = "<%allowunsafeblocks(false)%>" + BaseAddress = "285212672" + CheckForOverflowUnderflow = "false" + ConfigurationOverrideFile = "" + DefineConstants = "<%foreach(defines common_defines macros)%><%define%>;<%endfor%><%if(!optimize)%>DESIGN;DEBUG;<%endif%><%if(trace)%>TRACE<%endif%>" + DebugSymbols = "<%if(optimize)%>false<%else%>true<%endif%>" + NoWarn = "" + Optimize = "<%if(optimize)%>true<%else%>false<%endif%>" +<%if(exename || sharedname || staticname)%> + OutputPath = "<%if(exename)%><%if(exeout)%><%exeout%><%if(windows_style)%>\<%output_dir%><%endif%><%else%>.\<%output_dir%><%endif%><%else%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%output_dir%><%endif%>\" +<%endif%> + RegisterForComInterop = "false" + TreatWarningsAsErrors = "false" + WarningLevel = "4" + AdditionalOptions = "" + /> +<%endfor%> + </Settings> + <References> +<%foreach(libs)%> + <Reference + Name = "<%libname_prefix%><%lib%>" + AssemblyName = "<%libname_prefix%><%lib%>" + /> +<%endfor%> +<%foreach(lib, lit_libs pure_libs)%> + <Reference + Name = "<%lib%>" + AssemblyName = "<%lib%>" + /> +<%endfor%> + </References> + </Build> + <Files> + <Include> +<%foreach(source_files)%> + <File + RelPath = "<%source_file%>" + SubType = "<%if(flag_overrides(source_file, subtype))%><%flag_overrides(source_file, subtype)%><%else%>Code<%endif%>" + BuildAction = "Compile" + /> +<%endfor%> +<%foreach(custom_types)%> +<%foreach(custom_type->input_files)%> + <File + RelPath = "<%custom_type->input_file%>" +<%if(custom_type->input_file->output_files)%> + BuildAction = "Compile" + Generator = "<%if(custom_type->libpath)%>PATH=%PATH%;<%custom_type->libpath%>
<%endif%><%if(flag_overrides(custom_type->input_file, gendir))%>if not exist <%flag_overrides(custom_type->input_file, gendir)%> mkdir <%flag_overrides(custom_type->input_file, gendir)%>
<%endif%><%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%if(custom_type->output_option)%><%custom_type->input_file%> <%custom_type->output_option%> <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_files)%><%else%><%custom_type->input_file->output_files%><%endif%><%else%><%custom_type->input_file%><%endif%><%if(flag_overrides(custom_type->input_file, postcommand))%><%foreach(custom_type->input_file)%>&&<%flag_overrides(custom_type->input_file, postcommand)%><%endfor%><%else%><%if(custom_type->postcommand)%><%foreach(custom_type->input_file)%>&&<%custom_type->postcommand%><%endfor%><%endif%><%endif%>" +<%else%> + BuildAction = "None" +<%endif%> + /> +<%endfor%> +<%endfor%> +<%foreach(documentation_files)%> + <File + RelPath = "<%documentation_file%>" + BuildAction = "None" + /> +<%endfor%> + </Include> + </Files> + </VISUALJSHARP> +</VisualStudioProject> diff --git a/ACE/MPC/templates/vc7java.mpt b/ACE/MPC/templates/vc7java.mpt new file mode 100644 index 00000000000..cd1d1980f7b --- /dev/null +++ b/ACE/MPC/templates/vc7java.mpt @@ -0,0 +1,20 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +configurations = Debug Release +trace = 1 + +Release { + optimize = 1 + output_dir = Release +} + +Debug { + optimize = + output_dir = Debug +} + +conditional_include "user_vc7java" diff --git a/ACE/MPC/templates/vc7lib.mpt b/ACE/MPC/templates/vc7lib.mpt new file mode 100644 index 00000000000..de9f9a23ff9 --- /dev/null +++ b/ACE/MPC/templates/vc7lib.mpt @@ -0,0 +1,97 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +configurations = Debug Release +common_defines = WIN32 _WINDOWS +configuration_type = 4 +output_subdir = I386 + +Release { + optimize = 3 + defines = NDEBUG + output_dir = Static_Release + intermediate_dir = Static_Release + lib_modifier = s +} + +Debug { + optimize = + debug_prj = 1 + defines = _DEBUG + output_dir = Static_Debug + intermediate_dir = Static_Debug + lib_modifier = sd + pdbc = 1 +} + +Memcheck Release { + optimize = 3 + defines = NDEBUG + output_dir = Static_Release + intermediate_dir = Static_Release + lib_modifier = s + BasicRuntimeChecks = 0 + FixedBaseAddress = 1 +} + +Memcheck Debug { + optimize = + debug_prj = 1 + defines = _DEBUG + output_dir = Static_Debug + intermediate_dir = Static_Debug + lib_modifier = sd + pdbc = 1 + BasicRuntimeChecks = 0 + FixedBaseAddress = 1 +} + +MFC Release { + optimize = 3 + defines = NDEBUG + output_dir = Static_MFC_Release + intermediate_dir = Static_MFC_Release + lib_modifier = mfcs + use_mfc = 2 +} + +MFC Debug { + optimize = + debug_prj = 1 + defines = _DEBUG + output_dir = Static_MFC_Debug + intermediate_dir = Static_MFC_Debug + lib_modifier = mfcsd + pdbc = 1 + use_mfc = 2 +} + +ETS Release { + optimize = 3 + defines = NDEBUG + output_dir = ETS_Release + intermediate_dir = ETS_Release + lib_modifier = s + runtime_library = 2 + GenerateMapFile = TRUE + lit_libs += etsapi wsock32 +} + +ETS Debug { + optimize = + defines = _DEBUG + output_dir = ETS_Debug + intermediate_dir = ETS_Debug + lib_modifier = sd + runtime_library = 3 + pdbl = 1 + pdbc = 1 + GenerateMapFile = TRUE + lit_libs += etsapi wsock32 +} + +conditional_include "vcpartialmacros" +conditional_include "user_vc7lib" diff --git a/ACE/MPC/templates/vc7libexe.mpt b/ACE/MPC/templates/vc7libexe.mpt new file mode 100644 index 00000000000..101d33344fb --- /dev/null +++ b/ACE/MPC/templates/vc7libexe.mpt @@ -0,0 +1,108 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +configurations = Debug Release +common_defines = WIN32 _CONSOLE +configuration_type = 1 +subsystem = 1 +output_subdir = I386 + +Release { + LinkIncremental = 1 + optimize = 3 + defines = NDEBUG + output_dir = Static_Release + intermediate_dir = Static_Release + lib_modifier = s +} + +Debug { + optimize = + debug_prj = 1 + defines = _DEBUG + output_dir = Static_Debug + intermediate_dir = Static_Debug + lib_modifier = sd + pdbl = 1 + pdbc = 1 +} + +Memcheck Release { + optimize = 3 + defines = NDEBUG + output_dir = Static_Release + intermediate_dir = Static_Release + lib_modifier = s + BasicRuntimeChecks = 0 + LinkIncremental = 1 + FixedBaseAddress = 1 + pdbl = 1 +} + +Memcheck Debug { + optimize = + debug_prj = 1 + defines = _DEBUG + output_dir = Static_Debug + intermediate_dir = Static_Debug + lib_modifier = sd + pdbc = 1 + BasicRuntimeChecks = 0 + LinkIncremental = 1 + FixedBaseAddress = 1 + pdbl = 1 +} + +MFC Release { + LinkIncremental = 1 + optimize = 3 + defines = NDEBUG _AFXDLL + output_dir = Static_MFC_Release + intermediate_dir = Static_MFC_Release + lib_modifier = mfcs + use_mfc = 2 + unicode_mfc_entry = wWinMainCRTStartup +} + +MFC Debug { + optimize = + debug_prj = 1 + defines = _DEBUG _AFXDLL + output_dir = Static_MFC_Debug + intermediate_dir = Static_MFC_Debug + lib_modifier = mfcsd + pdbl = 1 + pdbc = 1 + use_mfc = 2 + unicode_mfc_entry = wWinMainCRTStartup +} + +ETS Release { + optimize = 3 + defines = NDEBUG + output_dir = ETS_Release + intermediate_dir = ETS_Release + lib_modifier = s + runtime_library = 2 + GenerateMapFile = TRUE + lit_libs += etsapi wsock32 +} + +ETS Debug { + optimize = + defines = _DEBUG + output_dir = ETS_Debug + intermediate_dir = ETS_Debug + lib_modifier = sd + runtime_library = 3 + pdbl = 1 + pdbc = 1 + GenerateMapFile = TRUE + lit_libs += etsapi wsock32 +} + +conditional_include "vcpartialmacros" +conditional_include "user_vc7libexe" diff --git a/ACE/MPC/templates/vc7vb.mpd b/ACE/MPC/templates/vc7vb.mpd new file mode 100644 index 00000000000..1c7e69ad357 --- /dev/null +++ b/ACE/MPC/templates/vc7vb.mpd @@ -0,0 +1,137 @@ +<VisualStudioProject> + <VisualBasic + ProjectType = "Local" + ProductVersion = "<%prversion("7.10.3077")%>" + SchemaVersion = "<%schemaversion("2.0")%>" + ProjectGuid = "{<%guid%>}" +<%if(scc)%> + SccProjectName = "<%scc%>" + SccLocalPath = "<%scc%>" + SccAuxPath = "<%scc%>" + SccProvider = "<%scc%>" +<%endif%> + > + <Build> + <Settings +<%if(ico_files)%> +<%foreach(ico_files)%> +<%if(forfirst)%> + ApplicationIcon = "<%ico_file%>" +<%endif%> +<%endfor%> +<%else%> + ApplicationIcon = "" +<%endif%> + AssemblyKeyContainerName = "" +<%if(exename || sharedname || staticname)%> + AssemblyName = "<%if(exename)%><%exename%><%else%><%libname_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%><%endif%>" +<%endif%> + AssemblyOriginatorKeyFile = "" + DefaultClientScript = "JScript" + DefaultHTMLPageLayout = "Grid" + DefaultTargetSchema = "IE50" + DelaySign = "<%DelaySign("false")%>" +<%if(exename || sharedname || staticname)%> + OutputType = "<%if(exename)%><%if(winapp)%>Win<%endif%>Exe<%else%>Library<%endif%>" +<%endif%> + OutputCompare = "Binary" + OptionExplicit = "On" + OptionStrict = "Off" + RootNamespace = "" + StartupObject = "<%startupobject%>" +<%if(libpaths)%> + ReferencePath = "<%foreach(libpaths)%><%libpath%><%fornotlast(";")%><%endfor%>" +<%endif%> + > +<%foreach(configurations)%> + <Config + Name = "<%configuration%>" + BaseAddress = "285212672" + ConfigurationOverrideFile = "" + DefineConstants = "<%foreach(defines common_defines macros)%><%define%><%fornotlast(";")%><%endfor%>" + DefineDebug = "<%if(optimize)%>false<%else%>true<%endif%>" + DefineTrace = "<%if(trace)%>true<%else%>false<%endif%>" + DefineSymbols = "<%if(optimize)%>false<%else%>true<%endif%>" + IncrementalBuild = "<%incremental("false")%>" + Optimize = "<%if(optimize)%>true<%else%>false<%endif%>" +<%if(exename || sharedname || staticname)%> + OutputPath = "<%if(exename)%><%if(exeout)%><%exeout%><%if(windows_style)%>\<%output_dir%><%endif%><%else%>.\<%output_dir%><%endif%><%else%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%output_dir%><%endif%>\" +<%endif%> + RegisterForComInterop = "false" + RemoveIntegerChecks = "false" + TreatWarningsAsErrors = "false" + WarningLevel = "1" + /> +<%endfor%> + </Settings> + <References> +<%foreach(libs)%> + <Reference + Name = "<%libname_prefix%><%lib%>" + AssemblyName = "<%libname_prefix%><%lib%>" + /> +<%endfor%> +<%foreach(lib, lit_libs pure_libs)%> + <Reference + Name = "<%lib%>" + AssemblyName = "<%lib%>" + /> +<%endfor%> + </References> + </Build> + <Files> + <Include> +<%foreach(source_files)%> + <File + RelPath = "<%source_file%>" + SubType = "<%if(flag_overrides(source_file, subtype))%><%flag_overrides(source_file, subtype)%><%else%>Code<%endif%>" + BuildAction = "Compile" + /> +<%endfor%> +<%foreach(resx_files)%> + <File + RelPath = "<%resx_file%>" + BuildAction = "EmbeddedResource" + /> +<%endfor%> +<%foreach(custom_types)%> +<%foreach(custom_type->input_files)%> + <File + RelPath = "<%custom_type->input_file%>" +<%if(custom_type->input_file->output_files)%> + BuildAction = "Compile" + Generator = "<%if(custom_type->libpath)%>PATH=%PATH%;<%custom_type->libpath%>
<%endif%><%if(flag_overrides(custom_type->input_file, gendir))%>if not exist <%flag_overrides(custom_type->input_file, gendir)%> mkdir <%flag_overrides(custom_type->input_file, gendir)%>
<%endif%><%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%if(custom_type->output_option)%><%custom_type->input_file%> <%custom_type->output_option%> <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_files)%><%else%><%custom_type->input_file->output_files%><%endif%><%else%><%custom_type->input_file%><%endif%><%if(flag_overrides(custom_type->input_file, postcommand))%><%foreach(custom_type->input_file)%>&&<%flag_overrides(custom_type->input_file, postcommand)%><%endfor%><%else%><%if(custom_type->postcommand)%><%foreach(custom_type->input_file)%>&&<%custom_type->postcommand%><%endfor%><%endif%><%endif%>" +<%else%> + BuildAction = "None" +<%endif%> + /> +<%endfor%> +<%endfor%> +<%foreach(aspx_files)%> + <File + RelPath = "<%aspx_file%>" + BuildAction = "Content" + /> +<%endfor%> +<%foreach(ico_files)%> + <File + RelPath = "<%ico_file%>" + BuildAction = "Content" + /> +<%endfor%> +<%foreach(config_files)%> + <File + RelPath = "<%config_file%>" + BuildAction = "None" + /> +<%endfor%> +<%foreach(documentation_files)%> + <File + RelPath = "<%documentation_file%>" + BuildAction = "None" + /> +<%endfor%> + </Include> + </Files> + </VisualBasic> +</VisualStudioProject> diff --git a/ACE/MPC/templates/vc7vb.mpt b/ACE/MPC/templates/vc7vb.mpt new file mode 100644 index 00000000000..78a474c16a2 --- /dev/null +++ b/ACE/MPC/templates/vc7vb.mpt @@ -0,0 +1,20 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +configurations = Debug Release +trace = 1 + +Release { + optimize = 1 + output_dir = Release +} + +Debug { + optimize = + output_dir = Debug +} + +conditional_include "user_vc7vb" diff --git a/ACE/MPC/templates/vc8.mpd b/ACE/MPC/templates/vc8.mpd new file mode 100644 index 00000000000..4ac5295d3b3 --- /dev/null +++ b/ACE/MPC/templates/vc8.mpd @@ -0,0 +1,1025 @@ +<?xml version="<%xml_version("1.0")%>" encoding="<%encoding("Windows-1252")%>"?> +<VisualStudioProject + ProjectType="<%vcprojecttype("Visual C++")%>" + Version="<%vcversion%>" + Name="<%project_name%>" + ProjectGUID="{<%guid%>}" + RootNamespace="<%project_name%>" + Keyword="<%if(UseOfMFC)%>MFCProj<%else%><%platform("Win32")%>Proj<%endif%>" + SignManifests="true" + > + <Platforms> +<%foreach(platforms)%> + <Platform + Name="<%platform%>" + /> +<%endfor%> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> +<%foreach(platforms)%> +<%foreach(configurations)%> + <Configuration + Name="<%configuration%>|<%platform%>" + OutputDirectory="<%if(type_is_dynamic)%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%><%else%><%if(type_is_static)%><%libout%><%else%><%if(exeout)%><%exeout%><%if(windows_style)%>\<%output_dir("Debug")%><%endif%><%else%><%if(windows_style)%><%output_dir("Debug")%><%else%><%output_dir(".")%><%endif%><%endif%><%endif%><%endif%>" + IntermediateDirectory="<%intermediate_dir%>\<%noextension(project_file)%><%if(output_subdir)%>\<%output_subdir%><%endif%>" +<%if(type_is_static && staticname)%> + ConfigurationType="4" +<%else%> +<%if(custom_only)%> + ConfigurationType="10" +<%else%> + ConfigurationType="<%ConfigurationType%>" +<%endif%> +<%endif%> +<%if(UseOfATL)%> + UseOfATL="<%UseOfATL%>" +<%endif%> +<%if(UseOfMFC)%> + UseOfMFC="<%UseOfMFC%>" +<%endif%> +<%if(unicode)%> + CharacterSet="<%charset("1")%>" +<%else%> + CharacterSet="<%charset("0")%>" +<%endif%> + +<%if(managed)%> + ManagedExtensions="<%managed%>" +<%endif%> + > +<%if(makeoutput)%> + <Tool + Name="VCNMakeTool" + BuildCommandLine="<%makebuild%> CONF=<%configuration%>" + ReBuildCommandLine="<%makerebuild%> CONF=<%configuration%>" + CleanCommandLine="<%makeclean%> CONF=<%configuration%>" + Output="<%makeoutput%>"/> +<%else%> + <Tool + Name="VCPreBuildEventTool" +<%if(prebuild)%> + CommandLine="<%eval(prebuild)%>" +<%endif%> + /> + <Tool + Name="VCCustomBuildTool" + /> +<%if(!custom_only)%> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + AdditionalOptions="<%foreach(midl_defines)%>/D <%midl_define%> <%endfor%><%midl_flags%>" + AdditionalIncludeDirectories="<%foreach(midl_includes)%><%midl_include%><%fornotlast(",")%><%endfor%>" +<%if(midl_notlb)%> + GenerateTypeLibrary="false" +<%endif%> + TypeLibraryName="$(InputName).tlb" + HeaderFileName="$(InputName).h" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c" + /> + <Tool + Name="VCCLCompilerTool" +<%if(compile_flags)%> + AdditionalOptions="<%compile_flags%>" +<%endif%> + Optimization="<%optimize("0")%>" +<%if(InlineFunctionExpansion)%> + InlineFunctionExpansion="<%InlineFunctionExpansion%>" +<%endif%> +<%if(EnableIntrinsicFunctions)%> + EnableIntrinsicFunctions="<%EnableIntrinsicFunctions%>" +<%endif%> +<%if(FavorSizeOrSpeed)%> + FavorSizeOrSpeed="<%FavorSizeOrSpeed%>" +<%endif%> +<%if(OmitFramePointers)%> + OmitFramePointers="<%OmitFramePointers%>" +<%endif%> +<%if(EnableFiberSafeOptimizations)%> + EnableFiberSafeOptimizations="<%EnableFiberSafeOptimizations%>" +<%endif%> +<%if(WholeProgramOptimization)%> + WholeProgramOptimization="<%WholeProgramOptimization%>" +<%endif%> +<%if(includes)%> + AdditionalIncludeDirectories="<%foreach(includes)%><%include%><%fornotlast(",")%><%endfor%>" +<%endif%> +<%if(AdditionalUsingDirectories)%> + AdditionalUsingDirectories="<%AdditionalUsingDirectories%>" +<%endif%> + PreprocessorDefinitions="<%if(unicode)%>UNICODE;_UNICODE;<%endif%><%if(type_is_dynamic)%><%foreach(dynamicflags)%><%dynamicflag%>;<%endfor%><%endif%><%if(need_staticflags)%><%foreach(staticflags)%><%staticflag%>;<%endfor%><%endif%><%if(pch_header)%><%foreach(pch_defines)%><%pch_define%>;<%endfor%><%endif%><%foreach(defines common_defines cpu_defines platform_defines macros)%><%define%><%fornotlast(";")%><%endfor%><%if(macro_for_lib_modifier)%><%if(use_lib_modifier)%><%if(lib_modifier)%>;MPC_LIB_MODIFIER=\"<%lib_modifier%>\"<%endif%><%endif%><%endif%>" +<%if(IgnoreStandardIncludePath)%> + IgnoreStandardIncludePath="<%IgnoreStandardIncludePath%>" +<%endif%> +<%if(GeneratePreprocessedFile)%> + GeneratePreprocessedFile="<%GeneratePreprocessedFile%>" +<%endif%> +<%if(KeepComments)%> + KeepComments="<%KeepComments%>" +<%endif%> +<%if(StringPooling)%> + StringPooling="<%StringPooling%>" +<%endif%> +<%if(!optimize)%> + MinimalRebuild="<%MinimalRebuild("true")%>" +<%endif%> +<%if(ExceptionHandling)%> + ExceptionHandling="<%ExceptionHandling%>" +<%endif%> +<%if(!managed)%> +<%if(optimize)%> +<%if(BasicRuntimeChecks)%> + BasicRuntimeChecks="<%BasicRuntimeChecks%>" +<%endif%> +<%else%> + BasicRuntimeChecks="<%BasicRuntimeChecks("3")%>" +<%endif%> +<%endif%> +<%if(SmallerTypeCheck)%> + SmallerTypeCheck="<%SmallerTypeCheck%>" +<%endif%> +<%if(runtime_library)%> + RuntimeLibrary="<%runtime_library%>" +<%else%> + RuntimeLibrary="<%if(type_is_static || need_staticflags)%><%if(debug_prj)%>1<%else%>0<%endif%><%else%><%if(debug_prj)%>3<%else%>2<%endif%><%endif%>" +<%endif%> +<%if(StructMemberAlignment)%> + StructMemberAlignment="<%StructMemberAlignment%>" +<%endif%> +<%if(BufferSecurityCheck)%> + BufferSecurityCheck="<%BufferSecurityCheck%>" +<%endif%> +<%if(EnableFunctionLevelLinking)%> + EnableFunctionLevelLinking="<%EnableFunctionLevelLinking%>" +<%endif%> +<%if(EnableEnhancedInstructionSet)%> + EnableEnhancedInstructionSet="<%EnableEnhancedInstructionSet%>" +<%endif%> +<%if(FloatingPointModel)%> + FloatingPointModel="<%FloatingPointModel%>" +<%endif%> +<%if(FloatingPointExceptions)%> + FloatingPointExceptions="<%FloatingPointExceptions%>" +<%endif%> +<%if(DisableLanguageExtensions)%> + DisableLanguageExtensions="<%DisableLanguageExtensions%>" +<%endif%> +<%if(DefaultCharIsUnsigned)%> + DefaultCharIsUnsigned="<%DefaultCharIsUnsigned%>" +<%endif%> +<%if(TreatWChar_tAsBuiltInType)%> + TreatWChar_tAsBuiltInType="<%TreatWChar_tAsBuiltInType%>" +<%endif%> +<%if(ForceConformanceInForLoopScope)%> + ForceConformanceInForLoopScope="<%ForceConformanceInForLoopScope%>" +<%endif%> + RuntimeTypeInfo="<%RuntimeTypeInfo("true")%>" +<%if(OpenMP)%> + OpenMP="<%OpenMP%>" +<%endif%> +<%if(pch_header)%> + UsePrecompiledHeader="2" + PrecompiledHeaderThrough="<%pch_header%>" +<%if(PrecompiledHeaderFile)%> + PrecompiledHeaderFile="<%PrecompiledHeaderFile%>" +<%endif%> +<%endif%> +<%if(ExpandAttributedSource)%> + ExpandAttributedSource="<%ExpandAttributedSource%>" +<%endif%> +<%if(AssemblerOutput)%> + AssemblerOutput="<%AssemblerOutput%>" +<%endif%> +<%if(AssemblerListingLocation)%> + AssemblerListingLocation="<%AssemblerListingLocation%>" +<%endif%> +<%if(ObjectFile)%> + ObjectFile="<%ObjectFile%>" +<%endif%> +<%if(pdbc)%> + ProgramDataBaseFileName="<%if(type_is_static)%><%libout%>\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.pdb<%else%><%intermediate_dir%>\<%noextension(project_file)%><%if(output_subdir)%>\<%output_subdir%><%endif%>/<%endif%>" +<%else%> +<%if(ProgramDataBaseFileName)%> + ProgramDataBaseFileName="<%ProgramDataBaseFileName%>" +<%endif%> +<%endif%> +<%if(GenerateXMLDocumentationFiles)%> + GenerateXMLDocumentationFiles="<%GenerateXMLDocumentationFiles%>" +<%endif%> +<%if(XMLDocumentationFileName)%> + XMLDocumentationFileName="<%XMLDocumentationFileName%>" +<%endif%> +<%if(BrowseInformation)%> + BrowseInformation="<%BrowseInformation%>" +<%endif%> +<%if(BrowseInformationFile)%> + BrowseInformationFile="<%BrowseInformationFile%>" +<%endif%> + WarningLevel="<%warning_level("3")%>" +<%if(WarnAsError)%> + WarnAsError="<%WarnAsError%>" +<%endif%> + Detect64BitPortabilityProblems="<%Detect64BitPortabilityProblems("true")%>" +<%if(!optimize || debug_format)%> + DebugInformationFormat="<%debug_format("3")%>" +<%endif%> +<%if(CallingConvention)%> + CallingConvention="<%CallingConvention%>" +<%endif%> +<%if(CompileAs)%> + CompileAs="<%CompileAs%>" +<%endif%> +<%if(DisableSpecificWarnings)%> + DisableSpecificWarnings="<%foreach(DisableSpecificWarnings)%><%DisableSpecificWarning%><%fornotlast(";")%><%endfor%>" +<%endif%> +<%if(ForcedIncludeFiles)%> + ForcedIncludeFiles="<%ForcedIncludeFiles%>" +<%endif%> +<%if(ForcedUsingFiles)%> + ForcedUsingFiles="<%ForcedUsingFiles%>" +<%endif%> +<%if(ShowIncludes)%> + ShowIncludes="<%ShowIncludes%>" +<%endif%> +<%if(UndefinePreprocessorDefinitions)%> + UndefinePreprocessorDefinitions="<%UndefinePreprocessorDefinitions%>" +<%endif%> +<%if(UndefineAllPreprocessorDefinitions)%> + UndefineAllPreprocessorDefinitions="<%UndefineAllPreprocessorDefinitions%>" +<%endif%> +<%if(EnablePREfast)%> + EnablePREfast="<%EnablePREfast%>" +<%endif%> +<%if(UseFullPaths)%> + UseFullPaths="<%UseFullPaths%>" +<%endif%> +<%if(OmitDefaultLibName)%> + OmitDefaultLibName="<%OmitDefaultLibName%>" +<%endif%> +<%if(ErrorReporting)%> + ErrorReporting="<%ErrorReporting%>" +<%endif%> +<%if(SuppressStartupBanner)%> + SuppressStartupBanner="<%SuppressStartupBanner%>" +<%endif%> + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="<%if(unicode)%>UNICODE;_UNICODE;<%endif%><%foreach(defines macros platform_defines)%><%define%><%fornotlast(";")%><%endfor%>" + Culture="<%culture("1033")%>" + AdditionalIncludeDirectories="<%foreach(includes)%><%include%><%fornotlast(",")%><%endfor%>" + /> + <Tool + Name="VCPreLinkEventTool" +<%if(prelink)%> + CommandLine="<%eval(prelink)%>" +<%endif%> + /> + <Tool +<%if(type_is_static)%> + Name="VCLibrarianTool" +<%if(staticname)%> + OutputFile="<%libout%>\<%libname_prefix%><%staticname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%>" +<%endif%> +<%else%> + Name="VCLinkerTool" +<%if(RegisterOutput)%> + RegisterOutput="<%RegisterOutput%>" +<%endif%> +<%if(IgnoreImportLibrary)%> + IgnoreImportLibrary="<%IgnoreImportLibrary%>" +<%endif%> +<%if(LinkLibraryDependencies)%> + LinkLibraryDependencies="<%LinkLibraryDependencies%>" +<%endif%> +<%if(UseLibraryDependencyInputs)%> + UseLibraryDependencyInputs="<%UseLibraryDependencyInputs%>" +<%endif%> +<%if(UseUnicodeResponseFiles)%> + UseUnicodeResponseFiles="<%UseUnicodeResponseFiles%>" +<%endif%> +<%if(!source_files)%> + AdditionalOptions="/noentry<%if(link_options)%> <%link_options%><%endif%><%if(release_link_options && !debug_prj)%> <%release_link_options%><%endif%>" +<%else%> +<%if(link_options || release_link_options && !debug_prj)%> + AdditionalOptions="<%link_options%><%if(release_link_options && !debug_prj)%> <%release_link_options%><%endif%>" +<%endif%> +<%endif%> +<%if(type_is_binary)%> + AdditionalDependencies="<%foreach(reverse(libs))%><%fornotfirst(" ")%><%libname_prefix%><%lib%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%><%endfor%><%foreach(reverse(lit_libs))%> <%lit_lib%>.lib<%endfor%><%foreach(reverse(pure_libs))%> <%pure_lib%><%endfor%>" +<%endif%> +<%if(exename || sharedname || staticname)%> + OutputFile="$(OutDir)\<%if(type_is_dynamic)%><%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%dll_ext%><%else%><%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%><%exe_ext%><%endif%>" +<%endif%> +<%if(win_version)%> + Version="<%win_version%>" +<%endif%> + LinkIncremental="<%LinkIncremental("2")%>" + SuppressStartupBanner="<%SuppressStartupBanner("true")%>" + AdditionalLibraryDirectories="<%foreach(libpaths)%><%libpath%><%fornotlast(";")%><%endfor%>" +<%if(ShowProgress)%> + ShowProgress="<%ShowProgress%>" +<%endif%> +<%if(ignore_default_library_names)%> + IgnoreDefaultLibraryNames="<%foreach(ignore_default_library_names)%><%ignore_default_library_name%><%fornotlast(";")%><%endfor%>" +<%endif%> +<%if(GenerateManifest)%> + GenerateManifest="<%GenerateManifest%>" +<%endif%> +<%if(ManifestFile)%> + ManifestFile="<%ManifestFile%>" +<%endif%> +<%if(AdditionalManifestDependencies)%> + AdditionalManifestDependencies="<%AdditionalManifestDependencies%>" +<%endif%> +<%if(IgnoreAllDefaultLibraries)%> + IgnoreAllDefaultLibraries="<%IgnoreAllDefaultLibraries%>" +<%endif%> +<%if(ModuleDefinitionFile)%> + ModuleDefinitionFile="<%ModuleDefinitionFile%>" +<%endif%> +<%if(AddModuleNamesToAssembly)%> + AddModuleNamesToAssembly="<%AddModuleNamesToAssembly%>" +<%endif%> +<%if(EmbedManagedResourceFile)%> + EmbedManagedResourceFile="<%EmbedManagedResourceFile%>" +<%endif%> +<%if(ForceSymbolReferences)%> + ForceSymbolReferences="<%ForceSymbolReferences%>" +<%endif%> +<%if(DelayLoadDLLs)%> + DelayLoadDLLs="<%DelayLoadDLLs%>" +<%endif%> +<%if(AssemblyLinkResource)%> + AssemblyLinkResource="<%AssemblyLinkResource%>" +<%endif%> + GenerateDebugInformation="<%GenerateDebugInformation("true")%>" +<%if(AssemblyDebug)%> + AssemblyDebug="<%AssemblyDebug%>" +<%endif%> +<%if(pdbl)%> +<%if(sharedname)%> + ProgramDatabaseFile="$(OutDir)\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%>.pdb" +<%else%> +<%if(exename)%> + ProgramDatabaseFile="$(OutDir)\<%exename%><%if(use_exe_modifier)%><%lib_modifier%><%endif%>.pdb" +<%endif%> +<%endif%> +<%endif%> +<%if(StripPrivateSymbols)%> + StripPrivateSymbols="<%StripPrivateSymbols%>" +<%endif%> +<%if(GenerateMapFile)%> + GenerateMapFile="<%GenerateMapFile%>" +<%endif%> +<%if(MapFileName)%> + MapFileName="<%MapFileName%>" +<%endif%> +<%if(MapExports)%> + MapExports="<%MapExports%>" +<%endif%> + SubSystem="<%subsystem("2")%>" +<%if(HeapReserveSize)%> + HeapReserveSize="<%HeapReserveSize%>" +<%endif%> +<%if(HeapCommitSize)%> + HeapCommitSize="<%HeapCommitSize%>" +<%endif%> +<%if(StackReserveSize)%> + StackReserveSize="<%StackReserveSize%>" +<%endif%> +<%if(StackCommitSize)%> + StackCommitSize="<%StackCommitSize%>" +<%endif%> +<%if(LargeAddressAware)%> + LargeAddressAware="<%LargeAddressAware%>" +<%endif%> +<%if(TerminalServerAware)%> + TerminalServerAware="<%TerminalServerAware%>" +<%endif%> +<%if(SwapRunFromCD)%> + SwapRunFromCD="<%SwapRunFromCD%>" +<%endif%> +<%if(SwapRunFromNet)%> + SwapRunFromNet="<%SwapRunFromNet%>" +<%endif%> +<%if(Driver)%> + Driver="<%Driver%>" +<%endif%> +<%if(optimize)%> + OptimizeReferences="<%OptimizeReferences("2")%>" + EnableCOMDATFolding="<%EnableCOMDATFolding("2")%>" +<%endif%> +<%if(OptimizeForWindows98)%> + OptimizeForWindows98="<%OptimizeForWindows98%>" +<%endif%> +<%if(FunctionOrder)%> + FunctionOrder="<%FunctionOrder%>" +<%endif%> +<%if(LinkTimeCodeGeneration)%> + LinkTimeCodeGeneration="<%LinkTimeCodeGeneration%>" +<%endif%> +<%if(ProfileGuidedDatabase)%> + ProfileGuidedDatabase="<%ProfileGuidedDatabase%>" +<%endif%> +<%if(unicode && unicode_mfc_entry && exename && source_files)%> + EntryPointSymbol="<%unicode_mfc_entry%>" +<%else%> +<%if(EntryPointSymbol)%> + EntryPointSymbol="<%EntryPointSymbol%>" +<%endif%> +<%endif%> +<%if(ResourceOnlyDLL)%> + ResourceOnlyDLL="<%ResourceOnlyDLL%>" +<%endif%> +<%if(SetChecksum)%> + SetChecksum="<%SetChecksum%>" +<%endif%> +<%if(BaseAddress)%> + BaseAddress="<%BaseAddress%>" +<%endif%> +<%if(TurnOffAssemblyGeneration)%> + TurnOffAssemblyGeneration="<%TurnOffAssemblyGeneration%>" +<%endif%> +<%if(ImportLibrary)%> + ImportLibrary="<%ImportLibrary%>" +<%else%> +<%if(type_is_dynamic && sharedname)%> + ImportLibrary="<%libout%>\<%libname_prefix%><%sharedname%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%lib_ext%>" +<%endif%> +<%endif%> +<%if(SupportUnloadOfDelayLoadedDLL)%> + SupportUnloadOfDelayLoadedDLL="<%SupportUnloadOfDelayLoadedDLL%>" +<%endif%> +<%if(MergeSections)%> + MergeSections="<%MergeSections%>" +<%endif%> + TargetMachine="<%TargetMachine("1")%>" +<%if(FixedBaseAddress || managed)%> + FixedBaseAddress="<%FixedBaseAddress("1")%>" +<%endif%> +<%if(KeyFile)%> + KeyFile="<%KeyFile%>" +<%endif%> +<%if(KeyContainer)%> + KeyContainer="<%KeyContainer%>" +<%endif%> +<%if(DelaySign)%> + DelaySign="<%DelaySign%>" +<%endif%> +<%if(AllowIsolation)%> + AllowIsolation="<%AllowIsolation%>" +<%endif%> +<%if(Profile)%> + Profile="<%Profile%>" +<%endif%> +<%if(CLRThreadAttribute)%> + CLRThreadAttribute="<%CLRThreadAttribute%>" +<%endif%> +<%if(CLRImageType)%> + CLRImageType="<%CLRImageType%>" +<%endif%> +<%if(ErrorReporting)%> + ErrorReporting="<%ErrorReporting%>" +<%endif%> +<%endif%> + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> +<%endif%> + <Tool + Name="VCPostBuildEventTool" +<%if(postbuild)%> + CommandLine="<%eval(postbuild)%>" +<%endif%> + /> +<%if(postclean)%> + <Tool + Name="VCPostCleanEventTool" + CommandLine="<%eval(postclean)%>" + /> +<%endif%> +<%if(deploymenttool)%> + <DeploymentTool + ForceDirty="-1" + RemoteDirectory="<%deployment_directory%>" + RegisterOutput="0" + AdditionalFiles="" + /> +<%endif%> +<%endif%> + </Configuration> +<%endfor%> +<%endfor%> + </Configurations> + <References> +<%if(after && add_references)%> + <!-- MPC ADD DEPENDENCIES --> +<%endif%> +<%foreach(AssemblyReferences)%> + <AssemblyReference + RelativePath="<%AssemblyReference%>" + /> +<%endfor%> + </References> + <Files> +<%if(exename || sharedname || staticname)%> +<%if(source_files)%> + <Filter + Name="Source Files" + Filter="<%foreach(ext, extensions(source_files))%><%ext%><%fornotlast(";")%><%endfor%>"> +<%if(pch_source)%> + <File + RelativePath="<%pch_source%>"> +<%foreach(platforms)%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="1"/> + </FileConfiguration> +<%endfor%> +<%endfor%> + </File> +<%endif%> +<%if(grouped_source_files)%> +<%foreach(sort(grouped_source_files))%> +<%if(compares(grouped_source_file, default_group))%> +<%foreach(grouped_source_file->files)%> + <File + RelativePath="<%grouped_source_file->file%>"> +<%if(duplicate_index(grouped_source_file->file))%> +<%foreach(platforms)%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>"> + <Tool + Name="VCCLCompilerTool" +<%if(flag_overrides(grouped_source_file->file, buildflags))%> + AdditionalOptions="<%flag_overrides(grouped_source_file->file, buildflags)%>" +<%endif%> +<%if(flag_overrides(grouped_source_file->file, no_pch))%> + UsePrecompiledHeader="0" +<%endif%> +<%if(flag_overrides(grouped_source_file->file, managed))%> + BasicRuntimeChecks="0" + CompileAsManaged="<%flag_overrides(grouped_source_file->file, managed)%>" +<%if(!ExceptionHandling || compares(ExceptionHandling, 1))%> + ExceptionHandling="2" +<%endif%> +<%endif%> + ObjectFile="$(IntDir)\$(InputName)<%duplicate_index(grouped_source_file->file)%>.obj"/> + </FileConfiguration> +<%endfor%> +<%endfor%> +<%else%> +<%if(flag_overrides(grouped_source_file->file, buildflags) || flag_overrides(grouped_source_file->file, no_pch) || flag_overrides(grouped_source_file->file, managed))%> +<%foreach(platforms)%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>"> + <Tool + Name="VCCLCompilerTool" +<%if(flag_overrides(grouped_source_file->file, buildflags))%> + AdditionalOptions="<%flag_overrides(grouped_source_file->file, buildflags)%>" +<%endif%> +<%if(flag_overrides(grouped_source_file->file, no_pch))%> + UsePrecompiledHeader="0" +<%endif%> +<%if(flag_overrides(grouped_source_file->file, managed))%> + BasicRuntimeChecks="0" + CompileAsManaged="<%flag_overrides(grouped_source_file->file, managed)%>" +<%if(!ExceptionHandling || compares(ExceptionHandling, 1))%> + ExceptionHandling="2" +<%endif%> +<%endif%> + /> + </FileConfiguration> +<%endfor%> +<%endfor%> +<%endif%> +<%endif%> + </File> +<%endfor%> +<%else%> + <Filter + Name="<%grouped_source_file%>" + Filter=""> +<%foreach(grouped_source_file->files)%> + <File + RelativePath="<%grouped_source_file->file%>"> +<%if(duplicate_index(grouped_source_file->file))%> +<%foreach(platforms)%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>"> + <Tool + Name="VCCLCompilerTool" +<%if(flag_overrides(grouped_source_file->file, buildflags))%> + AdditionalOptions="<%flag_overrides(grouped_source_file->file, buildflags)%>" +<%endif%> +<%if(flag_overrides(grouped_source_file->file, no_pch))%> + UsePrecompiledHeader="0" +<%endif%> +<%if(flag_overrides(grouped_source_file->file, managed))%> + BasicRuntimeChecks="0" + CompileAsManaged="<%flag_overrides(grouped_source_file->file, managed)%>" +<%if(!ExceptionHandling || compares(ExceptionHandling, 1))%> + ExceptionHandling="2" +<%endif%> +<%endif%> + ObjectFile="$(IntDir)\$(InputName)<%duplicate_index(grouped_source_file->file)%>.obj"/> + </FileConfiguration> +<%endfor%> +<%endfor%> +<%else%> +<%if(flag_overrides(grouped_source_file->file, buildflags) || flag_overrides(grouped_source_file->file, no_pch) || flag_overrides(grouped_source_file->file, managed))%> +<%foreach(platforms)%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>"> + <Tool + Name="VCCLCompilerTool" +<%if(flag_overrides(grouped_source_file->file, buildflags))%> + AdditionalOptions="<%flag_overrides(grouped_source_file->file, buildflags)%>" +<%endif%> +<%if(flag_overrides(grouped_source_file->file, no_pch))%> + UsePrecompiledHeader="0" +<%endif%> +<%if(flag_overrides(grouped_source_file->file, managed))%> + BasicRuntimeChecks="0" + CompileAsManaged="<%flag_overrides(grouped_source_file->file, managed)%>" +<%if(!ExceptionHandling || compares(ExceptionHandling, 1))%> + ExceptionHandling="2" +<%endif%> +<%endif%> + /> + </FileConfiguration> +<%endfor%> +<%endfor%> +<%endif%> +<%endif%> + </File> +<%endfor%> + </Filter> +<%endif%> +<%endfor%> +<%else%> +<%foreach(source_files)%> + <File + RelativePath="<%source_file%>"> +<%if(duplicate_index(source_file))%> +<%foreach(platforms)%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>"> + <Tool + Name="VCCLCompilerTool" +<%if(flag_overrides(source_file, buildflags))%> + AdditionalOptions="<%flag_overrides(source_file, buildflags)%>" +<%endif%> +<%if(flag_overrides(source_file, no_pch))%> + UsePrecompiledHeader="0" +<%endif%> +<%if(flag_overrides(source_file, managed))%> + BasicRuntimeChecks="0" + CompileAsManaged="<%flag_overrides(source_file, managed)%>" +<%if(!ExceptionHandling || compares(ExceptionHandling, 1))%> + ExceptionHandling="2" +<%endif%> +<%endif%> + ObjectFile="$(IntDir)\$(InputName)<%duplicate_index(source_file)%>.obj"/> + </FileConfiguration> +<%endfor%> +<%endfor%> +<%else%> +<%if(flag_overrides(source_file, buildflags) || flag_overrides(source_file, no_pch) || flag_overrides(source_file, managed))%> +<%foreach(platforms)%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>"> + <Tool + Name="VCCLCompilerTool" +<%if(flag_overrides(source_file, buildflags))%> + AdditionalOptions="<%flag_overrides(source_file, buildflags)%>" +<%endif%> +<%if(flag_overrides(source_file, no_pch))%> + UsePrecompiledHeader="0" +<%endif%> +<%if(flag_overrides(source_file, managed))%> + BasicRuntimeChecks="0" + CompileAsManaged="<%flag_overrides(source_file, managed)%>" +<%if(!ExceptionHandling || compares(ExceptionHandling, 1))%> + ExceptionHandling="2" +<%endif%> +<%endif%> + /> + </FileConfiguration> +<%endfor%> +<%endfor%> +<%endif%> +<%endif%> + </File> +<%endfor%> +<%endif%> + </Filter> +<%endif%> +<%endif%> +<%if(header_files)%> + <Filter + Name="Header Files" + Filter="<%foreach(ext, extensions(header_files))%><%ext%><%fornotlast(";")%><%endfor%>"> +<%if(pch_header)%> + <File + RelativePath="<%pch_header%>"> + </File> +<%endif%> +<%if(grouped_header_files)%> +<%foreach(sort(grouped_header_files))%> +<%if(compares(grouped_header_file, default_group))%> +<%foreach(grouped_header_file->files)%> + <File + RelativePath="<%grouped_header_file->file%>"> + </File> +<%endfor%> +<%else%> + <Filter + Name="<%grouped_header_file%>" + Filter=""> +<%foreach(grouped_header_file->files)%> + <File + RelativePath="<%grouped_header_file->file%>"> + </File> +<%endfor%> + </Filter> +<%endif%> +<%endfor%> +<%else%> +<%foreach(header_files)%> + <File + RelativePath="<%header_file%>"> + </File> +<%endfor%> +<%endif%> + </Filter> +<%endif%> +<%foreach(custom_types)%> +<%if(custom_type->input_files)%> + <Filter + Name="<%ucw(custom_type)%>" + Filter="<%foreach(custom_type->inputexts)%><%custom_type->inputext%><%fornotlast(";")%><%endfor%>"> +<%foreach(custom_type->input_files)%> + <File + RelativePath="<%custom_type->input_file%>"> +<%foreach(platforms)%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>" +<%if(!custom_type->input_file->output_files)%> + ExcludedFromBuild="true" +<%endif%> + > +<%if(custom_type->input_file->output_files)%> + <Tool + Name="VCCustomBuildTool" + Description="Invoking <%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> on <%custom_type->input_file%>" + CommandLine="<%if(custom_type->libpath)%>PATH=%PATH%;<%custom_type->libpath%>
<%endif%><%if(flag_overrides(custom_type->input_file, gendir))%>if not exist <%flag_overrides(custom_type->input_file, gendir)%> mkdir <%flag_overrides(custom_type->input_file, gendir)%>
<%endif%><%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%if(custom_type->output_option)%>"<%custom_type->input_file%>" <%custom_type->output_option%><%foreach(custom_type->input_file->output_files)%> "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%>"<%endfor%><%else%>"<%custom_type->input_file%>"<%endif%><%if(flag_overrides(custom_type->input_file, postcommand))%><%foreach(custom_type->input_file)%> && <%flag_overrides(custom_type->input_file, postcommand)%><%endfor%><%else%><%if(custom_type->postcommand)%><%foreach(custom_type->input_file)%> && <%custom_type->postcommand%><%endfor%><%endif%><%endif%><%if(pch_header)%><%if(custom_type->pch_postrule)%><%foreach(custom_type->input_file->source_output_files)%> && echo #include "<%pch_header%>" > temporary.src && type "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->source_output_file)%><%else%><%custom_type->input_file->source_output_file%><%endif%>" >> temporary.src && move /y temporary.src "<%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->source_output_file)%><%else%><%custom_type->input_file->source_output_file%><%endif%>"<%endfor%><%endif%><%endif%>" +<%if(flag_overrides(custom_type->input_file, dependent))%> + AdditionalDependencies="<%foreach(dep, flag_overrides(custom_type->input_file, dependent))%><%dep%><%if(!has_extension(dep))%><%exe_ext%><%endif%><%fornotlast(";")%><%endfor%><%foreach(custom_type->input_file->dependencies)%>;<%custom_type->input_file->dependencie%><%endfor%>" +<%else%> +<%if(custom_type->dependent)%> + AdditionalDependencies="<%foreach(custom_type->dependent)%><%custom_type->dependent%><%if(!has_extension(custom_type->dependent))%><%exe_ext%><%endif%><%fornotlast(";")%><%endfor%><%foreach(custom_type->input_file->dependencies)%>;<%custom_type->input_file->dependencie%><%endfor%>" +<%else%> +<%if(custom_type->input_file->dependencies)%> + AdditionalDependencies="<%foreach(custom_type->input_file->dependencies)%><%custom_type->input_file->dependencie%><%fornotlast(";")%><%endfor%>" +<%endif%> +<%endif%> +<%endif%> + Outputs="<%foreach(custom_type->input_file->output_files)%><%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%><%fornotlast(";")%><%endfor%>"/> +<%endif%> + </FileConfiguration> +<%endfor%> +<%endfor%> + </File> +<%endfor%> + </Filter> +<%endif%> +<%endfor%> +<%if(inline_files)%> + <Filter + Name="Inline Files" + Filter="<%foreach(ext, extensions(inline_files))%><%ext%><%fornotlast(";")%><%endfor%>"> +<%if(grouped_inline_files)%> +<%foreach(sort(grouped_inline_files))%> +<%if(compares(grouped_inline_file, default_group))%> +<%foreach(grouped_inline_file->files)%> + <File + RelativePath="<%grouped_inline_file->file%>"> + </File> +<%endfor%> +<%else%> + <Filter + Name="<%grouped_inline_file%>" + Filter=""> +<%foreach(grouped_inline_file->files)%> + <File + RelativePath="<%grouped_inline_file->file%>"> + </File> +<%endfor%> + </Filter> +<%endif%> +<%endfor%> +<%else%> +<%foreach(inline_files)%> + <File + RelativePath="<%inline_file%>"> + </File> +<%endfor%> +<%endif%> + </Filter> +<%endif%> +<%if(template_files)%> + <Filter + Name="Template Files" + Filter=""> +<%if(grouped_template_files)%> +<%foreach(sort(grouped_template_files))%> +<%if(compares(grouped_template_file, default_group))%> +<%foreach(grouped_template_file->files)%> + <File + RelativePath="<%grouped_template_file->file%>"> +<%foreach(platforms)%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>" + ExcludedFromBuild="TRUE"> + <Tool + Name="VCCLCompilerTool"/> + </FileConfiguration> +<%endfor%> +<%endfor%> + </File> +<%endfor%> +<%else%> + <Filter + Name="<%grouped_template_file%>" + Filter=""> +<%foreach(grouped_template_file->files)%> + <File + RelativePath="<%grouped_template_file->file%>"> +<%foreach(platforms)%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>" + ExcludedFromBuild="true"> + <Tool + Name="VCCLCompilerTool"/> + </FileConfiguration> +<%endfor%> +<%endfor%> + </File> +<%endfor%> + </Filter> +<%endif%> +<%endfor%> +<%else%> +<%foreach(template_files)%> + <File + RelativePath="<%template_file%>"> +<%foreach(platforms)%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>" + ExcludedFromBuild="true"> + <Tool + Name="VCCLCompilerTool"/> + </FileConfiguration> +<%endfor%> +<%endfor%> + </File> +<%endfor%> +<%endif%> + </Filter> +<%endif%> +<%if(documentation_files)%> + <Filter + Name="Documentation" + Filter=""> +<%if(grouped_documentation_files)%> +<%foreach(sort(grouped_documentation_files))%> +<%if(compares(grouped_documentation_file, default_group))%> +<%foreach(grouped_documentation_file->files)%> + <File + RelativePath="<%grouped_documentation_file->file%>"> +<%foreach(platforms)%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>" + ExcludedFromBuild="TRUE"> + <Tool + Name="VCCustomBuildTool"/> + </FileConfiguration> +<%endfor%> +<%endfor%> + </File> +<%endfor%> +<%else%> + <Filter + Name="<%grouped_documentation_file%>" + Filter=""> +<%foreach(grouped_documentation_file->files)%> + <File + RelativePath="<%grouped_documentation_file->file%>"> +<%foreach(platforms)%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>" + ExcludedFromBuild="TRUE"> + <Tool + Name="VCCustomBuildTool"/> + </FileConfiguration> +<%endfor%> +<%endfor%> + </File> +<%endfor%> + </Filter> +<%endif%> +<%endfor%> +<%else%> +<%foreach(documentation_files)%> + <File + RelativePath="<%documentation_file%>"> +<%foreach(platforms)%> +<%foreach(configurations)%> + <FileConfiguration + Name="<%configuration%>|<%platform%>" + ExcludedFromBuild="TRUE"> + <Tool + Name="VCCustomBuildTool"/> + </FileConfiguration> +<%endfor%> +<%endfor%> + </File> +<%endfor%> +<%endif%> + </Filter> +<%endif%> +<%if(resource_files && !type_is_static)%> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"> +<%if(grouped_resource_files)%> +<%foreach(sort(grouped_resource_files))%> +<%if(compares(grouped_resource_file, default_group))%> +<%foreach(grouped_resource_file->files)%> + <File + RelativePath="<%grouped_resource_file->file%>"> + </File> +<%endfor%> +<%else%> + <Filter + Name="<%grouped_resource_file%>" + Filter=""> +<%foreach(grouped_resource_file->files)%> + <File + RelativePath="<%grouped_resource_file->file%>"> + </File> +<%endfor%> + </Filter> +<%endif%> +<%endfor%> +<%else%> +<%foreach(resource_files)%> + <File + RelativePath="<%resource_file%>"> + </File> +<%endfor%> +<%endif%> + </Filter> +<%endif%> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/ACE/MPC/templates/vc8csharp.mpd b/ACE/MPC/templates/vc8csharp.mpd new file mode 100644 index 00000000000..7e2ede7b1c5 --- /dev/null +++ b/ACE/MPC/templates/vc8csharp.mpd @@ -0,0 +1,187 @@ +<%if(xmlheader)%><?xml version="1.0" encoding="utf-8"?> +<%endif%><Project<%if(toolsversion)%> ToolsVersion="<%toolsversion%>"<%endif%> DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <ProjectType>Local</ProjectType> + <ProductVersion><%prversion("8.0.50727")%></ProductVersion> + <SchemaVersion><%schemaversion("2.0")%></SchemaVersion> + <ProjectGuid>{<%guid%>}</ProjectGuid> +<%foreach(configurations)%> +<%if(forfirst)%> + <Configuration Condition=" '$(Configuration)' == '' "><%configuration%></Configuration> +<%endif%> +<%endfor%> +<%foreach(platforms)%> +<%if(forfirst)%> + <Platform Condition=" '$(Platform)' == '' "><%platform%></Platform> +<%endif%> +<%endfor%> +<%if(ico_files)%> +<%foreach(ico_files)%> +<%if(forfirst)%> + <ApplicationIcon><%ico_file%></ApplicationIcon> +<%endif%> +<%endfor%> +<%endif%> + <AssemblyKeyContainerName> + </AssemblyKeyContainerName> +<%if(exename || sharedname || staticname)%> + <AssemblyName><%if(exename)%><%exename%><%else%><%libname_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%><%endif%></AssemblyName> +<%endif%> + <AssemblyOriginatorKeyFile><%keyfile%></AssemblyOriginatorKeyFile> +<%if(keyfile)%> + <SignAssembly>true</SignAssembly> +<%endif%> + <DefaultClientScript>JScript</DefaultClientScript> + <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout> + <DefaultTargetSchema>IE50</DefaultTargetSchema> + <DelaySign><%DelaySign("false")%></DelaySign> +<%if(exename || sharedname || staticname)%> + <OutputType><%if(exename)%><%if(winapp)%>Win<%endif%>Exe<%else%>Library<%endif%></OutputType> +<%endif%> + <RootNamespace> + </RootNamespace> + <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent> + <StartupObject><%startupobject%></StartupObject> + <ReferencePath><%foreach(libpaths)%><%libpath%><%fornotlast(";")%><%endfor%></ReferencePath> + <FileUpgradeFlags> + </FileUpgradeFlags> + <UpgradeBackupLocation> + </UpgradeBackupLocation> + </PropertyGroup> +<%foreach(platforms)%> +<%foreach(configurations)%> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == '<%configuration%>|<%platform%>' "> +<%if(exename || sharedname || staticname)%> + <OutputPath><%if(exename)%><%if(exeout)%><%exeout%><%if(windows_style)%>\<%output_dir%><%endif%><%else%>.\<%output_dir%><%endif%><%else%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%output_dir%><%endif%>\</OutputPath> +<%endif%> + <AllowUnsafeBlocks><%allowunsafeblocks(false)%></AllowUnsafeBlocks> + <BaseAddress>285212672</BaseAddress> + <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow> + <ConfigurationOverrideFile> + </ConfigurationOverrideFile> + <DefineConstants><%foreach(defines common_defines macros)%><%define%>;<%endfor%><%if(!optimize)%>DESIGN;DEBUG;<%endif%><%if(trace)%>TRACE<%endif%></DefineConstants> + <DocumentationFile> + </DocumentationFile> + <DebugSymbols><%if(optimize)%>false<%else%>true<%endif%></DebugSymbols> + <FileAlignment>4096</FileAlignment> + <NoStdLib>false</NoStdLib> + <NoWarn> + </NoWarn> + <Optimize><%if(optimize)%>true<%else%>false<%endif%></Optimize> + <RegisterForComInterop><%RegisterForComInterop("false")%></RegisterForComInterop> + <RemoveIntegerChecks>false</RemoveIntegerChecks> + <TreatWarningsAsErrors>false</TreatWarningsAsErrors> + <WarningLevel><%warning_level("4")%></WarningLevel> + <DebugType><%if(optimize)%>none<%else%>full<%endif%></DebugType> + <ErrorReport>prompt</ErrorReport> + </PropertyGroup> +<%endfor%> +<%endfor%> + <ItemGroup> +<%if(after)%> + <!-- MPC ADD DEPENDENCIES --> +<%endif%> +<%foreach(libs)%> + <Reference Include="<%libname_prefix%><%lib%>"> + <Name><%libname_prefix%><%lib%></Name> + </Reference> +<%endfor%> +<%foreach(lib, sort(lit_libs pure_libs))%> + <Reference Include="<%lib%>"> + <Name><%lib%></Name> + </Reference> +<%endfor%> + </ItemGroup> + <ItemGroup> +<%foreach(source_files)%> +<%if(contains(flag_overrides(source_file, subtype), ^(Form|Component)$))%> + <Compile Include="<%source_file%>"> + <SubType><%flag_overrides(source_file, subtype)%></SubType> +<%if(flag_overrides(source_file, dependent_upon))%> + <DependentUpon><%flag_overrides(source_file, dependent_upon)%></DependentUpon> +<%endif%> + </Compile> +<%if(remove_from(source_files, \.Designer\.cs, source_file, \.cs))%> + <Compile Include="<%noextension(source_file)%>.Designer.cs"> + <DependentUpon><%basename(source_file)%></DependentUpon> + </Compile> +<%endif%> +<%if(remove_from(resx_files, resx, source_file, cs))%> + <EmbeddedResource Include="<%noextension(source_file)%>.resx"> + <SubType>Designer</SubType> + <DependentUpon><%basename(source_file)%></DependentUpon> + </EmbeddedResource> +<%endif%> +<%foreach(removed, 1, remove_from(resx_files, .*\.resx, source_file, cs))%> + <EmbeddedResource Include="<%removed%>"> + <SubType>Designer</SubType> + <DependentUpon><%basename(source_file)%></DependentUpon> + </EmbeddedResource> +<%endfor%> +<%endif%> +<%endfor%> +<%foreach(source_files)%> +<%if(!contains(flag_overrides(source_file, subtype), ^(Form|Component)$))%> + <Compile Include="<%source_file%>"> +<%if(flag_overrides(source_file, dependent_upon))%> + <DependentUpon><%flag_overrides(source_file, dependent_upon)%></DependentUpon> +<%endif%> + </Compile> +<%endif%> +<%endfor%> +<%foreach(custom_types)%> +<%foreach(custom_type->input_files)%> +<%if(custom_type->input_file->output_files)%> + <Compile Include="<%custom_type->input_file%>"> + <Generator><%if(custom_type->libpath)%>PATH=%PATH%;<%custom_type->libpath%>
<%endif%><%if(flag_overrides(custom_type->input_file, gendir))%>if not exist <%flag_overrides(custom_type->input_file, gendir)%> mkdir <%flag_overrides(custom_type->input_file, gendir)%>
<%endif%><%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%if(custom_type->output_option)%><%custom_type->input_file%> <%custom_type->output_option%> <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_files)%><%else%><%custom_type->input_file->output_files%><%endif%><%else%><%custom_type->input_file%><%endif%><%if(flag_overrides(custom_type->input_file, postcommand))%><%foreach(custom_type->input_file)%>&&<%flag_overrides(custom_type->input_file, postcommand)%><%endfor%><%else%><%if(custom_type->postcommand)%><%foreach(custom_type->input_file)%>&&<%custom_type->postcommand%><%endfor%><%endif%><%endif%></Generator> + </Compile> +<%else%> + <None Include="<%custom_type->input_file%>" /> +<%endif%> +<%endfor%> +<%endfor%> +<%foreach(resx_files)%> + <EmbeddedResource Include="<%resx_file%>"> +<%if(flag_overrides(resx_file, subtype))%> + <SubType><%flag_overrides(resx_file, subtype)%></SubType> +<%endif%> +<%if(flag_overrides(resx_file, generates_source))%> +<%if(compares(flag_overrides(resx_file, generates_source), 1))%> +<%if(ends_with(resx_file, \.settings))%> + <Generator>SettingsSingleFileGenerator</Generator> +<%else%> + <Generator>ResXFileCodeGenerator</Generator> +<%endif%> +<%else%> + <Generator><%flag_overrides(resx_file, generates_source)%></Generator> +<%endif%> + <LastGenOutput><%basenoextension(resx_file)%>.Designer.cs</LastGenOutput> +<%endif%> +<%if(flag_overrides(resx_file, dependent_upon))%> + <DependentUpon><%flag_overrides(resx_file, dependent_upon)%></DependentUpon> +<%endif%> + </EmbeddedResource> +<%if(flag_overrides(resx_file, generates_source))%> + <Compile Include="<%noextension(resx_file)%>.Designer.cs"> + <AutoGen>True</AutoGen> + <DesignTime>True</DesignTime> + <DependentUpon><%basename(resx_file)%></DependentUpon> + </Compile> +<%endif%> +<%endfor%> +<%foreach(ico_files)%> + <Content Include="<%ico_file%>" /> +<%endfor%> +<%foreach(config_files)%> + <None Include="<%config_file%>" /> +<%endfor%> +<%foreach(documentation_files)%> + <None Include="<%documentation_file%>" /> +<%endfor%> + </ItemGroup> + <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> + <PropertyGroup> + <PreBuildEvent><%if(prebuild)%><%eval(prebuild)%><%endif%></PreBuildEvent> + <PostBuildEvent><%if(postbuild)%><%eval(postbuild)%><%endif%></PostBuildEvent> + </PropertyGroup> +</Project> diff --git a/ACE/MPC/templates/vc8csharp.mpt b/ACE/MPC/templates/vc8csharp.mpt new file mode 100644 index 00000000000..33283aeb42d --- /dev/null +++ b/ACE/MPC/templates/vc8csharp.mpt @@ -0,0 +1,21 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +configurations = Debug Release +platforms = AnyCPU +trace = 1 + +Release { + optimize = 1 + output_dir = Release +} + +Debug { + optimize = + output_dir = Debug +} + +conditional_include "user_vc8csharp" diff --git a/ACE/MPC/templates/vc8dll.mpt b/ACE/MPC/templates/vc8dll.mpt new file mode 100644 index 00000000000..44ea297698e --- /dev/null +++ b/ACE/MPC/templates/vc8dll.mpt @@ -0,0 +1,72 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +configurations = Debug Release +common_defines = WIN32 _WINDOWS _CRT_NONSTDC_NO_WARNINGS +ConfigurationType = 2 +Detect64BitPortabilityProblems = false +MinimalRebuild = false + +conditional_include "vc8platforms" + +Release { + LinkIncremental = 1 + optimize = 2 + defines = NDEBUG + output_dir = Release + intermediate_dir = Release +} + +Debug { + debug_prj = 1 + defines = _DEBUG + output_dir = . + intermediate_dir = Debug + lib_modifier = d +} + +Memcheck Release { + optimize = 2 + defines = NDEBUG + output_dir = Release + intermediate_dir = Release + BasicRuntimeChecks = 0 + LinkIncremental = 1 + FixedBaseAddress = 1 +} + +Memcheck Debug { + debug_prj = 1 + defines = _DEBUG + output_dir = . + intermediate_dir = Debug + lib_modifier = d + BasicRuntimeChecks = 0 + LinkIncremental = 1 + FixedBaseAddress = 1 +} + +MFC Release { + LinkIncremental = 1 + optimize = 2 + defines = NDEBUG + output_dir = MFC_Release + intermediate_dir = MFC_Release + lib_modifier = mfc + UseOfMFC = 2 +} + +MFC Debug { + debug_prj = 1 + defines = _DEBUG + output_dir = MFC_Debug + intermediate_dir = MFC_Debug + lib_modifier = mfcd + UseOfMFC = 2 +} + +conditional_include "vcpartialmacros" +conditional_include "user_vc8dll" diff --git a/ACE/MPC/templates/vc8exe.mpt b/ACE/MPC/templates/vc8exe.mpt new file mode 100644 index 00000000000..6c601e648d5 --- /dev/null +++ b/ACE/MPC/templates/vc8exe.mpt @@ -0,0 +1,76 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +configurations = Debug Release +common_defines = WIN32 _CONSOLE _CRT_NONSTDC_NO_WARNINGS +ConfigurationType = 1 +SubSystem = 1 +Detect64BitPortabilityProblems = false +MinimalRebuild = false + +conditional_include "vc8platforms" + +Release { + LinkIncremental = 1 + optimize = 2 + defines = NDEBUG + output_dir = Release + intermediate_dir = Release +} + +Debug { + debug_prj = 1 + defines = _DEBUG + intermediate_dir = Debug + lib_modifier = d +} + +Memcheck Release { + LinkIncremental = 1 + optimize = 2 + defines = NDEBUG + output_dir = Release + intermediate_dir = Release + BasicRuntimeChecks = 0 + LinkIncremental = 1 + FixedBaseAddress = 1 +} + +Memcheck Debug { + debug_prj = 1 + defines = _DEBUG + intermediate_dir = Debug + lib_modifier = d + BasicRuntimeChecks = 0 + LinkIncremental = 1 + FixedBaseAddress = 1 +} + +MFC Release { + LinkIncremental = 1 + optimize = 2 + common_defines = WIN32 _WINDOWS + defines = NDEBUG _AFXDLL + output_dir = MFC_Release + intermediate_dir = MFC_Release + lib_modifier = mfc + UseOfMFC = 2 + unicode_mfc_entry = wWinMainCRTStartup +} + +MFC Debug { + debug_prj = 1 + common_defines = WIN32 _WINDOWS + defines = _DEBUG _AFXDLL + output_dir = MFC_Debug + intermediate_dir = MFC_Debug + lib_modifier = mfcd + UseOfMFC = 2 + unicode_mfc_entry = wWinMainCRTStartup +} + +conditional_include "vcpartialmacros" +conditional_include "user_vc8exe" diff --git a/ACE/MPC/templates/vc8java.mpd b/ACE/MPC/templates/vc8java.mpd new file mode 100644 index 00000000000..78a2071ba20 --- /dev/null +++ b/ACE/MPC/templates/vc8java.mpd @@ -0,0 +1,109 @@ +<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <ProjectType>Local</ProjectType> + <ProductVersion><%prversion("8.0.50727")%></ProductVersion> + <SchemaVersion><%schemaversion("2.0")%></SchemaVersion> + <ProjectGuid>{<%guid%>}</ProjectGuid> +<%foreach(configurations)%> +<%if(forfirst)%> + <Configuration Condition=" '$(Configuration)' == '' "><%configuration%></Configuration> +<%endif%> +<%endfor%> +<%foreach(platforms)%> +<%if(forfirst)%> + <Platform Condition=" '$(Platform)' == '' "><%platform%></Platform> +<%endif%> +<%endfor%> + <AssemblyKeyContainerName> + </AssemblyKeyContainerName> +<%if(exename || sharedname || staticname)%> + <AssemblyName><%if(exename)%><%exename%><%else%><%libname_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%><%endif%></AssemblyName> +<%endif%> + <AssemblyOriginatorKeyFile><%keyfile%></AssemblyOriginatorKeyFile> +<%if(keyfile)%> + <SignAssembly>true</SignAssembly> +<%endif%> + <DefaultClientScript>JScript</DefaultClientScript> + <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout> + <DefaultTargetSchema>IE50</DefaultTargetSchema> + <DelaySign><%DelaySign("false")%></DelaySign> +<%if(exename || sharedname || staticname)%> + <OutputType><%if(exename)%><%if(winapp)%>Win<%endif%>Exe<%else%>Library<%endif%></OutputType> +<%endif%> + <RootNamespace> + </RootNamespace> + <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent> + <StartupObject><%startupobject%></StartupObject> + <ReferencePath><%foreach(libpaths)%><%libpath%><%fornotlast(";")%><%endfor%></ReferencePath> + <FileUpgradeFlags> + </FileUpgradeFlags> + <UpgradeBackupLocation> + </UpgradeBackupLocation> + </PropertyGroup> +<%foreach(platforms)%> +<%foreach(configurations)%> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == '<%configuration%>|<%platform%>' "> +<%if(exename || sharedname || staticname)%> + <OutputPath><%if(exename)%><%if(exeout)%><%exeout%><%if(windows_style)%>\<%output_dir%><%endif%><%else%>.\<%output_dir%><%endif%><%else%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%output_dir%><%endif%>\</OutputPath> +<%endif%> + <AllowUnsafeBlocks><%allowunsafeblocks(false)%></AllowUnsafeBlocks> + <BaseAddress>285212672</BaseAddress> + <ConfigurationOverrideFile> + </ConfigurationOverrideFile> + <DefineConstants><%foreach(defines common_defines macros)%><%define%>;<%endfor%><%if(!optimize)%>DESIGN;DEBUG;<%endif%><%if(trace)%>TRACE<%endif%></DefineConstants> + <DebugSymbols><%if(optimize)%>false<%else%>true<%endif%></DebugSymbols> + <NoWarn> + </NoWarn> + <Optimize><%if(optimize)%>true<%else%>false<%endif%></Optimize> + <RegisterForComInterop><%RegisterForComInterop("false")%></RegisterForComInterop> + <TreatWarningsAsErrors>false</TreatWarningsAsErrors> + <WarningLevel><%warning_level("4")%></WarningLevel> + <DebugType><%if(optimize)%>none<%else%>full<%endif%></DebugType> + </PropertyGroup> +<%endfor%> +<%endfor%> + <ItemGroup> +<%if(after)%> + <!-- MPC ADD DEPENDENCIES --> +<%endif%> +<%foreach(libs)%> + <Reference Include="<%libname_prefix%><%lib%>"> + <Name><%libname_prefix%><%lib%></Name> + </Reference> +<%endfor%> +<%foreach(lib, sort(lit_libs pure_libs))%> + <Reference Include="<%lib%>"> + <Name><%lib%></Name> + </Reference> +<%endfor%> + </ItemGroup> + <ItemGroup> +<%foreach(source_files)%> + <Compile Include="<%source_file%>"> + <SubType><%if(flag_overrides(source_file, subtype))%><%flag_overrides(source_file, subtype)%><%else%>Code<%endif%></SubType> +<%if(flag_overrides(source_file, dependent_upon))%> + <DependentUpon><%flag_overrides(source_file, dependent_upon)%></DependentUpon> +<%endif%> + </Compile> +<%endfor%> +<%foreach(custom_types)%> +<%foreach(custom_type->input_files)%> +<%if(custom_type->input_file->output_files)%> + <Compile Include="<%custom_type->input_file%>"> + <Generator><%if(custom_type->libpath)%>PATH=%PATH%;<%custom_type->libpath%>
<%endif%><%if(flag_overrides(custom_type->input_file, gendir))%>if not exist <%flag_overrides(custom_type->input_file, gendir)%> mkdir <%flag_overrides(custom_type->input_file, gendir)%>
<%endif%><%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%if(custom_type->output_option)%><%custom_type->input_file%> <%custom_type->output_option%> <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_files)%><%else%><%custom_type->input_file->output_files%><%endif%><%else%><%custom_type->input_file%><%endif%><%if(flag_overrides(custom_type->input_file, postcommand))%><%foreach(custom_type->input_file)%>&&<%flag_overrides(custom_type->input_file, postcommand)%><%endfor%><%else%><%if(custom_type->postcommand)%><%foreach(custom_type->input_file)%>&&<%custom_type->postcommand%><%endfor%><%endif%><%endif%></Generator> + </Compile> +<%else%> + <None Include="<%custom_type->input_file%>" /> +<%endif%> +<%endfor%> +<%endfor%> +<%foreach(documentation_files)%> + <None Include="<%documentation_file%>" /> +<%endfor%> + </ItemGroup> + <Import Project="$(MSBuildBinPath)\Microsoft.VisualJSharp.targets" /> + <PropertyGroup> + <PreBuildEvent><%if(prebuild)%><%eval(prebuild)%><%endif%></PreBuildEvent> + <PostBuildEvent><%if(postbuild)%><%eval(postbuild)%><%endif%></PostBuildEvent> + </PropertyGroup> +</Project> diff --git a/ACE/MPC/templates/vc8java.mpt b/ACE/MPC/templates/vc8java.mpt new file mode 100644 index 00000000000..401d0b57bfd --- /dev/null +++ b/ACE/MPC/templates/vc8java.mpt @@ -0,0 +1,21 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +configurations = Debug Release +platforms = AnyCPU +trace = 1 + +Release { + optimize = 1 + output_dir = Release +} + +Debug { + optimize = + output_dir = Debug +} + +conditional_include "user_vc8java" diff --git a/ACE/MPC/templates/vc8lib.mpt b/ACE/MPC/templates/vc8lib.mpt new file mode 100644 index 00000000000..3d6faa13964 --- /dev/null +++ b/ACE/MPC/templates/vc8lib.mpt @@ -0,0 +1,70 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +configurations = Debug Release +common_defines = WIN32 _WINDOWS _CRT_NONSTDC_NO_WARNINGS +ConfigurationType = 4 +Detect64BitPortabilityProblems = false +MinimalRebuild = false + +conditional_include "vc8platforms" + +Release { + optimize = 2 + defines = NDEBUG + output_dir = Static_Release + intermediate_dir = Static_Release + lib_modifier = s +} + +Debug { + debug_prj = 1 + defines = _DEBUG + output_dir = Static_Debug + intermediate_dir = Static_Debug + lib_modifier = sd +} + +Memcheck Release { + optimize = 2 + defines = NDEBUG + output_dir = Static_Release + intermediate_dir = Static_Release + lib_modifier = s + BasicRuntimeChecks = 0 + FixedBaseAddress = 1 +} + +Memcheck Debug { + debug_prj = 1 + defines = _DEBUG + output_dir = Static_Debug + intermediate_dir = Static_Debug + lib_modifier = sd + BasicRuntimeChecks = 0 + FixedBaseAddress = 1 +} + +MFC Release { + optimize = 2 + defines = NDEBUG + output_dir = Static_MFC_Release + intermediate_dir = Static_MFC_Release + lib_modifier = mfcs + UseOfMFC = 2 +} + +MFC Debug { + debug_prj = 1 + defines = _DEBUG + output_dir = Static_MFC_Debug + intermediate_dir = Static_MFC_Debug + lib_modifier = mfcsd + UseOfMFC = 2 +} + +conditional_include "vcpartialmacros" +conditional_include "user_vc8lib" diff --git a/ACE/MPC/templates/vc8libexe.mpt b/ACE/MPC/templates/vc8libexe.mpt new file mode 100644 index 00000000000..5bc469e983f --- /dev/null +++ b/ACE/MPC/templates/vc8libexe.mpt @@ -0,0 +1,77 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +configurations = Debug Release +common_defines = WIN32 _CONSOLE _CRT_NONSTDC_NO_WARNINGS +ConfigurationType = 1 +SubSystem = 1 +Detect64BitPortabilityProblems = false +MinimalRebuild = false + +conditional_include "vc8platforms" + +Release { + LinkIncremental = 1 + optimize = 2 + defines = NDEBUG + output_dir = Static_Release + intermediate_dir = Static_Release + lib_modifier = s +} + +Debug { + debug_prj = 1 + defines = _DEBUG + output_dir = Static_Debug + intermediate_dir = Static_Debug + lib_modifier = sd +} + +Memcheck Release { + optimize = 2 + defines = NDEBUG + output_dir = Static_Release + intermediate_dir = Static_Release + lib_modifier = s + BasicRuntimeChecks = 0 + LinkIncremental = 1 + FixedBaseAddress = 1 +} + +Memcheck Debug { + debug_prj = 1 + defines = _DEBUG + output_dir = Static_Debug + intermediate_dir = Static_Debug + lib_modifier = sd + BasicRuntimeChecks = 0 + LinkIncremental = 1 + FixedBaseAddress = 1 +} + +MFC Release { + LinkIncremental = 1 + optimize = 2 + defines = NDEBUG _AFXDLL + output_dir = Static_MFC_Release + intermediate_dir = Static_MFC_Release + lib_modifier = mfcs + UseOfMFC = 2 + unicode_mfc_entry = wWinMainCRTStartup +} + +MFC Debug { + debug_prj = 1 + defines = _DEBUG _AFXDLL + output_dir = Static_MFC_Debug + intermediate_dir = Static_MFC_Debug + lib_modifier = mfcsd + UseOfMFC = 2 + unicode_mfc_entry = wWinMainCRTStartup +} + +conditional_include "vcpartialmacros" +conditional_include "user_vc8libexe" diff --git a/ACE/MPC/templates/vc8platforms.mpt b/ACE/MPC/templates/vc8platforms.mpt new file mode 100644 index 00000000000..3faf45cbb41 --- /dev/null +++ b/ACE/MPC/templates/vc8platforms.mpt @@ -0,0 +1,176 @@ +// -*- MPC -*- +// $Id$ +// +// Any of these platforms can set using value_template platforms= +// when generating solutions/projects. +// +//platforms = Win32 x64 "Pocket PC 2003 (ARMV4)" "Smartphone 2003 (ARMV4)" \ +// "Windows Mobile 5.0 Pocket PC SDK (ARMV4I)" "Windows Mobile 5.0 Smartphone SDK (ARMV4I)" \ +// "Windows Mobile 6 Standard SDK (ARMV4I)" + +platforms = Win32 x64 +default_platform = Win32 + +Win32 { + output_subdir = I386 +} + +x64 { + output_subdir = AMD64 + cpu_defines = _AMD64_ + platform_defines = _WIN64 + TargetMachine = "17" + link_options = /machine:AMD64 +} + +Pocket PC 2003 (ARMV4) { + output_subdir = PocketPC2003_ARMV4 + cpu_defines = $(ARCHFAM) $(_ARCHFAM_) + platform_defines = UNDER_CE=$(CEVER) _WIN32_WCE=$(CEVER) WINCE $(PLATFORMDEFINES) _WINDOWS _UNICODE UNICODE POCKETPC2003_UI_MODEL + link_options = /subsystem:windowsce,4.20 /machine:ARM /ARMPADCODE + lit_libs += ccrtrtti iphlpapi + subsystem = "0" + EnableFunctionLevelLinking = "true" + TargetMachine = "3" +} + +Smartphone 2003 (ARMV4) { + output_subdir = Smartphone2003_ARMV4 + cpu_defines = $(ARCHFAM) $(_ARCHFAM_) + platform_defines = UNDER_CE=$(CEVER) _WIN32_WCE=$(CEVER) WINCE $(PLATFORMDEFINES) _WINDOWS _UNICODE UNICODE SMARTPHONE2003_UI_MODEL + link_options = /subsystem:windowsce,4.20 /machine:ARM /ARMPADCODE + lit_libs += ccrtrtti iphlpapi + subsystem = "0" + EnableFunctionLevelLinking = "true" + TargetMachine = "3" +} + +Windows Mobile 5.0 Pocket PC SDK (ARMV4I) { + output_subdir = WinMobile50_PocketPC_ARMV4I + cpu_defines = $(ARCHFAM) $(_ARCHFAM_) + platform_defines = UNDER_CE=$(CEVER) _WIN32_WCE=$(CEVER) WINCE $(PLATFORMDEFINES) _WINDOWS _UNICODE UNICODE POCKETPC2003_UI_MODEL + link_options = /subsystem:windowsce,5.01 /machine:THUMB + lit_libs += iphlpapi + subsystem = "0" + TargetMachine = "3" +} + +Windows Mobile 5.0 Smartphone SDK (ARMV4I) { + output_subdir = WinMobile50_Smartphone_ARMV4I + cpu_defines = $(ARCHFAM) $(_ARCHFAM_) + platform_defines = UNDER_CE=$(CEVER) _WIN32_WCE=$(CEVER) WINCE $(PLATFORMDEFINES) _WINDOWS _UNICODE UNICODE SMARTPHONE2005_UI_MODEL + link_options = /subsystem:windowsce,5.01 /machine:THUMB + lit_libs += iphlpapi + subsystem = "0" + TargetMachine = "3" +} + +Windows Mobile 6 Standard SDK (ARMV4I) { + unicode = 1 + output_subdir = WinMobile60_SDK_ARMV4I + cpu_defines = $(ARCHFAM) $(_ARCHFAM_) + platform_defines = _WIN32_WCE=$(CEVER) UNDER_CE=$(CEVER) WINCE _WINDOWS $(PLATFORMDEFINES) + link_options = /subsystem:windowsce,5.02 + lit_libs += iphlpapi + subsystem = "0" + TargetMachine = "0" +} + +Windows Mobile 6 Professional SDK (ARMV4I) { + unicode = 1 + output_subdir = WinMobile60_SDK_ARMV4I + cpu_defines = $(ARCHFAM) $(_ARCHFAM_) + platform_defines = _WIN32_WCE=$(CEVER) UNDER_CE=$(CEVER) WINCE _WINDOWS $(PLATFORMDEFINES) + link_options = /subsystem:windowsce,5.02 + lit_libs += iphlpapi + subsystem = "0" + TargetMachine = "0" +} + +SuperSonic_CE6 (ARMV4I) { + unicode = 1 + output_subdir = SUPERSONIC_CE6_ARMV4I + cpu_defines = $(ARCHFAM) $(_ARCHFAM_) + platform_defines = UNDER_CE=$(CEVER) _WIN32_WCE=$(CEVER) WINCE _WINDOWS _UNICODE UNICODE + link_options = /subsystem:windowsce,6.0 /machine:THUMB + lit_libs += iphlpapi + subsystem = "0" + TargetMachine = "3" +} + +eBox4300_WINCE600_SDK (x86) { + unicode = 1 + output_subdir = eBox4300_WINCE600_SDK + cpu_defines = $(ARCHFAM) $(_ARCHFAM_) + platform_defines = UNDER_CE=$(CEVER) _WIN32_WCE=$(CEVER) WINCE _WINDOWS _UNICODE UNICODE + link_options = /subsystem:windowsce,6.0 + lit_libs += iphlpapi + subsystem = "0" + TargetMachine = "0" +} + +eBox2300_WINCE600_SDK (x86) { + unicode = 1 + output_subdir = eBox2300_WINCE600_SDK + cpu_defines = $(ARCHFAM) $(_ARCHFAM_) + platform_defines = UNDER_CE=$(CEVER) _WIN32_WCE=$(CEVER) WINCE _WINDOWS _UNICODE UNICODE + link_options = /subsystem:windowsce,6.0 + lit_libs += iphlpapi + subsystem = "0" + TargetMachine = "0" +} + +Beckhoff_HMI_500 (x86) { + unicode = 1 + output_subdir = Beckhoff_HMI_500 (x86) + cpu_defines = $(ARCHFAM) $(_ARCHFAM_) + platform_defines = UNDER_CE=$(CEVER) _WIN32_WCE=$(CEVER) WINCE _WINDOWS _UNICODE UNICODE + link_options = /subsystem:windowsce,5.00 + lit_libs += iphlpapi + subsystem = "0" + TargetMachine = "0" +} + +Beckhoff_HMI_500 (ARMV4I) { + unicode = 1 + output_subdir = Beckhoff_HMI_500 (ARMV4i) + cpu_defines = $(ARCHFAM) $(_ARCHFAM_) + platform_defines = UNDER_CE=$(CEVER) _WIN32_WCE=$(CEVER) WINCE _WINDOWS _UNICODE UNICODE + link_options = /subsystem:windowsce,5.00 + lit_libs += iphlpapi + subsystem = "0" + TargetMachine = "0" +} + +Beckhoff_HMI_600 (x86) { + unicode = 1 + output_subdir = Beckhoff_HMI_600 (x86) + cpu_defines = $(ARCHFAM) $(_ARCHFAM_) + platform_defines = UNDER_CE=$(CEVER) _WIN32_WCE=$(CEVER) WINCE _WINDOWS _UNICODE UNICODE + link_options = /subsystem:windowsce,6.00 + lit_libs += iphlpapi + subsystem = "0" + TargetMachine = "0" +} + +BR APC620 PPC700 CE 5.00 V1.2 (x86) { + unicode = 1 + output_subdir = BR APC620 + PPC700 CE 5.00 V1.2 (x86) + cpu_defines = $(ARCHFAM) $(_ARCHFAM_) + platform_defines = UNDER_CE=$(CEVER) _WIN32_WCE=$(CEVER) WINCE _WINDOWS _UNICODE UNICODE + link_options = /subsystem:windowsce,5.00 + lit_libs += iphlpapi + subsystem = "0" + TargetMachine = "0" +} + +STANDARDSDK_500 (x86) { + unicode = 1 + output_subdir = STANDARDSDK_500_x86 + cpu_defines = $(ARCHFAM) $(_ARCHFAM_) + platform_defines = UNDER_CE=$(CEVER) _WIN32_WCE=$(CEVER) WINCE _WINDOWS _UNICODE UNICODE + link_options = /subsystem:windowsce,5.00 + lit_libs += iphlpapi + subsystem = "0" + TargetMachine = "0" +} diff --git a/ACE/MPC/templates/vc8vb.mpd b/ACE/MPC/templates/vc8vb.mpd new file mode 100644 index 00000000000..1402d779a6f --- /dev/null +++ b/ACE/MPC/templates/vc8vb.mpd @@ -0,0 +1,125 @@ +<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <ProjectType>Local</ProjectType> + <ProductVersion><%prversion("8.0.50727")%></ProductVersion> + <SchemaVersion><%schemaversion("2.0")%></SchemaVersion> + <ProjectGuid>{<%guid%>}</ProjectGuid> +<%foreach(configurations)%> +<%if(forfirst)%> + <Configuration Condition=" '$(Configuration)' == '' "><%configuration%></Configuration> +<%endif%> +<%endfor%> +<%foreach(platforms)%> +<%if(forfirst)%> + <Platform Condition=" '$(Platform)' == '' "><%platform%></Platform> +<%endif%> +<%endfor%> +<%if(ico_files)%> +<%foreach(ico_files)%> +<%if(forfirst)%> + <ApplicationIcon><%ico_file%></ApplicationIcon> +<%endif%> +<%endfor%> +<%endif%> + <AssemblyKeyContainerName> + </AssemblyKeyContainerName> +<%if(exename || sharedname || staticname)%> + <AssemblyName><%if(exename)%><%exename%><%else%><%libname_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%><%endif%></AssemblyName> +<%endif%> + <AssemblyOriginatorKeyFile> + </AssemblyOriginatorKeyFile> + <DefaultClientScript>JScript</DefaultClientScript> + <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout> + <DefaultTargetSchema>IE50</DefaultTargetSchema> + <DelaySign><%DelaySign("false")%></DelaySign> + <OutputCompare>Binary</OutputCompare> +<%if(exename || sharedname || staticname)%> + <OutputType><%if(exename)%><%if(winapp)%>Win<%endif%>Exe<%else%>Library<%endif%></OutputType> +<%endif%> + <OptionExplicit>On</OptionExplicit> + <OptionStrict>Off</OptionStrict> + <RootNamespace> + </RootNamespace> + <StartupObject><%startupobject%></StartupObject> + <ReferencePath><%foreach(libpaths)%><%libpath%><%fornotlast(";")%><%endfor%></ReferencePath> + <FileUpgradeFlags> + </FileUpgradeFlags> + <UpgradeBackupLocation> + </UpgradeBackupLocation> + </PropertyGroup> +<%foreach(platforms)%> +<%foreach(configurations)%> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == '<%configuration%>|<%platform%>' "> +<%if(exename || sharedname || staticname)%> + <OutputPath><%if(exename)%><%if(exeout)%><%exeout%><%if(windows_style)%>\<%output_dir%><%endif%><%else%>.\<%output_dir%><%endif%><%else%><%if(dllout)%><%dllout%><%else%><%libout%><%endif%>\<%output_dir%><%endif%>\</OutputPath> +<%endif%> + <DocumentationFile> + </DocumentationFile> + <BaseAddress>285212672</BaseAddress> + <ConfigurationOverrideFile> + </ConfigurationOverrideFile> + <DefineConstants><%foreach(defines common_defines macros)%><%define%><%fornotlast(";")%><%endfor%> + </DefineConstants> + <DefineDebug><%if(optimize)%>false<%else%>true<%endif%></DefineDebug> + <DefineTrace><%if(trace)%>true<%else%>false<%endif%></DefineTrace> + <DefineSymbols>true</DefineSymbols> + <Optimize><%if(optimize)%>true<%else%>false<%endif%></Optimize> + <RegisterForComInterop><%RegisterForComInterop("false")%></RegisterForComInterop> + <RemoveIntegerChecks>false</RemoveIntegerChecks> + <TreatWarningsAsErrors>false</TreatWarningsAsErrors> + <WarningLevel><%warning_level("1")%></WarningLevel> + <NoWarn>42016,42017,42018,42019,42032</NoWarn> + </PropertyGroup> +<%endfor%> +<%endfor%> + <ItemGroup> +<%if(after)%> + <!-- MPC ADD DEPENDENCIES --> +<%endif%> +<%foreach(libs)%> + <Reference Include="<%libname_prefix%><%lib%>"> + <Name><%libname_prefix%><%lib%></Name> + </Reference> +<%endfor%> +<%foreach(lib, sort(lit_libs pure_libs))%> + <Reference Include="<%lib%>"> + <Name><%lib%></Name> + </Reference> +<%endfor%> + </ItemGroup> + <ItemGroup> +<%foreach(source_files)%> + <Compile Include="<%source_file%>"> + <SubType><%if(flag_overrides(source_file, subtype))%><%flag_overrides(source_file, subtype)%><%else%>Code<%endif%></SubType> + </Compile> +<%endfor%> +<%foreach(resx_files)%> + <EmbeddedResource Include="<%resx_file%>" /> +<%endfor%> +<%foreach(custom_types)%> +<%foreach(custom_type->input_files)%> +<%if(custom_type->input_file->output_files)%> + <Compile Include="<%custom_type->input_file%>"> + <Generator><%if(custom_type->libpath)%>PATH=%PATH%;<%custom_type->libpath%>
<%endif%><%if(flag_overrides(custom_type->input_file, gendir))%>if not exist <%flag_overrides(custom_type->input_file, gendir)%> mkdir <%flag_overrides(custom_type->input_file, gendir)%>
<%endif%><%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%if(custom_type->output_option)%><%custom_type->input_file%> <%custom_type->output_option%> <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_files)%><%else%><%custom_type->input_file->output_files%><%endif%><%else%><%custom_type->input_file%><%endif%><%if(flag_overrides(custom_type->input_file, postcommand))%><%foreach(custom_type->input_file)%>&&<%flag_overrides(custom_type->input_file, postcommand)%><%endfor%><%else%><%if(custom_type->postcommand)%><%foreach(custom_type->input_file)%>&&<%custom_type->postcommand%><%endfor%><%endif%><%endif%></Generator> + </Compile> +<%else%> + <None Include="<%custom_type->input_file%>" /> +<%endif%> +<%endfor%> +<%endfor%> +<%foreach(ico_files)%> + <Content Include="<%ico_file%>" /> +<%endfor%> +<%foreach(config_files)%> + <None Include="<%config_file%>" /> +<%endfor%> +<%foreach(documentation_files)%> + <None Include="<%documentation_file%>" /> +<%endfor%> + </ItemGroup> + <Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" /> + <PropertyGroup> + <PreBuildEvent><%if(prebuild)%><%eval(prebuild)%><%endif%></PreBuildEvent> + <PostBuildEvent><%if(postbuild)%><%eval(postbuild)%><%endif%></PostBuildEvent> + </PropertyGroup> +</Project> diff --git a/ACE/MPC/templates/vc8vb.mpt b/ACE/MPC/templates/vc8vb.mpt new file mode 100644 index 00000000000..a46dc45227e --- /dev/null +++ b/ACE/MPC/templates/vc8vb.mpt @@ -0,0 +1,21 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" +conditional_include "windowscommon" + +configurations = Debug Release +platforms = AnyCPU +trace = 1 + +Release { + optimize = 1 + output_dir = Release +} + +Debug { + optimize = + output_dir = Debug +} + +conditional_include "user_vc8vb" diff --git a/ACE/MPC/templates/vccommon.mpt b/ACE/MPC/templates/vccommon.mpt new file mode 100644 index 00000000000..6a1deccc961 --- /dev/null +++ b/ACE/MPC/templates/vccommon.mpt @@ -0,0 +1,9 @@ +// -*- MPC -*- +// $Id$ + +// NOTE: This is really only common to vc6 and should remain that way. The +// file is poorly named. -- Chad Elliott 9/23/2005 + +midl_defines = +midl_flags = /nologo /mktyplib203 /win32 +midl_includes = diff --git a/ACE/MPC/templates/wb26.mpd b/ACE/MPC/templates/wb26.mpd new file mode 100644 index 00000000000..7a3dd96c66a --- /dev/null +++ b/ACE/MPC/templates/wb26.mpd @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name><%project_name%></name> + <comment></comment> +<%if(after && enable_subprojects && exename)%> + <projects> + <!-- MPC ADD DEPENDENCIES --> + </projects> +<%endif%> + <buildSpec> + <buildCommand> + <name>com.windriver.ide.core.wrbuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>com.windriver.ide.core.wrnature</nature> + <nature>com.windriver.ide.core.wrcorenature</nature> + </natures> +<%if(!standard_build && make_coexistence)%> + <linkedResources> +<%foreach(source_files)%> + <link> + <name><%source_file%></name> + <type>1</type> + <location><%full_path(source_file)%></location> + </link> +<%endfor%> +<%foreach(header_files)%> + <link> + <name><%header_file%></name> + <type>1</type> + <location><%full_path(header_file)%></location> + </link> +<%endfor%> +<%foreach(inline_files)%> + <link> + <name><%inline_file%></name> + <type>1</type> + <location><%full_path(inline_file)%></location> + </link> +<%endfor%> +<%foreach(template_files)%> + <link> + <name><%template_file%></name> + <type>1</type> + <location><%full_path(template_file)%></location> + </link> +<%endfor%> + </linkedResources> +<%endif%> +</projectDescription> diff --git a/ACE/MPC/templates/wb26dll.mpt b/ACE/MPC/templates/wb26dll.mpt new file mode 100644 index 00000000000..d51bf4f2d07 --- /dev/null +++ b/ACE/MPC/templates/wb26dll.mpt @@ -0,0 +1,151 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" + +lib_prefix = lib +lib_ext = .a +dll_ext = +exe_ext = .out + +cxx_derivedsigs = *.o +ass_derivedsigs = *.o +c_derivedsigs = *.o +part_derivedsigs = *.o +ar_derivedsigs = .a + +platform = VxWorks +platform_name = vxworks-6.4 +project_type = DownloadableKernelModuleProject + +linkflags = +includedir = + +// *********************************************************************** +// Build Specs Section +// *********************************************************************** + +buildspecs = PPC604gnu PPC603gnu PENTIUM4gnu PPC85XXgnu +default_buildspec = PPC604gnu + +PPC603gnu { + cc_arch_spec = -mcpu=603 -mstrict-align -mno-implicit-fp -D_WRS_HARDWARE_FP -mlongcall + cpu = PPC603 + tool_family = gnu + tool = gnu + vx_cpu_family = ppc + cxx = ccppc + ar = arppc + nm = nmppc + munchflag = ppc + cxx_flags = -ansi -Wall -MD -MP -fexceptions -frtti -fweak -Wunused + cxx_dbgflags = -g + cxx_nondbgflags = -O2 -fstrength-reduce -fno-builtin + ass_flags = -ansi -xassembler-with-cpp -MD -MP + ass_dbgflags = -g + ass_nondbgflags = -O2 -fstrength-reduce -fno-builtin + c_flags = -Wall -MD -MP + c_dbgflags = -g + c_nondbgflags = -O2 -fstrength-reduce -fno-builtin + ar_flags = crus + ar_dbgflags = + ar_nondbgflags = + part_flags = + part_dbgflags = + part_nondbgflags = + linker_flags = -T $(WIND_BASE)/target/h/tool/gnu/ldscripts/link.OUT + linker_dbgflags = -g + linker_nondbgflags = -O2 -fstrength-reduce -fno-builtin +} + +PPC85XXgnu { + cc_arch_spec = -mcpu=8540 -mstrict-align -msoft-float -mabi=no-spe -mlongcall + cpu = PPC85XX + tool_family = gnu + tool = gnu + vx_cpu_family = ppc + cxx = ccppc + ar = arppc + nm = nmppc + munchflag = ppc + cxx_flags = -ansi -Wall -MD -MP -fexceptions -frtti -fweak -Wunused + cxx_dbgflags = -g + cxx_nondbgflags = -O2 -fstrength-reduce -fno-builtin + ass_flags = -ansi -xassembler-with-cpp -MD -MP + ass_dbgflags = -g + ass_nondbgflags = -O2 -fstrength-reduce -fno-builtin + c_flags = -Wall -MD -MP + c_dbgflags = -g + c_nondbgflags = -O2 -fstrength-reduce -fno-builtin + ar_flags = crus + ar_dbgflags = + ar_nondbgflags = + part_flags = + part_dbgflags = + part_nondbgflags = + linker_flags = -T $(WIND_BASE)/target/h/tool/gnu/ldscripts/link.OUT + linker_dbgflags = -g + linker_nondbgflags = -O2 -fstrength-reduce -fno-builtin +} + +PPC604gnu { + cc_arch_spec = -mcpu=604 -mstrict-align -mno-implicit-fp -mlongcall + cpu = PPC604 + tool_family = gnu + tool = gnu + vx_cpu_family = ppc + cxx = ccppc + ar = arppc + nm = nmppc + munchflag = ppc + cxx_flags = -ansi -Wall -MD -MP -fexceptions -frtti -fweak -Wunused + cxx_dbgflags = -g + cxx_nondbgflags = -O2 -fstrength-reduce -fno-builtin + ass_flags = -ansi -xassembler-with-cpp -MD -MP + ass_dbgflags = -g + ass_nondbgflags = -O2 -fstrength-reduce -fno-builtin + c_flags = -Wall -MD -MP + c_dbgflags = -g + c_nondbgflags = -O2 -fstrength-reduce -fno-builtin + ar_flags = crus + ar_dbgflags = + ar_nondbgflags = + part_flags = + part_dbgflags = + part_nondbgflags = + linker_flags = -T $(WIND_BASE)/target/h/tool/gnu/ldscripts/link.OUT + linker_dbgflags = -g + linker_nondbgflags = -O2 -fstrength-reduce -fno-builtin +} + +PENTIUM4gnu { + cc_arch_spec = -mtune=pentium4 -march=pentium4 + cpu = PENTIUM4 + tool_family = gnu + tool = gnu + vx_cpu_family = pentium + cxx = ccpentium + ar = arpentium + nm = nmpentium + munchflag = pentium + cxx_flags = -ansi -Wall -MD -MP -fexceptions -frtti -fweak -Wunused + cxx_dbgflags = -g + cxx_nondbgflags = -O2 -nostdlib -fno-builtin -fno-defer-pop -mno-sse -mno-sse2 + ass_flags = -ansi -xassembler-with-cpp -MD -MP + ass_dbgflags = -g + ass_nondbgflags = -O2 -nostdlib -fno-builtin -fno-defer-pop -mno-sse -mno-sse2 + c_flags = -Wall -MD -MP + c_dbgflags = -g + c_nondbgflags = -O2 -nostdlib -fno-builtin -fno-defer-pop -mno-sse -mno-sse2 + ar_flags = crus + ar_dbgflags = + ar_nondbgflags = + part_flags = + part_dbgflags = + part_nondbgflags = + linker_flags = -T $(WIND_BASE)/target/h/tool/gnu/ldscripts/link.OUT + linker_dbgflags = -g + linker_nondbgflags = -O2 -nostdlib -fno-builtin -fno-defer-pop -mno-sse -mno-sse2 +} + +conditional_include "user_wb26dll" diff --git a/ACE/MPC/templates/wb26exe.mpt b/ACE/MPC/templates/wb26exe.mpt new file mode 100644 index 00000000000..4f05ba4aea7 --- /dev/null +++ b/ACE/MPC/templates/wb26exe.mpt @@ -0,0 +1,6 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "wb26dll" +conditional_include "user_wb26exe" + diff --git a/ACE/MPC/templates/wb26wrmakefile.mpd b/ACE/MPC/templates/wb26wrmakefile.mpd new file mode 100644 index 00000000000..5660109c50b --- /dev/null +++ b/ACE/MPC/templates/wb26wrmakefile.mpd @@ -0,0 +1,375 @@ +# The file ".wrmakefile" is the template used by the Wind River Workbench to +# generate the makefiles of this project. Add user-specific build targets and +# make rules only(!) in this project's ".wrmakefile" file. These will then be +# automatically dumped into the makefiles. + +WIND_HOME := $(subst \,/,$(WIND_HOME)) +WIND_BASE := $(subst \,/,$(WIND_BASE)) +WIND_USR := $(subst \,/,$(WIND_USR)) +ACE_ROOT := $(subst \,/,$(ACE_ROOT)) +TAO_ROOT := $(subst \,/,$(TAO_ROOT)) +CIAO_ROOT := $(subst \,/,$(CIAO_ROOT)) +HOST_ROOT := $(subst \,/,$(HOST_ROOT)) +<%if(sharedname || staticname)%> +<%if(libout || dllout)%> +ACE_LIBOUT := <%if(dllout)%><%dllout%><%else%><%libout%><%endif%> +<%endif%> +<%endif%> +<%if(exename)%> +<%if(exeout)%> +ACE_EXEOUT := <%exeout%> +<%endif%> +<%endif%> + +<%if(exename)%> +ACE_TARGET_PREFIX := +ACE_TARGET_NAME := <%exename%> +ACE_TARGET_EXT := <%exe_ext%> +PROJECT_TARGET=$(filter %<%exe_ext%>,$(PROJECT_TARGETS)) +<%else%> +<%if(sharedname || staticname)%> +ACE_TARGET_PREFIX := <%lib_prefix%> +ACE_TARGET_NAME := <%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%> +ACE_TARGET_EXT := <%lib_ext%> +PROJECT_TARGET=$(filter %<%lib_ext%>,$(PROJECT_TARGETS)) +<%endif%> +<%endif%> +<%if(custom_only)%> +PROJECT_TARGET=CUSTOM_ONLY +<%endif%> + +<%if(standard_build && exename)%> +DEPLIBS = $(foreach lib,<%foreach(libs)%> <%libname_prefix%><%lib%><%endfor%> <%lit_libs%>, $(foreach libpath,<%foreach(libpaths)%><%if(targetoutdir)%> <%libpath%>/<%targetoutdir%><%endif%> <%libpath%><%endfor%>, $(wildcard $(libpath)/lib$(lib).a))) +<%endif%> + +<%if(standard_build)%> +all : generate_sources pre_recursion subdirs_all post_recursion pre_build main_all post_build +<%else%> +all : generate_sources pre_build main_all post_build +<%endif%> + +<%if(!standard_build)%> +_clean :: + @echo "make: removing targets and objects of `pwd`" +<%endif%> + +%IDE_GENERATED% + +<%if(standard_build && exename)%> +$(OBJ_DIR)/<%exename%>_partialImage.o : $(OBJECTS) $(SUB_OBJECTS) $(DEPLIBS) +<%endif%> + +<%if(!standard_build)%> +-include $(PRJ_ROOT_DIR)/*.makefile +<%endif%> + +-include *.makefile + +<%if(custom_only)%> +main_all : external_build + @echo "make: built targets of `pwd`" +<%else%> +<%if(standard_build)%> +main_all : check_objectdir external_build $(PROJECT_TARGETS) +<%else%> +main_all : external_build $(PROJECT_TARGETS) +<%endif%> + @echo "make: built targets of `pwd`" +<%endif%> + +<%if(standard_build)%> +check_objectdir : + @if [ ! -d "$(OBJ_DIR)" ]; then\ + mkdir -p $(OBJ_DIR);\ + fi + +# main entry point for pre processing prior to the recursion +pre_recursion :: + @echo "" + +# main entry point for post processing after the recursion +post_recursion :: + @echo "" +<%endif%> + +# entry point for extending the build +external_build :: + @echo "" + +# main entry point for pre processing prior to the build +<%if(standard_build)%> +ACE_ALL_OBJECTS := $(SUB_OBJECTS) $(OBJECTS) +ifneq ($(PROJECT_TARGET),) +pre_build :: $(PRE_BUILD_STEP) + @echo "Create object list $(PRJ_ROOT_DIR)/filelist.txt";\ + rm -f $(PRJ_ROOT_DIR)/filelist.txt;\ + for object in _dummy_ $(ACE_ALL_OBJECTS); do\ + if [ "$$object" = "_dummy_" ]; then\ + continue ;\ + fi;\ + echo "$$object" >> $(PRJ_ROOT_DIR)/filelist.txt;\ + done +else +pre_build :: $(PRE_BUILD_STEP) + @echo "" +endif +<%else%> +pre_build :: $(PRE_BUILD_STEP) + @echo "Create object list";\ + rm -f $(PRJ_ROOT_DIR)/filelist.txt;\ +<%if(exename)%> + for object in _dummy_ $(OBJECTS_<%exename%>); do\ +<%else%> + for object in _dummy_ $(OBJECTS_<%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%>); do\ +<%endif%> + if [ "$$object" = "_dummy_" ]; then\ + continue ;\ + fi;\ + echo "$$object" >> $(PRJ_ROOT_DIR)/filelist.txt ;\ + done +<%endif%> + +# entry point for generating sources prior to the build +<%if(standard_build)%> +ifneq ($(PROJECT_TARGET),) +<%endif%> +generate_sources :: +<%foreach(custom_types)%> +<%foreach(custom_type->input_files)%> +<%if(custom_type->input_file->output_files)%> + <%if(!standard_build)%><%if(make_coexistence)%>cd ../.. ; <%else%>cd .. ;<%endif%><%endif%><%if(flag_overrides(custom_type->input_file, command))%><%flag_overrides(custom_type->input_file, command)%><%else%><%custom_type->command%><%endif%> <%if(flag_overrides(custom_type->input_file, commandflags))%><%flag_overrides(custom_type->input_file, commandflags)%><%else%><%custom_type->commandflags%><%endif%> <%custom_type->input_file%> <%if(custom_type->output_option)%><%custom_type->output_option%> $@<%endif%> +<%endif%> +<%endfor%> +<%endfor%> +<%if(standard_build)%> +else +generate_sources :: + @echo "" +endif +<%endif%> + +# main entry point for post processing after the build +post_build :: $(POST_BUILD_STEP) deploy_output + @echo "" + +# entry point for deploying output after the build +<%if(standard_build)%> +ifneq ($(PROJECT_TARGET),) +<%endif%> +deploy_output :: +<%if(!standard_build)%> +<%if(exename)%> +<%if(exeout)%> + if [ $(ACE_EXEOUT) != . ]; then\ + if [ ! -d $(ACE_EXEOUT) ]; then\ + mkdir -p $(ACE_EXEOUT);\ + fi;\ + if test -e $(ACE_EXEOUT)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT); then \ + if test $(ACE_TARGET_NAME)/$(MODE_DIR)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT) -nt $(ACE_EXEOUT)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT); then \ + cp $(ACE_TARGET_NAME)/$(MODE_DIR)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT) $(ACE_EXEOUT);\ + fi \ + else \ + cp $(ACE_TARGET_NAME)/$(MODE_DIR)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT) $(ACE_EXEOUT);\ + fi\ + fi +<%endif%> +<%else%> +<%if(sharedname || staticname)%> +<%if(libout || dllout)%> + if [ $(ACE_LIBOUT) != . ]; then\ + if [ ! -d $(ACE_LIBOUT) ]; then\ + mkdir -p $(ACE_LIBOUT);\ + fi;\ + if test -e $(ACE_LIBOUT)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT); then \ + if test $(ACE_TARGET_NAME)/$(MODE_DIR)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT) -nt $(ACE_LIBOUT)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT); then \ + cp $(ACE_TARGET_NAME)/$(MODE_DIR)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT) $(ACE_LIBOUT);\ + fi \ + else \ + cp $(ACE_TARGET_NAME)/$(MODE_DIR)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT) $(ACE_LIBOUT);\ + fi\ + fi +<%endif%> +<%endif%> +<%endif%> +<%else%> +<%if(exename)%> +<%if(exeout)%> + if $(ACE_EXEOUT) != . ]; then\ + if [ ! -d $(ACE_EXEOUT) ]; then\ + mkdir -p $(ACE_EXEOUT);\ + fi;\ + if test -e $(ACE_EXEOUT)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT); then \ + if test $(OBJ_DIR)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT) -nt $(ACE_EXEOUT)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT); then \ + cp $(OBJ_DIR)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT) $(ACE_EXEOUT);\ + fi \ + else \ + cp $(OBJ_DIR)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT) $(ACE_EXEOUT);\ + fi\ + fi +<%endif%> +<%else%> +<%if(sharedname || staticname)%> +<%if(libout || dllout)%> + if [ $(ACE_LIBOUT) != . ]; then\ + if [ ! -d $(ACE_LIBOUT) ]; then\ + mkdir -p $(ACE_LIBOUT);\ + fi;\ + if test -e $(ACE_LIBOUT)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT); then \ + if test $(OBJ_DIR)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT) -nt $(ACE_LIBOUT)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT); then \ + cp $(OBJ_DIR)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT) $(ACE_LIBOUT);\ + fi \ + else \ + cp $(OBJ_DIR)/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT) $(ACE_LIBOUT);\ + fi\ + fi +<%endif%> +<%endif%> +<%endif%> +<%endif%> + @echo "" +<%if(standard_build)%> +else +deploy_output :: + @echo "" +endif +<%endif%> + +<%if(standard_build)%> + +# order subdirs to use subprojects first +isSubProject = $(if $(subst $(subst $(CURDIR)/,,$(dir)),,$(dir)),, $(dir)) +SUB_PROJECTS := $(foreach dir, $(SUBDIRS), $(isSubProject)) +isSubFolder = $(if $(subst $(subst $(CURDIR)/,,$(dir)),,$(dir)), $(dir)) +SUB_FOLDERS := $(foreach dir, $(SUBDIRS), $(isSubFolder)) + +SUBDIRS_ORDERED := $(SUB_PROJECTS) $(SUB_FOLDERS) + +# recursive make in SUBDIRS +subdirs_all : + @_PWD=`pwd`;\ + for dir in _dummy_ $(SUBDIRS_ORDERED); do\ + if [ "$$dir" = "_dummy_" ]; then\ + continue ;\ + fi;\ + if [ ! -d "$$dir" ]; then\ + continue ;\ + fi;\ + echo "Recursive make: Changing to Directory '$$dir'";\ + cd "$$dir";\ + "$(MAKE)" -f "$(MAKEFILE)" $(MFLAGS) all || exit;\ + echo "Recursive make: Changing back to Directory '$$_PWD'";\ + cd "$$_PWD";\ + done + +clean :: + @_PWD=`pwd`;\ + for dir in _dummy_ $(SUBDIRS_ORDERED); do\ + if [ "$$dir" = "_dummy_" ]; then\ + continue ;\ + fi;\ + if [ ! -d "$$dir" ]; then\ + continue ;\ + fi;\ + echo "Recursive make: Changing to Directory '$$dir'";\ + cd "$$dir";\ + "$(MAKE)" -f "$(MAKEFILE)" $(MFLAGS) $@ || exit;\ + echo "Recursive make: Changing back to Directory '$$_PWD'";\ + cd "$$_PWD";\ + done +<%endif%> + +clean :: external_clean $(CLEAN_STEP) _clean + +# entry point for extending the build clean +<%if(standard_build)%> +ifneq ($(PROJECT_TARGET),) +<%endif%> +external_clean :: +<%foreach(custom_types)%> +<%foreach(custom_type->input_files)%> +<%if(custom_type->input_file->output_files)%> + <%if(make_coexistence)%>cd ../.. ; <%endif%>rm -f <%foreach(custom_type->input_file->output_files)%> <%if(flag_overrides(custom_type->input_file, gendir))%><%flag_overrides(custom_type->input_file, gendir)%>\<%basename(custom_type->input_file->output_file)%><%else%><%custom_type->input_file->output_file%><%endif%><%endfor%> +<%endif%> +<%endfor%> +<%endfor%> +<%if(exename)%> +<%if(exeout)%> + rm -f <%exeout%>/$(ACE_TARGET_NAME)$(ACE_TARGET_EXT) +<%endif%> +<%else%> +<%if(sharedname || staticname)%> + rm -f <%if(dllout)%><%dllout%><%else%><%libout%><%endif%>/$(ACE_TARGET_PREFIX)$(ACE_TARGET_NAME)$(ACE_TARGET_EXT) +<%endif%> +<%endif%> + @echo "" +<%if(standard_build)%> +else +external_clean :: + @echo "" +endif +<%endif%> + + +<%if(standard_build)%> +_clean : + if [ -d $(OBJ_DIR) ]; then\ + echo "make: removing targets and objects of `pwd`";\ + rm -f $(OBJECTS) $(PROJECT_TARGETS) $(DEP_FILES) $(wildcard $(OBJ_DIR)/*.unstripped) $(wildcard $(OBJ_DIR)/ctdt.*) \ + rm -rf $(OBJ_DIR);\ + rm -f $(PRJ_ROOT_DIR)/filelist.txt;\ + else\ + echo "make: removing targets and objects of `pwd`, already done";\ + fi + +build_all_specs : + @echo "building target default for ALL build-specs";\ + for spec in _dummy_ $(ALL_BUILD_SPECS); do\ + if [ "$$spec" = "_dummy_" ]; then\ + continue ;\ + fi;\ + echo " ";\ + echo "building all for build-spec '$$spec'";\ + "$(MAKE)" -f "$(MAKEFILE)" $(MFLAGS) BUILD_SPEC=$$spec DEBUG_MODE=$(DEBUG_MODE) TRACE=$(TRACE) || exit;\ + done + +clean_all_specs : + @echo "building target clean for ALL build-specs";\ + for spec in _dummy_ $(ALL_BUILD_SPECS); do\ + if [ "$$spec" = "_dummy_" ]; then\ + continue ;\ + fi;\ + echo " ";\ + echo "building clean for build-spec '$$spec'";\ + "$(MAKE)" -f "$(MAKEFILE)" $(MFLAGS) BUILD_SPEC=$$spec DEBUG_MODE=$(DEBUG_MODE) TRACE=$(TRACE) clean || exit;\ + done + +build_enabled_specs : + @echo "building target default for ENABLED build-specs";\ + for spec in _dummy_ $(ENABLED_BUILD_SPECS); do\ + if [ "$$spec" = "_dummy_" ]; then\ + continue ;\ + fi;\ + echo " ";\ + echo "building all for build-spec '$$spec'";\ + "$(MAKE)" -f "$(MAKEFILE)" $(MFLAGS) BUILD_SPEC=$$spec DEBUG_MODE=$(DEBUG_MODE) TRACE=$(TRACE) || exit;\ + done + +clean_enabled_specs : + @echo "building target clean for ENABLED build-specs";\ + for spec in _dummy_ $(ENABLED_BUILD_SPECS); do\ + if [ "$$spec" = "_dummy_" ]; then\ + continue ;\ + fi;\ + echo " ";\ + echo "building clean for build-spec '$$spec'";\ + "$(MAKE)" -f "$(MAKEFILE)" $(MFLAGS) BUILD_SPEC=$$spec DEBUG_MODE=$(DEBUG_MODE) TRACE=$(TRACE) clean || exit;\ + done +<%endif%> + +<%if(standard_build)%> +<%if(sharedname || staticname)%> +ifneq ($(PROJECT_TARGET),) +$(OBJ_DIR)/<%lib_prefix%><%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%><%lib_ext%> : $(OBJECTS) $(SUB_OBJECTS) +endif +<%endif%> +<%endif%>
\ No newline at end of file diff --git a/ACE/MPC/templates/wb26wrproject.mpd b/ACE/MPC/templates/wb26wrproject.mpd new file mode 100644 index 00000000000..68df03826fa --- /dev/null +++ b/ACE/MPC/templates/wb26wrproject.mpd @@ -0,0 +1,217 @@ +<?xml version="1.0" encoding="UTF-8"?> +<wrxml> + <properties platform="<%platform%>" platform_name="<%platform_name%>" root="1" type="<%project_type%>"/> +<%if(after && enable_subprojects && exename)%> + <subprojects> + <!-- MPC ADD DEPENDENCIES --> + </subprojects> +<%endif%> + <attributes> + <mapAttribute> + <listAttribute key="BLD::Info|GlobalMacros"> + <stringAttribute value="PROJECT_TYPE"/> + <stringAttribute value="DEFINES"/> +<%if(sharedname || staticname)%> + <stringAttribute value="DO_STRIP"/> + <stringAttribute value="SHAREDLIB_VERSION"/> +<%endif%> + <stringAttribute value="EXPAND_DBG"/> + <stringAttribute value="LIBPATH"/> + <stringAttribute value="LIBS"/> + <stringAttribute value="PARTIAL_LIBS"/> + </listAttribute> + <stringAttribute key="BLD::Info|GlobalMacro|DEFINES" value="<%foreach(defines common_defines macros staticflags)%>-D<%define%> <%endfor%>"/> + <stringAttribute key="BLD::Info|GlobalMacro|PROJECT_TYPE" value="DKM"/> + <stringAttribute key="BLD::Info|GlobalMacro|EXPAND_DBG" value="0"/> + <stringAttribute key="BLD::Info|GlobalMacro|LIBPATH" value="<%foreach(libpaths)%><%fornotfirst(" ")%>-L<%libpath%><%endfor%>"/> + <stringAttribute key="BLD::Info|GlobalMacro|PARTIAL_LIBS" value="<%foreach(libs)%><%fornotfirst(" ")%>-l<%lib%><%if(use_lib_modifier)%><%lib_modifier%><%endif%><%if(!standard_build)%><%lib_ext%><%endif%><%endfor%><%foreach(lit_libs)%> <%lit_lib%>.lib<%endfor%><%foreach(pure_libs)%> <%pure_lib%><%endfor%>"/> + <stringAttribute key="BLD::Info|GlobalMacro|LIBS" value=""/> +<%if(sharedname || staticname)%> + <stringAttribute key="BLD::Info|GlobalMacro|DO_STRIP" value="0"/> + <stringAttribute key="BLD::Info|GlobalMacro|SHAREDLIB_VERSION" value=""/> +<%endif%> +<%foreach(buildspecs)%> + <listAttribute key="BLD::Info|Incl|<%buildspec%>"> + <stringAttribute value="-I$(WIND_BASE)/target/h"/> + <stringAttribute value="-I$(WIND_BASE)/target/h/wrn/coreip"/> +<%foreach(includes)%> + <stringAttribute value="-I<%include%>"/> +<%endfor%> + </listAttribute> +<%endfor%> + <listAttribute key="BLD::Info|Macros"> + <stringAttribute value="VX_CPU_FAMILY"/> + <stringAttribute value="CPU"/> + <stringAttribute value="TOOL_FAMILY"/> + <stringAttribute value="TOOL"/> + <stringAttribute value="TOOL_PATH"/> + <stringAttribute value="CC_ARCH_SPEC"/> + </listAttribute> +<%foreach(buildspecs)%> + <stringAttribute key="BLD::Info|Macro|CC_ARCH_SPEC|value|<%buildspec%>" value="<%cc_arch_spec%>"/> + <stringAttribute key="BLD::Info|Macro|CPU|value|<%buildspec%>" value="<%cpu%>"/> + <stringAttribute key="BLD::Info|Macro|TOOL_FAMILY|value|<%buildspec%>" value="<%tool_family%>"/> + <stringAttribute key="BLD::Info|Macro|TOOL_PATH|value|<%buildspec%>" value=""/> + <stringAttribute key="BLD::Info|Macro|TOOL|value|<%buildspec%>" value="<%tool%>"/> + <stringAttribute key="BLD::Info|Macro|VX_CPU_FAMILY|value|<%buildspec%>" value="<%vx_cpu_family%>"/> +<%endfor%> + <listAttribute key="BLD::Info|Tools"> + <stringAttribute value="C-Compiler"/> + <stringAttribute value="C++-Compiler"/> +<%if(sharedname || staticname)%> + <stringAttribute value="Linker"/> + <stringAttribute value="Partial Image Linker"/> + <stringAttribute value="Librarian"/> +<%else%> + <stringAttribute value="Linker"/> + <stringAttribute value="Partial Image Linker"/> + <stringAttribute value="Librarian"/> +<%endif%> + <stringAttribute value="Assembler"/> + </listAttribute> +<%foreach(buildspecs)%> + <stringAttribute key="BLD::Info|Tool|Assembler|cmd|<%buildspec%>" value="echo "building $@";%assemblerprefix% $(TOOL_PATH)<%cxx%> %DebugModeFlags% %ToolFlags% $(ADDED_CFLAGS) %Includes% $(ADDED_INCLUDES) -DCPU=$(CPU) -DTOOL_FAMILY=$(TOOL_FAMILY) -DTOOL=$(TOOL) -D_WRS_KERNEL $(DEFINES) -o %OutFile% -c %InFile%"/> + <stringAttribute key="BLD::Info|Tool|Assembler|dbgFlags|<%buildspec%>" value="<%ass_dbgflags%>"/> + <stringAttribute key="BLD::Info|Tool|Assembler|derivedSigs|<%buildspec%>" value="<%ass_derivedsigs%>"/> + <stringAttribute key="BLD::Info|Tool|Assembler|flags|<%buildspec%>" value="$(CC_ARCH_SPEC) <%ass_flags%>"/> + <stringAttribute key="BLD::Info|Tool|Assembler|nonDbgFlags|<%buildspec%>" value="<%ass_nondbgflags%>"/> +<%endfor%> + <booleanAttribute key="BLD::Info|Tool|Assembler|object" value="true"/> + <booleanAttribute key="BLD::Info|Tool|Assembler|passAble" value="false"/> + <stringAttribute key="BLD::Info|Tool|Assembler|sigs" value="*.s"/> +<%foreach(buildspecs)%> + <stringAttribute key="BLD::Info|Tool|C++-Compiler|cmd|<%buildspec%>" value="echo "building $@";%cppcompilerprefix% $(TOOL_PATH)<%cxx%> %DebugModeFlags% %ToolFlags% $(ADDED_C++FLAGS) %Includes% $(ADDED_INCLUDES) -DCPU=$(CPU) -DTOOL_FAMILY=$(TOOL_FAMILY) -DTOOL=$(TOOL) -D_WRS_KERNEL $(DEFINES) -o %OutFile% -c %InFile%"/> + <stringAttribute key="BLD::Info|Tool|C++-Compiler|dbgFlags|<%buildspec%>" value="<%cxx_dbgflags%>"/> + <stringAttribute key="BLD::Info|Tool|C++-Compiler|derivedSigs|<%buildspec%>" value="<%cxx_derivedsigs%>"/> + <stringAttribute key="BLD::Info|Tool|C++-Compiler|flags|<%buildspec%>" value="$(CC_ARCH_SPEC) <%cxx_flags%>"/> + <stringAttribute key="BLD::Info|Tool|C++-Compiler|nonDbgFlags|<%buildspec%>" value="<%cxx_nondbgflags%>"/> +<%endfor%> + <booleanAttribute key="BLD::Info|Tool|C++-Compiler|object" value="true"/> + <booleanAttribute key="BLD::Info|Tool|C++-Compiler|passAble" value="false"/> + <stringAttribute key="BLD::Info|Tool|C++-Compiler|sigs" value="<%foreach(ext, extensions(source_files))%>*.<%ext%><%fornotlast(";")%><%endfor%>"/> +<%foreach(buildspecs)%> + <stringAttribute key="BLD::Info|Tool|C-Compiler|cmd|<%buildspec%>" value="echo "building $@";%ccompilerprefix% $(TOOL_PATH)<%cxx%> %DebugModeFlags% %ToolFlags% $(ADDED_CFLAGS) %Includes% $(ADDED_INCLUDES) -DCPU=$(CPU) -DTOOL_FAMILY=$(TOOL_FAMILY) -DTOOL=$(TOOL) -D_WRS_KERNEL $(DEFINES) -o %OutFile% -c %InFile%"/> + <stringAttribute key="BLD::Info|Tool|C-Compiler|dbgFlags|<%buildspec%>" value="<%c_dbgflags%>"/> + <stringAttribute key="BLD::Info|Tool|C-Compiler|derivedSigs|<%buildspec%>" value="<%c_derivedsigs%>"/> + <stringAttribute key="BLD::Info|Tool|C-Compiler|flags|<%buildspec%>" value="$(CC_ARCH_SPEC) <%c_flags%>"/> + <stringAttribute key="BLD::Info|Tool|C-Compiler|nonDbgFlags|<%buildspec%>" value="<%c_nondbgflags%>"/> +<%endfor%> + <booleanAttribute key="BLD::Info|Tool|C-Compiler|object" value="true"/> + <booleanAttribute key="BLD::Info|Tool|C-Compiler|passAble" value="false"/> + <stringAttribute key="BLD::Info|Tool|C-Compiler|sigs" value="*.c"/> +<%foreach(buildspecs)%> + <stringAttribute key="BLD::Info|Tool|Librarian|cmd|<%buildspec%>" value="echo "building $@";%archiverprefix% $(TOOL_PATH)<%ar%> %ToolFlags% %OutFile% @$(PRJ_ROOT_DIR)/filelist.txt $(ADDED_OBJECTS)"/> + <stringAttribute key="BLD::Info|Tool|Librarian|dbgFlags|<%buildspec%>" value="<%ar_dbgflags%>"/> + <stringAttribute key="BLD::Info|Tool|Librarian|derivedSigs|<%buildspec%>" value="*<%ar_derivedsigs%>"/> + <stringAttribute key="BLD::Info|Tool|Librarian|flags|<%buildspec%>" value="<%ar_flags%>"/> + <stringAttribute key="BLD::Info|Tool|Librarian|nonDbgFlags|<%buildspec%>" value="<%ar_nondbgflags%>"/> +<%endfor%> + <booleanAttribute key="BLD::Info|Tool|Librarian|object" value="false"/> + <booleanAttribute key="BLD::Info|Tool|Librarian|passAble" value="true"/> + <stringAttribute key="BLD::Info|Tool|Librarian|sigs" value=""/> +<%foreach(buildspecs)%> + <stringAttribute key="BLD::Info|Tool|Linker|cmd|<%buildspec%>" value="echo "building $@";rm -f %OutFile%;<%nm%> %Objects% $(ADDED_OBJECTS) %Libraries% | tclsh $(WIND_BASE)/host/resource/hutils/tcl/munch.tcl -c <%munchflag%> > $(OBJ_DIR)/ctdt.c;%ccompilerprefix% $(TOOL_PATH)<%cxx%> %DebugModeFlags% $(CC_ARCH_SPEC) -fdollars-in-identifiers -Wall $(ADDED_CFLAGS) %Includes% $(ADDED_INCLUDES) -DCPU=$(CPU) -DTOOL_FAMILY=$(TOOL_FAMILY) -DTOOL=$(TOOL) -D_WRS_KERNEL $(DEFINES) -o $(OBJ_DIR)/ctdt.o -c $(OBJ_DIR)/ctdt.c;%linkerprefix% $(TOOL_PATH)<%cxx%> -r -nostdlib -Wl,-X %ToolFlags% -o %OutFile% $(OBJ_DIR)/ctdt.o %Objects% $(ADDED_OBJECTS) %Libraries% $(LIBPATH) $(LIBS) $(ADDED_LIBPATH) $(ADDED_LIBS) && if [ "$(EXPAND_DBG)" = "1" ]; then plink "$@";fi"/> + <stringAttribute key="BLD::Info|Tool|Linker|dbgFlags|<%buildspec%>" value="<%linker_dbgflags%>"/> + <stringAttribute key="BLD::Info|Tool|Linker|derivedSigs|<%buildspec%>" value="<%if(exename)%>*<%exe_ext%><%else%>*<%lib_ext%><%endif%>"/> + <stringAttribute key="BLD::Info|Tool|Linker|flags|<%buildspec%>" value="<%linker_flags%>"/> + <stringAttribute key="BLD::Info|Tool|Linker|nonDbgFlags|<%buildspec%>" value="<%linker_nondbgflags%>"/> +<%endfor%> + <booleanAttribute key="BLD::Info|Tool|Linker|object" value="false"/> + <booleanAttribute key="BLD::Info|Tool|Linker|passAble" value="false"/> + <stringAttribute key="BLD::Info|Tool|Linker|sigs" value=""/> +<%foreach(buildspecs)%> + <stringAttribute key="BLD::Info|Tool|Partial Image Linker|cmd|<%buildspec%>" value="echo "building $@";%linkerprefix% $(TOOL_PATH)<%cxx%> -r -nostdlib -Wl,-X %ToolFlags% -o %OutFile% %Objects% $(ADDED_OBJECTS) $(LIBPATH) <%if(linkflags)%> <%linkflags%><%endif%><%if(link_groups)%> -Wl,--start-group<%endif%> $(PARTIAL_LIBS) $(LIBS) <%if(link_groups)%>-Wl,--end-group<%endif%> $(ADDED_LIBPATH) $(ADDED_LIBS) && if [ "$(EXPAND_DBG)" = "1" ]; then plink "$@";fi"/> + <stringAttribute key="BLD::Info|Tool|Partial Image Linker|dbgFlags|<%buildspec%>" value="<%part_dbgflags%>"/> + <stringAttribute key="BLD::Info|Tool|Partial Image Linker|derivedSigs|<%buildspec%>" value="<%part_derivedsigs%>"/> + <stringAttribute key="BLD::Info|Tool|Partial Image Linker|flags|<%buildspec%>" value="<%part_flags%>"/> + <stringAttribute key="BLD::Info|Tool|Partial Image Linker|nonDbgFlags|<%buildspec%>" value="<%part_nondbgflags%>"/> +<%endfor%> + <booleanAttribute key="BLD::Info|Tool|Partial Image Linker|object" value="false"/> + <booleanAttribute key="BLD::Info|Tool|Partial Image Linker|passAble" value="true"/> + <stringAttribute key="BLD::Info|Tool|Partial Image Linker|sigs" value=""/> + <stringAttribute key="BLD::Info|cmd" value="%makeprefix% make --no-print-directory"/> + <stringAttribute key="BLD::Info|defaultSpec" value="<%default_buildspec%>"/> +<%foreach(buildspecs)%> + <stringAttribute key="BLD::Info|redirDir|<%buildspec%>" value="<%buildspec%>"/> +<%endfor%> + <stringAttribute key="BLD::Info|redirRoot" value=""/> + <listAttribute key="BLD::Info|specs"> +<%foreach(buildspecs)%> + <stringAttribute value="<%buildspec%>"/> +<%endfor%> + </listAttribute> + <intAttribute key="BuildSupportEnabled" value="1"/> +<%if(standard_build)%> + <booleanAttribute key="BuildTargetCentric" value="false"/> +<%if(exename || sharedname || staticname)%> + <listAttribute key="BLD::Tgt|Targets"> + <stringAttribute value="<%if(exename)%><%exename%><%else%><%if(staticname)%><%lib_prefix%><%staticname%><%else%><%lib_prefix%><%sharedname%><%endif%><%endif%>"/> +<%if(exename)%> + <stringAttribute value="<%exename%>_partialImage"/> +<%endif%> + </listAttribute> +<%if(exename)%> + <stringAttribute key="BLD::Tgt|Target|<%exename%>_partialImage|ToolName" value="Partial Image Linker"/> + <booleanAttribute key="BLD::Tgt|Target|<%exename%>_partialImage|passed" value="true"/> + <listAttribute key="BLD::Tgt|Target|<%exename%>_partialImage|refs"/> +<%endif%> + <stringAttribute key="BLD::Tgt|Target|<%if(exename)%><%exename%><%else%><%if(staticname)%><%lib_prefix%><%staticname%><%else%><%lib_prefix%><%sharedname%><%endif%><%endif%>|ToolName" value="<%if(sharedname || staticname)%>Librarian"<%else%>Linker"<%endif%>/> + <booleanAttribute key="BLD::Tgt|Target|<%if(exename)%><%exename%><%else%><%if(staticname)%><%lib_prefix%><%staticname%><%else%><%lib_prefix%><%sharedname%><%endif%><%endif%>|passed" value="false"/> + <listAttribute key="BLD::Tgt|Target|<%if(exename)%><%exename%><%else%><%if(staticname)%><%lib_prefix%><%staticname%><%else%><%lib_prefix%><%sharedname%><%endif%><%endif%>|refs"<%if(!exename)%>/<%endif%>> +<%if(exename)%> + <stringAttribute value="<%exename%>_partialImage"/> + </listAttribute> +<%endif%> +<%endif%> +<%else%> + <booleanAttribute key="BuildTargetCentric" value="true"/> +<%endif%> + </mapAttribute> + </attributes> +<%if(!standard_build)%> + <buildtargets> +<%if(exename)%> + <buildtarget buildtool="Linker" name="<%exename%>" passed="true" targetname="<%exename%>"> +<%else%> +<%if(sharedname || staticname)%> + <buildtarget buildtool="Librarian" name="<%if(sharedname)%><%lib_prefix%><%sharedname%><%else%><%lib_prefix%><%staticname%><%endif%>" passed="true" targetname="<%if(sharedname)%><%sharedname%><%else%><%staticname%><%endif%>"> +<%else%> + <buildtarget buildtool="Linker" name="<%exename%>" passed="true" targetname="<%exename%>"> +<%endif%> +<%endif%> + <contents> +<%if(exename)%> + <buildtargetreference name="/<%project_name%>/PartialImage"/> +<%else%> +<%foreach(source_files)%> + <file name="/<%project_name%>/<%source_file%>"/> +<%endfor%> +<%foreach(source_dirs)%> + <folder name="/<%source_dir%>" recursive="false"/> +<%endfor%> +<%endif%> + </contents> + </buildtarget> +<%if(exename)%> + <buildtarget buildtool="Partial Image Linker" name="PartialImage" passed="true" targetname="PartialImage"> + <attributes> + <mapAttribute> +<%foreach(buildspecs)%> + <stringAttribute key="BLD::Info|Tool|Partial Image Linker|cmd|<%buildspec%>" value="echo "building $@";%linkerprefix% $(TOOL_PATH)<%cxx%> -r -nostdlib -Wl,-X %ToolFlags% -o %OutFile% %Objects% $(ADDED_OBJECTS) $(LIBPATH) <%if(linkflags)%> <%linkflags%><%endif%><%if(link_groups)%> -Wl,--start-group<%endif%> $(PARTIAL_LIBS) $(LIBS) <%if(link_groups)%>-Wl,--end-group<%endif%> $(ADDED_LIBPATH) $(ADDED_LIBS) && if [ "$(EXPAND_DBG)" = "1" ]; then plink "$@";fi"/> +<%endfor%> + </mapAttribute> + </attributes> + <contents> +<%foreach(source_files)%> + <file name="/<%project_name%>/<%source_file%>"/> +<%endfor%> +<%foreach(source_dirs)%> + <folder name="/<%source_dir%>" recursive="false"/> +<%endfor%> + </contents> + </buildtarget> +<%endif%> + </buildtargets> +<%endif%> +</wrxml> + diff --git a/ACE/MPC/templates/windowscommon.mpt b/ACE/MPC/templates/windowscommon.mpt new file mode 100644 index 00000000000..4f7d3369e00 --- /dev/null +++ b/ACE/MPC/templates/windowscommon.mpt @@ -0,0 +1,7 @@ +// -*- MPC -*- +// $Id$ + +lib_prefix = +lib_ext = .lib +dll_ext = .dll +exe_ext = .exe diff --git a/ACE/MPC/templates/wix.mpd b/ACE/MPC/templates/wix.mpd new file mode 100644 index 00000000000..6a7f40e63ff --- /dev/null +++ b/ACE/MPC/templates/wix.mpd @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<Include> +<%marker(top)%> + <Fragment Id="<%project_name%>"> +<%if(sharedname || exename || install_location)%> + <DirectoryRef Id="INSTALLDIR"> +<%foreach(name, install_location)%> + <Directory Id="<%project_name%>.<%name%>" Name="<%name%>"> +<%endfor%> + + <Component Id="<%project_name%>" Guid="<%guid%>"> +<%marker(component_top)%> +<%if(install_binary(1))%> + <File Id="file.<%project_name%>" Name="<%if(type_is_dynamic)%><%sharedname%>.dll<%else%><%exename%>.exe<%endif%>" + Source="<%source_directory%>/<%if(type_is_dynamic)%><%sharedname%>.dll<%else%><%exename%>.exe<%endif%>" + DiskId="<%diskid(1)%>" /> +<%endif%> +<%if(install_resources)%> +<%foreach(resource_files)%> + <File Id="file.resource.<%resource_file%>" Name="<%resource_file%>" + Source="<%full_path(resource_file)%>" + DiskId="<%diskid(1)%>" /> + +<%endfor%> +<%endif%> +<%if(gme_install)%> + + <!-- registry information for GME component --> + <RegistryKey Root="<%gme_register(HKLM)%>" Key="SOFTWARE\GME\Components\<%gme_progid%>" Action="createAndRemoveOnUninstall"> + <RegistryValue Name="Description" Type="string" Value="<%gme_description%>" Action="write" /> +<%if(gme_has_icon)%> + <RegistryValue Name="Icon" Type="string" Value="<%gme_icon(,IDI_COMPICON)%>" Action="write" /> +<%endif%> + <RegistryValue Name="Paradigm" Type="string" Value="<%foreach(gme_paradigms)%><%gme_paradigm%><%fornotlast(",")%><%endfor%>" Action="write" /> + <RegistryValue Name="Tooltip" Type="string" Value="<%gme_tooltip%>" Action="write" /> + <RegistryValue Name="Type" Type="integer" Value="<%gme_component_type(1)%>" Action="write" /> + </RegistryKey> + + <RegistryKey Root="<%gme_register(HKLM)%>" Key="SOFTWARE\GME\Components\<%gme_progid%>\Associated" Action="create"> +<%foreach(gme_paradigms)%> + <RegistryValue Name="<%gme_paradigm%>" Type="string" Action="write" Value="" /> +<%endfor%> + </RegistryKey> + + <RegistryKey Root="<%gme_register(HKLM)%>" Key="SOFTWARE\Classes\<%gme_progid%>" Action="createAndRemoveOnUninstall"> + <RegistryValue Type="string" Value="<%gme_description%>" /> + </RegistryKey> + + <RegistryKey Root="<%gme_register(HKLM)%>" Key="SOFTWARE\Classes\<%gme_progid%>\CLSID" Action="create"> + <RegistryValue Type="string" Value="{<%gme_uuid%>}" /> + </RegistryKey> + + <RegistryKey Root="<%gme_register(HKLM)%>" Key="SOFTWARE\Classes\CLSID\{<%gme_uuid%>}" Action="createAndRemoveOnUninstall"> + <RegistryValue Type="string" Value="<%gme_description%>" /> + </RegistryKey> + + <RegistryKey Root="<%gme_register(HKLM)%>" Key="SOFTWARE\Classes\CLSID\{<%gme_uuid%>}\InProcServer32" Action="create"> + <RegistryValue Type="string" Value="[INSTALLDIR]<%foreach(name, install_location)%><%name%>\\<%endfor%><%sharedname%>.dll" /> + </RegistryKey> + + <RegistryKey Root="<%gme_register(HKLM)%>" Key="SOFTWARE\Classes\CLSID\{<%gme_uuid%>}\ProgID" Action="create"> + <RegistryValue Type="string" Value="<%gme_progid%>" /> + </RegistryKey> +<%endif%> +<%marker(component_bottom)%> + </Component> +<%foreach(name, install_location)%> + </Directory> +<%endfor%> + </DirectoryRef> +<%endif%> + </Fragment> +<%marker(bottom)%> +</Include> diff --git a/ACE/MPC/templates/wix.mpt b/ACE/MPC/templates/wix.mpt new file mode 100644 index 00000000000..300ea4b23c4 --- /dev/null +++ b/ACE/MPC/templates/wix.mpt @@ -0,0 +1,4 @@ +// -*- MPC -*- +// $Id$ + +conditional_include "common" diff --git a/ACE/MPC/vs_postclean.pl b/ACE/MPC/vs_postclean.pl new file mode 100755 index 00000000000..3283b850c9a --- /dev/null +++ b/ACE/MPC/vs_postclean.pl @@ -0,0 +1,136 @@ +#! /usr/bin/perl +eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' + & eval 'exec perl -w -S $0 $argv:q' + if 0; + +# ****************************************************************** +# Author: Chad Elliott +# Date: 7/10/2008 +# Description: Visual Studio doesn't support a post clean build step, +# so this script will do it. +# $Id$ +# ****************************************************************** + +# ****************************************************************** +# Pragma Section +# ****************************************************************** + +use strict; +use FileHandle; +use File::Basename; +use Cwd; + +# ****************************************************************** +# Data Section +# ****************************************************************** + +my $version = '1.0'; + +# ****************************************************************** +# Subroutine Section +# ****************************************************************** + +sub read_proj { + my($cfg, $file) = @_; + my $fh = new FileHandle(); + my $cmd; + + if (open($fh, $file)) { + my $cfg_ok; + my $next_name; + my $next_command; + while(<$fh>) { + ## Locate the start of a Configuration section + if (/<Configuration\s*$/) { + $next_name = 1; + } + ## Next, find the configuration name + elsif ($next_name && /Name="(.+)"/) { + $cfg_ok = ($1 eq $cfg); + $next_name = undef; + } + ## Next, find the post clean event + elsif ($cfg_ok && /Name="VCPostCleanEventTool"/) { + $next_command = 1; + } + ## And finally, get the postclean command line + elsif ($next_command && /CommandLine="(.+)"/) { + $cmd = $1; + last; + } + } + close($fh); + } + + ## Convert frequently used XML sequences to plain characters. + $cmd =~ s/&/&/g; + $cmd =~ s/"/\"/g; + $cmd =~ s/>/>/g; + $cmd =~ s/</</g; + + ## Return the command line (undef if there was no postclean) + return $cmd; +} + +sub clean_proj { + my($cfg, $file) = @_; + + ## Read the postclean command from the project + my $cmd = read_proj($cfg, $file); + + ## Move to the directory of the project and run the command + if (defined $cmd) { + my $current_dir = getcwd(); + if (chdir(dirname($file))) { + system($cmd); + chdir($current_dir); + } + else { + ## We'll only warn about files that we can't deal with. + print "WARNING: Unable to postclean $file\n"; + } + } +} + +sub clean_sln { + my($cfg, $file) = @_; + my $fh = new FileHandle(); + + ## For a solution, just read in and clean each project file we find. + if (open($fh, $file)) { + while (<$fh>) { + if (/^Project\([^)]+\)\s*=\s*"[^\"]+",\s*"([^\"]+)"/) { + clean_proj($cfg, $1); + } + } + close($fh); + } +} + +# ****************************************************************** +# Main Section +# ****************************************************************** + +if ($#ARGV == -1) { + print "PostClean v$version\n", + "Usage: ", basename($0), " [CFG=<configuration>] <project or solution files>\n"; + exit(0); +} + +## Determine the project or solution configuration (defaulting to the +## default created by MPC). +my $cfg = 'Debug|Win32'; +if ($ARGV[0] =~ /^CFG=(.+)/) { + $cfg = $1; + shift(@ARGV); +} + +foreach my $file (@ARGV) { + if ($file =~ /\.sln$/) { + clean_sln($cfg, $file); + } + else { + ## It's not a solution file, we'll assume it's a project + clean_proj($cfg, $file); + } +} |