summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbdullah Sowayan <sowayan@users.noreply.github.com>2010-02-24 20:20:21 +0000
committerAbdullah Sowayan <sowayan@users.noreply.github.com>2010-02-24 20:20:21 +0000
commit035b47c1a6985e2b884182ab0f3bb1afa714a48f (patch)
tree48d75721f242b7a0eb4398a65b672a152bdaa37f
parenta3894e5127aa8cf1892e717ab30f02e053cdb482 (diff)
downloadATCD-ACE+TAO+CIAO-5_7_6_NGC_Patches.tar.gz
-rw-r--r--ACE/MPC/ChangeLog1120
-rw-r--r--ACE/MPC/MPC.icobin0 -> 7168 bytes
-rw-r--r--ACE/MPC/PROBLEM-REPORT-FORM30
-rwxr-xr-xACE/MPC/clone_build_tree.pl542
-rwxr-xr-xACE/MPC/combine_dsw.pl145
-rw-r--r--ACE/MPC/config/bison.mpb14
-rw-r--r--ACE/MPC/config/boost_base.mpb15
-rw-r--r--ACE/MPC/config/boost_date_time.mpb8
-rw-r--r--ACE/MPC/config/boost_filesystem.mpb8
-rw-r--r--ACE/MPC/config/boost_iostreams.mpb8
-rw-r--r--ACE/MPC/config/boost_prg_exec_monitor.mpb8
-rw-r--r--ACE/MPC/config/boost_program_options.mpb8
-rw-r--r--ACE/MPC/config/boost_python.mpb6
-rw-r--r--ACE/MPC/config/boost_regex.mpb8
-rw-r--r--ACE/MPC/config/boost_serialization.mpb8
-rw-r--r--ACE/MPC/config/boost_signals.mpb8
-rw-r--r--ACE/MPC/config/boost_system.mpb8
-rw-r--r--ACE/MPC/config/boost_test_exec_monitor.mpb8
-rw-r--r--ACE/MPC/config/boost_thread.mpb8
-rw-r--r--ACE/MPC/config/boost_unit_test_framework.mpb11
-rw-r--r--ACE/MPC/config/boost_wave.mpb8
-rw-r--r--ACE/MPC/config/build_files.mpb7
-rw-r--r--ACE/MPC/config/bzip2.mpb14
-rw-r--r--ACE/MPC/config/cppunit.mpb8
-rw-r--r--ACE/MPC/config/default.rel6
-rw-r--r--ACE/MPC/config/erlang.mpb15
-rw-r--r--ACE/MPC/config/erlang_otp.mpb12
-rw-r--r--ACE/MPC/config/flex.mpb13
-rw-r--r--ACE/MPC/config/gacutil.mpb8
-rw-r--r--ACE/MPC/config/global.features39
-rw-r--r--ACE/MPC/config/global.mpb12
-rw-r--r--ACE/MPC/config/gsl.mpb6
-rw-r--r--ACE/MPC/config/iiopnet.mpb19
-rw-r--r--ACE/MPC/config/iodbc.mpb12
-rw-r--r--ACE/MPC/config/ixml.mpb7
-rw-r--r--ACE/MPC/config/lex.mpb13
-rw-r--r--ACE/MPC/config/libpng.mpb10
-rw-r--r--ACE/MPC/config/log4cplus.mpb8
-rw-r--r--ACE/MPC/config/loki.mpb8
-rw-r--r--ACE/MPC/config/lzo1.mpb12
-rw-r--r--ACE/MPC/config/lzo2.mpb8
-rw-r--r--ACE/MPC/config/mfc.mpb16
-rw-r--r--ACE/MPC/config/mpb.mpb12
-rw-r--r--ACE/MPC/config/mpich.mpb13
-rw-r--r--ACE/MPC/config/msgfmt.mpb11
-rw-r--r--ACE/MPC/config/mysql.mpb8
-rw-r--r--ACE/MPC/config/mysqlpp.mpb8
-rw-r--r--ACE/MPC/config/ndds_ts_defaults.mpb24
-rw-r--r--ACE/MPC/config/nddsexe.mpb5
-rw-r--r--ACE/MPC/config/nddsexe_with_idl.mpb5
-rw-r--r--ACE/MPC/config/nddslib.mpb15
-rw-r--r--ACE/MPC/config/nddslib_with_idl.mpb5
-rw-r--r--ACE/MPC/config/odbc.mpb23
-rw-r--r--ACE/MPC/config/openmpi.mpb9
-rw-r--r--ACE/MPC/config/openssl.mpb32
-rw-r--r--ACE/MPC/config/pcre.mpb17
-rw-r--r--ACE/MPC/config/pcreposix.mpb5
-rw-r--r--ACE/MPC/config/python.mpb8
-rw-r--r--ACE/MPC/config/qt.mpb55
-rw-r--r--ACE/MPC/config/qt3.mpb5
-rw-r--r--ACE/MPC/config/qt4_core.mpb16
-rw-r--r--ACE/MPC/config/qt4_designer.mpb6
-rw-r--r--ACE/MPC/config/qt4_designercomponents.mpb6
-rw-r--r--ACE/MPC/config/qt4_gui.mpb36
-rw-r--r--ACE/MPC/config/qt4_network.mpb6
-rw-r--r--ACE/MPC/config/qt4_opengl.mpb6
-rw-r--r--ACE/MPC/config/qt4_qt3support.mpb7
-rw-r--r--ACE/MPC/config/qt4_sql.mpb6
-rw-r--r--ACE/MPC/config/qt4_svg.mpb6
-rw-r--r--ACE/MPC/config/qt4_test.mpb6
-rw-r--r--ACE/MPC/config/qt4_xml.mpb6
-rw-r--r--ACE/MPC/config/qwt.mpb11
-rw-r--r--ACE/MPC/config/rpc.mpb15
-rw-r--r--ACE/MPC/config/ruby.mpb6
-rw-r--r--ACE/MPC/config/splice_ts_defaults.mpb24
-rw-r--r--ACE/MPC/config/spliceexe.mpb5
-rw-r--r--ACE/MPC/config/spliceexe_with_idl.mpb5
-rw-r--r--ACE/MPC/config/splicelib.mpb21
-rw-r--r--ACE/MPC/config/splicelib_with_idl.mpb5
-rw-r--r--ACE/MPC/config/sqlite3.mpb8
-rw-r--r--ACE/MPC/config/swig_java.mpb16
-rw-r--r--ACE/MPC/config/swig_perl.mpb19
-rw-r--r--ACE/MPC/config/swig_php.mpb19
-rw-r--r--ACE/MPC/config/swig_python.mpb20
-rw-r--r--ACE/MPC/config/swig_ruby.mpb19
-rw-r--r--ACE/MPC/config/swig_tcl.mpb15
-rw-r--r--ACE/MPC/config/udm.mpb29
-rw-r--r--ACE/MPC/config/unicode.mpb8
-rw-r--r--ACE/MPC/config/unixodbc.mpb10
-rw-r--r--ACE/MPC/config/upnp.mpb5
-rw-r--r--ACE/MPC/config/wix.mpb29
-rw-r--r--ACE/MPC/config/wix_ui.mpb8
-rw-r--r--ACE/MPC/config/wix_xml.mpb8
-rw-r--r--ACE/MPC/config/xalanc.mpb9
-rw-r--r--ACE/MPC/config/xerces.mpb57
-rw-r--r--ACE/MPC/config/yacc.mpb15
-rw-r--r--ACE/MPC/config/ziparchive.mpb8
-rw-r--r--ACE/MPC/config/zlib.mpb17
-rw-r--r--ACE/MPC/config/zzip.mpb17
-rwxr-xr-xACE/MPC/create_base.pl199
-rwxr-xr-xACE/MPC/depgen.pl36
-rwxr-xr-xACE/MPC/devtools/document_template.pl372
-rwxr-xr-xACE/MPC/devtools/highlight_template.pl242
-rw-r--r--ACE/MPC/docs/LICENSE53
-rw-r--r--ACE/MPC/docs/MPC.sgml560
-rw-r--r--ACE/MPC/docs/README981
-rw-r--r--ACE/MPC/docs/USAGE306
-rw-r--r--ACE/MPC/docs/html/MakeProjectCreator.css1713
-rw-r--r--ACE/MPC/docs/html/MakeProjectCreator.html7148
-rw-r--r--ACE/MPC/docs/html/images/OCILOGO_bw_book.epsbin0 -> 72640 bytes
-rw-r--r--ACE/MPC/docs/html/images/mpc.fig74
-rw-r--r--ACE/MPC/docs/html/images/mpc.gifbin0 -> 3368 bytes
-rw-r--r--ACE/MPC/docs/html/images/mpc_mtiff.epsbin0 -> 38047 bytes
-rw-r--r--ACE/MPC/docs/html/images/mwc.fig46
-rw-r--r--ACE/MPC/docs/html/images/mwc.gifbin0 -> 1960 bytes
-rw-r--r--ACE/MPC/docs/html/images/mwc_mtiff.epsbin0 -> 16107 bytes
-rw-r--r--ACE/MPC/docs/templates/automake.txt19
-rw-r--r--ACE/MPC/docs/templates/bmake.txt32
-rw-r--r--ACE/MPC/docs/templates/cc.txt13
-rw-r--r--ACE/MPC/docs/templates/common.txt37
-rw-r--r--ACE/MPC/docs/templates/ghs.txt14
-rw-r--r--ACE/MPC/docs/templates/make.net.txt40
-rw-r--r--ACE/MPC/docs/templates/make.txt74
-rw-r--r--ACE/MPC/docs/templates/vc7.txt55
-rw-r--r--ACE/MPC/docs/templates/vc7csharp.txt18
-rw-r--r--ACE/MPC/docs/templates/vc7java.txt18
-rw-r--r--ACE/MPC/docs/templates/vc7vb.txt16
-rw-r--r--ACE/MPC/docs/templates/vc8.txt147
-rw-r--r--ACE/MPC/docs/templates/vc8csharp.txt20
-rw-r--r--ACE/MPC/docs/templates/vc8java.txt18
-rw-r--r--ACE/MPC/docs/templates/vc8vb.txt16
-rw-r--r--ACE/MPC/docs/templates/wb26.txt12
-rw-r--r--ACE/MPC/docs/templates/wix.txt9
-rwxr-xr-xACE/MPC/generate_export_header.pl126
-rw-r--r--ACE/MPC/history/ChangeLog-3_12088
-rw-r--r--ACE/MPC/history/ChangeLog-3_22053
-rw-r--r--ACE/MPC/history/ChangeLog-3_31985
-rw-r--r--ACE/MPC/history/ChangeLog-3_41718
-rw-r--r--ACE/MPC/history/ChangeLog-3_51397
-rw-r--r--ACE/MPC/history/ChangeLog-3_61248
-rw-r--r--ACE/MPC/modules/AutomakeProjectCreator.pm62
-rw-r--r--ACE/MPC/modules/AutomakeWorkspaceCreator.pm778
-rw-r--r--ACE/MPC/modules/BCB2007ProjectCreator.pm50
-rw-r--r--ACE/MPC/modules/BCB2007WorkspaceCreator.pm123
-rw-r--r--ACE/MPC/modules/BCB2009ProjectCreator.pm36
-rw-r--r--ACE/MPC/modules/BCB2009WorkspaceCreator.pm36
-rw-r--r--ACE/MPC/modules/BDS4ProjectCreator.pm50
-rw-r--r--ACE/MPC/modules/BDS4WorkspaceCreator.pm89
-rw-r--r--ACE/MPC/modules/BMakeProjectCreator.pm111
-rw-r--r--ACE/MPC/modules/BMakeWorkspaceCreator.pm99
-rw-r--r--ACE/MPC/modules/BorlandProjectBase.pm36
-rw-r--r--ACE/MPC/modules/CCProjectCreator.pm62
-rw-r--r--ACE/MPC/modules/CCWorkspaceCreator.pm117
-rw-r--r--ACE/MPC/modules/CommandHelper.pm96
-rw-r--r--ACE/MPC/modules/ConfigParser.pm129
-rw-r--r--ACE/MPC/modules/Creator.pm1310
-rw-r--r--ACE/MPC/modules/Depgen/DependencyEditor.pm117
-rw-r--r--ACE/MPC/modules/Depgen/DependencyGenerator.pm67
-rw-r--r--ACE/MPC/modules/Depgen/DependencyWriter.pm30
-rw-r--r--ACE/MPC/modules/Depgen/DependencyWriterFactory.pm40
-rw-r--r--ACE/MPC/modules/Depgen/Driver.pm244
-rw-r--r--ACE/MPC/modules/Depgen/MakeDependencyWriter.pm43
-rw-r--r--ACE/MPC/modules/Depgen/MakeObjectGenerator.pm43
-rw-r--r--ACE/MPC/modules/Depgen/NMakeDependencyWriter.pm53
-rw-r--r--ACE/MPC/modules/Depgen/NMakeObjectGenerator.pm51
-rw-r--r--ACE/MPC/modules/Depgen/ObjectGenerator.pm30
-rw-r--r--ACE/MPC/modules/Depgen/ObjectGeneratorFactory.pm40
-rw-r--r--ACE/MPC/modules/Depgen/Preprocessor.pm145
-rw-r--r--ACE/MPC/modules/DirectoryManager.pm205
-rw-r--r--ACE/MPC/modules/Driver.pm636
-rw-r--r--ACE/MPC/modules/EM3ProjectCreator.pm54
-rw-r--r--ACE/MPC/modules/EM3WorkspaceCreator.pm53
-rw-r--r--ACE/MPC/modules/FeatureParser.pm89
-rw-r--r--ACE/MPC/modules/GHSProjectCreator.pm166
-rw-r--r--ACE/MPC/modules/GHSWorkspaceCreator.pm199
-rw-r--r--ACE/MPC/modules/GUID.pm48
-rw-r--r--ACE/MPC/modules/HTMLProjectCreator.pm133
-rw-r--r--ACE/MPC/modules/HTMLWorkspaceCreator.pm90
-rw-r--r--ACE/MPC/modules/MPC.pm41
-rw-r--r--ACE/MPC/modules/MWC.pm41
-rw-r--r--ACE/MPC/modules/MakeProjectBase.pm51
-rw-r--r--ACE/MPC/modules/MakeProjectCreator.pm105
-rw-r--r--ACE/MPC/modules/MakeWorkspaceBase.pm343
-rw-r--r--ACE/MPC/modules/MakeWorkspaceCreator.pm71
-rw-r--r--ACE/MPC/modules/NMakeProjectCreator.pm65
-rw-r--r--ACE/MPC/modules/NMakeWorkspaceCreator.pm108
-rw-r--r--ACE/MPC/modules/Options.pm602
-rw-r--r--ACE/MPC/modules/OutputMessage.pm106
-rw-r--r--ACE/MPC/modules/Parser.pm196
-rw-r--r--ACE/MPC/modules/ProjectCreator.pm5425
-rw-r--r--ACE/MPC/modules/SLEProjectCreator.pm43
-rw-r--r--ACE/MPC/modules/SLEWorkspaceCreator.pm65
-rw-r--r--ACE/MPC/modules/StringProcessor.pm133
-rw-r--r--ACE/MPC/modules/TemplateInputReader.pm140
-rw-r--r--ACE/MPC/modules/TemplateParser.pm2050
-rw-r--r--ACE/MPC/modules/VC10ProjectCreator.pm20
-rw-r--r--ACE/MPC/modules/VC10WorkspaceCreator.pm42
-rw-r--r--ACE/MPC/modules/VC6ProjectCreator.pm81
-rw-r--r--ACE/MPC/modules/VC6WorkspaceCreator.pm105
-rw-r--r--ACE/MPC/modules/VC71ProjectCreator.pm37
-rw-r--r--ACE/MPC/modules/VC71WorkspaceCreator.pm82
-rw-r--r--ACE/MPC/modules/VC7ProjectCreator.pm150
-rw-r--r--ACE/MPC/modules/VC7WorkspaceCreator.pm295
-rw-r--r--ACE/MPC/modules/VC8ProjectCreator.pm113
-rw-r--r--ACE/MPC/modules/VC8WorkspaceCreator.pm248
-rw-r--r--ACE/MPC/modules/VC9ProjectCreator.pm35
-rw-r--r--ACE/MPC/modules/VC9WorkspaceCreator.pm42
-rw-r--r--ACE/MPC/modules/VCProjectBase.pm61
-rw-r--r--ACE/MPC/modules/Version.pm58
-rw-r--r--ACE/MPC/modules/WB26ProjectCreator.pm85
-rw-r--r--ACE/MPC/modules/WB26WorkspaceCreator.pm204
-rw-r--r--ACE/MPC/modules/WinProjectBase.pm119
-rw-r--r--ACE/MPC/modules/WinVersionTranslator.pm69
-rw-r--r--ACE/MPC/modules/WinWorkspaceBase.pm35
-rw-r--r--ACE/MPC/modules/WixProjectCreator.pm120
-rw-r--r--ACE/MPC/modules/WixWorkspaceCreator.pm81
-rw-r--r--ACE/MPC/modules/WorkspaceCreator.pm2354
-rw-r--r--ACE/MPC/modules/WorkspaceHelper.pm88
-rw-r--r--ACE/MPC/modules/XMLProjectBase.pm49
-rwxr-xr-xACE/MPC/mpc.pl46
-rwxr-xr-xACE/MPC/mwc.pl46
-rwxr-xr-xACE/MPC/prj_install.pl402
-rwxr-xr-xACE/MPC/registry.pl205
-rw-r--r--ACE/MPC/rpm/MPC.spec30
-rwxr-xr-xACE/MPC/rpm/buildrpm.sh96
-rw-r--r--ACE/MPC/templates/automake.mpd355
-rw-r--r--ACE/MPC/templates/automakedll.mpt14
-rw-r--r--ACE/MPC/templates/automakeexe.mpt5
-rw-r--r--ACE/MPC/templates/bcb2007.mpd177
-rw-r--r--ACE/MPC/templates/bcb2007dll.mpt9
-rw-r--r--ACE/MPC/templates/bcb2007exe.mpt9
-rw-r--r--ACE/MPC/templates/bcb2009.mpd178
-rw-r--r--ACE/MPC/templates/bcb2009dll.mpt9
-rw-r--r--ACE/MPC/templates/bcb2009exe.mpt9
-rw-r--r--ACE/MPC/templates/bds4.mpd268
-rw-r--r--ACE/MPC/templates/bds4dll.mpt9
-rw-r--r--ACE/MPC/templates/bds4exe.mpt9
-rw-r--r--ACE/MPC/templates/bmake.mpd374
-rw-r--r--ACE/MPC/templates/bmakecommon.mpt28
-rw-r--r--ACE/MPC/templates/bmakedll.mpt45
-rw-r--r--ACE/MPC/templates/bmakedllexe.mpt48
-rw-r--r--ACE/MPC/templates/bmakelib.mpt21
-rw-r--r--ACE/MPC/templates/bmakelibexe.mpt27
-rw-r--r--ACE/MPC/templates/cc.mpd93
-rw-r--r--ACE/MPC/templates/cccommon.mpt29
-rw-r--r--ACE/MPC/templates/ccexe.mpt5
-rw-r--r--ACE/MPC/templates/cclib.mpt5
-rw-r--r--ACE/MPC/templates/common.mpt8
-rw-r--r--ACE/MPC/templates/em3.mpd395
-rw-r--r--ACE/MPC/templates/em3vcpdll.mpt104
-rw-r--r--ACE/MPC/templates/em3vcpdllexe.mpt105
-rw-r--r--ACE/MPC/templates/em3vcplib.mpt100
-rw-r--r--ACE/MPC/templates/em3vcplibexe.mpt108
-rw-r--r--ACE/MPC/templates/ghs.mpd195
-rw-r--r--ACE/MPC/templates/ghscommon.mpt9
-rw-r--r--ACE/MPC/templates/ghsdll.mpt6
-rw-r--r--ACE/MPC/templates/ghsdllexe.mpt6
-rw-r--r--ACE/MPC/templates/ghslib.mpt6
-rw-r--r--ACE/MPC/templates/ghslibexe.mpt6
-rw-r--r--ACE/MPC/templates/html.mpd176
-rw-r--r--ACE/MPC/templates/make.mpd362
-rw-r--r--ACE/MPC/templates/make.net.mpd131
-rw-r--r--ACE/MPC/templates/make.net.mpt40
-rw-r--r--ACE/MPC/templates/makedll.mpt428
-rw-r--r--ACE/MPC/templates/makeexe.mpt5
-rw-r--r--ACE/MPC/templates/nmake.mpd346
-rw-r--r--ACE/MPC/templates/nmakedll.mpt177
-rw-r--r--ACE/MPC/templates/nmakeexe.mpt153
-rw-r--r--ACE/MPC/templates/sle.mpd254
-rw-r--r--ACE/MPC/templates/sledll.mpt7
-rw-r--r--ACE/MPC/templates/sleexe.mpt7
-rw-r--r--ACE/MPC/templates/unixcommon.mpt7
-rw-r--r--ACE/MPC/templates/vc6.mpd380
-rw-r--r--ACE/MPC/templates/vc6dspdll.mpt64
-rw-r--r--ACE/MPC/templates/vc6dspdllexe.mpt71
-rw-r--r--ACE/MPC/templates/vc6dsplib.mpt64
-rw-r--r--ACE/MPC/templates/vc6dsplibexe.mpt74
-rw-r--r--ACE/MPC/templates/vc7.mpd656
-rw-r--r--ACE/MPC/templates/vc7csharp.mpd141
-rw-r--r--ACE/MPC/templates/vc7csharp.mpt20
-rw-r--r--ACE/MPC/templates/vc7dll.mpt101
-rw-r--r--ACE/MPC/templates/vc7exe.mpt106
-rw-r--r--ACE/MPC/templates/vc7java.mpd104
-rw-r--r--ACE/MPC/templates/vc7java.mpt20
-rw-r--r--ACE/MPC/templates/vc7lib.mpt97
-rw-r--r--ACE/MPC/templates/vc7libexe.mpt108
-rw-r--r--ACE/MPC/templates/vc7vb.mpd137
-rw-r--r--ACE/MPC/templates/vc7vb.mpt20
-rw-r--r--ACE/MPC/templates/vc8.mpd1025
-rw-r--r--ACE/MPC/templates/vc8csharp.mpd187
-rw-r--r--ACE/MPC/templates/vc8csharp.mpt21
-rw-r--r--ACE/MPC/templates/vc8dll.mpt72
-rw-r--r--ACE/MPC/templates/vc8exe.mpt76
-rw-r--r--ACE/MPC/templates/vc8java.mpd109
-rw-r--r--ACE/MPC/templates/vc8java.mpt21
-rw-r--r--ACE/MPC/templates/vc8lib.mpt70
-rw-r--r--ACE/MPC/templates/vc8libexe.mpt77
-rw-r--r--ACE/MPC/templates/vc8platforms.mpt176
-rw-r--r--ACE/MPC/templates/vc8vb.mpd125
-rw-r--r--ACE/MPC/templates/vc8vb.mpt21
-rw-r--r--ACE/MPC/templates/vccommon.mpt9
-rw-r--r--ACE/MPC/templates/wb26.mpd53
-rw-r--r--ACE/MPC/templates/wb26dll.mpt151
-rw-r--r--ACE/MPC/templates/wb26exe.mpt6
-rw-r--r--ACE/MPC/templates/wb26wrmakefile.mpd375
-rw-r--r--ACE/MPC/templates/wb26wrproject.mpd217
-rw-r--r--ACE/MPC/templates/windowscommon.mpt7
-rw-r--r--ACE/MPC/templates/wix.mpd74
-rw-r--r--ACE/MPC/templates/wix.mpt4
-rwxr-xr-xACE/MPC/vs_postclean.pl136
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
new file mode 100644
index 00000000000..2d56840fd1c
--- /dev/null
+++ b/ACE/MPC/MPC.ico
Binary files differ
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) || '&nbsp;';
+ 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/</&lt;/g;
+ $desc =~ s/>/&gt;/g;
+
+ print $fh " <tr>\n",
+ " <td>$key</td>\n",
+ " <td>", (defined $def ? $def : '&nbsp'), "</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/&/&amp;/g;
+ $line =~ s/</&lt;/g;
+ $line =~ s/>/&gt;/g;
+ $line =~ s/"/&quot;/g;
+ $line =~ s/ /&nbsp;/g;
+ $line =~ s/\t/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/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">&nbsp;</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">&nbsp;</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">&nbsp;</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&rsquo;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 &ldquo;install&rdquo; file after processing each
+ project. These &ldquo;install&rdquo; 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 &ldquo;make&rdquo; 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">&nbsp;</p>
+
+ <p class="Code">mwc.pl -relative
+ PROJ_TOP=/usr/projects/top</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">project {</p>
+
+ <p class="Code">&nbsp;&nbsp;includes += $(PROJ_TOP)</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</p>
+ </li>
+
+ <li class="Body">The generated project file would contain text
+ similar to:</li>
+
+ <li style="list-style: none">
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">CPPFLAGS += -I..</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">mpc.pl -type vc71 -ti lib:vc7dsplib -ti
+ dll:vc7dspdll</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">mwc.pl -value_project
+ includes+=/include/path</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">mwc.pl -type vc71 -value_template
+ configurations=Release</p>
+
+ <p class="Code">&nbsp;</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">&lt;%</em> and
+ <em class="Code">%&gt;</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">&nbsp;</p>
+
+ <p class="Code">/foo/bar_root = /foo/bar_root/MPC/config</p>
+
+ <p class="Code">&nbsp;</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">&lt;language&gt;:&lt;func name&gt;[,
+ &lt;language&gt;:&lt;func name&gt;]*</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 &ldquo;projects&rdquo; 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
+ &ldquo;workspaces,&rdquo; 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">&nbsp;</p>
+
+ <p class="Code">workspace(optional name):
+ optional_base_workspace {</p>
+
+ <p class="Code">&nbsp;&nbsp;file.mpc</p>
+
+ <p class="Code">&nbsp;&nbsp;directory</p>
+
+ <p class="Code">&nbsp;&nbsp;other.mwc</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;&nbsp;exclude(vc6, vc7, vc71, vc8, vc9,
+ vc10, nmake) {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;this_directory</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">workspace {</p>
+
+ <p class="Code">&nbsp;&nbsp;...</p>
+
+ <p class="Code">&nbsp;&nbsp;static {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;cmdline += -static</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;directory/foo.mpc</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;&nbsp;exclude(gnuace, make) {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;some.mpc</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;&nbsp;// Associate the name "other" with
+ dir3</p>
+
+ <p class="Code">&nbsp;&nbsp;associate(other) {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;dir3</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</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 &ldquo;projects&rdquo; and each project
+ can inherit from base projects.</li>
+
+ <li style="list-style: none">
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">project(optional name): base_project,
+ another_base_project {</p>
+
+ <p class="Code">&nbsp;&nbsp;exename = client</p>
+
+ <p class="Code">&nbsp;&nbsp;includes += directory_name
+ other_directory</p>
+
+ <p class="Code">&nbsp;&nbsp;libpaths += /usr/X11R6/lib</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;&nbsp;Header_Files {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;file1.h</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;file2.h</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;fileN.h</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;&nbsp;Source_Files {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;file1.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;file2.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;fileN.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</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&rsquo;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">&lt;% %&gt;</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">&lt;% %&gt;</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">&lt;%
+ %&gt;</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 &ldquo;project&rdquo; 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">&nbsp;</p>
+
+ <p class="Code">Source_Files {</p>
+
+ <p class="Code">&nbsp;&nbsp;file1.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;file2.cpp</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">Source_Files(MACRO_NAME) {</p>
+
+ <p class="Code">&nbsp;&nbsp;BlockA {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;file1.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;file2.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">&nbsp;&nbsp;BlockB {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;file3.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;file4.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">verbatim(&lt;project type&gt;,
+ &lt;location&gt;) {</p>
+
+ <p class="Code">&nbsp;&nbsp;...</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</p>
+ </li>
+
+ <li class="Body">When MPC is generating a project of type
+ <em class="Code">&lt;project type&gt;</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">&lt;location&gt;</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">&nbsp;</p>
+
+ <p class="Code">verbatim(gnuace, bottom) {</p>
+
+ <p class="Code">&nbsp;&nbsp;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">&nbsp;</p>
+
+ <p class="Code">expand(VAR_NAME) {</p>
+
+ <p class="Code">&nbsp;&nbsp;$ENV_VAR</p>
+
+ <p class="Code">&nbsp;&nbsp;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">&nbsp;</p>
+
+ <p class="Code">specific(prop:windows) {</p>
+
+ <p class="Code">&nbsp;&nbsp;lit_libs += qt-mt230nc</p>
+
+ <p class="Code">} else {</p>
+
+ <p class="Code">&nbsp;&nbsp;lit_libs += qt-mt</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</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 &rsquo;!&rsquo;)
+ 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">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">Yes</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</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">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</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">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</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">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</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">&nbsp;</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">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</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">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</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">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</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">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">Yes</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</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">&nbsp;</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">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</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">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</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">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</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">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</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">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</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">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</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">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">conditional(&lt;project type|property&gt; [,
+ &lt;project type|property&gt; ...]) {</p>
+
+ <p class="Code">&nbsp;&nbsp;source1.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;...</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">conditional(&lt;project type|property&gt; [,
+ &lt;project type|property&gt; ...]) {</p>
+
+ <p class="Code">&nbsp;&nbsp;source1.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;...</p>
+
+ <p class="Code">} else {</p>
+
+ <p class="Code">&nbsp;&nbsp;source2.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;...</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</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 &rsquo;!&rsquo;) 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">&nbsp;</p>
+
+ <p class="Code">project {</p>
+
+ <p class="Code">&nbsp;&nbsp;Define_Custom(MOC) {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;automatic = 0</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;command =
+ $(QTDIR)/bin/moc</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;output_option =
+ -o</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;inputext = .h</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;pre_extension =
+ _moc</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;source_outputext =
+ .cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;keyword mocflags =
+ commandflags</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;&nbsp;// Custom Component</p>
+
+ <p class="Code">&nbsp;&nbsp;MOC_Files {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;QtReactor.h</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;&nbsp;Source_Files {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;QtReactor_moc.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</p>
+ </li>
+
+ <li class="Body">The above example defines a custom file type,
+ &ldquo;<em class="Code">MOC</em> &rdquo;, 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
+ &lt;name&gt;</em></p>
+ </td>
+
+ <td rowspan="1" colspan="1">
+ <p class="Tbl-Body">This is a special assignment that
+ allows the user to map &lt;name&gt; 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
+ &ldquo;automatic&rdquo; 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">&gt;&gt;</em> construct.</li>
+
+ <li class="Body">Below is an example that demonstrates the use
+ of <em class="Code">&gt;&gt;</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">&nbsp;</p>
+
+ <p class="Code">project {</p>
+
+ <p class="Code">&nbsp;&nbsp;Define_Custom(Quogen) {</p>
+
+ <p class="Code">&nbsp;&nbsp;automatic = 0</p>
+
+ <p class="Code">&nbsp;&nbsp;command = perl quogen.pl</p>
+
+ <p class="Code">&nbsp;&nbsp;commandflags = --debuglevel=1
+ --language=c++ \</p>
+
+ <p class="Code">
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--kernel_language=c++</p>
+
+ <p class="Code">&nbsp;&nbsp;inputext = .prp</p>
+
+ <p class="Code">&nbsp;&nbsp;keyword quogenflags =
+ commandflags</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;&nbsp;Quogen_Files {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;foo.prp &gt;&gt;
+ hello.h hello.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;&nbsp;Source_Files {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;hello.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</p>
+ </li>
+
+ <li class="Body">You can use the <em class="Code">&lt;&lt;</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">&lt;&lt;</em> foo.in as shown below.</li>
+
+ <li style="list-style: none">
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">Quogen_Files {</p>
+
+ <p class="Code">&nbsp;&nbsp;foo.prp &gt;&gt; hello.h
+ hello.cpp &lt;&lt; foo.in</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">project {</p>
+
+ <p class="Code">&nbsp;&nbsp;Define_Custom(TEST) {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;optional(keyword)
+ {</p>
+
+ <p class="Code">
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag_keyword(option) +=
+ value [, value]</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;}</p>
+
+ <p class="Code">&nbsp;&nbsp;}</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">&nbsp;</p>
+
+ <p class="Code">Define_Custom(IDL) {</p>
+
+ <p class="Code">&nbsp;&nbsp;...</p>
+
+ <p class="Code">&nbsp;&nbsp;inputext = .idl</p>
+
+ <p class="Code">&nbsp;&nbsp;source_pre_extension = C, S</p>
+
+ <p class="Code">&nbsp;&nbsp;header_pre_extension = C, S</p>
+
+ <p class="Code">&nbsp;&nbsp;inline_pre_extension = C, S</p>
+
+ <p class="Code">&nbsp;&nbsp;source_outputext = .cpp, .cxx,
+ .cc, .C</p>
+
+ <p class="Code">&nbsp;&nbsp;header_outputext = .h, .hpp,
+ .hxx, .hh</p>
+
+ <p class="Code">&nbsp;&nbsp;inline_outputext = .inl, .i</p>
+
+ <p class="Code">&nbsp;&nbsp;keyword idlflags =
+ commandflags</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;&nbsp;optional(source_pre_extension)
+ {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;commandflags(-GA) +=
+ A</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">&nbsp;&nbsp;optional(template_outputext)
+ {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;commandflags(!-Sc) +=
+ S_T.cpp, S_T.cxx, S_T.cc, S_T.C</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">&nbsp;&nbsp;optional(header_pre_extension)
+ {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;commandflags(!-Sc) +=
+ S_T</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">&nbsp;&nbsp;optional(inline_pre_extension)
+ {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;commandflags(!-Sc) +=
+ S_T</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">MOC_Files {</p>
+
+ <p class="Code">&nbsp;&nbsp;commandflags += -nw</p>
+
+ <p class="Code">&nbsp;&nbsp;gendir = moc_generated</p>
+
+ <p class="Code">&nbsp;&nbsp;QtReactor.h</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">Source_Files {</p>
+
+ <p class="Code">
+ &nbsp;&nbsp;moc_generated/QtReactor_moc.cpp</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">project: taoidldefaults {</p>
+
+ <p class="Code">&nbsp;&nbsp;specific(!automake) {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;tao_idlflags += -Sc
+ -hs _s.h -si _s.i -ss _s.cpp -hc .h -ci .i -cs .cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;&nbsp;// This allows "make idl_stubs"
+ to work</p>
+
+ <p class="Code">&nbsp;&nbsp;verbatim(gnuace, macros) {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;IDL_CLIENT_HDR_EXT
+ ?= .h</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;IDL_CLIENT_INL_EXT
+ ?= .i</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;IDL_CLIENT_SRC_EXT
+ ?= .cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;IDL_SERVER_HDR_EXT
+ ?= _s.h</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;IDL_SERVER_INL_EXT
+ ?= _s.i</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;IDL_SERVER_SRC_EXT
+ ?= _s.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;&nbsp;Modify_Custom(IDL) {</p>
+
+ <p class="Code">
+ &nbsp;&nbsp;&nbsp;&nbsp;source_pre_extension = , _s</p>
+
+ <p class="Code">
+ &nbsp;&nbsp;&nbsp;&nbsp;header_pre_extension = , _s</p>
+
+ <p class="Code">
+ &nbsp;&nbsp;&nbsp;&nbsp;inline_pre_extension = , _s</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;inline_outputext
+ &nbsp;&nbsp;&nbsp;&nbsp;= .i</p>
+
+ <p class="Code">&nbsp;&nbsp;}</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">&lt;%</em> and <em class=
+ "Code">%&gt;</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">&lt;%input%&gt;</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">&lt;%input_basename%&gt;</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">&lt;%input_dirname%&gt;</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">&lt;%input_noext%&gt;</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">&lt;%input_ext%&gt;</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">&lt;%output%&gt;</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">&lt;%output_basename%&gt;</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">&lt;%output_dirname%&gt;</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">&lt;%output_noext%&gt;</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">&lt;%output_ext%&gt;</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">&lt;%documentation_file%&gt;</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">&lt;%header_file%&gt;</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">&lt;%inline_file%&gt;</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">&lt;%resource_file%&gt;</em> (<em class=
+ "TableCode">&lt;%resx_file%&gt;</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">&lt;%source_file%&gt;</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">&lt;%template_file%&gt;</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">&lt;%documentation_file_noext%&gt;</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">&lt;%header_file_noext%&gt;</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">&lt;%inline_file_noext%&gt;</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">&lt;%resource_file_noext%&gt;</em>
+ (<em class="TableCode">&lt;%resx_file_noext%&gt;</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">&lt;%source_file_noext%&gt;</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">&lt;%template_file_noext%&gt;</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">&lt;%input_ext%&gt;</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">&lt;%output_ext%&gt;</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">&nbsp;</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">&lt;%and%&gt;</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">&lt;%cat%&gt;</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">&lt;%cmdsep%&gt;</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">&lt;%cat%&gt;</em> and <em class=
+ "Code">&lt;%mv%&gt;</em> commands would be run.
+ <em class="Code">&lt;%cat%&gt; &lt;%source_file%&gt;
+ &lt;%gt%&gt; foo &lt;%cmdsep%&gt; &lt;%mv%&gt; foo
+ other_dir</em></p>
+ </td>
+ </tr>
+
+ <tr>
+ <td rowspan="1" colspan="1">
+ <p class="TblCode"><em class=
+ "TableCode">&lt;%cmp%&gt;</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">&lt;%cp%&gt;</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">&lt;%crlf%&gt;</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">&lt;%equote%&gt;</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">&lt;%gendir%&gt;</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">&lt;%gt%&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;%lt%&gt;</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">&lt;%mkdir%&gt;</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">&lt;%mv%&gt;</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">&lt;%nul%&gt;</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">&lt;%or%&gt;</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">&lt;%os%&gt;</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">&lt;%prj_type%&gt;</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">&lt;%quote%&gt;</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">&lt;%rm%&gt;</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">&lt;%rmdir%&gt;</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">&lt;%slash%&gt;</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">&lt;%temporary%&gt;</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">&lt;%bat%&gt;</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">&lt;%cmd%&gt;</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">&lt;%exe%&gt;</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">&nbsp;</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">&nbsp;</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 &rsquo;!&rsquo; 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">&nbsp;</p>
+
+ <p class="Code">// ziparchive.mpb</p>
+
+ <p class="Code">feature(ziparchive) {</p>
+
+ <p class="Code">&nbsp;&nbsp;includes += $(ZIPARCHIVEROOT)</p>
+
+ <p class="Code">&nbsp;&nbsp;libpaths +=
+ $(ZIPARCHIVEROOT)/lib</p>
+
+ <p class="Code">&nbsp;&nbsp;libs &nbsp;&nbsp;&nbsp;&nbsp;+=
+ ziparch</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">project: taoserver {</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">project(RTEC_Perf): strategies, rtcorbaevent,
+ minimum_corba {</p>
+
+ <p class="Code">&nbsp;&nbsp;sharedname = TAO_RTEC_Perf</p>
+
+ <p class="Code">&nbsp;&nbsp;idlflags +=
+ -Wb,export_macro=TAO_RTEC_Perf_Export \</p>
+
+ <p class="Code">
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-Wb,export_include=rtec_perf_export.h</p>
+
+ <p class="Code">&nbsp;&nbsp;dllflags +=
+ TAO_RTEC_PERF_BUILD_DLL</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;&nbsp;Template_Files {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;Auto_Disconnect.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;Auto_Functor.cpp</p>
+
+ <p class="Code">
+ &nbsp;&nbsp;&nbsp;&nbsp;Low_Priority_Setup.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;RIR_Narrow.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;Servant_var.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;Shutdown.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;Task_Activator.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">project(RTEC_Perf): strategies, rtcorbaevent,
+ minimum_corba {</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">sharedname = TAO_RTEC_Perf</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">dllflags += TAO_RTEC_PERF_BUILD_DLL</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">Template_Files {</p>
+
+ <p class="Code">&nbsp;&nbsp;Auto_Disconnect.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;Auto_Functor.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;Low_Priority_Setup.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;RIR_Narrow.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;Servant_var.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;Shutdown.cpp</p>
+
+ <p class="Code">&nbsp;&nbsp;Task_Activator.cpp</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</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&rsquo;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">&lt;% %&gt;</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">&lt;% %&gt;</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">&nbsp;</p>
+
+ <p class="Code">&lt;%if(exename)%&gt;BIN =
+ &lt;%exename%&gt;&lt;%else%&gt;LIB =
+ &lt;%sharedname%&gt;&lt;%endif%&gt;</p>
+
+ <p class="Code">&nbsp;</p>
+ </li>
+
+ <li class="Body">is equivalent to:</li>
+
+ <li style="list-style: none">
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&lt;%if(exename)%&gt;</p>
+
+ <p class="Code">BIN = &lt;%exename%&gt;</p>
+
+ <p class="Code">&lt;%else%&gt;</p>
+
+ <p class="Code">LIB = &lt;%sharedname%&gt;</p>
+
+ <p class="Code">&lt;%endif%&gt;</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">FILES=&lt;%foreach(fvar, idl_files source_files
+ header_files)%&gt; &lt;%fvar%&gt;&lt;%endfor%&gt;</p>
+
+ <p class="Code">&nbsp;</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 &rsquo;<em class="Code">s</em> &rsquo; removed.</li>
+
+ <li style="list-style: none">
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">FILES=&lt;%foreach(idl_files source_files
+ header_files)%&gt; &lt;%idl_file%&gt;&lt;%endfor%&gt;</p>
+
+ <p class="Code">&nbsp;</p>
+ </li>
+
+ <li class="Body">Note that the <em class=
+ "Code">&lt;%idl_file%&gt;</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 &rsquo;<em class=
+ "Code">s</em> &rsquo;, 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">&nbsp;</p>
+
+ <p class="Code">&lt;%foreach(filelist)%&gt;
+ &lt;%filelist%&gt;&lt;%endfor%&gt;</p>
+
+ <p class="Code">&nbsp;</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">&lt;%marker(local)%&gt;</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">&lt;%temporary%&gt;</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">&nbsp;</p>
+
+ <p class="Code">document_template.pl v1.3</p>
+
+ <p class="Code">Usage: document_template.pl &lt;template&gt;
+ [&lt;html output&gt; [language]]</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">html output - This defaults to the name of the
+ template file with the .mpd</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extension replaced with
+ .html.</p>
+
+ <p class="Code">language &nbsp;&nbsp;&nbsp;- This defaults to
+ the language for which the template is designed.</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;It can be any of the valid
+ language settings for MPC:</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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">-&gt;</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-&gt;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-&gt;input_file-&gt;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">&nbsp;</p>
+
+ <p class="Code">&lt;%if(custom_types)%&gt;</p>
+
+ <p class="Code">&lt;%foreach(custom_types)%&gt;</p>
+
+ <p class="Code">
+ &lt;%foreach(custom_type-&gt;input_files)%&gt;</p>
+
+ <p class="Code">
+ &lt;%foreach(custom_type-&gt;input_file-&gt;output_files)%&gt;</p>
+
+ <p class="Code">
+ &lt;%custom_type-&gt;input_file-&gt;output_file%&gt;:
+ &lt;%custom_type-&gt;input_file%&gt;</p>
+
+ <p class="Code">
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;%custom_type-&gt;command%&gt;
+ &lt;%custom_type-&gt;commandflags%&gt; $@</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&lt;%endfor%&gt;</p>
+
+ <p class="Code">&lt;%endfor%&gt;</p>
+
+ <p class="Code">&lt;%endfor%&gt;</p>
+
+ <p class="Code">&lt;%endif%&gt;</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">&lt;%if(grouped_source_files)%&gt;</p>
+
+ <p class="Code">&lt;%comment(Get back each set of grouped
+ files)%&gt;</p>
+
+ <p class="Code">&lt;%foreach(grouped_source_files)%&gt;</p>
+
+ <p class="Code">&lt;%comment(This will provide the name of
+ the group)%&gt;</p>
+
+ <p class="Code">&lt;%grouped_source_file%&gt; = \</p>
+
+ <p class="Code">&lt;%comment(Get all the source files in a
+ single group)%&gt;</p>
+
+ <p class="Code">
+ &lt;%foreach(grouped_source_file-&gt;files)%&gt;</p>
+
+ <p class="Code">
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;%grouped_source_file-&gt;file)%&gt;&lt;%fornotlast("
+ \\")%&gt;</p>
+
+ <p class="Code">&lt;%endfor%&gt;</p>
+
+ <p class="Code">&lt;%endfor%&gt;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">ifndef
+ &lt;%grouped_source_files-&gt;component_name%&gt;</p>
+
+ <p class="Code">
+ &lt;%grouped_source_files-&gt;component_name%&gt; = \</p>
+
+ <p class="Code">&lt;%foreach(grouped_source_files)%&gt;</p>
+
+ <p class="Code">
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;%grouped_source_file%&gt;&lt;%fornotlast("
+ \\")%&gt;</p>
+
+ <p class="Code">&lt;%endfor%&gt;</p>
+
+ <p class="Code">endif</p>
+
+ <p class="Code">&lt;%endif%&gt;</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">variable_name = value1 "value 2"</p>
+
+ <p class="Code">variable_name += another_value</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">Release {</p>
+
+ <p class="Code">&nbsp;&nbsp;compile_flags = /W3 /GX /O2 /MD
+ /GR</p>
+
+ <p class="Code">&nbsp;&nbsp;defines = NDEBUG</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">Debug {</p>
+
+ <p class="Code">&nbsp;&nbsp;compile_flags = /W3 /Gm /GX /Zi /Od
+ /MDd /GR /Gy</p>
+
+ <p class="Code">&nbsp;&nbsp;defines = _DEBUG</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">conditional_include "vcfullmacros"</p>
+
+ <p class="Code">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">&lt;%foreach(configurations)%&gt;</p>
+
+ <p class="Code">Name = &lt;%configuration%&gt;</p>
+
+ <p class="Code">&lt;%compile_flags%&gt;&lt;%foreach(defines
+ common_defines)%&gt; /D &lt;%define%&gt;=1&lt;%endfor%&gt;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&lt;%endfor%&gt;</p>
+
+ <p class="Code">&nbsp;</p>
+ </li>
+
+ <li class="Body">The following output is generated from the above
+ example:</li>
+
+ <li style="list-style: none">
+ <p class="Code">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">// Section 2 - MAKEFILE</p>
+
+ <p class="Code">Makefile.&lt;%project_name%&gt;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">// Section 3 - OPTIONS</p>
+
+ <p class="Code">//end-options</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">// Section 4 - TARGET FILE</p>
+
+ <p class="Code">&lt;%if(exename)%&gt;</p>
+
+ <p class="Code">&lt;%exename%&gt;</p>
+
+ <p class="Code">&lt;%else%&gt;</p>
+
+ <p class="Code">&lt;%if(sharedname)%&gt;</p>
+
+ <p class="Code">&lt;%sharedname%&gt;</p>
+
+ <p class="Code">&lt;%else%&gt;</p>
+
+ <p class="Code">&lt;%if(staticname)%&gt;</p>
+
+ <p class="Code">&lt;%staticname%&gt;</p>
+
+ <p class="Code">&lt;%endif%&gt;</p>
+
+ <p class="Code">&lt;%endif%&gt;</p>
+
+ <p class="Code">&lt;%endif%&gt;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">// Section 5 - SOURCE FILES</p>
+
+ <p class="Code">&lt;%foreach(source_files)%&gt;</p>
+
+ <p class="Code">&lt;%source_file%&gt;</p>
+
+ <p class="Code">&lt;%endfor%&gt;</p>
+
+ <p class="Code">//end-srcfiles</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">// Section 6 - INCLUDE DIRECTORIES</p>
+
+ <p class="Code">&lt;%foreach(includes)%&gt;</p>
+
+ <p class="Code">&lt;%include%&gt;</p>
+
+ <p class="Code">&lt;%endfor%&gt;</p>
+
+ <p class="Code">//end-include-dirs</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">// Section 7 - LIBRARY DIRECTORIES</p>
+
+ <p class="Code">&lt;%foreach(libpaths)%&gt;</p>
+
+ <p class="Code">&lt;%libpath%&gt;</p>
+
+ <p class="Code">&lt;%endfor%&gt;</p>
+
+ <p class="Code">//end-library-dirs</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">// Section 8 - DEFINITIONS</p>
+
+ <p class="Code">&lt;%foreach(macros defines)%&gt;</p>
+
+ <p class="Code">-D&lt;%macro%&gt;</p>
+
+ <p class="Code">&lt;%endfor%&gt;</p>
+
+ <p class="Code">&lt;%if(pch_header)%&gt;</p>
+
+ <p class="Code">&lt;%foreach(pch_defines)%&gt;</p>
+
+ <p class="Code">-D&lt;%pch_define%&gt;</p>
+
+ <p class="Code">&lt;%endfor%&gt;</p>
+
+ <p class="Code">&lt;%endif%&gt;</p>
+
+ <p class="Code">//end-defs</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">// Section 9 - C FLAGS</p>
+
+ <p class="Code">&lt;%cflags("-g")%&gt;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">// Section 10 - LIBRARY FLAGS</p>
+
+ <p class="Code">&lt;%libflags%&gt;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">// Section 11 - SRC DIRECTORY</p>
+
+ <p class="Code">.</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">// Section 12 - OBJ DIRECTORY</p>
+
+ <p class="Code">&lt;%objdir(".")%&gt;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">// Section 13 - BIN DIRECTORY</p>
+
+ <p class="Code">
+ &lt;%if(install)%&gt;&lt;%install%&gt;&lt;%else%&gt;.&lt;%endif%&gt;</p>
+
+ <p class="Code">&nbsp;</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">&lt;%marker(top)%&gt;</p>
+
+ <p class="Code">&lt;%marker(macros)%&gt;</p>
+
+ <p class="Code">&lt;%marker(local)%&gt;</p>
+
+ <p class="Code">&lt;%marker(bottom)%&gt;</p>
+
+ <p class="Code">//end-user-targets</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">// Section 15 - LIBRARY FILES</p>
+
+ <p class="Code">&lt;%foreach(libs lit_libs pure_libs)%&gt;</p>
+
+ <p class="Code">&lt;%lib%&gt;</p>
+
+ <p class="Code">&lt;%endfor%&gt;</p>
+
+ <p class="Code">//end-library-files</p>
+
+ <p class="Code">&nbsp;</p>
+ </li>
+
+ <li class="Body">Note that output is generated differently
+ depending upon whether <em class="Code">&lt;%exename%&gt;</em>,
+ <em class="Code">&lt;%sharedname%&gt;</em> or <em class=
+ "Code">&lt;%staticname%&gt;</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">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">#
+ ************************************************************</p>
+
+ <p class="Code"># Pragmas</p>
+
+ <p class="Code">#
+ ************************************************************</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">use strict;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">use MakeProjectBase;</p>
+
+ <p class="Code">use ProjectCreator;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">use vars qw(@ISA);</p>
+
+ <p class="Code">@ISA = qw(MakeProjectBase ProjectCreator);</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">#
+ ************************************************************</p>
+
+ <p class="Code"># Subroutine Section</p>
+
+ <p class="Code">#
+ ************************************************************</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">sub convert_slashes {</p>
+
+ <p class="Code">&nbsp;&nbsp;#my $self = shift;</p>
+
+ <p class="Code">&nbsp;&nbsp;return 0;</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">sub project_file_extension {</p>
+
+ <p class="Code">&nbsp;&nbsp;#my $self = shift;</p>
+
+ <p class="Code">&nbsp;&nbsp;return '.fic';</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">sub get_dll_exe_template_input_file {</p>
+
+ <p class="Code">&nbsp;&nbsp;#my $self = shift;</p>
+
+ <p class="Code">&nbsp;&nbsp;return 'fictionalexe';</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">sub get_dll_template_input_file {</p>
+
+ <p class="Code">&nbsp;&nbsp;#my $self = shift;</p>
+
+ <p class="Code">&nbsp;&nbsp;return 'fictionaldll';</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">sub get_template {</p>
+
+ <p class="Code">&nbsp;&nbsp;#my $self = shift;</p>
+
+ <p class="Code">&nbsp;&nbsp;return 'fictional';</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">1;</p>
+
+ <p class="Code">&nbsp;</p>
+ </li>
+
+ <li class="Body">In our example, we inherit from the
+ MakeProjectBase which provides some methods that are common to
+ all &ldquo;make&rdquo; 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 &ldquo;Virtual Methods To Be Overridden&rdquo;
+ 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">&nbsp;</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">&nbsp;</p>
+
+ <p class="Code">#
+ ************************************************************</p>
+
+ <p class="Code"># Pragmas</p>
+
+ <p class="Code">#
+ ************************************************************</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">use strict;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">use FictionalProjectCreator;</p>
+
+ <p class="Code">use WorkspaceCreator;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">use vars qw(@ISA);</p>
+
+ <p class="Code">@ISA = qw(WorkspaceCreator);</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">#
+ ************************************************************</p>
+
+ <p class="Code"># Subroutine Section</p>
+
+ <p class="Code">#
+ ************************************************************</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">sub workspace_file_name {</p>
+
+ <p class="Code">&nbsp;&nbsp;my $self = shift;</p>
+
+ <p class="Code">&nbsp;&nbsp;return
+ $self-&gt;get_modified_workspace_name($self-&gt;get_workspace_name(),
+ '.fws');</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">sub pre_workspace {</p>
+
+ <p class="Code">&nbsp;&nbsp;my($self, $fh) = @_;</p>
+
+ <p class="Code">&nbsp;&nbsp;my $crlf = $self-&gt;crlf();</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;&nbsp;print $fh '&lt;?xml version="1.0"
+ encoding="UTF-8"?&gt;', $crlf,</p>
+
+ <p class="Code">
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'&lt;!--
+ MPC Command --&gt;', $crlf,</p>
+
+ <p class="Code">
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&lt;!--
+ $0 @ARGV --&gt;", $crlf;</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">sub write_comps {</p>
+
+ <p class="Code">&nbsp;&nbsp;my($self, $fh) = @_;</p>
+
+ <p class="Code">&nbsp;&nbsp;my $projects =
+ $self-&gt;get_projects();</p>
+
+ <p class="Code">&nbsp;&nbsp;my @list =
+ $self-&gt;sort_dependencies($projects);</p>
+
+ <p class="Code">&nbsp;&nbsp;my $crlf = $self-&gt;crlf();</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;&nbsp;print $fh '&lt;projects&gt;',
+ $crlf;</p>
+
+ <p class="Code">&nbsp;&nbsp;foreach my $project (@list) {</p>
+
+ <p class="Code">&nbsp;&nbsp;&nbsp;&nbsp;print $fh " &lt;project
+ path=\"$project\"/&gt;$crlf";</p>
+
+ <p class="Code">&nbsp;&nbsp;}</p>
+
+ <p class="Code">&nbsp;&nbsp;print $fh
+ "&lt;/projects&gt;$crlf";</p>
+
+ <p class="Code">}</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">1;</p>
+
+ <p class="Code">&nbsp;</p>
+
+ <p class="Code">&nbsp;</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
new file mode 100644
index 00000000000..708fd10aae9
--- /dev/null
+++ b/ACE/MPC/docs/html/images/OCILOGO_bw_book.eps
Binary files differ
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
new file mode 100644
index 00000000000..a2b78e7064a
--- /dev/null
+++ b/ACE/MPC/docs/html/images/mpc.gif
Binary files differ
diff --git a/ACE/MPC/docs/html/images/mpc_mtiff.eps b/ACE/MPC/docs/html/images/mpc_mtiff.eps
new file mode 100644
index 00000000000..925cdb68fc7
--- /dev/null
+++ b/ACE/MPC/docs/html/images/mpc_mtiff.eps
Binary files differ
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
new file mode 100644
index 00000000000..79f3a6c41e5
--- /dev/null
+++ b/ACE/MPC/docs/html/images/mwc.gif
Binary files differ
diff --git a/ACE/MPC/docs/html/images/mwc_mtiff.eps b/ACE/MPC/docs/html/images/mwc_mtiff.eps
new file mode 100644
index 00000000000..44002530573
--- /dev/null
+++ b/ACE/MPC/docs/html/images/mwc_mtiff.eps
Binary files differ
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:
+
+ &quot; 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 &amp;, 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 '&amp;';
+}
+
+
+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 '&quot;';
+}
+
+
+sub get_escaped_quote_symbol {
+ #my $self = shift;
+ return '\\&quot;';
+}
+
+
+sub get_gt_symbol {
+ #my $self = shift;
+ return '&gt;';
+}
+
+
+sub get_lt_symbol {
+ #my $self = shift;
+ return '&lt;';
+}
+
+
+sub get_and_symbol {
+ #my $self = shift;
+ return '&amp;&amp;';
+}
+
+
+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="&amp;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="&amp;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="&amp;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="&amp;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="&amp;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&amp;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 &amp;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="&amp;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="&amp;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="&amp;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="&amp;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="&amp;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&amp;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 &amp;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=\&quot;<%lib_modifier%>\&quot;<%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%>&#x0D;&#x0A;<%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)%>&#x0D;&#x0A;<%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)%>&quot;<%custom_type->input_file%>&quot; <%custom_type->output_option%><%foreach(custom_type->input_file->output_files)%> &quot;<%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%>&quot;<%endfor%><%else%>&quot;<%custom_type->input_file%>&quot;<%endif%><%if(flag_overrides(custom_type->input_file, postcommand))%><%foreach(custom_type->input_file)%> &amp;&amp; <%flag_overrides(custom_type->input_file, postcommand)%><%endfor%><%else%><%if(custom_type->postcommand)%><%foreach(custom_type->input_file)%> &amp;&amp; <%custom_type->postcommand%><%endfor%><%endif%><%endif%><%if(pch_header)%><%if(custom_type->pch_postrule)%><%foreach(custom_type->input_file->source_output_files)%> &amp;&amp; echo #include &quot;<%pch_header%>&quot; &gt; temporary.src &amp;&amp; type &quot;<%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%>&quot; &gt;&gt; temporary.src &amp;&amp; move /y temporary.src &quot;<%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%>&quot;<%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%>&#x0D;&#x0A;<%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)%>&#x0D;&#x0A;<%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)%>&amp;&amp;<%flag_overrides(custom_type->input_file, postcommand)%><%endfor%><%else%><%if(custom_type->postcommand)%><%foreach(custom_type->input_file)%>&amp;&amp;<%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%>&#x0D;&#x0A;<%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)%>&#x0D;&#x0A;<%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)%>&amp;&amp;<%flag_overrides(custom_type->input_file, postcommand)%><%endfor%><%else%><%if(custom_type->postcommand)%><%foreach(custom_type->input_file)%>&amp;&amp;<%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%>&#x0D;&#x0A;<%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)%>&#x0D;&#x0A;<%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)%>&amp;&amp;<%flag_overrides(custom_type->input_file, postcommand)%><%endfor%><%else%><%if(custom_type->postcommand)%><%foreach(custom_type->input_file)%>&amp;&amp;<%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=\&quot;<%lib_modifier%>\&quot;<%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%>&#x0D;&#x0A;<%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)%>&#x0D;&#x0A;<%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)%>&quot;<%custom_type->input_file%>&quot; <%custom_type->output_option%><%foreach(custom_type->input_file->output_files)%> &quot;<%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%>&quot;<%endfor%><%else%>&quot;<%custom_type->input_file%>&quot;<%endif%><%if(flag_overrides(custom_type->input_file, postcommand))%><%foreach(custom_type->input_file)%> &amp;&amp; <%flag_overrides(custom_type->input_file, postcommand)%><%endfor%><%else%><%if(custom_type->postcommand)%><%foreach(custom_type->input_file)%> &amp;&amp; <%custom_type->postcommand%><%endfor%><%endif%><%endif%><%if(pch_header)%><%if(custom_type->pch_postrule)%><%foreach(custom_type->input_file->source_output_files)%> &amp;&amp; echo #include &quot;<%pch_header%>&quot; &gt; temporary.src &amp;&amp; type &quot;<%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%>&quot; &gt;&gt; temporary.src &amp;&amp; move /y temporary.src &quot;<%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%>&quot;<%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%>&#x0D;&#x0A;<%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)%>&#x0D;&#x0A;<%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)%>&amp;&amp;<%flag_overrides(custom_type->input_file, postcommand)%><%endfor%><%else%><%if(custom_type->postcommand)%><%foreach(custom_type->input_file)%>&amp;&amp;<%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%>&#x0D;&#x0A;<%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)%>&#x0D;&#x0A;<%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)%>&amp;&amp;<%flag_overrides(custom_type->input_file, postcommand)%><%endfor%><%else%><%if(custom_type->postcommand)%><%foreach(custom_type->input_file)%>&amp;&amp;<%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%>&#x0D;&#x0A;<%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)%>&#x0D;&#x0A;<%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)%>&amp;&amp;<%flag_overrides(custom_type->input_file, postcommand)%><%endfor%><%else%><%if(custom_type->postcommand)%><%foreach(custom_type->input_file)%>&amp;&amp;<%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 &quot;building $@&quot;;%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 &quot;building $@&quot;;%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 &quot;building $@&quot;;%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 &quot;building $@&quot;;%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 &quot;building $@&quot;;rm -f %OutFile%;<%nm%> %Objects% $(ADDED_OBJECTS) %Libraries% | tclsh $(WIND_BASE)/host/resource/hutils/tcl/munch.tcl -c <%munchflag%> &gt; $(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) &amp;&amp; if [ &quot;$(EXPAND_DBG)&quot; = &quot;1&quot; ]; then plink &quot;$@&quot;;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 &quot;building $@&quot;;%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) &amp;&amp; if [ &quot;$(EXPAND_DBG)&quot; = &quot;1&quot; ]; then plink &quot;$@&quot;;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 &quot;building $@&quot;;%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) &amp;&amp; if [ &quot;$(EXPAND_DBG)&quot; = &quot;1&quot; ]; then plink &quot;$@&quot;;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/&amp;/&/g;
+ $cmd =~ s/&quot;/\"/g;
+ $cmd =~ s/&gt;/>/g;
+ $cmd =~ s/&lt;/</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);
+ }
+}