From 74fc54a786532248cf1bd70eb3b3e5efba1578e8 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Mon, 22 Dec 2008 06:51:23 +0000 Subject: [PATCH] Updating Prebuild source to match the binary in trunk/bin/Prebuild.exe git-svn-id: http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk@2399 52acb1d6-8a22-11de-b505-999d5b087335 --- Programs/Prebuild/ChangeLog | 11 + Programs/Prebuild/INSTALL | 236 --- Programs/Prebuild/NEWS | 200 -- Programs/Prebuild/Prebuild.exe | Bin 249856 -> 238080 bytes Programs/Prebuild/README | 274 --- Programs/Prebuild/THANKS | 18 - Programs/Prebuild/TODO | 43 - Programs/Prebuild/clean.bat | 1 - Programs/Prebuild/clean.sh | 1 - Programs/Prebuild/doc/prebuild-example1.xml | 300 --- Programs/Prebuild/doc/prebuild-example2.xml | 72 - Programs/Prebuild/doc/prebuild-example3.xml | 113 -- Programs/Prebuild/doc/prebuild-example4.xml | 715 ------- Programs/Prebuild/doc/prebuild-example5.xml | 187 -- Programs/Prebuild/prebuild | 2 - Programs/Prebuild/scripts/Clean.bat | 2 - Programs/Prebuild/scripts/Clean.sh | 4 - Programs/Prebuild/scripts/Help.bat | 2 - Programs/Prebuild/scripts/MonoDevelop.sh | 2 - Programs/Prebuild/scripts/Prebuild.nsi | 231 --- Programs/Prebuild/scripts/SharpDevelop.bat | 4 - Programs/Prebuild/scripts/SharpDevelop2.bat | 4 - Programs/Prebuild/scripts/VS2002.bat | 4 - Programs/Prebuild/scripts/VS2003.bat | 4 - Programs/Prebuild/scripts/VS2005.bat | 4 - Programs/Prebuild/scripts/VS2008.bat | 4 - Programs/Prebuild/scripts/autotools.bat | 4 - Programs/Prebuild/scripts/autotools.sh | 5 - Programs/Prebuild/scripts/makefile.bat | 4 - Programs/Prebuild/scripts/makefile.sh | 10 - Programs/Prebuild/scripts/nant.bat | 4 - Programs/Prebuild/scripts/nant.sh | 2 - Programs/Prebuild/scripts/xcode.bat | 4 - Programs/Prebuild/scripts/xcode.sh | 2 - .../src/Core/Attributes/DataNodeAttribute.cs | 162 +- .../Core/Attributes/OptionNodeAttribute.cs | 160 +- .../src/Core/Attributes/TargetAttribute.cs | 160 +- Programs/Prebuild/src/Core/FatalException.cs | 188 +- .../Prebuild/src/Core/Interfaces/IDataNode.cs | 112 +- .../Prebuild/src/Core/Interfaces/ITarget.cs | 118 +- Programs/Prebuild/src/Core/Kernel.cs | 1661 +++++++++-------- .../src/Core/Nodes/ConfigurationNode.cs | 354 ++-- Programs/Prebuild/src/Core/Nodes/DataNode.cs | 252 +-- .../Prebuild/src/Core/Nodes/ExcludeNode.cs | 196 +- Programs/Prebuild/src/Core/Nodes/FileNode.cs | 560 +++--- Programs/Prebuild/src/Core/Nodes/FilesNode.cs | 512 ++--- Programs/Prebuild/src/Core/Nodes/MatchNode.cs | 702 +++---- .../Prebuild/src/Core/Nodes/OptionsNode.cs | 1310 ++++++------- .../Prebuild/src/Core/Nodes/ProcessNode.cs | 238 +-- .../Prebuild/src/Core/Nodes/ProjectNode.cs | 1144 ++++++------ .../Prebuild/src/Core/Nodes/ReferenceNode.cs | 290 +-- .../src/Core/Nodes/ReferencePathNode.cs | 196 +- .../Prebuild/src/Core/Nodes/SolutionNode.cs | 728 ++++---- Programs/Prebuild/src/Core/Parse/IfContext.cs | 326 ++-- .../Prebuild/src/Core/Parse/Preprocessor.cs | 1115 +++++------ .../Prebuild/src/Core/Targets/DebugTarget.cs | 204 +- .../src/Core/Targets/MakefileTarget.cs | 942 +++++----- .../src/Core/Targets/MonoDevelopTarget.cs | 946 +++++----- .../Prebuild/src/Core/Targets/NAntTarget.cs | 898 +++++---- .../src/Core/Targets/SharpDevelopTarget.cs | 874 ++++----- .../Prebuild/src/Core/Targets/VS2002Target.cs | 192 +- .../Prebuild/src/Core/Targets/VS2003Target.cs | 1222 ++++++------ .../Prebuild/src/Core/Targets/VS2005Target.cs | 302 +-- .../src/Core/Targets/VSGenericTarget.cs | 49 +- .../Prebuild/src/Core/Targets/XcodeTarget.cs | 1210 ++++++------ .../src/Core/UnknownLanguageException.cs | 126 +- .../Core/Utilities/CommandLineCollection.cs | 324 ++-- .../src/Core/Utilities/CurrentDirectory.cs | 178 +- .../Prebuild/src/Core/Utilities/Helper.cs | 1326 ++++++------- Programs/Prebuild/src/Core/Utilities/Log.cs | 558 +++--- .../Prebuild/src/Core/WarningException.cs | 168 +- Programs/Prebuild/src/Prebuild.cs | 330 ++-- .../Prebuild/src/Properties/AssemblyInfo.cs | 242 +-- Programs/Prebuild/src/data/dnpb-1.0.xsd | 364 ++-- Programs/Prebuild/src/data/dnpb-1.1.xsd | 366 ++-- Programs/Prebuild/src/data/dnpb-1.2.xsd | 394 ++-- Programs/Prebuild/src/data/dnpb-1.3.xsd | 410 ++-- Programs/Prebuild/src/data/dnpb-1.4.xsd | 424 ++--- Programs/Prebuild/src/data/dnpb-1.5.xsd | 430 ++--- Programs/Prebuild/src/data/prebuild-1.6.xsd | 462 ++--- 80 files changed, 11761 insertions(+), 14137 deletions(-) delete mode 100644 Programs/Prebuild/INSTALL delete mode 100644 Programs/Prebuild/NEWS delete mode 100644 Programs/Prebuild/README delete mode 100644 Programs/Prebuild/THANKS delete mode 100644 Programs/Prebuild/TODO delete mode 100644 Programs/Prebuild/clean.bat delete mode 100644 Programs/Prebuild/clean.sh delete mode 100644 Programs/Prebuild/doc/prebuild-example1.xml delete mode 100644 Programs/Prebuild/doc/prebuild-example2.xml delete mode 100644 Programs/Prebuild/doc/prebuild-example3.xml delete mode 100644 Programs/Prebuild/doc/prebuild-example4.xml delete mode 100644 Programs/Prebuild/doc/prebuild-example5.xml delete mode 100644 Programs/Prebuild/prebuild delete mode 100644 Programs/Prebuild/scripts/Clean.bat delete mode 100644 Programs/Prebuild/scripts/Clean.sh delete mode 100644 Programs/Prebuild/scripts/Help.bat delete mode 100644 Programs/Prebuild/scripts/MonoDevelop.sh delete mode 100644 Programs/Prebuild/scripts/Prebuild.nsi delete mode 100644 Programs/Prebuild/scripts/SharpDevelop.bat delete mode 100644 Programs/Prebuild/scripts/SharpDevelop2.bat delete mode 100644 Programs/Prebuild/scripts/VS2002.bat delete mode 100644 Programs/Prebuild/scripts/VS2003.bat delete mode 100644 Programs/Prebuild/scripts/VS2005.bat delete mode 100644 Programs/Prebuild/scripts/VS2008.bat delete mode 100644 Programs/Prebuild/scripts/autotools.bat delete mode 100644 Programs/Prebuild/scripts/autotools.sh delete mode 100644 Programs/Prebuild/scripts/makefile.bat delete mode 100644 Programs/Prebuild/scripts/makefile.sh delete mode 100644 Programs/Prebuild/scripts/nant.bat delete mode 100644 Programs/Prebuild/scripts/nant.sh delete mode 100644 Programs/Prebuild/scripts/xcode.bat delete mode 100644 Programs/Prebuild/scripts/xcode.sh diff --git a/Programs/Prebuild/ChangeLog b/Programs/Prebuild/ChangeLog index b85875c0..bb8e7b09 100644 --- a/Programs/Prebuild/ChangeLog +++ b/Programs/Prebuild/ChangeLog @@ -1,3 +1,14 @@ +2008-12-09T02:15 D. Moonfire + * src/Core/Kernel.cs + - Added a /ppi target to get the results of processing but before + processing the actual results. + * src/Core/Preprocessor.cs + - Applied the patch from kanato with formatting changes. + - Uses the format. + * tests/ + - Added some lightweight tests to test the functionality of the + include patch. + 2008-06-19T09:37 John Anderson * src/Core/Kernel.cs - Only Loop through targets that are not abstract. diff --git a/Programs/Prebuild/INSTALL b/Programs/Prebuild/INSTALL deleted file mode 100644 index 23e5f25d..00000000 --- a/Programs/Prebuild/INSTALL +++ /dev/null @@ -1,236 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free -Software Foundation, Inc. - -This file is free documentation; the Free Software Foundation gives -unlimited permission to copy, distribute and modify it. - -Basic Installation -================== - -These are generic installation instructions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. (Caching is -disabled by default to prevent problems with accidental use of stale -cache files.) - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You only need -`configure.ac' if you want to change it or regenerate `configure' using -a newer version of `autoconf'. - -The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. If you're - using `csh' on an old version of System V, you might need to type - `sh ./configure' instead to prevent `csh' from trying to execute - `configure' itself. - - Running `configure' takes awhile. While running, it prints some - messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package. - - 4. Type `make install' to install the programs and any data files and - documentation. - - 5. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - -Compilers and Options -===================== - -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - -You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you must use a version of `make' that -supports the `VPATH' variable, such as GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. - - If you have to use a `make' that does not support the `VPATH' -variable, you have to compile the package for one architecture at a -time in the source code directory. After you have installed the -package for one architecture, use `make distclean' before reconfiguring -for another architecture. - -Installation Names -================== - -By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - -Optional Features -================= - -Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - -Specifying the System Type -========================== - -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - -Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). Here is a another example: - - /bin/bash ./configure CONFIG_SHELL=/bin/bash - -Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent -configuration-related scripts to be executed by `/bin/bash'. - -`configure' Invocation -====================== - -`configure' recognizes the following options to control how it operates. - -`--help' -`-h' - Print a summary of the options to `configure', and exit. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff --git a/Programs/Prebuild/NEWS b/Programs/Prebuild/NEWS deleted file mode 100644 index bea28dac..00000000 --- a/Programs/Prebuild/NEWS +++ /dev/null @@ -1,200 +0,0 @@ -Prebuild is an XML-driven pre-build tool allowing developers to easily generate project or make files for major IDE's and .NET development tools including: Visual Studio 2005, Visual Studio 2003, Visual Studio 2002, SharpDevelop, MonoDevelop, and NAnt. - -Documentation and downloads are available at http://dnpb.sourceforge.net. - -Prebuild is licensed under the BSD license. - -[ XXXXXXX XX, XXX - 1.3.2 ] - + Added Keyfile signing to NAnt target and VS2005 target - + Updated XSD file to 1.7 - + Boo and VisualBasic Language support in VS2005 target - + Added basic Autotools target. It creates a non-recursive Autotools system. - ! Multiple files can be excluded from the Match node - ! VS2005 now handles .resx files correctly. - ! NAnt and Autotools now handle defines - ! NAnt and Autotools now handle resources - + Conditional XML variables can be passed through the command line. - + Added /install and /remove command line flags to install and remove assemblies from the GAC - + Many fixes to VS2005 target - -[ July 21, 2006 - 1.3.1 ] - ! VS2005 fixes from Rob Loach - ! NAnt fixes from Rob Loach and David Hudson - ! XML doc fixes from Rob Loach - + Added SharpDevelop2 target (really just uses VS2005 target) - ! Fixed bug with BuildEvents in Monodevelop target - + Passing /yes will default to answering yes to any warnings - -[ February 28, 2006 - 1.3 ] - + Added MonoDevelop target. - + Added NAnt target. - + Lots of fixes to all targets. - * Cleaned up the code using FXCop. - * Updated schema to 1.6 to fix a typo and add a new parameter. - * jendave is now the maintainer of the project. RobLoach has been added as a developer. - * Removed references to 'dnpb'. - + Added rudimentary support for pre- and post- build scripts - * Updated examples. - -[ August 5, 2004 - 1.2 ] - + Added Visual Studio Express (vs2005express) target contributed by Borrillis and modified for use with different languages - + Added the allowedgroups command line option followed by a pipe-delimited list of project group filter flags (eg. Group1|Group2) allow optional filtering of all projects that dont have at least one of these flags - + Added the filterGroups XML attribute to the project node and updated the scheme to v1.5 for this addition, it is used to specified the delimited list of filter groups to which a project belongs - * Modified the removedir command line option to allow for a pipe-delimited list of directory names - ! Modified the resource loading code to search for resourced without the prepended namespace (as Visual Studio .NET does it) to allow for it to be compiled with SharpDevelop as well - + Added the GenerateXmlDocFile boolean option to the Options XML element - * Changed the behavior of the XmlDocFile option so that if not specified it uses the assemblyName (without file extension) + .xml for the file name instead of just not generating the file since the new GenerateXmlDocFile takes care of this - -[ January 3, 2004 - 1.1 ] - ! Replaced regex use for more efficient manual parsing to allow use on non-windows platforms with Mono which has Regex problems - + Added the checkOsVars attribute to the root element for enabling interpolation for Enviroment variables in the form ${var}, otherwise no checking is performed for efficiency-sake - * Make the version attribute on the root element optional as it isn't used and not needed since the schema url contains the version - -[ December 30, 2004 - 1.1 ] - ! Applied Leed's fix for SharpDevelop references - + Rewrote much of the processing for better validation and without the use of a temp file - + Added support for configurations at the project level which are named All. They now apply changes to all Solution level defined configs - * Changed all spaces into tabs - + Added support for the None build action - * Replaced all sequence's in the XML schema for all's because the order doesn't matter since the xml file is loaded into an XmlDocument - -[ December 25, 2004 - 1.0 ] - + Added the /removedir option for cleaning directories like obj before file releases - + Changed WriteTempXml() and the new DeleteTempXml() methods to be compiled only in DEBUG builds - * Made path optional for Match elements (defaults to current directory) and updates schema for it - ! Fixed XML example in the readme.txt - + Added example xml files to docs directory - * Updated license.txt to add Dan Moorehead and update copyright years - + Updated prebuild.xml to take advantage of the default path attribute for match elements - + Updated Clean to delete the obj directories - -[ December 25, 2004 - 0.13 ] - + Added dnpb.exe so that it can be used to generate the project files - + Added dnpb.ico - * Added parameterless Write statement to Log for writing a single line - * Changed scehema to version 1.3 for support of icon attribute - * Added support for All configuration name under a Project node signifying common settings for all configurations - ! Fixed the SupressWarnings by adding the corresponding field to OptionsNode - * Wrote documentation in docs/readme.txt - * Added Dan Moorehead to copyrights and extended date from 2004 to 2004-2005 - * Updated prebuild.xml - * Optimized Log class - * Updated OutputUsage() - * /clean targets all by default - * No log file is used by default, /log without value specified uses default file name - + Added support for the /pause which pauses the utility after execution to observe output - - -[ September 27, 2004 - 0.12.2a ] - ! Fixed a nasty bug when trying to delete our temp file for pre-processing. - -[ September 15, 2004 - 0.12.2 ] - + Expanded platform identification, thanks to the NAnt guys for shedding some - light on how to properly check for UNIX platforms! Thanks guys! - * POSIX OS identifier changed to UNIX. Valid OS names are now "Win32", "UNIX", - and "Unknown". - ! Fixed SharpDevelop target to properly use the 'rootNamespace' attribute of - the Project tag. - + New command-line switch, /ppo, forces DNPB to pre-process the file and write - the pre-processed file. This allows you to test/debug your pre-processor - macros. No other processing will be done. You can specify a target file as - a paramter for the /ppo switch, or DNPB will write the file 'preprocessed.xml' - if you do not specify a file. - + The Match tag now has a 'buildAction' attribute which functions exactly like - the attribute of the same name for the File tag. - -[ August 5, 2004 - 0.12.1 ] - + Added environment variable expansion for all values. Environment variables - should be listed in the form ${VAR}. - -[ July 30, 2004 - 0.12.0 ] - + Added preprocessing via XML processing information tags. Available tags - are: ?>, ?>, and . The - current expression parser is very basic, but will be replaced with a more - capable parser over time. Current operators available are: =, !=, <, >, - <=, >=. Current test variables available: OS, RuntimeVersion, RuntimeMajor, - RuntimeMinor, RuntimeRevision. - -[ July 27, 2004 - 0.11.4 ] - + Added 'useRegex' attribute to the Match tag. Matches can now use regular - expressions to match filenames. - + Added the 'assemblyName' attribute to the Project tag. Projects can now - set their output assembly name. - ! Fixed several bugs in the way that Project tags inheirt their parent - Solutions configuration options. This operation should now work fully as - intended. - ! Due to some wierdness, Project Guid's are now stored as part of the Project - node and created at parse time. - -[ May 11, 2004 - 0.11.3 ] - ! Fixed a bug where I was writing the wrong property name for a projects root - namespace. - ! Removed a DEBUG statement I had left in the code in 0.11.2. - ! Fixed a bug in the VS2002 writer which caused the version variables to not - be overriden correctly. - + Added the rootNamespace property to the element, allowing you to - specify the root namespace. - * /target and /clean are now mutually exclusive command line switches, and - they both now take the all option. In the case of /target all, all build - file for all targets will be created. In the case of /clean all, the user - will be prompted to make sure they want to do it, and if so, will clean - all build files for all targets. - -[ April 22, 2004 - 0.11.2 ] - ! Fixed a bug with the /file command-line operator. Was using the unresolved - file path rather then the resolved one, was making the attempt to open the - dnpb file fail. - ! Fixed a bug in the schema that required at least 1 solution and 1 reference - path. We can do just fine with 0 of either of these. Some files may be all - statements and not have any tags. - ! Fixed a bug that caused the project references not to be written with the - SharpDevelop target. - * Changed the schema to version 1.2, allowing for Configuration nodes to exist - under project nodes. The inheritance of values is hierarchical. Meaning, if - you define a configuration named Debug at the Soltion level, and one by the - same name at the Project level, the one at the Project level will first - inherit the options of the Solution level configuration, then set it's own - options. If you define a configuration at the Project level and it does not - exist at the Solution level, it will be created at the Solution level. - * Project references should now work correctly across the board. Note that due - to a restriction in Visual Studio, you can only reference projects in the same - solution. - -[ April 21, 2004 - 0.11.1 ] - ! Fixed a problem with resolving paths in various targets. Was not properly - setting the CWD. - * Schema updated to 1.1, moving the ReferencePath element from the Options - element to the Project element. This makes more logical sense, given that - reference paths are resolved relative to the project path. Any prebuild.xml - file referecning verison 1.0 will fail! Please update to the 1.1 schema. - -[ April 19, 2004 - 0.11.0 ] - * Added several attributes across the code to make FxCop happy - ! Fixed bugs in reference paths being written in the VS targets. - ! Fixed a bug in ProjectNode which was doing two CWDStack.Push() calls instead of - a Push/Pop pair. Was wreaking havoc with tags. - ! Fixed some bugs in the path tracking, both the Project and Solution nodes now - have a FullPath property, which is the full path to the file resolved at load - time. This should fix all path relativity problems. - + Added new /clean switch, allowing the target to clean up any files it generated. - in accordance, the ITarget interface has been updated to support a new Clean() - method. - + Completed addition of the tag, to allow the referencing of external - prebuild.xml files. - + Added the runtime attribute to the Project element. This allows the developer - to specify which runtime a project should target (Mono or Microsoft). This is - of course ignored in certain targets like the Visual Studio targets. - + Added the SharpDevelop target. - -[ April 13, 2004 - 0.10.1a ] - + Added the buildAction attribute to the File node. This is needed for dnpb - to even be able to bootstrap itself (dnpb-1.0.xsd must be an embedded resource) - -[ April 13, 2004 - 0.10.1 ] - * First Release - -[ Key ] -* = Change or information -+ = Addition -! = Bug Fix - diff --git a/Programs/Prebuild/Prebuild.exe b/Programs/Prebuild/Prebuild.exe index b3c2ab7d3e9b3c68534828cb86dd6b08d845b888..8c9f6854c2986efb513f6cb07324e346d50704b3 100644 GIT binary patch literal 238080 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 literal 249856 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Ξ>md_uJQapO^e8QaN}kK`BusaZ}Ym(U#K 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 Prebuild /target vs2003 - -This will generate the project files for Visual Studio.NET 2003 and -place the redirect the log to a file named PrebuildLog.txt in the -parent directory - - -The syntax structure is as below, where commandParameter is optional -depending on the command and you can provide several option-value -pairs. - -Note: The '> ' signifies the command prompt, do not enter this literally - -> Prebuild /

- /// - /// - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple=true)] - public sealed class DataNodeAttribute : Attribute - { - #region Fields - - private string m_Name = "unknown"; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The name. - public DataNodeAttribute(string name) - { - m_Name = name; - } - - #endregion - - #region Properties - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: sontek $ + * $Date: 2008-04-29 15:51:17 -0700 (Tue, 29 Apr 2008) $ + * $Revision: 264 $ + */ +#endregion + +using System; +using System.Collections.Specialized; + +namespace Prebuild.Core.Attributes +{ + /// + /// + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple=true)] + public sealed class DataNodeAttribute : Attribute + { + #region Fields + + private string m_Name = "unknown"; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The name. + public DataNodeAttribute(string name) + { + m_Name = name; + } + + #endregion + + #region Properties + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs b/Programs/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs index 4f8b87d5..55dc769f 100644 --- a/Programs/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs +++ b/Programs/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs @@ -1,80 +1,80 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 00:49:58 +0000 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - -using System; - -namespace Prebuild.Core.Attributes -{ - /// - /// - /// - [AttributeUsage(AttributeTargets.Field)] - public sealed class OptionNodeAttribute : Attribute - { - #region Fields - - private string m_NodeName; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// Name of the node. - public OptionNodeAttribute(string nodeName) - { - m_NodeName = nodeName; - } - - #endregion - - #region Properties - - /// - /// Gets the name of the node. - /// - /// The name of the node. - public string NodeName - { - get - { - return m_NodeName; - } - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2006-01-27 16:49:58 -0800 (Fri, 27 Jan 2006) $ + * $Revision: 71 $ + */ +#endregion + +using System; + +namespace Prebuild.Core.Attributes +{ + /// + /// + /// + [AttributeUsage(AttributeTargets.Field)] + public sealed class OptionNodeAttribute : Attribute + { + #region Fields + + private string m_NodeName; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// Name of the node. + public OptionNodeAttribute(string nodeName) + { + m_NodeName = nodeName; + } + + #endregion + + #region Properties + + /// + /// Gets the name of the node. + /// + /// The name of the node. + public string NodeName + { + get + { + return m_NodeName; + } + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Attributes/TargetAttribute.cs b/Programs/Prebuild/src/Core/Attributes/TargetAttribute.cs index 6ea590cc..50877676 100644 --- a/Programs/Prebuild/src/Core/Attributes/TargetAttribute.cs +++ b/Programs/Prebuild/src/Core/Attributes/TargetAttribute.cs @@ -1,80 +1,80 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 00:49:58 +0000 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - -using System; - -namespace Prebuild.Core.Attributes -{ - /// - /// - /// - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] - public sealed class TargetAttribute : Attribute - { - #region Fields - - private string m_Name; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The name. - public TargetAttribute(string name) - { - m_Name = name; - } - - #endregion - - #region Properties - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2006-01-27 16:49:58 -0800 (Fri, 27 Jan 2006) $ + * $Revision: 71 $ + */ +#endregion + +using System; + +namespace Prebuild.Core.Attributes +{ + /// + /// + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] + public sealed class TargetAttribute : Attribute + { + #region Fields + + private string m_Name; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The name. + public TargetAttribute(string name) + { + m_Name = name; + } + + #endregion + + #region Properties + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/FatalException.cs b/Programs/Prebuild/src/Core/FatalException.cs index ab7d25c7..61467ad9 100644 --- a/Programs/Prebuild/src/Core/FatalException.cs +++ b/Programs/Prebuild/src/Core/FatalException.cs @@ -1,94 +1,94 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 00:49:58 +0000 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - -using System; -using System.Runtime.Serialization; - -namespace Prebuild.Core -{ - /// - /// - /// - [Serializable()] - public class FatalException : Exception - { - #region Constructors - - - /// - /// Initializes a new instance of the class. - /// - public FatalException() - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The format. - /// The args. - public FatalException(string format, params object[] args) - : base(String.Format(format, args)) - { - } - - /// - /// Exception with specified string - /// - /// Exception message - public FatalException(string message): base(message) - { - } - - /// - /// - /// - /// - /// - public FatalException(string message, Exception exception) : base(message, exception) - { - } - - /// - /// - /// - /// - /// - protected FatalException(SerializationInfo info, StreamingContext context) : base( info, context ) - { - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2006-01-27 16:49:58 -0800 (Fri, 27 Jan 2006) $ + * $Revision: 71 $ + */ +#endregion + +using System; +using System.Runtime.Serialization; + +namespace Prebuild.Core +{ + /// + /// + /// + [Serializable()] + public class FatalException : Exception + { + #region Constructors + + + /// + /// Initializes a new instance of the class. + /// + public FatalException() + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The format. + /// The args. + public FatalException(string format, params object[] args) + : base(String.Format(format, args)) + { + } + + /// + /// Exception with specified string + /// + /// Exception message + public FatalException(string message): base(message) + { + } + + /// + /// + /// + /// + /// + public FatalException(string message, Exception exception) : base(message, exception) + { + } + + /// + /// + /// + /// + /// + protected FatalException(SerializationInfo info, StreamingContext context) : base( info, context ) + { + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Interfaces/IDataNode.cs b/Programs/Prebuild/src/Core/Interfaces/IDataNode.cs index dc591488..e885a3b6 100644 --- a/Programs/Prebuild/src/Core/Interfaces/IDataNode.cs +++ b/Programs/Prebuild/src/Core/Interfaces/IDataNode.cs @@ -1,56 +1,56 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 00:49:58 +0000 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - -using System; -using System.Xml; - -namespace Prebuild.Core.Interfaces -{ - /// - /// - /// - public interface IDataNode - { - /// - /// Gets or sets the parent. - /// - /// The parent. - IDataNode Parent { get; set; } - /// - /// Parses the specified node. - /// - /// The node. - void Parse(XmlNode node); - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2006-01-27 16:49:58 -0800 (Fri, 27 Jan 2006) $ + * $Revision: 71 $ + */ +#endregion + +using System; +using System.Xml; + +namespace Prebuild.Core.Interfaces +{ + /// + /// + /// + public interface IDataNode + { + /// + /// Gets or sets the parent. + /// + /// The parent. + IDataNode Parent { get; set; } + /// + /// Parses the specified node. + /// + /// The node. + void Parse(XmlNode node); + } +} diff --git a/Programs/Prebuild/src/Core/Interfaces/ITarget.cs b/Programs/Prebuild/src/Core/Interfaces/ITarget.cs index 1ddb0e3d..2baf72b6 100644 --- a/Programs/Prebuild/src/Core/Interfaces/ITarget.cs +++ b/Programs/Prebuild/src/Core/Interfaces/ITarget.cs @@ -1,60 +1,60 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 00:49:58 +0000 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - -using System; - -namespace Prebuild.Core.Interfaces -{ - /// - /// - /// - public interface ITarget - { - /// - /// Writes the specified kern. - /// - /// The kern. - void Write(Kernel kern); - /// - /// Cleans the specified kern. - /// - /// The kern. - void Clean(Kernel kern); - /// - /// Gets the name. - /// - /// The name. - string Name { get; } - } +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2006-01-27 16:49:58 -0800 (Fri, 27 Jan 2006) $ + * $Revision: 71 $ + */ +#endregion + +using System; + +namespace Prebuild.Core.Interfaces +{ + /// + /// + /// + public interface ITarget + { + /// + /// Writes the specified kern. + /// + /// The kern. + void Write(Kernel kern); + /// + /// Cleans the specified kern. + /// + /// The kern. + void Clean(Kernel kern); + /// + /// Gets the name. + /// + /// The name. + string Name { get; } + } } \ No newline at end of file diff --git a/Programs/Prebuild/src/Core/Kernel.cs b/Programs/Prebuild/src/Core/Kernel.cs index 5f205689..f87c53bb 100644 --- a/Programs/Prebuild/src/Core/Kernel.cs +++ b/Programs/Prebuild/src/Core/Kernel.cs @@ -1,817 +1,844 @@ -#region BSD License -/* -Copyright (c) 2004-2008 -Matthew Holmes (matthew@wildfiregames.com), -Dan Moorehead (dan05a@gmail.com), -Rob Loach (http://www.robloach.net), -C.J. Adams-Collier (cjac@colliertech.org) - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: sontek $ - * $Date: 2008-06-19 15:40:55 +0000 (Thu, 19 Jun 2008) $ - * $Revision: 276 $ - */ -#endregion - -using System; -using System.Diagnostics; -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Reflection; -using System.Xml; -using System.Xml.Schema; -using System.Text; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Parse; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core -{ - /// - /// - /// - public class Kernel : IDisposable - { - #region Inner Classes - - private struct NodeEntry - { - public Type Type; - public DataNodeAttribute Attribute; - } - - #endregion - - #region Fields - - private static Kernel m_Instance = new Kernel(); - - /// - /// This must match the version of the schema that is embeeded - /// - private static string m_SchemaVersion = "1.7"; - private static string m_Schema = "prebuild-" + m_SchemaVersion + ".xsd"; - private static string m_SchemaURI = "http://dnpb.sourceforge.net/schemas/" + m_Schema; - bool disposed; - private Version m_Version; - private string m_Revision = ""; - private CommandLineCollection m_CommandLine; - private Log m_Log; - private CurrentDirectory m_CurrentWorkingDirectory; - private XmlSchemaCollection m_Schemas; - - private Hashtable m_Targets; - private Hashtable m_Nodes; - - ArrayList m_Solutions; - string m_Target; - string m_Clean; - string[] m_RemoveDirectories; - string m_CurrentFile; - XmlDocument m_CurrentDoc; - bool m_PauseAfterFinish; - string[] m_ProjectGroups; - StringCollection m_Refs; - - - #endregion - - #region Constructors - - private Kernel() - { - } - - #endregion - - #region Properties - - /// - /// Gets a value indicating whether [pause after finish]. - /// - /// true if [pause after finish]; otherwise, false. - public bool PauseAfterFinish - { - get - { - return m_PauseAfterFinish; - } - } - - /// - /// Gets the instance. - /// - /// The instance. - public static Kernel Instance - { - get - { - return m_Instance; - } - } - - /// - /// Gets the version. - /// - /// The version. - public string Version - { - get - { - return String.Format("{0}.{1}.{2}{3}", m_Version.Major, m_Version.Minor, m_Version.Build, m_Revision); - } - } - - /// - /// Gets the command line. - /// - /// The command line. - public CommandLineCollection CommandLine - { - get - { - return m_CommandLine; - } - } - - /// - /// Gets the targets. - /// - /// The targets. - public Hashtable Targets - { - get - { - return m_Targets; - } - } - - /// - /// Gets the log. - /// - /// The log. - public Log Log - { - get - { - return m_Log; - } - } - - /// - /// Gets the current working directory. - /// - /// The current working directory. - public CurrentDirectory CurrentWorkingDirectory - { - get - { - return m_CurrentWorkingDirectory; - } - } - - /// - /// Gets the solutions. - /// - /// The solutions. - public ArrayList Solutions - { - get - { - return m_Solutions; - } - } - - /// - /// Gets the XmlDocument object representing the prebuild.xml - /// being processed - /// - /// The XmlDocument object - public XmlDocument CurrentDoc - { - get - { - return m_CurrentDoc; - } - } - - #endregion - - #region Private Methods - - private void RemoveDirectories(string rootDir, string[] dirNames) - { - foreach(string dir in Directory.GetDirectories(rootDir)) - { - string simpleName = Path.GetFileName(dir); - - if(Array.IndexOf(dirNames, simpleName) != -1) - { - //delete if the name matches one of the directory names to delete - string fullDirPath = Path.GetFullPath(dir); - Directory.Delete(fullDirPath,true); - } - else//not a match, so check children - { - RemoveDirectories(dir,dirNames); - //recurse, checking children for them - } - } - } - -// private void RemoveDirectoryMatches(string rootDir, string dirPattern) -// { -// foreach(string dir in Directory.GetDirectories(rootDir)) -// { -// foreach(string match in Directory.GetDirectories(dir)) -// {//delete all child directories that match -// Directory.Delete(Path.GetFullPath(match),true); -// } -// //recure through the rest checking for nested matches to delete -// RemoveDirectoryMatches(dir,dirPattern); -// } -// } - - private void LoadSchema() - { - Assembly assembly = this.GetType().Assembly; - Stream stream = assembly.GetManifestResourceStream("Prebuild.data." + m_Schema); - if(stream == null) - { - //try without the default namespace prepending to it in case was compiled with SharpDevelop or MonoDevelop instead of Visual Studio .NET - stream = assembly.GetManifestResourceStream(m_Schema); - if(stream == null) - { - throw new System.Reflection.TargetException(string.Format("Could not find the scheme embedded resource file '{0}'.", m_Schema)); - } - } - XmlReader schema = new XmlTextReader(stream); - - m_Schemas = new XmlSchemaCollection(); - m_Schemas.Add(m_SchemaURI, schema); - } - - private void CacheVersion() - { - m_Version = Assembly.GetEntryAssembly().GetName().Version; - } - - private void CacheTargets(Assembly assm) - { - foreach(Type t in assm.GetTypes()) - { - TargetAttribute ta = (TargetAttribute)Helper.CheckType(t, typeof(TargetAttribute), typeof(ITarget)); - - if(ta == null) - continue; - - if (t.IsAbstract) - continue; - - ITarget target = (ITarget)assm.CreateInstance(t.FullName); - if (target == null) - { - throw new MissingMethodException("Could not create ITarget instance"); - } - - m_Targets[ta.Name] = target; - } - } - - private void CacheNodeTypes(Assembly assm) - { - foreach(Type t in assm.GetTypes()) - { - foreach (DataNodeAttribute dna in t.GetCustomAttributes(typeof(DataNodeAttribute), true)) - { - NodeEntry ne = new NodeEntry(); - ne.Type = t; - ne.Attribute = dna; - m_Nodes[dna.Name] = ne; - } - } - } - - private void LogBanner() - { - m_Log.Write("Prebuild v" + this.Version); - m_Log.Write("Copyright (c) 2004-2008"); - m_Log.Write("Matthew Holmes (matthew@wildfiregames.com),"); - m_Log.Write("Dan Moorehead (dan05a@gmail.com),"); - m_Log.Write("David Hudson (jendave@yahoo.com),"); - m_Log.Write("Rob Loach (http://www.robloach.net),"); - m_Log.Write("C.J. Adams-Collier (cjac@colliertech.org),"); - - m_Log.Write("See 'prebuild /usage' for help"); - m_Log.Write(); - } - - - - private void ProcessFile(string file) - { - ProcessFile(file, this.m_Solutions); - } - - public void ProcessFile(ProcessNode node, SolutionNode parent) - { - if (node.IsValid) - { - ArrayList list = new ArrayList(); - ProcessFile(node.Path, list); - - foreach (SolutionNode solution in list) - parent.SolutionsTable[solution.Name] = solution; - } - } - - /// - /// - /// - /// - /// - public void ProcessFile(string file, IList solutions) - { - m_CurrentWorkingDirectory.Push(); - - string path = file; - try - { - try - { - path = Helper.ResolvePath(path); - } - catch(ArgumentException) - { - m_Log.Write("Could not open Prebuild file: " + path); - m_CurrentWorkingDirectory.Pop(); - return; - } - - m_CurrentFile = path; - Helper.SetCurrentDir(Path.GetDirectoryName(path)); - - XmlTextReader reader = new XmlTextReader(path); - - Core.Parse.Preprocessor pre = new Core.Parse.Preprocessor(); - - //register command line arguments as XML variables - IDictionaryEnumerator dict = m_CommandLine.GetEnumerator(); - while (dict.MoveNext()) - { - string name = dict.Key.ToString().Trim(); - if (name.Length > 0) - pre.RegisterVariable(name, dict.Value.ToString()); - } - - string xml = pre.Process(reader);//remove script and evaulate pre-proccessing to get schema-conforming XML - - - m_CurrentDoc = new XmlDocument(); - try - { - XmlValidatingReader validator = new XmlValidatingReader(new XmlTextReader(new StringReader(xml))); - - //validate while reading from string into XmlDocument DOM structure in memory - foreach(XmlSchema schema in m_Schemas) - { - validator.Schemas.Add(schema); - } - m_CurrentDoc.Load(validator); - } - catch(XmlException e) - { - throw new XmlException(e.ToString()); - } - - //is there a purpose to writing it? An syntax/schema problem would have been found during pre.Process() and reported with details - if(m_CommandLine.WasPassed("ppo")) - { - string ppoFile = m_CommandLine["ppo"]; - if(ppoFile == null || ppoFile.Trim().Length < 1) - { - ppoFile = "preprocessed.xml"; - } - - StreamWriter writer = null; - try - { - writer = new StreamWriter(ppoFile); - writer.Write(xml); - } - catch(IOException ex) - { - Console.WriteLine("Could not write PPO file '{0}': {1}", ppoFile, ex.Message); - } - finally - { - if(writer != null) - { - writer.Close(); - } - } - return; - } - //start reading the xml config file - XmlElement rootNode = m_CurrentDoc.DocumentElement; - //string suggestedVersion = Helper.AttributeValue(rootNode,"version","1.0"); - Helper.CheckForOSVariables = Helper.ParseBoolean(rootNode,"checkOsVars",false); - - foreach(XmlNode node in rootNode.ChildNodes)//solutions or if pre-proc instructions - { - IDataNode dataNode = ParseNode(node, null); - if(dataNode is ProcessNode) - { - ProcessNode proc = (ProcessNode)dataNode; - if(proc.IsValid) - { - ProcessFile(proc.Path); - } - } - else if(dataNode is SolutionNode) - { - solutions.Add(dataNode); - } - } - } - catch(XmlSchemaException xse) - { - m_Log.Write("XML validation error at line {0} in {1}:\n\n{2}", - xse.LineNumber, path, xse.Message); - } - finally - { - m_CurrentWorkingDirectory.Pop(); - } - } - - #endregion - - #region Public Methods - - /// - /// Allows the project. - /// - /// The project groups flags. - /// - public bool AllowProject(string projectGroupsFlags) - { - if(m_ProjectGroups != null && m_ProjectGroups.Length > 0) - { - if(projectGroupsFlags != null && projectGroupsFlags.Length == 0) - { - foreach(string group in projectGroupsFlags.Split('|')) - { - if(Array.IndexOf(m_ProjectGroups, group) != -1) //if included in the filter list - { - return true; - } - } - } - return false;//not included in the list or no groups specified for the project - } - return true;//no filter specified in the command line args - } - - /// - /// Gets the type of the node. - /// - /// The node. - /// - public Type GetNodeType(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - if(!m_Nodes.ContainsKey(node.Name)) - { - return null; - } - - NodeEntry ne = (NodeEntry)m_Nodes[node.Name]; - return ne.Type; - } - - /// - /// - /// - /// - /// - /// - public IDataNode ParseNode(XmlNode node, IDataNode parent) - { - return ParseNode(node, parent, null); - } - - //Create an instance of the data node type that is mapped to the name of the xml DOM node - /// - /// Parses the node. - /// - /// The node. - /// The parent. - /// The pre node. - /// - public IDataNode ParseNode(XmlNode node, IDataNode parent, IDataNode preNode) - { - IDataNode dataNode = null; - - try - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - if(preNode == null) - { - if(!m_Nodes.ContainsKey(node.Name)) - { - //throw new XmlException("Unknown XML node: " + node.Name); - return null; - } - - NodeEntry ne = (NodeEntry)m_Nodes[node.Name]; - Type type = ne.Type; - //DataNodeAttribute dna = ne.Attribute; - - dataNode = (IDataNode)type.Assembly.CreateInstance(type.FullName); - if(dataNode == null) - { - throw new System.Reflection.TargetException("Could not create new parser instance: " + type.FullName); - } - } - else - dataNode = preNode; - - dataNode.Parent = parent; - dataNode.Parse(node); - } - catch(WarningException wex) - { - m_Log.Write(LogType.Warning, wex.Message); - return null; - } - catch(FatalException fex) - { - m_Log.WriteException(LogType.Error, fex); - throw; - } - catch(Exception ex) - { - m_Log.WriteException(LogType.Error, ex); - throw; - } - - return dataNode; - } - - /// - /// Initializes the specified target. - /// - /// The target. - /// The args. - public void Initialize(LogTargets target, string[] args) - { - m_Targets = new Hashtable(); - CacheTargets(this.GetType().Assembly); - m_Nodes = new Hashtable(); - CacheNodeTypes(this.GetType().Assembly); - CacheVersion(); - - m_CommandLine = new CommandLineCollection(args); - - string logFile = null; - if(m_CommandLine.WasPassed("log")) - { - logFile = m_CommandLine["log"]; - - if(logFile != null && logFile.Length == 0) - { - logFile = "Prebuild.log"; - } - } - else - { - target = target & ~LogTargets.File; //dont output to a file - } - - m_Log = new Log(target, logFile); - LogBanner(); - - m_CurrentWorkingDirectory = new CurrentDirectory(); - - m_Target = m_CommandLine["target"]; - m_Clean = m_CommandLine["clean"]; - string removeDirs = m_CommandLine["removedir"]; - if(removeDirs != null && removeDirs.Length == 0) - { - m_RemoveDirectories = removeDirs.Split('|'); - } - - string flags = m_CommandLine["allowedgroups"];//allows filtering by specifying a pipe-delimited list of groups to include - if(flags != null && flags.Length == 0) - { - m_ProjectGroups = flags.Split('|'); - } - m_PauseAfterFinish = m_CommandLine.WasPassed("pause"); - - LoadSchema(); - - m_Solutions = new ArrayList(); - m_Refs = new StringCollection(); - } - - /// - /// Processes this instance. - /// - public void Process() - { - bool perfomedOtherTask = false; - if(m_RemoveDirectories != null && m_RemoveDirectories.Length > 0) - { - try - { - RemoveDirectories(".",m_RemoveDirectories); - } - catch(IOException e) - { - m_Log.Write("Failed to remove directories named {0}",m_RemoveDirectories); - m_Log.WriteException(LogType.Error,e); - } - catch(UnauthorizedAccessException e) - { - m_Log.Write("Failed to remove directories named {0}",m_RemoveDirectories); - m_Log.WriteException(LogType.Error,e); - } - perfomedOtherTask = true; - } - - if(m_Target != null && m_Clean != null) - { - m_Log.Write(LogType.Error, "The options /target and /clean cannot be passed together"); - return; - } - else if(m_Target == null && m_Clean == null) - { - if(perfomedOtherTask) //finished - { - return; - } - m_Log.Write(LogType.Error, "Must pass either /target or /clean to process a Prebuild file"); - return; - } - - string file = "./prebuild.xml"; - if(m_CommandLine.WasPassed("file")) - { - file = m_CommandLine["file"]; - } - - ProcessFile(file); - - string target = (m_Target != null ? m_Target.ToLower() : m_Clean.ToLower()); - bool clean = (m_Target == null); - if(clean && target != null && target.Length == 0) - { - target = "all"; - } - if(clean && target == "all")//default to all if no target was specified for clean - { - //check if they passed yes - if (!m_CommandLine.WasPassed("yes")) - { - Console.WriteLine("WARNING: This operation will clean ALL project files for all targets, are you sure? (y/n):"); - string ret = Console.ReadLine(); - if(ret == null) - { - return; - } - ret = ret.Trim().ToLower(); - if((ret.ToLower() != "y" && ret.ToLower() != "yes")) - { - return; - } - } - //clean all targets (just cleaning vs2002 target didn't clean nant) - foreach(ITarget targ in m_Targets.Values) - { - targ.Clean(this); - } - } - else - { - if (!m_Targets.Contains(target)) { - m_Log.Write(LogType.Error, "Unknown Target \"{0}\"", target); - return; - } - ITarget targ = (ITarget)m_Targets[target]; - - if(clean) - { - targ.Clean(this); - } - else - { - targ.Write(this); - } - } - - m_Log.Flush(); - } - - #endregion - - #region IDisposable Members - - /// - /// - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// Dispose objects - /// - /// - /// If true, it will dispose close the handle - /// - /// - /// Will dispose managed and unmanaged resources. - /// - protected virtual void Dispose(bool disposing) - { - if (!this.disposed) - { - if (disposing) - { - if (this.m_Log != null) - { - this.m_Log.Close(); - this.m_Log = null; - } - } - } - this.disposed = true; - } - - /// - /// - /// - ~Kernel() - { - this.Dispose(false); - } - - /// - /// Closes and destroys this object - /// - /// - /// Same as Dispose(true) - /// - public void Close() - { - Dispose(); - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2008 +Matthew Holmes (matthew@wildfiregames.com), +Dan Moorehead (dan05a@gmail.com), +Rob Loach (http://www.robloach.net), +C.J. Adams-Collier (cjac@colliertech.org) + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: dmoonfire $ + * $Date: 2008-12-09 18:04:22 -0800 (Tue, 09 Dec 2008) $ + * $Revision: 279 $ + */ +#endregion + +using System; +using System.Diagnostics; +using System.Collections; +using System.Collections.Specialized; +using System.IO; +using System.Reflection; +using System.Xml; +using System.Xml.Schema; +using System.Text; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Parse; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core +{ + /// + /// + /// + public class Kernel : IDisposable + { + #region Inner Classes + + private struct NodeEntry + { + public Type Type; + public DataNodeAttribute Attribute; + } + + #endregion + + #region Fields + + private static Kernel m_Instance = new Kernel(); + + /// + /// This must match the version of the schema that is embeeded + /// + private static string m_SchemaVersion = "1.7"; + private static string m_Schema = "prebuild-" + m_SchemaVersion + ".xsd"; + private static string m_SchemaURI = "http://dnpb.sourceforge.net/schemas/" + m_Schema; + bool disposed; + private Version m_Version; + private string m_Revision = ""; + private CommandLineCollection m_CommandLine; + private Log m_Log; + private CurrentDirectory m_CurrentWorkingDirectory; + private XmlSchemaCollection m_Schemas; + + private Hashtable m_Targets; + private Hashtable m_Nodes; + + ArrayList m_Solutions; + string m_Target; + string m_Clean; + string[] m_RemoveDirectories; + string m_CurrentFile; + XmlDocument m_CurrentDoc; + bool m_PauseAfterFinish; + string[] m_ProjectGroups; + StringCollection m_Refs; + + + #endregion + + #region Constructors + + private Kernel() + { + } + + #endregion + + #region Properties + + /// + /// Gets a value indicating whether [pause after finish]. + /// + /// true if [pause after finish]; otherwise, false. + public bool PauseAfterFinish + { + get + { + return m_PauseAfterFinish; + } + } + + /// + /// Gets the instance. + /// + /// The instance. + public static Kernel Instance + { + get + { + return m_Instance; + } + } + + /// + /// Gets the version. + /// + /// The version. + public string Version + { + get + { + return String.Format("{0}.{1}.{2}{3}", m_Version.Major, m_Version.Minor, m_Version.Build, m_Revision); + } + } + + /// + /// Gets the command line. + /// + /// The command line. + public CommandLineCollection CommandLine + { + get + { + return m_CommandLine; + } + } + + /// + /// Gets the targets. + /// + /// The targets. + public Hashtable Targets + { + get + { + return m_Targets; + } + } + + /// + /// Gets the log. + /// + /// The log. + public Log Log + { + get + { + return m_Log; + } + } + + /// + /// Gets the current working directory. + /// + /// The current working directory. + public CurrentDirectory CurrentWorkingDirectory + { + get + { + return m_CurrentWorkingDirectory; + } + } + + /// + /// Gets the solutions. + /// + /// The solutions. + public ArrayList Solutions + { + get + { + return m_Solutions; + } + } + + /// + /// Gets the XmlDocument object representing the prebuild.xml + /// being processed + /// + /// The XmlDocument object + public XmlDocument CurrentDoc + { + get + { + return m_CurrentDoc; + } + } + + #endregion + + #region Private Methods + + private void RemoveDirectories(string rootDir, string[] dirNames) + { + foreach(string dir in Directory.GetDirectories(rootDir)) + { + string simpleName = Path.GetFileName(dir); + + if(Array.IndexOf(dirNames, simpleName) != -1) + { + //delete if the name matches one of the directory names to delete + string fullDirPath = Path.GetFullPath(dir); + Directory.Delete(fullDirPath,true); + } + else//not a match, so check children + { + RemoveDirectories(dir,dirNames); + //recurse, checking children for them + } + } + } + +// private void RemoveDirectoryMatches(string rootDir, string dirPattern) +// { +// foreach(string dir in Directory.GetDirectories(rootDir)) +// { +// foreach(string match in Directory.GetDirectories(dir)) +// {//delete all child directories that match +// Directory.Delete(Path.GetFullPath(match),true); +// } +// //recure through the rest checking for nested matches to delete +// RemoveDirectoryMatches(dir,dirPattern); +// } +// } + + private void LoadSchema() + { + Assembly assembly = this.GetType().Assembly; + Stream stream = assembly.GetManifestResourceStream("Prebuild.data." + m_Schema); + if(stream == null) + { + //try without the default namespace prepending to it in case was compiled with SharpDevelop or MonoDevelop instead of Visual Studio .NET + stream = assembly.GetManifestResourceStream(m_Schema); + if(stream == null) + { + throw new System.Reflection.TargetException(string.Format("Could not find the scheme embedded resource file '{0}'.", m_Schema)); + } + } + XmlReader schema = new XmlTextReader(stream); + + m_Schemas = new XmlSchemaCollection(); + m_Schemas.Add(m_SchemaURI, schema); + } + + private void CacheVersion() + { + m_Version = Assembly.GetEntryAssembly().GetName().Version; + } + + private void CacheTargets(Assembly assm) + { + foreach(Type t in assm.GetTypes()) + { + TargetAttribute ta = (TargetAttribute)Helper.CheckType(t, typeof(TargetAttribute), typeof(ITarget)); + + if(ta == null) + continue; + + if (t.IsAbstract) + continue; + + ITarget target = (ITarget)assm.CreateInstance(t.FullName); + if (target == null) + { + throw new MissingMethodException("Could not create ITarget instance"); + } + + m_Targets[ta.Name] = target; + } + } + + private void CacheNodeTypes(Assembly assm) + { + foreach(Type t in assm.GetTypes()) + { + foreach (DataNodeAttribute dna in t.GetCustomAttributes(typeof(DataNodeAttribute), true)) + { + NodeEntry ne = new NodeEntry(); + ne.Type = t; + ne.Attribute = dna; + m_Nodes[dna.Name] = ne; + } + } + } + + private void LogBanner() + { + m_Log.Write("Prebuild v" + this.Version); + m_Log.Write("Copyright (c) 2004-2008"); + m_Log.Write("Matthew Holmes (matthew@wildfiregames.com),"); + m_Log.Write("Dan Moorehead (dan05a@gmail.com),"); + m_Log.Write("David Hudson (jendave@yahoo.com),"); + m_Log.Write("Rob Loach (http://www.robloach.net),"); + m_Log.Write("C.J. Adams-Collier (cjac@colliertech.org),"); + + m_Log.Write("See 'prebuild /usage' for help"); + m_Log.Write(); + } + + + + private void ProcessFile(string file) + { + ProcessFile(file, this.m_Solutions); + } + + public void ProcessFile(ProcessNode node, SolutionNode parent) + { + if (node.IsValid) + { + ArrayList list = new ArrayList(); + ProcessFile(node.Path, list); + + foreach (SolutionNode solution in list) + parent.SolutionsTable[solution.Name] = solution; + } + } + + /// + /// + /// + /// + /// + public void ProcessFile(string file, IList solutions) + { + m_CurrentWorkingDirectory.Push(); + + string path = file; + try + { + try + { + path = Helper.ResolvePath(path); + } + catch(ArgumentException) + { + m_Log.Write("Could not open Prebuild file: " + path); + m_CurrentWorkingDirectory.Pop(); + return; + } + + m_CurrentFile = path; + Helper.SetCurrentDir(Path.GetDirectoryName(path)); + + XmlTextReader reader = new XmlTextReader(path); + + Core.Parse.Preprocessor pre = new Core.Parse.Preprocessor(); + + //register command line arguments as XML variables + IDictionaryEnumerator dict = m_CommandLine.GetEnumerator(); + while (dict.MoveNext()) + { + string name = dict.Key.ToString().Trim(); + if (name.Length > 0) + pre.RegisterVariable(name, dict.Value.ToString()); + } + + string xml = pre.Process(reader);//remove script and evaulate pre-proccessing to get schema-conforming XML + + // See if the user put into a pseudo target of "prebuild:preprocessed-input" to indicate they want to see the + // output before the system processes it. + if (m_CommandLine.WasPassed("ppi")) + { + // Get the filename if there is one, otherwise use a default. + string ppiFile = m_CommandLine["ppi"]; + if (ppiFile == null || ppiFile.Trim().Length == 0) + { + ppiFile = "preprocessed-input.xml"; + } + + // Write out the string to the given stream. + try + { + using (StreamWriter ppiWriter = new StreamWriter(ppiFile)) + { + ppiWriter.WriteLine(xml); + } + } + catch(IOException ex) + { + Console.WriteLine("Could not write PPI file '{0}': {1}", ppiFile, ex.Message); + } + + // Finish processing this special tag. + return; + } + + m_CurrentDoc = new XmlDocument(); + try + { + XmlValidatingReader validator = new XmlValidatingReader(new XmlTextReader(new StringReader(xml))); + + //validate while reading from string into XmlDocument DOM structure in memory + foreach(XmlSchema schema in m_Schemas) + { + validator.Schemas.Add(schema); + } + m_CurrentDoc.Load(validator); + } + catch(XmlException e) + { + throw new XmlException(e.ToString()); + } + + //is there a purpose to writing it? An syntax/schema problem would have been found during pre.Process() and reported with details + if(m_CommandLine.WasPassed("ppo")) + { + string ppoFile = m_CommandLine["ppo"]; + if(ppoFile == null || ppoFile.Trim().Length < 1) + { + ppoFile = "preprocessed.xml"; + } + + StreamWriter writer = null; + try + { + writer = new StreamWriter(ppoFile); + writer.Write(xml); + } + catch(IOException ex) + { + Console.WriteLine("Could not write PPO file '{0}': {1}", ppoFile, ex.Message); + } + finally + { + if(writer != null) + { + writer.Close(); + } + } + return; + } + //start reading the xml config file + XmlElement rootNode = m_CurrentDoc.DocumentElement; + //string suggestedVersion = Helper.AttributeValue(rootNode,"version","1.0"); + Helper.CheckForOSVariables = Helper.ParseBoolean(rootNode,"checkOsVars",false); + + foreach(XmlNode node in rootNode.ChildNodes)//solutions or if pre-proc instructions + { + IDataNode dataNode = ParseNode(node, null); + if(dataNode is ProcessNode) + { + ProcessNode proc = (ProcessNode)dataNode; + if(proc.IsValid) + { + ProcessFile(proc.Path); + } + } + else if(dataNode is SolutionNode) + { + solutions.Add(dataNode); + } + } + } + catch(XmlSchemaException xse) + { + m_Log.Write("XML validation error at line {0} in {1}:\n\n{2}", + xse.LineNumber, path, xse.Message); + } + finally + { + m_CurrentWorkingDirectory.Pop(); + } + } + + #endregion + + #region Public Methods + + /// + /// Allows the project. + /// + /// The project groups flags. + /// + public bool AllowProject(string projectGroupsFlags) + { + if(m_ProjectGroups != null && m_ProjectGroups.Length > 0) + { + if(projectGroupsFlags != null && projectGroupsFlags.Length == 0) + { + foreach(string group in projectGroupsFlags.Split('|')) + { + if(Array.IndexOf(m_ProjectGroups, group) != -1) //if included in the filter list + { + return true; + } + } + } + return false;//not included in the list or no groups specified for the project + } + return true;//no filter specified in the command line args + } + + /// + /// Gets the type of the node. + /// + /// The node. + /// + public Type GetNodeType(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + if(!m_Nodes.ContainsKey(node.Name)) + { + return null; + } + + NodeEntry ne = (NodeEntry)m_Nodes[node.Name]; + return ne.Type; + } + + /// + /// + /// + /// + /// + /// + public IDataNode ParseNode(XmlNode node, IDataNode parent) + { + return ParseNode(node, parent, null); + } + + //Create an instance of the data node type that is mapped to the name of the xml DOM node + /// + /// Parses the node. + /// + /// The node. + /// The parent. + /// The pre node. + /// + public IDataNode ParseNode(XmlNode node, IDataNode parent, IDataNode preNode) + { + IDataNode dataNode = null; + + try + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + if(preNode == null) + { + if(!m_Nodes.ContainsKey(node.Name)) + { + //throw new XmlException("Unknown XML node: " + node.Name); + return null; + } + + NodeEntry ne = (NodeEntry)m_Nodes[node.Name]; + Type type = ne.Type; + //DataNodeAttribute dna = ne.Attribute; + + dataNode = (IDataNode)type.Assembly.CreateInstance(type.FullName); + if(dataNode == null) + { + throw new System.Reflection.TargetException("Could not create new parser instance: " + type.FullName); + } + } + else + dataNode = preNode; + + dataNode.Parent = parent; + dataNode.Parse(node); + } + catch(WarningException wex) + { + m_Log.Write(LogType.Warning, wex.Message); + return null; + } + catch(FatalException fex) + { + m_Log.WriteException(LogType.Error, fex); + throw; + } + catch(Exception ex) + { + m_Log.WriteException(LogType.Error, ex); + throw; + } + + return dataNode; + } + + /// + /// Initializes the specified target. + /// + /// The target. + /// The args. + public void Initialize(LogTargets target, string[] args) + { + m_Targets = new Hashtable(); + CacheTargets(this.GetType().Assembly); + m_Nodes = new Hashtable(); + CacheNodeTypes(this.GetType().Assembly); + CacheVersion(); + + m_CommandLine = new CommandLineCollection(args); + + string logFile = null; + if(m_CommandLine.WasPassed("log")) + { + logFile = m_CommandLine["log"]; + + if(logFile != null && logFile.Length == 0) + { + logFile = "Prebuild.log"; + } + } + else + { + target = target & ~LogTargets.File; //dont output to a file + } + + m_Log = new Log(target, logFile); + LogBanner(); + + m_CurrentWorkingDirectory = new CurrentDirectory(); + + m_Target = m_CommandLine["target"]; + m_Clean = m_CommandLine["clean"]; + string removeDirs = m_CommandLine["removedir"]; + if(removeDirs != null && removeDirs.Length == 0) + { + m_RemoveDirectories = removeDirs.Split('|'); + } + + string flags = m_CommandLine["allowedgroups"];//allows filtering by specifying a pipe-delimited list of groups to include + if(flags != null && flags.Length == 0) + { + m_ProjectGroups = flags.Split('|'); + } + m_PauseAfterFinish = m_CommandLine.WasPassed("pause"); + + LoadSchema(); + + m_Solutions = new ArrayList(); + m_Refs = new StringCollection(); + } + + /// + /// Processes this instance. + /// + public void Process() + { + bool perfomedOtherTask = false; + if(m_RemoveDirectories != null && m_RemoveDirectories.Length > 0) + { + try + { + RemoveDirectories(".",m_RemoveDirectories); + } + catch(IOException e) + { + m_Log.Write("Failed to remove directories named {0}",m_RemoveDirectories); + m_Log.WriteException(LogType.Error,e); + } + catch(UnauthorizedAccessException e) + { + m_Log.Write("Failed to remove directories named {0}",m_RemoveDirectories); + m_Log.WriteException(LogType.Error,e); + } + perfomedOtherTask = true; + } + + if(m_Target != null && m_Clean != null) + { + m_Log.Write(LogType.Error, "The options /target and /clean cannot be passed together"); + return; + } + else if(m_Target == null && m_Clean == null) + { + if(perfomedOtherTask) //finished + { + return; + } + m_Log.Write(LogType.Error, "Must pass either /target or /clean to process a Prebuild file"); + return; + } + + string file = "./prebuild.xml"; + if(m_CommandLine.WasPassed("file")) + { + file = m_CommandLine["file"]; + } + + ProcessFile(file); + + string target = (m_Target != null ? m_Target.ToLower() : m_Clean.ToLower()); + bool clean = (m_Target == null); + if(clean && target != null && target.Length == 0) + { + target = "all"; + } + if(clean && target == "all")//default to all if no target was specified for clean + { + //check if they passed yes + if (!m_CommandLine.WasPassed("yes")) + { + Console.WriteLine("WARNING: This operation will clean ALL project files for all targets, are you sure? (y/n):"); + string ret = Console.ReadLine(); + if(ret == null) + { + return; + } + ret = ret.Trim().ToLower(); + if((ret.ToLower() != "y" && ret.ToLower() != "yes")) + { + return; + } + } + //clean all targets (just cleaning vs2002 target didn't clean nant) + foreach(ITarget targ in m_Targets.Values) + { + targ.Clean(this); + } + } + else + { + if (!m_Targets.Contains(target)) { + m_Log.Write(LogType.Error, "Unknown Target \"{0}\"", target); + return; + } + ITarget targ = (ITarget)m_Targets[target]; + + if(clean) + { + targ.Clean(this); + } + else + { + targ.Write(this); + } + } + + m_Log.Flush(); + } + + #endregion + + #region IDisposable Members + + /// + /// + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Dispose objects + /// + /// + /// If true, it will dispose close the handle + /// + /// + /// Will dispose managed and unmanaged resources. + /// + protected virtual void Dispose(bool disposing) + { + if (!this.disposed) + { + if (disposing) + { + if (this.m_Log != null) + { + this.m_Log.Close(); + this.m_Log = null; + } + } + } + this.disposed = true; + } + + /// + /// + /// + ~Kernel() + { + this.Dispose(false); + } + + /// + /// Closes and destroys this object + /// + /// + /// Same as Dispose(true) + /// + public void Close() + { + Dispose(); + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Nodes/ConfigurationNode.cs b/Programs/Prebuild/src/Core/Nodes/ConfigurationNode.cs index a41d9c42..a160f002 100644 --- a/Programs/Prebuild/src/Core/Nodes/ConfigurationNode.cs +++ b/Programs/Prebuild/src/Core/Nodes/ConfigurationNode.cs @@ -1,177 +1,177 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 00:49:58 +0000 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - -using System; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Configuration")] - public class ConfigurationNode : DataNode, ICloneable - { - #region Fields - - private string m_Name = "unknown"; - private OptionsNode m_Options; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public ConfigurationNode() - { - m_Options = new OptionsNode(); - } - - #endregion - - #region Properties - - /// - /// Gets or sets the parent. - /// - /// The parent. - public override IDataNode Parent - { - get - { - return base.Parent; - } - set - { - base.Parent = value; - if(base.Parent is SolutionNode) - { - SolutionNode node = (SolutionNode)base.Parent; - if(node != null && node.Options != null) - { - node.Options.CopyTo(m_Options); - } - } - } - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - - /// - /// Gets or sets the options. - /// - /// The options. - public OptionsNode Options - { - get - { - return m_Options; - } - set - { - m_Options = value; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - m_Name = Helper.AttributeValue(node, "name", m_Name); - if( node == null ) - { - throw new ArgumentNullException("node"); - } - foreach(XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if(dataNode is OptionsNode) - { - ((OptionsNode)dataNode).CopyTo(m_Options); - } - } - } - - /// - /// Copies to. - /// - /// The conf. - public void CopyTo(ConfigurationNode conf) - { - m_Options.CopyTo(conf.m_Options); - } - - #endregion - - #region ICloneable Members - - /// - /// Creates a new object that is a copy of the current instance. - /// - /// - /// A new object that is a copy of this instance. - /// - public object Clone() - { - ConfigurationNode ret = new ConfigurationNode(); - ret.m_Name = m_Name; - m_Options.CopyTo(ret.m_Options); - return ret; - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2006-01-27 16:49:58 -0800 (Fri, 27 Jan 2006) $ + * $Revision: 71 $ + */ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Configuration")] + public class ConfigurationNode : DataNode, ICloneable + { + #region Fields + + private string m_Name = "unknown"; + private OptionsNode m_Options; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public ConfigurationNode() + { + m_Options = new OptionsNode(); + } + + #endregion + + #region Properties + + /// + /// Gets or sets the parent. + /// + /// The parent. + public override IDataNode Parent + { + get + { + return base.Parent; + } + set + { + base.Parent = value; + if(base.Parent is SolutionNode) + { + SolutionNode node = (SolutionNode)base.Parent; + if(node != null && node.Options != null) + { + node.Options.CopyTo(m_Options); + } + } + } + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + + /// + /// Gets or sets the options. + /// + /// The options. + public OptionsNode Options + { + get + { + return m_Options; + } + set + { + m_Options = value; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + m_Name = Helper.AttributeValue(node, "name", m_Name); + if( node == null ) + { + throw new ArgumentNullException("node"); + } + foreach(XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if(dataNode is OptionsNode) + { + ((OptionsNode)dataNode).CopyTo(m_Options); + } + } + } + + /// + /// Copies to. + /// + /// The conf. + public void CopyTo(ConfigurationNode conf) + { + m_Options.CopyTo(conf.m_Options); + } + + #endregion + + #region ICloneable Members + + /// + /// Creates a new object that is a copy of the current instance. + /// + /// + /// A new object that is a copy of this instance. + /// + public object Clone() + { + ConfigurationNode ret = new ConfigurationNode(); + ret.m_Name = m_Name; + m_Options.CopyTo(ret.m_Options); + return ret; + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Nodes/DataNode.cs b/Programs/Prebuild/src/Core/Nodes/DataNode.cs index 11e6a85c..46422673 100644 --- a/Programs/Prebuild/src/Core/Nodes/DataNode.cs +++ b/Programs/Prebuild/src/Core/Nodes/DataNode.cs @@ -1,126 +1,126 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: sontek $ - * $Date: 2008-05-07 20:59:35 +0000 (Wed, 07 May 2008) $ - * $Revision: 270 $ - */ -#endregion - -using System; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using System.IO; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - public class DataNode : IDataNode - { - #region Fields - - private IDataNode parent; - string[] m_WebTypes = new string[] { "aspx", "ascx", "master", "ashx", "asmx" }; - - #endregion - - #region IDataNode Members - - /// - /// Gets or sets the parent. - /// - /// The parent. - public virtual IDataNode Parent - { - get - { - return parent; - } - set - { - parent = value; - } - } - public string[] WebTypes - { - get { return m_WebTypes; } - } - /// - /// Parses the specified node. - /// - /// The node. - public virtual void Parse(XmlNode node) - { - } - public BuildAction GetBuildActionByFileName(string fileName) - { - string extension = Path.GetExtension(fileName).ToLower(); - foreach (string type in WebTypes) - { - if (extension == type) - return BuildAction.Content; - } - return BuildAction.Compile; - } - /// - /// Parses the file type to figure out what type it is - /// - /// - public SubType GetSubTypeByFileName(string fileName) - { - string extension = System.IO.Path.GetExtension(fileName).ToLower(); - string designer = String.Format(".designer{0}", extension); - string path = fileName.ToLower(); - if (extension == ".resx") - { - return SubType.Designer; - } - else if (path.EndsWith(".settings")) - { - return SubType.Settings; - } - else - { - - foreach (string type in WebTypes) - { - if (path.EndsWith(string.Format("{0}{1}", type, extension))) - { - return SubType.CodeBehind; - } - } - } - return SubType.Code; - } - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: sontek $ + * $Date: 2008-05-07 13:59:35 -0700 (Wed, 07 May 2008) $ + * $Revision: 270 $ + */ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using System.IO; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + public class DataNode : IDataNode + { + #region Fields + + private IDataNode parent; + string[] m_WebTypes = new string[] { "aspx", "ascx", "master", "ashx", "asmx" }; + + #endregion + + #region IDataNode Members + + /// + /// Gets or sets the parent. + /// + /// The parent. + public virtual IDataNode Parent + { + get + { + return parent; + } + set + { + parent = value; + } + } + public string[] WebTypes + { + get { return m_WebTypes; } + } + /// + /// Parses the specified node. + /// + /// The node. + public virtual void Parse(XmlNode node) + { + } + public BuildAction GetBuildActionByFileName(string fileName) + { + string extension = Path.GetExtension(fileName).ToLower(); + foreach (string type in WebTypes) + { + if (extension == type) + return BuildAction.Content; + } + return BuildAction.Compile; + } + /// + /// Parses the file type to figure out what type it is + /// + /// + public SubType GetSubTypeByFileName(string fileName) + { + string extension = System.IO.Path.GetExtension(fileName).ToLower(); + string designer = String.Format(".designer{0}", extension); + string path = fileName.ToLower(); + if (extension == ".resx") + { + return SubType.Designer; + } + else if (path.EndsWith(".settings")) + { + return SubType.Settings; + } + else + { + + foreach (string type in WebTypes) + { + if (path.EndsWith(string.Format("{0}{1}", type, extension))) + { + return SubType.CodeBehind; + } + } + } + return SubType.Code; + } + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Nodes/ExcludeNode.cs b/Programs/Prebuild/src/Core/Nodes/ExcludeNode.cs index 0e86437d..16d83931 100644 --- a/Programs/Prebuild/src/Core/Nodes/ExcludeNode.cs +++ b/Programs/Prebuild/src/Core/Nodes/ExcludeNode.cs @@ -1,98 +1,98 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: borrillis $ - * $Date: 2007-05-24 16:03:16 +0000 (Thu, 24 May 2007) $ - * $Revision: 243 $ - */ -#endregion - -using System; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Exclude")] - public class ExcludeNode : DataNode - { - #region Fields - - private string m_Pattern = ""; - - #endregion - - #region Properties - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Pattern; - } - } - - /// - /// Gets the pattern. - /// - /// The pattern. - public string Pattern - { - get - { - return m_Pattern; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - m_Pattern = Helper.AttributeValue( node, "name", m_Pattern ); - m_Pattern = Helper.AttributeValue(node, "pattern", m_Pattern ); - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: borrillis $ + * $Date: 2007-05-24 09:03:16 -0700 (Thu, 24 May 2007) $ + * $Revision: 243 $ + */ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Exclude")] + public class ExcludeNode : DataNode + { + #region Fields + + private string m_Pattern = ""; + + #endregion + + #region Properties + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Pattern; + } + } + + /// + /// Gets the pattern. + /// + /// The pattern. + public string Pattern + { + get + { + return m_Pattern; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + m_Pattern = Helper.AttributeValue( node, "name", m_Pattern ); + m_Pattern = Helper.AttributeValue(node, "pattern", m_Pattern ); + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Nodes/FileNode.cs b/Programs/Prebuild/src/Core/Nodes/FileNode.cs index 4e0a7211..92bc08ea 100644 --- a/Programs/Prebuild/src/Core/Nodes/FileNode.cs +++ b/Programs/Prebuild/src/Core/Nodes/FileNode.cs @@ -1,280 +1,280 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: sontek $ - * $Date: 2008-05-06 00:03:34 +0000 (Tue, 06 May 2008) $ - * $Revision: 269 $ - */ -#endregion - -using System; -using System.IO; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; -using Prebuild.Core.Targets; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - public enum BuildAction - { - /// - /// - /// - None, - /// - /// - /// - Compile, - /// - /// - /// - Content, - /// - /// - /// - EmbeddedResource - } - - /// - /// - /// - public enum SubType - { - /// - /// - /// - Code, - /// - /// - /// - Component, - /// - /// - /// - Designer, - /// - /// - /// - Form, - /// - /// - /// - Settings, - /// - /// - /// - UserControl, - /// - /// - /// - CodeBehind, - } - - public enum CopyToOutput - { - Never, - Always, - PreserveNewest - } - - /// - /// - /// - [DataNode("File")] - public class FileNode : DataNode - { - #region Fields - - private string m_Path; - private string m_ResourceName = ""; - private BuildAction? m_BuildAction; - private bool m_Valid; - private SubType? m_SubType; - private CopyToOutput m_CopyToOutput = CopyToOutput.Never; - private bool m_Link = false; - private string m_LinkPath = string.Empty; - private bool m_PreservePath = false; - - - #endregion - - #region Properties - - /// - /// - /// - public string Path - { - get - { - return m_Path; - } - } - - /// - /// - /// - public string ResourceName - { - get - { - return m_ResourceName; - } - } - - /// - /// - /// - public BuildAction BuildAction - { - get - { - if (m_BuildAction != null) - return m_BuildAction.Value; - else - return GetBuildActionByFileName(this.Path); - - } - } - - public CopyToOutput CopyToOutput - { - get - { - return this.m_CopyToOutput; - } - } - - public bool IsLink - { - get - { - return this.m_Link; - } - } - - public string LinkPath - { - get - { - return this.m_LinkPath; - } - } - /// - /// - /// - public SubType SubType - { - get - { - if (m_SubType != null) - return m_SubType.Value; - else - return GetSubTypeByFileName(this.Path); - } - } - - /// - /// - /// - public bool IsValid - { - get - { - return m_Valid; - } - } - - /// - /// - /// - /// - /// - public bool PreservePath - { - get - { - return m_PreservePath; - } - } - - #endregion - - #region Public Methods - - /// - /// - /// - /// - public override void Parse(XmlNode node) - { - string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); - if (buildAction != string.Empty) - m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); - string subType = Helper.AttributeValue(node, "subType", string.Empty); - if (subType != String.Empty) - m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); - - m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString()); - this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); - if ( this.m_Link == true ) - { - this.m_LinkPath = Helper.AttributeValue( node, "linkPath", string.Empty ); - } - this.m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", this.m_CopyToOutput.ToString())); - this.m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); - - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); - if(m_Path == null) - { - m_Path = ""; - } - - m_Path = m_Path.Trim(); - m_Valid = true; - if(!File.Exists(m_Path)) - { - m_Valid = false; - Kernel.Instance.Log.Write(LogType.Warning, "File does not exist: {0}", m_Path); - } - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: sontek $ + * $Date: 2008-05-05 17:03:34 -0700 (Mon, 05 May 2008) $ + * $Revision: 269 $ + */ +#endregion + +using System; +using System.IO; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; +using Prebuild.Core.Targets; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + public enum BuildAction + { + /// + /// + /// + None, + /// + /// + /// + Compile, + /// + /// + /// + Content, + /// + /// + /// + EmbeddedResource + } + + /// + /// + /// + public enum SubType + { + /// + /// + /// + Code, + /// + /// + /// + Component, + /// + /// + /// + Designer, + /// + /// + /// + Form, + /// + /// + /// + Settings, + /// + /// + /// + UserControl, + /// + /// + /// + CodeBehind, + } + + public enum CopyToOutput + { + Never, + Always, + PreserveNewest + } + + /// + /// + /// + [DataNode("File")] + public class FileNode : DataNode + { + #region Fields + + private string m_Path; + private string m_ResourceName = ""; + private BuildAction? m_BuildAction; + private bool m_Valid; + private SubType? m_SubType; + private CopyToOutput m_CopyToOutput = CopyToOutput.Never; + private bool m_Link = false; + private string m_LinkPath = string.Empty; + private bool m_PreservePath = false; + + + #endregion + + #region Properties + + /// + /// + /// + public string Path + { + get + { + return m_Path; + } + } + + /// + /// + /// + public string ResourceName + { + get + { + return m_ResourceName; + } + } + + /// + /// + /// + public BuildAction BuildAction + { + get + { + if (m_BuildAction != null) + return m_BuildAction.Value; + else + return GetBuildActionByFileName(this.Path); + + } + } + + public CopyToOutput CopyToOutput + { + get + { + return this.m_CopyToOutput; + } + } + + public bool IsLink + { + get + { + return this.m_Link; + } + } + + public string LinkPath + { + get + { + return this.m_LinkPath; + } + } + /// + /// + /// + public SubType SubType + { + get + { + if (m_SubType != null) + return m_SubType.Value; + else + return GetSubTypeByFileName(this.Path); + } + } + + /// + /// + /// + public bool IsValid + { + get + { + return m_Valid; + } + } + + /// + /// + /// + /// + /// + public bool PreservePath + { + get + { + return m_PreservePath; + } + } + + #endregion + + #region Public Methods + + /// + /// + /// + /// + public override void Parse(XmlNode node) + { + string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); + if (buildAction != string.Empty) + m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); + string subType = Helper.AttributeValue(node, "subType", string.Empty); + if (subType != String.Empty) + m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); + + m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString()); + this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); + if ( this.m_Link == true ) + { + this.m_LinkPath = Helper.AttributeValue( node, "linkPath", string.Empty ); + } + this.m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", this.m_CopyToOutput.ToString())); + this.m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); + + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); + if(m_Path == null) + { + m_Path = ""; + } + + m_Path = m_Path.Trim(); + m_Valid = true; + if(!File.Exists(m_Path)) + { + m_Valid = false; + Kernel.Instance.Log.Write(LogType.Warning, "File does not exist: {0}", m_Path); + } + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Nodes/FilesNode.cs b/Programs/Prebuild/src/Core/Nodes/FilesNode.cs index 919deac0..f071f1a4 100644 --- a/Programs/Prebuild/src/Core/Nodes/FilesNode.cs +++ b/Programs/Prebuild/src/Core/Nodes/FilesNode.cs @@ -1,256 +1,256 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: sontek $ - * $Date: 2008-05-06 00:03:34 +0000 (Tue, 06 May 2008) $ - * $Revision: 269 $ - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using System.IO; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Files")] - public class FilesNode : DataNode - { - #region Fields - - private StringCollection m_Files; - private Hashtable m_BuildActions; - private Hashtable m_SubTypes; - private Hashtable m_ResourceNames; - private Hashtable m_CopyToOutputs; - private Hashtable m_Links; - private Hashtable m_LinkPaths; - private Hashtable m_PreservePaths; - - #endregion - - #region Constructors - - /// - /// - /// - public FilesNode() - { - m_Files = new StringCollection(); - m_BuildActions = new Hashtable(); - m_SubTypes = new Hashtable(); - m_ResourceNames = new Hashtable(); - m_CopyToOutputs = new Hashtable(); - m_Links = new Hashtable(); - m_LinkPaths = new Hashtable(); - m_PreservePaths = new Hashtable(); - } - - #endregion - - #region Properties - - /// - /// - /// - public int Count - { - get - { - return m_Files.Count; - } - } - - #endregion - - #region Public Methods - - /// - /// - /// - /// - /// - public BuildAction GetBuildAction(string file) - { - if(!m_BuildActions.ContainsKey(file)) - { - return BuildAction.Compile; - } - - return (BuildAction)m_BuildActions[file]; - } - - public CopyToOutput GetCopyToOutput(string file) - { - if (!this.m_CopyToOutputs.ContainsKey(file)) - { - return CopyToOutput.Never; - } - return (CopyToOutput) this.m_CopyToOutputs[file]; - } - - public bool GetIsLink(string file) - { - if (!this.m_Links.ContainsKey(file)) - { - return false; - } - return (bool) this.m_Links[file]; - } - - public string GetLinkPath( string file ) - { - if ( !this.m_LinkPaths.ContainsKey( file ) ) - { - return string.Empty; - } - return (string)this.m_LinkPaths[ file ]; - } - - /// - /// - /// - /// - /// - public SubType GetSubType(string file) - { - if(!m_SubTypes.ContainsKey(file)) - { - return SubType.Code; - } - - return (SubType)m_SubTypes[file]; - } - - /// - /// - /// - /// - /// - public string GetResourceName(string file) - { - if(!m_ResourceNames.ContainsKey(file)) - { - return ""; - } - - return (string)m_ResourceNames[file]; - } - - /// - /// - /// - /// - /// - public bool GetPreservePath( string file ) - { - if ( !m_PreservePaths.ContainsKey( file ) ) - { - return false; - } - - return (bool)m_PreservePaths[ file ]; - } - - /// - /// - /// - /// - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - foreach(XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if(dataNode is FileNode) - { - FileNode fileNode = (FileNode)dataNode; - if(fileNode.IsValid) - { - if (!m_Files.Contains(fileNode.Path)) - { - m_Files.Add(fileNode.Path); - m_BuildActions[fileNode.Path] = fileNode.BuildAction; - m_SubTypes[fileNode.Path] = fileNode.SubType; - m_ResourceNames[fileNode.Path] = fileNode.ResourceName; - this.m_PreservePaths[ fileNode.Path ] = fileNode.PreservePath; - this.m_Links[ fileNode.Path ] = fileNode.IsLink; - this.m_LinkPaths[ fileNode.Path ] = fileNode.LinkPath; - this.m_CopyToOutputs[ fileNode.Path ] = fileNode.CopyToOutput; - - } - } - } - else if(dataNode is MatchNode) - { - foreach(string file in ((MatchNode)dataNode).Files) - { - MatchNode matchNode = (MatchNode)dataNode; - if (!m_Files.Contains(file)) - { - m_Files.Add(file); - m_BuildActions[ file ] = matchNode.BuildAction == null ? GetBuildActionByFileName(file) : matchNode.BuildAction; - m_SubTypes[file] = matchNode.SubType == null ? GetSubTypeByFileName(file) : matchNode.SubType.Value; - m_ResourceNames[ file ] = matchNode.ResourceName; - this.m_PreservePaths[ file ] = matchNode.PreservePath; - this.m_Links[ file ] = matchNode.IsLink; - this.m_LinkPaths[ file ] = matchNode.LinkPath; - this.m_CopyToOutputs[ file ] = matchNode.CopyToOutput; - - } - } - } - } - } - - // TODO: Check in to why StringCollection's enumerator doesn't implement - // IEnumerator? - /// - /// - /// - /// - public StringEnumerator GetEnumerator() - { - return m_Files.GetEnumerator(); - } - - #endregion - - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: sontek $ + * $Date: 2008-05-05 17:03:34 -0700 (Mon, 05 May 2008) $ + * $Revision: 269 $ + */ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using System.IO; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Files")] + public class FilesNode : DataNode + { + #region Fields + + private StringCollection m_Files; + private Hashtable m_BuildActions; + private Hashtable m_SubTypes; + private Hashtable m_ResourceNames; + private Hashtable m_CopyToOutputs; + private Hashtable m_Links; + private Hashtable m_LinkPaths; + private Hashtable m_PreservePaths; + + #endregion + + #region Constructors + + /// + /// + /// + public FilesNode() + { + m_Files = new StringCollection(); + m_BuildActions = new Hashtable(); + m_SubTypes = new Hashtable(); + m_ResourceNames = new Hashtable(); + m_CopyToOutputs = new Hashtable(); + m_Links = new Hashtable(); + m_LinkPaths = new Hashtable(); + m_PreservePaths = new Hashtable(); + } + + #endregion + + #region Properties + + /// + /// + /// + public int Count + { + get + { + return m_Files.Count; + } + } + + #endregion + + #region Public Methods + + /// + /// + /// + /// + /// + public BuildAction GetBuildAction(string file) + { + if(!m_BuildActions.ContainsKey(file)) + { + return BuildAction.Compile; + } + + return (BuildAction)m_BuildActions[file]; + } + + public CopyToOutput GetCopyToOutput(string file) + { + if (!this.m_CopyToOutputs.ContainsKey(file)) + { + return CopyToOutput.Never; + } + return (CopyToOutput) this.m_CopyToOutputs[file]; + } + + public bool GetIsLink(string file) + { + if (!this.m_Links.ContainsKey(file)) + { + return false; + } + return (bool) this.m_Links[file]; + } + + public string GetLinkPath( string file ) + { + if ( !this.m_LinkPaths.ContainsKey( file ) ) + { + return string.Empty; + } + return (string)this.m_LinkPaths[ file ]; + } + + /// + /// + /// + /// + /// + public SubType GetSubType(string file) + { + if(!m_SubTypes.ContainsKey(file)) + { + return SubType.Code; + } + + return (SubType)m_SubTypes[file]; + } + + /// + /// + /// + /// + /// + public string GetResourceName(string file) + { + if(!m_ResourceNames.ContainsKey(file)) + { + return ""; + } + + return (string)m_ResourceNames[file]; + } + + /// + /// + /// + /// + /// + public bool GetPreservePath( string file ) + { + if ( !m_PreservePaths.ContainsKey( file ) ) + { + return false; + } + + return (bool)m_PreservePaths[ file ]; + } + + /// + /// + /// + /// + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + foreach(XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if(dataNode is FileNode) + { + FileNode fileNode = (FileNode)dataNode; + if(fileNode.IsValid) + { + if (!m_Files.Contains(fileNode.Path)) + { + m_Files.Add(fileNode.Path); + m_BuildActions[fileNode.Path] = fileNode.BuildAction; + m_SubTypes[fileNode.Path] = fileNode.SubType; + m_ResourceNames[fileNode.Path] = fileNode.ResourceName; + this.m_PreservePaths[ fileNode.Path ] = fileNode.PreservePath; + this.m_Links[ fileNode.Path ] = fileNode.IsLink; + this.m_LinkPaths[ fileNode.Path ] = fileNode.LinkPath; + this.m_CopyToOutputs[ fileNode.Path ] = fileNode.CopyToOutput; + + } + } + } + else if(dataNode is MatchNode) + { + foreach(string file in ((MatchNode)dataNode).Files) + { + MatchNode matchNode = (MatchNode)dataNode; + if (!m_Files.Contains(file)) + { + m_Files.Add(file); + m_BuildActions[ file ] = matchNode.BuildAction == null ? GetBuildActionByFileName(file) : matchNode.BuildAction; + m_SubTypes[file] = matchNode.SubType == null ? GetSubTypeByFileName(file) : matchNode.SubType.Value; + m_ResourceNames[ file ] = matchNode.ResourceName; + this.m_PreservePaths[ file ] = matchNode.PreservePath; + this.m_Links[ file ] = matchNode.IsLink; + this.m_LinkPaths[ file ] = matchNode.LinkPath; + this.m_CopyToOutputs[ file ] = matchNode.CopyToOutput; + + } + } + } + } + } + + // TODO: Check in to why StringCollection's enumerator doesn't implement + // IEnumerator? + /// + /// + /// + /// + public StringEnumerator GetEnumerator() + { + return m_Files.GetEnumerator(); + } + + #endregion + + } +} diff --git a/Programs/Prebuild/src/Core/Nodes/MatchNode.cs b/Programs/Prebuild/src/Core/Nodes/MatchNode.cs index fc9e7f3d..3b5ac770 100644 --- a/Programs/Prebuild/src/Core/Nodes/MatchNode.cs +++ b/Programs/Prebuild/src/Core/Nodes/MatchNode.cs @@ -1,351 +1,351 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: sontek $ - * $Date: 2008-05-07 20:59:35 +0000 (Wed, 07 May 2008) $ - * $Revision: 270 $ - */ -#endregion - -using System; -using System.Collections.Specialized; -using System.IO; -using System.Text.RegularExpressions; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; -using System.Collections; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Match")] - public class MatchNode : DataNode - { - #region Fields - - private StringCollection m_Files; - private Regex m_Regex; - private BuildAction? m_BuildAction; - private SubType? m_SubType; - string m_ResourceName = ""; - private CopyToOutput m_CopyToOutput; - private bool m_Link; - private string m_LinkPath; - private bool m_PreservePath; - private ArrayList m_Exclusions; - - #endregion - - #region Constructors - - /// - /// - /// - public MatchNode() - { - m_Files = new StringCollection(); - m_Exclusions = new ArrayList(); - } - - #endregion - - #region Properties - - /// - /// - /// - public StringCollection Files - { - get - { - return m_Files; - } - } - - /// - /// - /// - public BuildAction? BuildAction - { - get - { - return m_BuildAction; - } - } - - /// - /// - /// - public SubType? SubType - { - get - { - return m_SubType; - } - } - - public CopyToOutput CopyToOutput - { - get - { - return this.m_CopyToOutput; - } - } - - public bool IsLink - { - get - { - return this.m_Link; - } - } - - public string LinkPath - { - get - { - return this.m_LinkPath; - } - } - /// - /// - /// - public string ResourceName - { - get - { - return m_ResourceName; - } - } - - public bool PreservePath - { - get - { - return m_PreservePath; - } - } - - #endregion - - #region Private Methods - - /// - /// Recurses the directories. - /// - /// The path. - /// The pattern. - /// if set to true [recurse]. - /// if set to true [use regex]. - private void RecurseDirectories(string path, string pattern, bool recurse, bool useRegex, ArrayList exclusions) - { - Match match; - Boolean excludeFile; - try - { - string[] files; - - if(!useRegex) - { - files = Directory.GetFiles(path, pattern); - if(files != null) - { - string fileTemp; - foreach (string file in files) - { - excludeFile = false; - if (file.Substring(0,2) == "./" || file.Substring(0,2) == ".\\") - { - fileTemp = file.Substring(2); - } - else - { - fileTemp = file; - } - - // Check all excludions and set flag if there are any hits. - foreach ( ExcludeNode exclude in exclusions ) - { - Regex exRegEx = new Regex( exclude.Pattern ); - match = exRegEx.Match( file ); - excludeFile |= match.Success; - } - - if ( !excludeFile ) - { - m_Files.Add( fileTemp ); - } - - } - } - else - { - return; - } - } - else - { - files = Directory.GetFiles(path); - foreach(string file in files) - { - excludeFile = false; - - match = m_Regex.Match(file); - if(match.Success) - { - // Check all excludions and set flag if there are any hits. - foreach ( ExcludeNode exclude in exclusions ) - { - Regex exRegEx = new Regex( exclude.Pattern ); - match = exRegEx.Match( file ); - excludeFile |= !match.Success; - } - - if ( !excludeFile ) - { - m_Files.Add( file ); - } - } - } - } - - if(recurse) - { - string[] dirs = Directory.GetDirectories(path); - if(dirs != null && dirs.Length > 0) - { - foreach(string str in dirs) - { - RecurseDirectories(Helper.NormalizePath(str), pattern, recurse, useRegex, exclusions); - } - } - } - } - catch(DirectoryNotFoundException) - { - return; - } - catch(ArgumentException) - { - return; - } - } - - #endregion - - #region Public Methods - - /// - /// - /// - /// - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - string path = Helper.AttributeValue(node, "path", "."); - string pattern = Helper.AttributeValue(node, "pattern", "*"); - bool recurse = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "recurse", "false")); - bool useRegex = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "useRegex", "false")); - string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); - if (buildAction != string.Empty) - m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); - - //TODO: Figure out where the subtype node is being assigned - //string subType = Helper.AttributeValue(node, "subType", string.Empty); - //if (subType != String.Empty) - // m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); - m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString()); - this.m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", this.m_CopyToOutput.ToString())); - this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); - if ( this.m_Link == true ) - { - this.m_LinkPath = Helper.AttributeValue( node, "linkPath", string.Empty ); - } - this.m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); - - - if(path != null && path.Length == 0) - { - path = ".";//use current directory - } - //throw new WarningException("Match must have a 'path' attribute"); - - if(pattern == null) - { - throw new WarningException("Match must have a 'pattern' attribute"); - } - - path = Helper.NormalizePath(path); - if(!Directory.Exists(path)) - { - throw new WarningException("Match path does not exist: {0}", path); - } - - try - { - if(useRegex) - { - m_Regex = new Regex(pattern); - } - } - catch(ArgumentException ex) - { - throw new WarningException("Could not compile regex pattern: {0}", ex.Message); - } - - - foreach(XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if(dataNode is ExcludeNode) - { - ExcludeNode excludeNode = (ExcludeNode)dataNode; - m_Exclusions.Add( dataNode ); - } - } - - RecurseDirectories( path, pattern, recurse, useRegex, m_Exclusions ); - - if(m_Files.Count < 1) - { - throw new WarningException("Match returned no files: {0}{1}", Helper.EndPath(path), pattern); - } - m_Regex = null; - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: sontek $ + * $Date: 2008-05-07 13:59:35 -0700 (Wed, 07 May 2008) $ + * $Revision: 270 $ + */ +#endregion + +using System; +using System.Collections.Specialized; +using System.IO; +using System.Text.RegularExpressions; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; +using System.Collections; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Match")] + public class MatchNode : DataNode + { + #region Fields + + private StringCollection m_Files; + private Regex m_Regex; + private BuildAction? m_BuildAction; + private SubType? m_SubType; + string m_ResourceName = ""; + private CopyToOutput m_CopyToOutput; + private bool m_Link; + private string m_LinkPath; + private bool m_PreservePath; + private ArrayList m_Exclusions; + + #endregion + + #region Constructors + + /// + /// + /// + public MatchNode() + { + m_Files = new StringCollection(); + m_Exclusions = new ArrayList(); + } + + #endregion + + #region Properties + + /// + /// + /// + public StringCollection Files + { + get + { + return m_Files; + } + } + + /// + /// + /// + public BuildAction? BuildAction + { + get + { + return m_BuildAction; + } + } + + /// + /// + /// + public SubType? SubType + { + get + { + return m_SubType; + } + } + + public CopyToOutput CopyToOutput + { + get + { + return this.m_CopyToOutput; + } + } + + public bool IsLink + { + get + { + return this.m_Link; + } + } + + public string LinkPath + { + get + { + return this.m_LinkPath; + } + } + /// + /// + /// + public string ResourceName + { + get + { + return m_ResourceName; + } + } + + public bool PreservePath + { + get + { + return m_PreservePath; + } + } + + #endregion + + #region Private Methods + + /// + /// Recurses the directories. + /// + /// The path. + /// The pattern. + /// if set to true [recurse]. + /// if set to true [use regex]. + private void RecurseDirectories(string path, string pattern, bool recurse, bool useRegex, ArrayList exclusions) + { + Match match; + Boolean excludeFile; + try + { + string[] files; + + if(!useRegex) + { + files = Directory.GetFiles(path, pattern); + if(files != null) + { + string fileTemp; + foreach (string file in files) + { + excludeFile = false; + if (file.Substring(0,2) == "./" || file.Substring(0,2) == ".\\") + { + fileTemp = file.Substring(2); + } + else + { + fileTemp = file; + } + + // Check all excludions and set flag if there are any hits. + foreach ( ExcludeNode exclude in exclusions ) + { + Regex exRegEx = new Regex( exclude.Pattern ); + match = exRegEx.Match( file ); + excludeFile |= match.Success; + } + + if ( !excludeFile ) + { + m_Files.Add( fileTemp ); + } + + } + } + else + { + return; + } + } + else + { + files = Directory.GetFiles(path); + foreach(string file in files) + { + excludeFile = false; + + match = m_Regex.Match(file); + if(match.Success) + { + // Check all excludions and set flag if there are any hits. + foreach ( ExcludeNode exclude in exclusions ) + { + Regex exRegEx = new Regex( exclude.Pattern ); + match = exRegEx.Match( file ); + excludeFile |= !match.Success; + } + + if ( !excludeFile ) + { + m_Files.Add( file ); + } + } + } + } + + if(recurse) + { + string[] dirs = Directory.GetDirectories(path); + if(dirs != null && dirs.Length > 0) + { + foreach(string str in dirs) + { + RecurseDirectories(Helper.NormalizePath(str), pattern, recurse, useRegex, exclusions); + } + } + } + } + catch(DirectoryNotFoundException) + { + return; + } + catch(ArgumentException) + { + return; + } + } + + #endregion + + #region Public Methods + + /// + /// + /// + /// + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + string path = Helper.AttributeValue(node, "path", "."); + string pattern = Helper.AttributeValue(node, "pattern", "*"); + bool recurse = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "recurse", "false")); + bool useRegex = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "useRegex", "false")); + string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); + if (buildAction != string.Empty) + m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); + + //TODO: Figure out where the subtype node is being assigned + //string subType = Helper.AttributeValue(node, "subType", string.Empty); + //if (subType != String.Empty) + // m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); + m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString()); + this.m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", this.m_CopyToOutput.ToString())); + this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); + if ( this.m_Link == true ) + { + this.m_LinkPath = Helper.AttributeValue( node, "linkPath", string.Empty ); + } + this.m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); + + + if(path != null && path.Length == 0) + { + path = ".";//use current directory + } + //throw new WarningException("Match must have a 'path' attribute"); + + if(pattern == null) + { + throw new WarningException("Match must have a 'pattern' attribute"); + } + + path = Helper.NormalizePath(path); + if(!Directory.Exists(path)) + { + throw new WarningException("Match path does not exist: {0}", path); + } + + try + { + if(useRegex) + { + m_Regex = new Regex(pattern); + } + } + catch(ArgumentException ex) + { + throw new WarningException("Could not compile regex pattern: {0}", ex.Message); + } + + + foreach(XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if(dataNode is ExcludeNode) + { + ExcludeNode excludeNode = (ExcludeNode)dataNode; + m_Exclusions.Add( dataNode ); + } + } + + RecurseDirectories( path, pattern, recurse, useRegex, m_Exclusions ); + + if(m_Files.Count < 1) + { + throw new WarningException("Match returned no files: {0}{1}", Helper.EndPath(path), pattern); + } + m_Regex = null; + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Nodes/OptionsNode.cs b/Programs/Prebuild/src/Core/Nodes/OptionsNode.cs index db63b745..9a420c59 100644 --- a/Programs/Prebuild/src/Core/Nodes/OptionsNode.cs +++ b/Programs/Prebuild/src/Core/Nodes/OptionsNode.cs @@ -1,655 +1,655 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2007-01-08 16:55:40 +0000 (Mon, 08 Jan 2007) $ - * $Revision: 197 $ - */ -#endregion - - - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Reflection; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Options")] - public class OptionsNode : DataNode - { - #region Fields - - private static Hashtable m_OptionFields; - - [OptionNode("CompilerDefines")] - private string m_CompilerDefines = ""; - - /// - /// - /// - public string CompilerDefines - { - get - { - return m_CompilerDefines; - } - set - { - m_CompilerDefines = value; - } - } - - [OptionNode("OptimizeCode")] - private bool m_OptimizeCode; - - /// - /// - /// - public bool OptimizeCode - { - get - { - return m_OptimizeCode; - } - set - { - m_OptimizeCode = value; - } - } - - [OptionNode("CheckUnderflowOverflow")] - private bool m_CheckUnderflowOverflow; - - /// - /// - /// - public bool CheckUnderflowOverflow - { - get - { - return m_CheckUnderflowOverflow; - } - set - { - m_CheckUnderflowOverflow = value; - } - } - - [OptionNode("AllowUnsafe")] - private bool m_AllowUnsafe; - - /// - /// - /// - public bool AllowUnsafe - { - get - { - return m_AllowUnsafe; - } - set - { - m_AllowUnsafe = value; - } - } - - [OptionNode("PreBuildEvent")] - private string m_PreBuildEvent; - - /// - /// - /// - public string PreBuildEvent - { - get - { - return m_PreBuildEvent; - } - set - { - m_PreBuildEvent = value; - } - } - - [OptionNode("PostBuildEvent")] - private string m_PostBuildEvent; - - /// - /// - /// - public string PostBuildEvent - { - get - { - return m_PostBuildEvent; - } - set - { - m_PostBuildEvent = value; - } - } - - [OptionNode("PreBuildEventArgs")] - private string m_PreBuildEventArgs; - - /// - /// - /// - public string PreBuildEventArgs - { - get - { - return m_PreBuildEventArgs; - } - set - { - m_PreBuildEventArgs = value; - } - } - - [OptionNode("PostBuildEventArgs")] - private string m_PostBuildEventArgs; - - /// - /// - /// - public string PostBuildEventArgs - { - get - { - return m_PostBuildEventArgs; - } - set - { - m_PostBuildEventArgs = value; - } - } - - [OptionNode("RunPostBuildEvent")] - private string m_RunPostBuildEvent; - - /// - /// - /// - public string RunPostBuildEvent - { - get - { - return m_RunPostBuildEvent; - } - set - { - m_RunPostBuildEvent = value; - } - } - - [OptionNode("RunScript")] - private string m_RunScript; - - /// - /// - /// - public string RunScript - { - get - { - return m_RunScript; - } - set - { - m_RunScript = value; - } - } - - [OptionNode("WarningLevel")] - private int m_WarningLevel = 4; - - /// - /// - /// - public int WarningLevel - { - get - { - return m_WarningLevel; - } - set - { - m_WarningLevel = value; - } - } - - [OptionNode("WarningsAsErrors")] - private bool m_WarningsAsErrors; - - /// - /// - /// - public bool WarningsAsErrors - { - get - { - return m_WarningsAsErrors; - } - set - { - m_WarningsAsErrors = value; - } - } - - [OptionNode("SuppressWarnings")] - private string m_SuppressWarnings = ""; - - /// - /// - /// - public string SuppressWarnings - { - get - { - return m_SuppressWarnings; - } - set - { - m_SuppressWarnings = value; - } - } - - [OptionNode("OutputPath")] - private string m_OutputPath = "bin/"; - - /// - /// - /// - public string OutputPath - { - get - { - return m_OutputPath; - } - set - { - m_OutputPath = value; - } - } - - [OptionNode("GenerateDocumentation")] - private bool m_GenerateDocumentation; - - /// - /// - /// - public bool GenerateDocumentation - { - get - { - return m_GenerateDocumentation; - } - set - { - m_GenerateDocumentation = value; - } - } - - [OptionNode("GenerateXmlDocFile")] - private bool m_GenerateXmlDocFile; - - /// - /// - /// - public bool GenerateXmlDocFile - { - get - { - return m_GenerateXmlDocFile; - } - set - { - m_GenerateXmlDocFile = value; - } - } - - [OptionNode("XmlDocFile")] - private string m_XmlDocFile = ""; - - /// - /// - /// - public string XmlDocFile - { - get - { - return m_XmlDocFile; - } - set - { - m_XmlDocFile = value; - } - } - - [OptionNode("KeyFile")] - private string m_KeyFile = ""; - - /// - /// - /// - public string KeyFile - { - get - { - return m_KeyFile; - } - set - { - m_KeyFile = value; - } - } - - [OptionNode("DebugInformation")] - private bool m_DebugInformation; - - /// - /// - /// - public bool DebugInformation - { - get - { - return m_DebugInformation; - } - set - { - m_DebugInformation = value; - } - } - - [OptionNode("RegisterComInterop")] - private bool m_RegisterComInterop; - - /// - /// - /// - public bool RegisterComInterop - { - get - { - return m_RegisterComInterop; - } - set - { - m_RegisterComInterop = value; - } - } - - [OptionNode("RemoveIntegerChecks")] - private bool m_RemoveIntegerChecks; - - /// - /// - /// - public bool RemoveIntegerChecks - { - get - { - return m_RemoveIntegerChecks; - } - set - { - m_RemoveIntegerChecks = value; - } - } - - [OptionNode("IncrementalBuild")] - private bool m_IncrementalBuild; - - /// - /// - /// - public bool IncrementalBuild - { - get - { - return m_IncrementalBuild; - } - set - { - m_IncrementalBuild = value; - } - } - - [OptionNode("BaseAddress")] - private string m_BaseAddress = "285212672"; - - /// - /// - /// - public string BaseAddress - { - get - { - return m_BaseAddress; - } - set - { - m_BaseAddress = value; - } - } - - [OptionNode("FileAlignment")] - private int m_FileAlignment = 4096; - - /// - /// - /// - public int FileAlignment - { - get - { - return m_FileAlignment; - } - set - { - m_FileAlignment = value; - } - } - - [OptionNode("NoStdLib")] - private bool m_NoStdLib; - - /// - /// - /// - public bool NoStdLib - { - get - { - return m_NoStdLib; - } - set - { - m_NoStdLib = value; - } - } - - private StringCollection m_FieldsDefined; - - #endregion - - #region Constructors - - /// - /// Initializes the class. - /// - static OptionsNode() - { - Type t = typeof(OptionsNode); - - m_OptionFields = new Hashtable(); - foreach(FieldInfo f in t.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)) - { - object[] attrs = f.GetCustomAttributes(typeof(OptionNodeAttribute), false); - if(attrs == null || attrs.Length < 1) - { - continue; - } - - OptionNodeAttribute ona = (OptionNodeAttribute)attrs[0]; - m_OptionFields[ona.NodeName] = f; - } - } - - /// - /// Initializes a new instance of the class. - /// - public OptionsNode() - { - m_FieldsDefined = new StringCollection(); - } - - #endregion - - #region Properties - - /// - /// Gets the at the specified index. - /// - /// - public object this[string index] - { - get - { - if(!m_OptionFields.ContainsKey(index)) - { - return null; - } - - FieldInfo f = (FieldInfo)m_OptionFields[index]; - return f.GetValue(this); - } - } - - /// - /// Gets the at the specified index. - /// - /// - public object this[string index, object defaultValue] - { - get - { - object valueObject = this[index]; - if(valueObject != null && valueObject is string && ((string)valueObject).Length == 0) - { - return defaultValue; - } - return valueObject; - } - } - - - #endregion - - #region Private Methods - - private void FlagDefined(string name) - { - if(!m_FieldsDefined.Contains(name)) - { - m_FieldsDefined.Add(name); - } - } - - private void SetOption(string nodeName, string val) - { - lock(m_OptionFields) - { - if(!m_OptionFields.ContainsKey(nodeName)) - { - return; - } - - FieldInfo f = (FieldInfo)m_OptionFields[nodeName]; - f.SetValue(this, Helper.TranslateValue(f.FieldType, val)); - FlagDefined(f.Name); - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - foreach(XmlNode child in node.ChildNodes) - { - SetOption(child.Name, Helper.InterpolateForEnvironmentVariables(child.InnerText)); - } - } - - /// - /// Copies to. - /// - /// The opt. - public void CopyTo(OptionsNode opt) - { - if(opt == null) - { - return; - } - - foreach(FieldInfo f in m_OptionFields.Values) - { - if(m_FieldsDefined.Contains(f.Name)) - { - f.SetValue(opt, f.GetValue(this)); - opt.m_FieldsDefined.Add(f.Name); - } - } - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2007-01-08 08:55:40 -0800 (Mon, 08 Jan 2007) $ + * $Revision: 197 $ + */ +#endregion + + + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.Reflection; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Options")] + public class OptionsNode : DataNode + { + #region Fields + + private static Hashtable m_OptionFields; + + [OptionNode("CompilerDefines")] + private string m_CompilerDefines = ""; + + /// + /// + /// + public string CompilerDefines + { + get + { + return m_CompilerDefines; + } + set + { + m_CompilerDefines = value; + } + } + + [OptionNode("OptimizeCode")] + private bool m_OptimizeCode; + + /// + /// + /// + public bool OptimizeCode + { + get + { + return m_OptimizeCode; + } + set + { + m_OptimizeCode = value; + } + } + + [OptionNode("CheckUnderflowOverflow")] + private bool m_CheckUnderflowOverflow; + + /// + /// + /// + public bool CheckUnderflowOverflow + { + get + { + return m_CheckUnderflowOverflow; + } + set + { + m_CheckUnderflowOverflow = value; + } + } + + [OptionNode("AllowUnsafe")] + private bool m_AllowUnsafe; + + /// + /// + /// + public bool AllowUnsafe + { + get + { + return m_AllowUnsafe; + } + set + { + m_AllowUnsafe = value; + } + } + + [OptionNode("PreBuildEvent")] + private string m_PreBuildEvent; + + /// + /// + /// + public string PreBuildEvent + { + get + { + return m_PreBuildEvent; + } + set + { + m_PreBuildEvent = value; + } + } + + [OptionNode("PostBuildEvent")] + private string m_PostBuildEvent; + + /// + /// + /// + public string PostBuildEvent + { + get + { + return m_PostBuildEvent; + } + set + { + m_PostBuildEvent = value; + } + } + + [OptionNode("PreBuildEventArgs")] + private string m_PreBuildEventArgs; + + /// + /// + /// + public string PreBuildEventArgs + { + get + { + return m_PreBuildEventArgs; + } + set + { + m_PreBuildEventArgs = value; + } + } + + [OptionNode("PostBuildEventArgs")] + private string m_PostBuildEventArgs; + + /// + /// + /// + public string PostBuildEventArgs + { + get + { + return m_PostBuildEventArgs; + } + set + { + m_PostBuildEventArgs = value; + } + } + + [OptionNode("RunPostBuildEvent")] + private string m_RunPostBuildEvent; + + /// + /// + /// + public string RunPostBuildEvent + { + get + { + return m_RunPostBuildEvent; + } + set + { + m_RunPostBuildEvent = value; + } + } + + [OptionNode("RunScript")] + private string m_RunScript; + + /// + /// + /// + public string RunScript + { + get + { + return m_RunScript; + } + set + { + m_RunScript = value; + } + } + + [OptionNode("WarningLevel")] + private int m_WarningLevel = 4; + + /// + /// + /// + public int WarningLevel + { + get + { + return m_WarningLevel; + } + set + { + m_WarningLevel = value; + } + } + + [OptionNode("WarningsAsErrors")] + private bool m_WarningsAsErrors; + + /// + /// + /// + public bool WarningsAsErrors + { + get + { + return m_WarningsAsErrors; + } + set + { + m_WarningsAsErrors = value; + } + } + + [OptionNode("SuppressWarnings")] + private string m_SuppressWarnings = ""; + + /// + /// + /// + public string SuppressWarnings + { + get + { + return m_SuppressWarnings; + } + set + { + m_SuppressWarnings = value; + } + } + + [OptionNode("OutputPath")] + private string m_OutputPath = "bin/"; + + /// + /// + /// + public string OutputPath + { + get + { + return m_OutputPath; + } + set + { + m_OutputPath = value; + } + } + + [OptionNode("GenerateDocumentation")] + private bool m_GenerateDocumentation; + + /// + /// + /// + public bool GenerateDocumentation + { + get + { + return m_GenerateDocumentation; + } + set + { + m_GenerateDocumentation = value; + } + } + + [OptionNode("GenerateXmlDocFile")] + private bool m_GenerateXmlDocFile; + + /// + /// + /// + public bool GenerateXmlDocFile + { + get + { + return m_GenerateXmlDocFile; + } + set + { + m_GenerateXmlDocFile = value; + } + } + + [OptionNode("XmlDocFile")] + private string m_XmlDocFile = ""; + + /// + /// + /// + public string XmlDocFile + { + get + { + return m_XmlDocFile; + } + set + { + m_XmlDocFile = value; + } + } + + [OptionNode("KeyFile")] + private string m_KeyFile = ""; + + /// + /// + /// + public string KeyFile + { + get + { + return m_KeyFile; + } + set + { + m_KeyFile = value; + } + } + + [OptionNode("DebugInformation")] + private bool m_DebugInformation; + + /// + /// + /// + public bool DebugInformation + { + get + { + return m_DebugInformation; + } + set + { + m_DebugInformation = value; + } + } + + [OptionNode("RegisterComInterop")] + private bool m_RegisterComInterop; + + /// + /// + /// + public bool RegisterComInterop + { + get + { + return m_RegisterComInterop; + } + set + { + m_RegisterComInterop = value; + } + } + + [OptionNode("RemoveIntegerChecks")] + private bool m_RemoveIntegerChecks; + + /// + /// + /// + public bool RemoveIntegerChecks + { + get + { + return m_RemoveIntegerChecks; + } + set + { + m_RemoveIntegerChecks = value; + } + } + + [OptionNode("IncrementalBuild")] + private bool m_IncrementalBuild; + + /// + /// + /// + public bool IncrementalBuild + { + get + { + return m_IncrementalBuild; + } + set + { + m_IncrementalBuild = value; + } + } + + [OptionNode("BaseAddress")] + private string m_BaseAddress = "285212672"; + + /// + /// + /// + public string BaseAddress + { + get + { + return m_BaseAddress; + } + set + { + m_BaseAddress = value; + } + } + + [OptionNode("FileAlignment")] + private int m_FileAlignment = 4096; + + /// + /// + /// + public int FileAlignment + { + get + { + return m_FileAlignment; + } + set + { + m_FileAlignment = value; + } + } + + [OptionNode("NoStdLib")] + private bool m_NoStdLib; + + /// + /// + /// + public bool NoStdLib + { + get + { + return m_NoStdLib; + } + set + { + m_NoStdLib = value; + } + } + + private StringCollection m_FieldsDefined; + + #endregion + + #region Constructors + + /// + /// Initializes the class. + /// + static OptionsNode() + { + Type t = typeof(OptionsNode); + + m_OptionFields = new Hashtable(); + foreach(FieldInfo f in t.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)) + { + object[] attrs = f.GetCustomAttributes(typeof(OptionNodeAttribute), false); + if(attrs == null || attrs.Length < 1) + { + continue; + } + + OptionNodeAttribute ona = (OptionNodeAttribute)attrs[0]; + m_OptionFields[ona.NodeName] = f; + } + } + + /// + /// Initializes a new instance of the class. + /// + public OptionsNode() + { + m_FieldsDefined = new StringCollection(); + } + + #endregion + + #region Properties + + /// + /// Gets the at the specified index. + /// + /// + public object this[string index] + { + get + { + if(!m_OptionFields.ContainsKey(index)) + { + return null; + } + + FieldInfo f = (FieldInfo)m_OptionFields[index]; + return f.GetValue(this); + } + } + + /// + /// Gets the at the specified index. + /// + /// + public object this[string index, object defaultValue] + { + get + { + object valueObject = this[index]; + if(valueObject != null && valueObject is string && ((string)valueObject).Length == 0) + { + return defaultValue; + } + return valueObject; + } + } + + + #endregion + + #region Private Methods + + private void FlagDefined(string name) + { + if(!m_FieldsDefined.Contains(name)) + { + m_FieldsDefined.Add(name); + } + } + + private void SetOption(string nodeName, string val) + { + lock(m_OptionFields) + { + if(!m_OptionFields.ContainsKey(nodeName)) + { + return; + } + + FieldInfo f = (FieldInfo)m_OptionFields[nodeName]; + f.SetValue(this, Helper.TranslateValue(f.FieldType, val)); + FlagDefined(f.Name); + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + foreach(XmlNode child in node.ChildNodes) + { + SetOption(child.Name, Helper.InterpolateForEnvironmentVariables(child.InnerText)); + } + } + + /// + /// Copies to. + /// + /// The opt. + public void CopyTo(OptionsNode opt) + { + if(opt == null) + { + return; + } + + foreach(FieldInfo f in m_OptionFields.Values) + { + if(m_FieldsDefined.Contains(f.Name)) + { + f.SetValue(opt, f.GetValue(this)); + opt.m_FieldsDefined.Add(f.Name); + } + } + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Nodes/ProcessNode.cs b/Programs/Prebuild/src/Core/Nodes/ProcessNode.cs index b73d0716..ce6a2fe8 100644 --- a/Programs/Prebuild/src/Core/Nodes/ProcessNode.cs +++ b/Programs/Prebuild/src/Core/Nodes/ProcessNode.cs @@ -1,119 +1,119 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 00:49:58 +0000 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Process")] - public class ProcessNode : DataNode - { - #region Fields - - private string m_Path; - private bool m_IsValid = true; - - #endregion - - #region Properties - - /// - /// Gets the path. - /// - /// The path. - public string Path - { - get - { - return m_Path; - } - } - - /// - /// Gets a value indicating whether this instance is valid. - /// - /// true if this instance is valid; otherwise, false. - public bool IsValid - { - get - { - return m_IsValid; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); - if(m_Path == null) - { - m_Path = ""; - } - - try - { - m_Path = Helper.ResolvePath(m_Path); - } - catch(ArgumentException) - { - Kernel.Instance.Log.Write(LogType.Warning, "Could not find prebuild file for processing: {0}", m_Path); - m_IsValid = false; - } - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2006-01-27 16:49:58 -0800 (Fri, 27 Jan 2006) $ + * $Revision: 71 $ + */ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Process")] + public class ProcessNode : DataNode + { + #region Fields + + private string m_Path; + private bool m_IsValid = true; + + #endregion + + #region Properties + + /// + /// Gets the path. + /// + /// The path. + public string Path + { + get + { + return m_Path; + } + } + + /// + /// Gets a value indicating whether this instance is valid. + /// + /// true if this instance is valid; otherwise, false. + public bool IsValid + { + get + { + return m_IsValid; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); + if(m_Path == null) + { + m_Path = ""; + } + + try + { + m_Path = Helper.ResolvePath(m_Path); + } + catch(ArgumentException) + { + Kernel.Instance.Log.Write(LogType.Warning, "Could not find prebuild file for processing: {0}", m_Path); + m_IsValid = false; + } + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Nodes/ProjectNode.cs b/Programs/Prebuild/src/Core/Nodes/ProjectNode.cs index b24d31fc..4f5c802c 100644 --- a/Programs/Prebuild/src/Core/Nodes/ProjectNode.cs +++ b/Programs/Prebuild/src/Core/Nodes/ProjectNode.cs @@ -1,572 +1,572 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: sontek $ - * $Date: 2008-06-16 23:37:58 +0000 (Mon, 16 Jun 2008) $ - * $Revision: 275 $ - */ -#endregion - -using System; -using System.Collections; -using System.IO; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// A set of values that the Project's type can be - /// - public enum ProjectType - { - /// - /// The project is a console executable - /// - Exe, - /// - /// The project is a windows executable - /// - WinExe, - /// - /// The project is a library - /// - Library, - /// - /// The project is a website - /// - Web, - } - - /// - /// - /// - public enum ClrRuntime - { - /// - /// - /// - Microsoft, - /// - /// - /// - Mono - } - /// - /// The version of the .NET framework to use (Required for VS2008) - /// We don't need .NET 1.1 in here, it'll default when using vs2003. - /// - public enum FrameworkVersion - { - /// - /// .NET 2.0 - /// - v2_0, - /// - /// .NET 3.0 - /// - v3_0, - /// - /// .NET 3.5 - /// - v3_5, - } - /// - /// The Node object representing /Prebuild/Solution/Project elements - /// - [DataNode("Project")] - public class ProjectNode : DataNode - { - #region Fields - - private string m_Name = "unknown"; - private string m_Path = ""; - private string m_FullPath = ""; - private string m_AssemblyName; - private string m_AppIcon = ""; - private string m_ConfigFile = ""; - private string m_DesignerFolder = ""; - private string m_Language = "C#"; - private ProjectType m_Type = ProjectType.Exe; - private ClrRuntime m_Runtime = ClrRuntime.Microsoft; - private FrameworkVersion m_Framework = FrameworkVersion.v2_0; - private string m_StartupObject = ""; - private string m_RootNamespace; - private string m_FilterGroups = ""; - private string m_Version = ""; - private Guid m_Guid; - - private Hashtable m_Configurations; - private ArrayList m_ReferencePaths; - private ArrayList m_References; - private ArrayList m_Authors; - private FilesNode m_Files; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public ProjectNode() - { - m_Configurations = new Hashtable(); - m_ReferencePaths = new ArrayList(); - m_References = new ArrayList(); - m_Authors = new ArrayList(); - } - - #endregion - - #region Properties - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - /// - /// The version of the .NET Framework to compile under - /// - public FrameworkVersion FrameworkVersion - { - get - { - return this.m_Framework; - } - } - /// - /// Gets the path. - /// - /// The path. - public string Path - { - get - { - return m_Path; - } - } - - /// - /// Gets the filter groups. - /// - /// The filter groups. - public string FilterGroups - { - get - { - return m_FilterGroups; - } - } - - /// - /// Gets the project's version - /// - /// The project's version. - public string Version - { - get - { - return m_Version; - } - } - - /// - /// Gets the full path. - /// - /// The full path. - public string FullPath - { - get - { - return m_FullPath; - } - } - - /// - /// Gets the name of the assembly. - /// - /// The name of the assembly. - public string AssemblyName - { - get - { - return m_AssemblyName; - } - } - - /// - /// Gets the app icon. - /// - /// The app icon. - public string AppIcon - { - get - { - return m_AppIcon; - } - } - - /// - /// Gets the app icon. - /// - /// The app icon. - public string ConfigFile - { - get - { - return m_ConfigFile; - } - } - - /// - /// - /// - public string DesignerFolder - { - get - { - return m_DesignerFolder; - } - } - - /// - /// Gets the language. - /// - /// The language. - public string Language - { - get - { - return m_Language; - } - } - - /// - /// Gets the type. - /// - /// The type. - public ProjectType Type - { - get - { - return m_Type; - } - } - - /// - /// Gets the runtime. - /// - /// The runtime. - public ClrRuntime Runtime - { - get - { - return m_Runtime; - } - } - - private bool m_GenerateAssemblyInfoFile = false; - - /// - /// - /// - public bool GenerateAssemblyInfoFile - { - get - { - return m_GenerateAssemblyInfoFile; - } - set - { - m_GenerateAssemblyInfoFile = value; - } - } - - /// - /// Gets the startup object. - /// - /// The startup object. - public string StartupObject - { - get - { - return m_StartupObject; - } - } - - /// - /// Gets the root namespace. - /// - /// The root namespace. - public string RootNamespace - { - get - { - return m_RootNamespace; - } - } - - /// - /// Gets the configurations. - /// - /// The configurations. - public ICollection Configurations - { - get - { - return m_Configurations.Values; - } - } - - /// - /// Gets the configurations table. - /// - /// The configurations table. - public Hashtable ConfigurationsTable - { - get - { - return m_Configurations; - } - } - - /// - /// Gets the reference paths. - /// - /// The reference paths. - public ArrayList ReferencePaths - { - get - { - return m_ReferencePaths; - } - } - - /// - /// Gets the references. - /// - /// The references. - public ArrayList References - { - get - { - return m_References; - } - } - - /// - /// Gets the Authors list. - /// - /// The list of the project's authors. - public ArrayList Authors - { - get - { - return m_Authors; - } - } - - /// - /// Gets the files. - /// - /// The files. - public FilesNode Files - { - get - { - return m_Files; - } - } - - /// - /// Gets or sets the parent. - /// - /// The parent. - public override IDataNode Parent - { - get - { - return base.Parent; - } - set - { - base.Parent = value; - if(base.Parent is SolutionNode && m_Configurations.Count < 1) - { - SolutionNode parent = (SolutionNode)base.Parent; - foreach(ConfigurationNode conf in parent.Configurations) - { - m_Configurations[conf.Name] = conf.Clone(); - } - } - } - } - - /// - /// Gets the GUID. - /// - /// The GUID. - public Guid Guid - { - get - { - return m_Guid; - } - } - - #endregion - - #region Private Methods - - private void HandleConfiguration(ConfigurationNode conf) - { - if(String.Compare(conf.Name, "all", true) == 0) //apply changes to all, this may not always be applied first, - //so it *may* override changes to the same properties for configurations defines at the project level - { - foreach(ConfigurationNode confNode in this.m_Configurations.Values) - { - conf.CopyTo(confNode);//update the config templates defines at the project level with the overrides - } - } - if(m_Configurations.ContainsKey(conf.Name)) - { - ConfigurationNode parentConf = (ConfigurationNode)m_Configurations[conf.Name]; - conf.CopyTo(parentConf);//update the config templates defines at the project level with the overrides - } - else - { - m_Configurations[conf.Name] = conf; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - m_Name = Helper.AttributeValue(node, "name", m_Name); - m_Path = Helper.AttributeValue(node, "path", m_Path); - m_FilterGroups = Helper.AttributeValue(node, "filterGroups", m_FilterGroups); - m_Version = Helper.AttributeValue(node, "version", m_Version); - m_AppIcon = Helper.AttributeValue(node, "icon", m_AppIcon); - m_ConfigFile = Helper.AttributeValue(node, "configFile", m_ConfigFile); - m_DesignerFolder = Helper.AttributeValue(node, "designerFolder", m_DesignerFolder); - m_AssemblyName = Helper.AttributeValue(node, "assemblyName", m_AssemblyName); - m_Language = Helper.AttributeValue(node, "language", m_Language); - m_Type = (ProjectType)Helper.EnumAttributeValue(node, "type", typeof(ProjectType), m_Type); - m_Runtime = (ClrRuntime)Helper.EnumAttributeValue(node, "runtime", typeof(ClrRuntime), m_Runtime); - m_Framework = (FrameworkVersion)Helper.EnumAttributeValue(node, "frameworkVersion", typeof(FrameworkVersion), m_Framework); - m_StartupObject = Helper.AttributeValue(node, "startupObject", m_StartupObject); - m_RootNamespace = Helper.AttributeValue(node, "rootNamespace", m_RootNamespace); - - string guid = Helper.AttributeValue(node, "guid", Guid.NewGuid().ToString()); - m_Guid = new Guid(guid); - - m_GenerateAssemblyInfoFile = Helper.ParseBoolean(node, "generateAssemblyInfoFile", false); - - if(m_AssemblyName == null || m_AssemblyName.Length < 1) - { - m_AssemblyName = m_Name; - } - - if(m_RootNamespace == null || m_RootNamespace.Length < 1) - { - m_RootNamespace = m_Name; - } - - m_FullPath = m_Path; - try - { - m_FullPath = Helper.ResolvePath(m_FullPath); - } - catch - { - throw new WarningException("Could not resolve Solution path: {0}", m_Path); - } - - Kernel.Instance.CurrentWorkingDirectory.Push(); - try - { - Helper.SetCurrentDir(m_FullPath); - - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - foreach(XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if(dataNode is ConfigurationNode) - { - HandleConfiguration((ConfigurationNode)dataNode); - } - else if(dataNode is ReferencePathNode) - { - m_ReferencePaths.Add(dataNode); - } - else if(dataNode is ReferenceNode) - { - m_References.Add(dataNode); - } - else if(dataNode is AuthorNode) - { - m_Authors.Add(dataNode); - } - else if(dataNode is FilesNode) - { - m_Files = (FilesNode)dataNode; - } - } - } - finally - { - Kernel.Instance.CurrentWorkingDirectory.Pop(); - } - } - - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: sontek $ + * $Date: 2008-06-16 16:37:58 -0700 (Mon, 16 Jun 2008) $ + * $Revision: 275 $ + */ +#endregion + +using System; +using System.Collections; +using System.IO; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// A set of values that the Project's type can be + /// + public enum ProjectType + { + /// + /// The project is a console executable + /// + Exe, + /// + /// The project is a windows executable + /// + WinExe, + /// + /// The project is a library + /// + Library, + /// + /// The project is a website + /// + Web, + } + + /// + /// + /// + public enum ClrRuntime + { + /// + /// + /// + Microsoft, + /// + /// + /// + Mono + } + /// + /// The version of the .NET framework to use (Required for VS2008) + /// We don't need .NET 1.1 in here, it'll default when using vs2003. + /// + public enum FrameworkVersion + { + /// + /// .NET 2.0 + /// + v2_0, + /// + /// .NET 3.0 + /// + v3_0, + /// + /// .NET 3.5 + /// + v3_5, + } + /// + /// The Node object representing /Prebuild/Solution/Project elements + /// + [DataNode("Project")] + public class ProjectNode : DataNode + { + #region Fields + + private string m_Name = "unknown"; + private string m_Path = ""; + private string m_FullPath = ""; + private string m_AssemblyName; + private string m_AppIcon = ""; + private string m_ConfigFile = ""; + private string m_DesignerFolder = ""; + private string m_Language = "C#"; + private ProjectType m_Type = ProjectType.Exe; + private ClrRuntime m_Runtime = ClrRuntime.Microsoft; + private FrameworkVersion m_Framework = FrameworkVersion.v2_0; + private string m_StartupObject = ""; + private string m_RootNamespace; + private string m_FilterGroups = ""; + private string m_Version = ""; + private Guid m_Guid; + + private Hashtable m_Configurations; + private ArrayList m_ReferencePaths; + private ArrayList m_References; + private ArrayList m_Authors; + private FilesNode m_Files; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public ProjectNode() + { + m_Configurations = new Hashtable(); + m_ReferencePaths = new ArrayList(); + m_References = new ArrayList(); + m_Authors = new ArrayList(); + } + + #endregion + + #region Properties + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + /// + /// The version of the .NET Framework to compile under + /// + public FrameworkVersion FrameworkVersion + { + get + { + return this.m_Framework; + } + } + /// + /// Gets the path. + /// + /// The path. + public string Path + { + get + { + return m_Path; + } + } + + /// + /// Gets the filter groups. + /// + /// The filter groups. + public string FilterGroups + { + get + { + return m_FilterGroups; + } + } + + /// + /// Gets the project's version + /// + /// The project's version. + public string Version + { + get + { + return m_Version; + } + } + + /// + /// Gets the full path. + /// + /// The full path. + public string FullPath + { + get + { + return m_FullPath; + } + } + + /// + /// Gets the name of the assembly. + /// + /// The name of the assembly. + public string AssemblyName + { + get + { + return m_AssemblyName; + } + } + + /// + /// Gets the app icon. + /// + /// The app icon. + public string AppIcon + { + get + { + return m_AppIcon; + } + } + + /// + /// Gets the app icon. + /// + /// The app icon. + public string ConfigFile + { + get + { + return m_ConfigFile; + } + } + + /// + /// + /// + public string DesignerFolder + { + get + { + return m_DesignerFolder; + } + } + + /// + /// Gets the language. + /// + /// The language. + public string Language + { + get + { + return m_Language; + } + } + + /// + /// Gets the type. + /// + /// The type. + public ProjectType Type + { + get + { + return m_Type; + } + } + + /// + /// Gets the runtime. + /// + /// The runtime. + public ClrRuntime Runtime + { + get + { + return m_Runtime; + } + } + + private bool m_GenerateAssemblyInfoFile = false; + + /// + /// + /// + public bool GenerateAssemblyInfoFile + { + get + { + return m_GenerateAssemblyInfoFile; + } + set + { + m_GenerateAssemblyInfoFile = value; + } + } + + /// + /// Gets the startup object. + /// + /// The startup object. + public string StartupObject + { + get + { + return m_StartupObject; + } + } + + /// + /// Gets the root namespace. + /// + /// The root namespace. + public string RootNamespace + { + get + { + return m_RootNamespace; + } + } + + /// + /// Gets the configurations. + /// + /// The configurations. + public ICollection Configurations + { + get + { + return m_Configurations.Values; + } + } + + /// + /// Gets the configurations table. + /// + /// The configurations table. + public Hashtable ConfigurationsTable + { + get + { + return m_Configurations; + } + } + + /// + /// Gets the reference paths. + /// + /// The reference paths. + public ArrayList ReferencePaths + { + get + { + return m_ReferencePaths; + } + } + + /// + /// Gets the references. + /// + /// The references. + public ArrayList References + { + get + { + return m_References; + } + } + + /// + /// Gets the Authors list. + /// + /// The list of the project's authors. + public ArrayList Authors + { + get + { + return m_Authors; + } + } + + /// + /// Gets the files. + /// + /// The files. + public FilesNode Files + { + get + { + return m_Files; + } + } + + /// + /// Gets or sets the parent. + /// + /// The parent. + public override IDataNode Parent + { + get + { + return base.Parent; + } + set + { + base.Parent = value; + if(base.Parent is SolutionNode && m_Configurations.Count < 1) + { + SolutionNode parent = (SolutionNode)base.Parent; + foreach(ConfigurationNode conf in parent.Configurations) + { + m_Configurations[conf.Name] = conf.Clone(); + } + } + } + } + + /// + /// Gets the GUID. + /// + /// The GUID. + public Guid Guid + { + get + { + return m_Guid; + } + } + + #endregion + + #region Private Methods + + private void HandleConfiguration(ConfigurationNode conf) + { + if(String.Compare(conf.Name, "all", true) == 0) //apply changes to all, this may not always be applied first, + //so it *may* override changes to the same properties for configurations defines at the project level + { + foreach(ConfigurationNode confNode in this.m_Configurations.Values) + { + conf.CopyTo(confNode);//update the config templates defines at the project level with the overrides + } + } + if(m_Configurations.ContainsKey(conf.Name)) + { + ConfigurationNode parentConf = (ConfigurationNode)m_Configurations[conf.Name]; + conf.CopyTo(parentConf);//update the config templates defines at the project level with the overrides + } + else + { + m_Configurations[conf.Name] = conf; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + m_Name = Helper.AttributeValue(node, "name", m_Name); + m_Path = Helper.AttributeValue(node, "path", m_Path); + m_FilterGroups = Helper.AttributeValue(node, "filterGroups", m_FilterGroups); + m_Version = Helper.AttributeValue(node, "version", m_Version); + m_AppIcon = Helper.AttributeValue(node, "icon", m_AppIcon); + m_ConfigFile = Helper.AttributeValue(node, "configFile", m_ConfigFile); + m_DesignerFolder = Helper.AttributeValue(node, "designerFolder", m_DesignerFolder); + m_AssemblyName = Helper.AttributeValue(node, "assemblyName", m_AssemblyName); + m_Language = Helper.AttributeValue(node, "language", m_Language); + m_Type = (ProjectType)Helper.EnumAttributeValue(node, "type", typeof(ProjectType), m_Type); + m_Runtime = (ClrRuntime)Helper.EnumAttributeValue(node, "runtime", typeof(ClrRuntime), m_Runtime); + m_Framework = (FrameworkVersion)Helper.EnumAttributeValue(node, "frameworkVersion", typeof(FrameworkVersion), m_Framework); + m_StartupObject = Helper.AttributeValue(node, "startupObject", m_StartupObject); + m_RootNamespace = Helper.AttributeValue(node, "rootNamespace", m_RootNamespace); + + string guid = Helper.AttributeValue(node, "guid", Guid.NewGuid().ToString()); + m_Guid = new Guid(guid); + + m_GenerateAssemblyInfoFile = Helper.ParseBoolean(node, "generateAssemblyInfoFile", false); + + if(m_AssemblyName == null || m_AssemblyName.Length < 1) + { + m_AssemblyName = m_Name; + } + + if(m_RootNamespace == null || m_RootNamespace.Length < 1) + { + m_RootNamespace = m_Name; + } + + m_FullPath = m_Path; + try + { + m_FullPath = Helper.ResolvePath(m_FullPath); + } + catch + { + throw new WarningException("Could not resolve Solution path: {0}", m_Path); + } + + Kernel.Instance.CurrentWorkingDirectory.Push(); + try + { + Helper.SetCurrentDir(m_FullPath); + + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + foreach(XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if(dataNode is ConfigurationNode) + { + HandleConfiguration((ConfigurationNode)dataNode); + } + else if(dataNode is ReferencePathNode) + { + m_ReferencePaths.Add(dataNode); + } + else if(dataNode is ReferenceNode) + { + m_References.Add(dataNode); + } + else if(dataNode is AuthorNode) + { + m_Authors.Add(dataNode); + } + else if(dataNode is FilesNode) + { + m_Files = (FilesNode)dataNode; + } + } + } + finally + { + Kernel.Instance.CurrentWorkingDirectory.Pop(); + } + } + + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Nodes/ReferenceNode.cs b/Programs/Prebuild/src/Core/Nodes/ReferenceNode.cs index 8298733f..acc74561 100644 --- a/Programs/Prebuild/src/Core/Nodes/ReferenceNode.cs +++ b/Programs/Prebuild/src/Core/Nodes/ReferenceNode.cs @@ -1,143 +1,147 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-07-25 16:56:49 +0000 (Tue, 25 Jul 2006) $ - * $Revision: 132 $ - */ -#endregion - -using System; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Reference")] - public class ReferenceNode : DataNode - { - #region Fields - - private string m_Name = "unknown"; - private string m_Path; - private string m_LocalCopy; - private string m_Version; - - #endregion - - #region Properties - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - - /// - /// Gets the path. - /// - /// The path. - public string Path - { - get - { - return m_Path; - } - } - - /// - /// Gets a value indicating whether [local copy specified]. - /// - /// true if [local copy specified]; otherwise, false. - public bool LocalCopySpecified - { - get - { - return ( m_LocalCopy != null && m_LocalCopy.Length == 0); - } - } - - /// - /// Gets a value indicating whether [local copy]. - /// - /// true if [local copy]; otherwise, false. - public bool LocalCopy - { - get - { - if( m_LocalCopy == null) - { - return false; - } - return bool.Parse(m_LocalCopy); - } - } - - /// - /// Gets the version. - /// - /// The version. - public string Version - { - get - { - return m_Version; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - m_Name = Helper.AttributeValue(node, "name", m_Name); - m_Path = Helper.AttributeValue(node, "path", m_Path); - m_LocalCopy = Helper.AttributeValue(node, "localCopy", m_LocalCopy); - m_Version = Helper.AttributeValue(node, "version", m_Version); - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2006-07-25 09:56:49 -0700 (Tue, 25 Jul 2006) $ + * $Revision: 132 $ + */ +#endregion + +using System; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Reference")] + public class ReferenceNode : DataNode + { + #region Fields + + private string m_Name = "unknown"; + private string m_Path; + private string m_LocalCopy; + private string m_Version; + + #endregion + + #region Properties + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + set + { + m_Name = value; + } + } + + /// + /// Gets the path. + /// + /// The path. + public string Path + { + get + { + return m_Path; + } + } + + /// + /// Gets a value indicating whether [local copy specified]. + /// + /// true if [local copy specified]; otherwise, false. + public bool LocalCopySpecified + { + get + { + return ( m_LocalCopy != null && m_LocalCopy.Length == 0); + } + } + + /// + /// Gets a value indicating whether [local copy]. + /// + /// true if [local copy]; otherwise, false. + public bool LocalCopy + { + get + { + if( m_LocalCopy == null) + { + return false; + } + return bool.Parse(m_LocalCopy); + } + } + + /// + /// Gets the version. + /// + /// The version. + public string Version + { + get + { + return m_Version; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + m_Name = Helper.AttributeValue(node, "name", m_Name); + m_Path = Helper.AttributeValue(node, "path", m_Path); + m_LocalCopy = Helper.AttributeValue(node, "localCopy", m_LocalCopy); + m_Version = Helper.AttributeValue(node, "version", m_Version); + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Nodes/ReferencePathNode.cs b/Programs/Prebuild/src/Core/Nodes/ReferencePathNode.cs index 1f015a04..606256bd 100644 --- a/Programs/Prebuild/src/Core/Nodes/ReferencePathNode.cs +++ b/Programs/Prebuild/src/Core/Nodes/ReferencePathNode.cs @@ -1,98 +1,98 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 00:49:58 +0000 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("ReferencePath")] - public class ReferencePathNode : DataNode - { - #region Fields - - private string m_Path; - - #endregion - - #region Properties - - /// - /// Gets the path. - /// - /// The path. - public string Path - { - get - { - return m_Path; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); - if(m_Path == null) - { - m_Path = ""; - } - - m_Path = m_Path.Trim(); - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2006-01-27 16:49:58 -0800 (Fri, 27 Jan 2006) $ + * $Revision: 71 $ + */ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("ReferencePath")] + public class ReferencePathNode : DataNode + { + #region Fields + + private string m_Path; + + #endregion + + #region Properties + + /// + /// Gets the path. + /// + /// The path. + public string Path + { + get + { + return m_Path; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); + if(m_Path == null) + { + m_Path = ""; + } + + m_Path = m_Path.Trim(); + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Nodes/SolutionNode.cs b/Programs/Prebuild/src/Core/Nodes/SolutionNode.cs index 485762ed..7c70545a 100644 --- a/Programs/Prebuild/src/Core/Nodes/SolutionNode.cs +++ b/Programs/Prebuild/src/Core/Nodes/SolutionNode.cs @@ -1,364 +1,364 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: sontek $ - * $Date: 2008-04-30 23:36:53 +0000 (Wed, 30 Apr 2008) $ - * $Revision: 267 $ - */ -#endregion - -using System; -using System.Collections; -using System.Diagnostics; -using System.IO; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - /// - /// - /// - [DataNode("Solution")] - [DataNode("EmbeddedSolution")] - [DebuggerDisplay("{Name}")] - public class SolutionNode : DataNode - { - #region Fields - - private Guid m_Guid = Guid.NewGuid(); - private string m_Name = "unknown"; - private string m_Path = ""; - private string m_FullPath = ""; - private string m_ActiveConfig = "Debug"; - - private OptionsNode m_Options; - private FilesNode m_Files; - private Hashtable m_Configurations; - private Hashtable m_Projects; - private Hashtable m_DatabaseProjects; - private ArrayList m_ProjectsOrder; - private Hashtable m_Solutions; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public SolutionNode() - { - m_Configurations = new Hashtable(); - m_Projects = new Hashtable(); - m_ProjectsOrder = new ArrayList(); - m_DatabaseProjects = new Hashtable(); - m_Solutions = new Hashtable(); - } - - #endregion - - #region Properties - public override IDataNode Parent - { - get - { - return base.Parent; - } - set - { - if (value is SolutionNode) - { - SolutionNode solution = (SolutionNode)value; - foreach (ConfigurationNode conf in solution.Configurations) - { - m_Configurations[conf.Name] = conf.Clone(); - } - } - - base.Parent = value; - } - } - - public Guid Guid - { - get - { - return m_Guid; - } - set - { - m_Guid = value; - } - } - /// - /// Gets or sets the active config. - /// - /// The active config. - public string ActiveConfig - { - get - { - return m_ActiveConfig; - } - set - { - m_ActiveConfig = value; - } - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return m_Name; - } - } - - /// - /// Gets the path. - /// - /// The path. - public string Path - { - get - { - return m_Path; - } - } - - /// - /// Gets the full path. - /// - /// The full path. - public string FullPath - { - get - { - return m_FullPath; - } - } - - /// - /// Gets the options. - /// - /// The options. - public OptionsNode Options - { - get - { - return m_Options; - } - } - - /// - /// Gets the files. - /// - /// The files. - public FilesNode Files - { - get - { - return m_Files; - } - } - - /// - /// Gets the configurations. - /// - /// The configurations. - public ICollection Configurations - { - get - { - return m_Configurations.Values; - } - } - - /// - /// Gets the configurations table. - /// - /// The configurations table. - public Hashtable ConfigurationsTable - { - get - { - return m_Configurations; - } - } - /// - /// Gets the database projects. - /// - public ICollection DatabaseProjects - { - get - { - return m_DatabaseProjects.Values; - } - } - /// - /// Gets the nested solutions. - /// - public ICollection Solutions - { - get - { - return m_Solutions.Values; - } - } - /// - /// Gets the nested solutions hash table. - /// - public Hashtable SolutionsTable - { - get - { - return this.m_Solutions; - } - } - /// - /// Gets the projects. - /// - /// The projects. - public ICollection Projects - { - get - { - return m_Projects.Values; - } - } - - /// - /// Gets the projects table. - /// - /// The projects table. - public Hashtable ProjectsTable - { - get - { - return m_Projects; - } - } - - /// - /// Gets the projects table. - /// - /// The projects table. - public ArrayList ProjectsTableOrder - { - get - { - return m_ProjectsOrder; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - m_Name = Helper.AttributeValue(node, "name", m_Name); - m_ActiveConfig = Helper.AttributeValue(node, "activeConfig", m_ActiveConfig); - m_Path = Helper.AttributeValue(node, "path", m_Path); - - m_FullPath = m_Path; - try - { - m_FullPath = Helper.ResolvePath(m_FullPath); - } - catch - { - throw new WarningException("Could not resolve solution path: {0}", m_Path); - } - - Kernel.Instance.CurrentWorkingDirectory.Push(); - try - { - Helper.SetCurrentDir(m_FullPath); - - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - foreach(XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if(dataNode is OptionsNode) - { - m_Options = (OptionsNode)dataNode; - } - else if(dataNode is FilesNode) - { - m_Files = (FilesNode)dataNode; - } - else if(dataNode is ConfigurationNode) - { - m_Configurations[((ConfigurationNode)dataNode).Name] = dataNode; - } - else if(dataNode is ProjectNode) - { - m_Projects[((ProjectNode)dataNode).Name] = dataNode; - m_ProjectsOrder.Add(dataNode); - } - else if(dataNode is SolutionNode) - { - m_Solutions[((SolutionNode)dataNode).Name] = dataNode; - } - else if (dataNode is ProcessNode) - { - ProcessNode p = (ProcessNode)dataNode; - Kernel.Instance.ProcessFile(p, this); - } - else if (dataNode is DatabaseProjectNode) - { - m_DatabaseProjects[((DatabaseProjectNode)dataNode).Name] = dataNode; - } - } - } - finally - { - Kernel.Instance.CurrentWorkingDirectory.Pop(); - } - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: sontek $ + * $Date: 2008-04-30 16:36:53 -0700 (Wed, 30 Apr 2008) $ + * $Revision: 267 $ + */ +#endregion + +using System; +using System.Collections; +using System.Diagnostics; +using System.IO; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + /// + /// + /// + [DataNode("Solution")] + [DataNode("EmbeddedSolution")] + [DebuggerDisplay("{Name}")] + public class SolutionNode : DataNode + { + #region Fields + + private Guid m_Guid = Guid.NewGuid(); + private string m_Name = "unknown"; + private string m_Path = ""; + private string m_FullPath = ""; + private string m_ActiveConfig = "Debug"; + + private OptionsNode m_Options; + private FilesNode m_Files; + private Hashtable m_Configurations; + private Hashtable m_Projects; + private Hashtable m_DatabaseProjects; + private ArrayList m_ProjectsOrder; + private Hashtable m_Solutions; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public SolutionNode() + { + m_Configurations = new Hashtable(); + m_Projects = new Hashtable(); + m_ProjectsOrder = new ArrayList(); + m_DatabaseProjects = new Hashtable(); + m_Solutions = new Hashtable(); + } + + #endregion + + #region Properties + public override IDataNode Parent + { + get + { + return base.Parent; + } + set + { + if (value is SolutionNode) + { + SolutionNode solution = (SolutionNode)value; + foreach (ConfigurationNode conf in solution.Configurations) + { + m_Configurations[conf.Name] = conf.Clone(); + } + } + + base.Parent = value; + } + } + + public Guid Guid + { + get + { + return m_Guid; + } + set + { + m_Guid = value; + } + } + /// + /// Gets or sets the active config. + /// + /// The active config. + public string ActiveConfig + { + get + { + return m_ActiveConfig; + } + set + { + m_ActiveConfig = value; + } + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return m_Name; + } + } + + /// + /// Gets the path. + /// + /// The path. + public string Path + { + get + { + return m_Path; + } + } + + /// + /// Gets the full path. + /// + /// The full path. + public string FullPath + { + get + { + return m_FullPath; + } + } + + /// + /// Gets the options. + /// + /// The options. + public OptionsNode Options + { + get + { + return m_Options; + } + } + + /// + /// Gets the files. + /// + /// The files. + public FilesNode Files + { + get + { + return m_Files; + } + } + + /// + /// Gets the configurations. + /// + /// The configurations. + public ICollection Configurations + { + get + { + return m_Configurations.Values; + } + } + + /// + /// Gets the configurations table. + /// + /// The configurations table. + public Hashtable ConfigurationsTable + { + get + { + return m_Configurations; + } + } + /// + /// Gets the database projects. + /// + public ICollection DatabaseProjects + { + get + { + return m_DatabaseProjects.Values; + } + } + /// + /// Gets the nested solutions. + /// + public ICollection Solutions + { + get + { + return m_Solutions.Values; + } + } + /// + /// Gets the nested solutions hash table. + /// + public Hashtable SolutionsTable + { + get + { + return this.m_Solutions; + } + } + /// + /// Gets the projects. + /// + /// The projects. + public ICollection Projects + { + get + { + return m_Projects.Values; + } + } + + /// + /// Gets the projects table. + /// + /// The projects table. + public Hashtable ProjectsTable + { + get + { + return m_Projects; + } + } + + /// + /// Gets the projects table. + /// + /// The projects table. + public ArrayList ProjectsTableOrder + { + get + { + return m_ProjectsOrder; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + m_Name = Helper.AttributeValue(node, "name", m_Name); + m_ActiveConfig = Helper.AttributeValue(node, "activeConfig", m_ActiveConfig); + m_Path = Helper.AttributeValue(node, "path", m_Path); + + m_FullPath = m_Path; + try + { + m_FullPath = Helper.ResolvePath(m_FullPath); + } + catch + { + throw new WarningException("Could not resolve solution path: {0}", m_Path); + } + + Kernel.Instance.CurrentWorkingDirectory.Push(); + try + { + Helper.SetCurrentDir(m_FullPath); + + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + foreach(XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if(dataNode is OptionsNode) + { + m_Options = (OptionsNode)dataNode; + } + else if(dataNode is FilesNode) + { + m_Files = (FilesNode)dataNode; + } + else if(dataNode is ConfigurationNode) + { + m_Configurations[((ConfigurationNode)dataNode).Name] = dataNode; + } + else if(dataNode is ProjectNode) + { + m_Projects[((ProjectNode)dataNode).Name] = dataNode; + m_ProjectsOrder.Add(dataNode); + } + else if(dataNode is SolutionNode) + { + m_Solutions[((SolutionNode)dataNode).Name] = dataNode; + } + else if (dataNode is ProcessNode) + { + ProcessNode p = (ProcessNode)dataNode; + Kernel.Instance.ProcessFile(p, this); + } + else if (dataNode is DatabaseProjectNode) + { + m_DatabaseProjects[((DatabaseProjectNode)dataNode).Name] = dataNode; + } + } + } + finally + { + Kernel.Instance.CurrentWorkingDirectory.Pop(); + } + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Parse/IfContext.cs b/Programs/Prebuild/src/Core/Parse/IfContext.cs index 9a499d95..7170a9ac 100644 --- a/Programs/Prebuild/src/Core/Parse/IfContext.cs +++ b/Programs/Prebuild/src/Core/Parse/IfContext.cs @@ -1,163 +1,163 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 00:49:58 +0000 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - -using System; - -namespace Prebuild.Core.Parse -{ - /// - /// - /// - public enum IfState - { - /// - /// - /// - None, - /// - /// - /// - If, - /// - /// - /// - ElseIf, - /// - /// - /// - Else - } - - /// - /// Summary description for IfContext. - /// - // Inspired by the equivalent WiX class (see www.sourceforge.net/projects/wix/) - public class IfContext - { - #region Properties - - bool m_Active; - bool m_Keep; - bool m_EverKept; - IfState m_State = IfState.None; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// if set to true [active]. - /// if set to true [keep]. - /// The state. - public IfContext(bool active, bool keep, IfState state) - { - m_Active = active; - m_Keep = keep; - m_EverKept = keep; - m_State = state; - } - - #endregion - - #region Properties - - /// - /// Gets or sets a value indicating whether this is active. - /// - /// true if active; otherwise, false. - public bool Active - { - get - { - return m_Active; - } - set - { - m_Active = value; - } - } - - /// - /// Gets or sets a value indicating whether this is keep. - /// - /// true if keep; otherwise, false. - public bool Keep - { - get - { - return m_Keep; - } - set - { - m_Keep = value; - if(m_Keep) - { - m_EverKept = true; - } - } - } - - /// - /// Gets a value indicating whether [ever kept]. - /// - /// true if [ever kept]; otherwise, false. - public bool EverKept - { - get - { - return m_EverKept; - } - } - - /// - /// Gets or sets the state. - /// - /// The state. - public IfState State - { - get - { - return m_State; - } - set - { - m_State = value; - } - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2006-01-27 16:49:58 -0800 (Fri, 27 Jan 2006) $ + * $Revision: 71 $ + */ +#endregion + +using System; + +namespace Prebuild.Core.Parse +{ + /// + /// + /// + public enum IfState + { + /// + /// + /// + None, + /// + /// + /// + If, + /// + /// + /// + ElseIf, + /// + /// + /// + Else + } + + /// + /// Summary description for IfContext. + /// + // Inspired by the equivalent WiX class (see www.sourceforge.net/projects/wix/) + public class IfContext + { + #region Properties + + bool m_Active; + bool m_Keep; + bool m_EverKept; + IfState m_State = IfState.None; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// if set to true [active]. + /// if set to true [keep]. + /// The state. + public IfContext(bool active, bool keep, IfState state) + { + m_Active = active; + m_Keep = keep; + m_EverKept = keep; + m_State = state; + } + + #endregion + + #region Properties + + /// + /// Gets or sets a value indicating whether this is active. + /// + /// true if active; otherwise, false. + public bool Active + { + get + { + return m_Active; + } + set + { + m_Active = value; + } + } + + /// + /// Gets or sets a value indicating whether this is keep. + /// + /// true if keep; otherwise, false. + public bool Keep + { + get + { + return m_Keep; + } + set + { + m_Keep = value; + if(m_Keep) + { + m_EverKept = true; + } + } + } + + /// + /// Gets a value indicating whether [ever kept]. + /// + /// true if [ever kept]; otherwise, false. + public bool EverKept + { + get + { + return m_EverKept; + } + } + + /// + /// Gets or sets the state. + /// + /// The state. + public IfState State + { + get + { + return m_State; + } + set + { + m_State = value; + } + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Parse/Preprocessor.cs b/Programs/Prebuild/src/Core/Parse/Preprocessor.cs index 65acf5d5..4d56c0fc 100644 --- a/Programs/Prebuild/src/Core/Parse/Preprocessor.cs +++ b/Programs/Prebuild/src/Core/Parse/Preprocessor.cs @@ -1,524 +1,591 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2007-04-26 08:10:27 +0000 (Thu, 26 Apr 2007) $ - * $Revision: 236 $ - */ -#endregion - -using System; -using System.Collections; -using System.IO; -using System.Xml; - -namespace Prebuild.Core.Parse -{ - /// - /// - /// - public enum OperatorSymbol - { - /// - /// - /// - None, - /// - /// - /// - Equal, - /// - /// - /// - NotEqual, - /// - /// - /// - LessThan, - /// - /// - /// - GreaterThan, - /// - /// - /// - LessThanEqual, - /// - /// - /// - GreaterThanEqual - } - - /// - /// - /// - public class Preprocessor - { - #region Fields - - XmlDocument m_OutDoc; - Stack m_IfStack; - Hashtable m_Variables; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public Preprocessor() - { - m_OutDoc = new XmlDocument(); - m_IfStack = new Stack(); - m_Variables = new Hashtable(); - - RegisterVariable("OS", GetOS()); - RegisterVariable("RuntimeVersion", Environment.Version.Major); - RegisterVariable("RuntimeMajor", Environment.Version.Major); - RegisterVariable("RuntimeMinor", Environment.Version.Minor); - RegisterVariable("RuntimeRevision", Environment.Version.Revision); - } - - #endregion - - #region Properties - - /// - /// Gets the processed doc. - /// - /// The processed doc. - public XmlDocument ProcessedDoc - { - get - { - return m_OutDoc; - } - } - - #endregion - - #region Private Methods - - /// - /// Parts of this code were taken from NAnt and is subject to the GPL - /// as per NAnt's license. Thanks to the NAnt guys for this little gem. - /// - /// - public static string GetOS() - { - PlatformID platId = Environment.OSVersion.Platform; - if(platId == PlatformID.Win32NT || platId == PlatformID.Win32Windows) - { - return "Win32"; - } - - if (File.Exists("/System/Library/Frameworks/Cocoa.framework/Cocoa")) - { - return "MACOSX"; - } - - /* - * .NET 1.x, under Mono, the UNIX code is 128. Under - * .NET 2.x, Mono or MS, the UNIX code is 4 - */ - if(Environment.Version.Major == 1) - { - if((int)platId == 128) - { - return "UNIX"; - } - } - else if((int)platId == 4) - { - return "UNIX"; - } - - return "Unknown"; - } - - private static bool CompareNum(OperatorSymbol oper, int val1, int val2) - { - switch(oper) - { - case OperatorSymbol.Equal: - return (val1 == val2); - case OperatorSymbol.NotEqual: - return (val1 != val2); - case OperatorSymbol.LessThan: - return (val1 < val2); - case OperatorSymbol.LessThanEqual: - return (val1 <= val2); - case OperatorSymbol.GreaterThan: - return (val1 > val2); - case OperatorSymbol.GreaterThanEqual: - return (val1 >= val2); - } - - throw new WarningException("Unknown operator type"); - } - - private static bool CompareStr(OperatorSymbol oper, string val1, string val2) - { - switch(oper) - { - case OperatorSymbol.Equal: - return (val1 == val2); - case OperatorSymbol.NotEqual: - return (val1 != val2); - case OperatorSymbol.LessThan: - return (val1.CompareTo(val2) < 0); - case OperatorSymbol.LessThanEqual: - return (val1.CompareTo(val2) <= 0); - case OperatorSymbol.GreaterThan: - return (val1.CompareTo(val2) > 0); - case OperatorSymbol.GreaterThanEqual: - return (val1.CompareTo(val2) >= 0); - } - - throw new WarningException("Unknown operator type"); - } - - private static char NextChar(int idx, string str) - { - if((idx + 1) >= str.Length) - { - return Char.MaxValue; - } - - return str[idx + 1]; - } - // Very very simple expression parser. Can only match expressions of the form - // : - // OS = Windows - // OS != Linux - // RuntimeMinor > 0 - private bool ParseExpression(string exp) - { - if(exp == null) - { - throw new ArgumentException("Invalid expression, cannot be null"); - } - - exp = exp.Trim(); - if(exp.Length < 1) - { - throw new ArgumentException("Invalid expression, cannot be 0 length"); - } - - string id = ""; - string str = ""; - OperatorSymbol oper = OperatorSymbol.None; - bool inStr = false; - char c; - - for(int i = 0; i < exp.Length; i++) - { - c = exp[i]; - if(Char.IsWhiteSpace(c)) - { - continue; - } - - if(Char.IsLetterOrDigit(c) || c == '_') - { - if(inStr) - { - str += c; - } - else - { - id += c; - } - } - else if(c == '\"') - { - inStr = !inStr; - if(inStr) - { - str = ""; - } - } - else - { - if(inStr) - { - str += c; - } - else - { - switch(c) - { - case '=': - oper = OperatorSymbol.Equal; - break; - - case '!': - if(NextChar(i, exp) == '=') - { - oper = OperatorSymbol.NotEqual; - } - - break; - - case '<': - if(NextChar(i, exp) == '=') - { - oper = OperatorSymbol.LessThanEqual; - } - else - { - oper = OperatorSymbol.LessThan; - } - - break; - - case '>': - if(NextChar(i, exp) == '=') - { - oper = OperatorSymbol.GreaterThanEqual; - } - else - { - oper = OperatorSymbol.GreaterThan; - } - - break; - } - } - } - } - - - if(inStr) - { - throw new WarningException("Expected end of string in expression"); - } - - if(oper == OperatorSymbol.None) - { - throw new WarningException("Expected operator in expression"); - } - else if(id.Length < 1) - { - throw new WarningException("Expected identifier in expression"); - } - else if(str.Length < 1) - { - throw new WarningException("Expected value in expression"); - } - - bool ret = false; - try - { - object val = m_Variables[id.ToLower()]; - if(val == null) - { - throw new WarningException("Unknown identifier '{0}'", id); - } - - int numVal, numVal2; - string strVal, strVal2; - Type t = val.GetType(); - if(t.IsAssignableFrom(typeof(int))) - { - numVal = (int)val; - numVal2 = Int32.Parse(str); - ret = CompareNum(oper, numVal, numVal2); - } - else - { - strVal = val.ToString(); - strVal2 = str; - ret = CompareStr(oper, strVal, strVal2); - } - } - catch(ArgumentException ex) - { - ex.ToString(); - throw new WarningException("Invalid value type for system variable '{0}', expected int", id); - } - - return ret; - } - - #endregion - - #region Public Methods - - /// - /// - /// - /// - /// - public void RegisterVariable(string name, object variableValue) - { - if(name == null || variableValue == null) - { - return; - } - - m_Variables[name.ToLower()] = variableValue; - } - - /// - /// Performs validation on the xml source as well as evaluates conditional and flow expresions - /// - /// For invalid use of conditional expressions or for invalid XML syntax. If a XmlValidatingReader is passed, then will also throw exceptions for non-schema-conforming xml - /// - /// the output xml - public string Process(XmlReader reader) - { - if(reader == null) - { - throw new ArgumentException("Invalid XML reader to pre-process"); - } - - IfContext context = new IfContext(true, true, IfState.None); - StringWriter xmlText = new StringWriter(); - XmlTextWriter writer = new XmlTextWriter(xmlText); - writer.Formatting = Formatting.Indented; - while(reader.Read()) - { - if(reader.NodeType == XmlNodeType.ProcessingInstruction) - { - bool ignore = false; - switch(reader.LocalName) - { - case "if": - m_IfStack.Push(context); - context = new IfContext(context.Keep & context.Active, ParseExpression(reader.Value), IfState.If); - ignore = true; - break; - - case "elseif": - if(m_IfStack.Count == 0) - { - throw new WarningException("Unexpected 'elseif' outside of 'if'"); - } - else if(context.State != IfState.If && context.State != IfState.ElseIf) - { - throw new WarningException("Unexpected 'elseif' outside of 'if'"); - } - - context.State = IfState.ElseIf; - if(!context.EverKept) - { - context.Keep = ParseExpression(reader.Value); - } - else - { - context.Keep = false; - } - - ignore = true; - break; - - case "else": - if(m_IfStack.Count == 0) - { - throw new WarningException("Unexpected 'else' outside of 'if'"); - } - else if(context.State != IfState.If && context.State != IfState.ElseIf) - { - throw new WarningException("Unexpected 'else' outside of 'if'"); - } - - context.State = IfState.Else; - context.Keep = !context.EverKept; - ignore = true; - break; - - case "endif": - if(m_IfStack.Count == 0) - { - throw new WarningException("Unexpected 'endif' outside of 'if'"); - } - - context = (IfContext)m_IfStack.Pop(); - ignore = true; - break; - } - - if(ignore) - { - continue; - } - }//end pre-proc instruction - - if(!context.Active || !context.Keep) - { - continue; - } - - switch(reader.NodeType) - { - case XmlNodeType.Element: - bool empty = reader.IsEmptyElement; - writer.WriteStartElement(reader.Name); - - while (reader.MoveToNextAttribute()) - { - writer.WriteAttributeString(reader.Name, reader.Value); - } - - if(empty) - { - writer.WriteEndElement(); - } - - break; - - case XmlNodeType.EndElement: - writer.WriteEndElement(); - break; - - case XmlNodeType.Text: - writer.WriteString(reader.Value); - break; - - case XmlNodeType.CDATA: - writer.WriteCData(reader.Value); - break; - - default: - break; - } - } - - if(m_IfStack.Count != 0) - { - throw new WarningException("Mismatched 'if', 'endif' pair"); - } - - return xmlText.ToString(); - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: dmoonfire $ + * $Date: 2008-12-09 18:26:03 -0800 (Tue, 09 Dec 2008) $ + * $Revision: 280 $ + */ +#endregion + +using System; +using System.Collections; +using System.IO; +using System.Text.RegularExpressions; +using System.Xml; + +namespace Prebuild.Core.Parse +{ + /// + /// + /// + public enum OperatorSymbol + { + /// + /// + /// + None, + /// + /// + /// + Equal, + /// + /// + /// + NotEqual, + /// + /// + /// + LessThan, + /// + /// + /// + GreaterThan, + /// + /// + /// + LessThanEqual, + /// + /// + /// + GreaterThanEqual + } + + /// + /// + /// + public class Preprocessor + { + #region Constants + + /// + /// Includes the regex to look for file tags in the processing instruction. + /// + private static readonly Regex includeFileRegex = new Regex("file=\"(.+?)\""); + + #endregion + + #region Fields + + XmlDocument m_OutDoc; + Stack m_IfStack; + Hashtable m_Variables; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public Preprocessor() + { + m_OutDoc = new XmlDocument(); + m_IfStack = new Stack(); + m_Variables = new Hashtable(); + + RegisterVariable("OS", GetOS()); + RegisterVariable("RuntimeVersion", Environment.Version.Major); + RegisterVariable("RuntimeMajor", Environment.Version.Major); + RegisterVariable("RuntimeMinor", Environment.Version.Minor); + RegisterVariable("RuntimeRevision", Environment.Version.Revision); + } + + #endregion + + #region Properties + + /// + /// Gets the processed doc. + /// + /// The processed doc. + public XmlDocument ProcessedDoc + { + get + { + return m_OutDoc; + } + } + + #endregion + + #region Private Methods + + /// + /// Parts of this code were taken from NAnt and is subject to the GPL + /// as per NAnt's license. Thanks to the NAnt guys for this little gem. + /// + /// + public static string GetOS() + { + PlatformID platId = Environment.OSVersion.Platform; + if(platId == PlatformID.Win32NT || platId == PlatformID.Win32Windows) + { + return "Win32"; + } + + if (File.Exists("/System/Library/Frameworks/Cocoa.framework/Cocoa")) + { + return "MACOSX"; + } + + /* + * .NET 1.x, under Mono, the UNIX code is 128. Under + * .NET 2.x, Mono or MS, the UNIX code is 4 + */ + if(Environment.Version.Major == 1) + { + if((int)platId == 128) + { + return "UNIX"; + } + } + else if((int)platId == 4) + { + return "UNIX"; + } + + return "Unknown"; + } + + private static bool CompareNum(OperatorSymbol oper, int val1, int val2) + { + switch(oper) + { + case OperatorSymbol.Equal: + return (val1 == val2); + case OperatorSymbol.NotEqual: + return (val1 != val2); + case OperatorSymbol.LessThan: + return (val1 < val2); + case OperatorSymbol.LessThanEqual: + return (val1 <= val2); + case OperatorSymbol.GreaterThan: + return (val1 > val2); + case OperatorSymbol.GreaterThanEqual: + return (val1 >= val2); + } + + throw new WarningException("Unknown operator type"); + } + + private static bool CompareStr(OperatorSymbol oper, string val1, string val2) + { + switch(oper) + { + case OperatorSymbol.Equal: + return (val1 == val2); + case OperatorSymbol.NotEqual: + return (val1 != val2); + case OperatorSymbol.LessThan: + return (val1.CompareTo(val2) < 0); + case OperatorSymbol.LessThanEqual: + return (val1.CompareTo(val2) <= 0); + case OperatorSymbol.GreaterThan: + return (val1.CompareTo(val2) > 0); + case OperatorSymbol.GreaterThanEqual: + return (val1.CompareTo(val2) >= 0); + } + + throw new WarningException("Unknown operator type"); + } + + private static char NextChar(int idx, string str) + { + if((idx + 1) >= str.Length) + { + return Char.MaxValue; + } + + return str[idx + 1]; + } + // Very very simple expression parser. Can only match expressions of the form + // : + // OS = Windows + // OS != Linux + // RuntimeMinor > 0 + private bool ParseExpression(string exp) + { + if(exp == null) + { + throw new ArgumentException("Invalid expression, cannot be null"); + } + + exp = exp.Trim(); + if(exp.Length < 1) + { + throw new ArgumentException("Invalid expression, cannot be 0 length"); + } + + string id = ""; + string str = ""; + OperatorSymbol oper = OperatorSymbol.None; + bool inStr = false; + char c; + + for(int i = 0; i < exp.Length; i++) + { + c = exp[i]; + if(Char.IsWhiteSpace(c)) + { + continue; + } + + if(Char.IsLetterOrDigit(c) || c == '_') + { + if(inStr) + { + str += c; + } + else + { + id += c; + } + } + else if(c == '\"') + { + inStr = !inStr; + if(inStr) + { + str = ""; + } + } + else + { + if(inStr) + { + str += c; + } + else + { + switch(c) + { + case '=': + oper = OperatorSymbol.Equal; + break; + + case '!': + if(NextChar(i, exp) == '=') + { + oper = OperatorSymbol.NotEqual; + } + + break; + + case '<': + if(NextChar(i, exp) == '=') + { + oper = OperatorSymbol.LessThanEqual; + } + else + { + oper = OperatorSymbol.LessThan; + } + + break; + + case '>': + if(NextChar(i, exp) == '=') + { + oper = OperatorSymbol.GreaterThanEqual; + } + else + { + oper = OperatorSymbol.GreaterThan; + } + + break; + } + } + } + } + + + if(inStr) + { + throw new WarningException("Expected end of string in expression"); + } + + if(oper == OperatorSymbol.None) + { + throw new WarningException("Expected operator in expression"); + } + else if(id.Length < 1) + { + throw new WarningException("Expected identifier in expression"); + } + else if(str.Length < 1) + { + throw new WarningException("Expected value in expression"); + } + + bool ret = false; + try + { + object val = m_Variables[id.ToLower()]; + if(val == null) + { + throw new WarningException("Unknown identifier '{0}'", id); + } + + int numVal, numVal2; + string strVal, strVal2; + Type t = val.GetType(); + if(t.IsAssignableFrom(typeof(int))) + { + numVal = (int)val; + numVal2 = Int32.Parse(str); + ret = CompareNum(oper, numVal, numVal2); + } + else + { + strVal = val.ToString(); + strVal2 = str; + ret = CompareStr(oper, strVal, strVal2); + } + } + catch(ArgumentException ex) + { + ex.ToString(); + throw new WarningException("Invalid value type for system variable '{0}', expected int", id); + } + + return ret; + } + + #endregion + + #region Public Methods + + /// + /// + /// + /// + /// + public void RegisterVariable(string name, object variableValue) + { + if(name == null || variableValue == null) + { + return; + } + + m_Variables[name.ToLower()] = variableValue; + } + + /// + /// Performs validation on the xml source as well as evaluates conditional and flow expresions + /// + /// For invalid use of conditional expressions or for invalid XML syntax. If a XmlValidatingReader is passed, then will also throw exceptions for non-schema-conforming xml + /// + /// the output xml + public string Process(XmlReader initialReader) + { + if(initialReader == null) + { + throw new ArgumentException("Invalid XML reader to pre-process"); + } + + IfContext context = new IfContext(true, true, IfState.None); + StringWriter xmlText = new StringWriter(); + XmlTextWriter writer = new XmlTextWriter(xmlText); + writer.Formatting = Formatting.Indented; + + // Create a queue of XML readers and add the initial + // reader to it. Then we process until we run out of + // readers which lets the operation add more + // readers to generate a multi-file parser and not require + // XML fragments that a recursive version would use. + Stack readerStack = new Stack(); + readerStack.Push(initialReader); + + while(readerStack.Count > 0) + { + // Pop off the next reader. + XmlReader reader = (XmlReader) readerStack.Pop(); + + // Process through this XML reader until it is + // completed (or it is replaced by the include + // operation). + while(reader.Read()) + { + // The prebuild file has a series of processing + // instructions which allow for specific + // inclusions based on operating system or to + // include additional files. + if(reader.NodeType == XmlNodeType.ProcessingInstruction) + { + bool ignore = false; + + switch(reader.LocalName) + { + case "include": + // use regular expressions to parse out the attributes. + MatchCollection matches = includeFileRegex.Matches(reader.Value); + + // make sure there is only one file attribute. + if(matches.Count > 1) + { + throw new WarningException("An node was found, but it specified more than one file."); + } + + if(matches.Count == 0) + { + throw new WarningException("An node was found, but it did not specify the file attribute."); + } + + // Pull the file out from the regex and make sure it is a valid file before using it. + string filename = matches[0].Groups[1].Value; + FileInfo includeFile = new FileInfo(filename); + + if(!includeFile.Exists) + { + throw new WarningException("Cannot include file: " + includeFile.FullName); + } + + // Create a new reader object for this file. Then put the old reader back on the stack and start + // processing using this new XML reader. + XmlReader newReader = new XmlTextReader(includeFile.Open(FileMode.Open, FileAccess.Read, FileShare.Read)); + + readerStack.Push(reader); + reader = newReader; + ignore = true; + break; + + case "if": + m_IfStack.Push(context); + context = new IfContext(context.Keep & context.Active, ParseExpression(reader.Value), IfState.If); + ignore = true; + break; + + case "elseif": + if(m_IfStack.Count == 0) + { + throw new WarningException("Unexpected 'elseif' outside of 'if'"); + } + else if(context.State != IfState.If && context.State != IfState.ElseIf) + { + throw new WarningException("Unexpected 'elseif' outside of 'if'"); + } + + context.State = IfState.ElseIf; + if(!context.EverKept) + { + context.Keep = ParseExpression(reader.Value); + } + else + { + context.Keep = false; + } + + ignore = true; + break; + + case "else": + if(m_IfStack.Count == 0) + { + throw new WarningException("Unexpected 'else' outside of 'if'"); + } + else if(context.State != IfState.If && context.State != IfState.ElseIf) + { + throw new WarningException("Unexpected 'else' outside of 'if'"); + } + + context.State = IfState.Else; + context.Keep = !context.EverKept; + ignore = true; + break; + + case "endif": + if(m_IfStack.Count == 0) + { + throw new WarningException("Unexpected 'endif' outside of 'if'"); + } + + context = (IfContext)m_IfStack.Pop(); + ignore = true; + break; + } + + if(ignore) + { + continue; + } + }//end pre-proc instruction + + if(!context.Active || !context.Keep) + { + continue; + } + + switch(reader.NodeType) + { + case XmlNodeType.Element: + bool empty = reader.IsEmptyElement; + writer.WriteStartElement(reader.Name); + + while (reader.MoveToNextAttribute()) + { + writer.WriteAttributeString(reader.Name, reader.Value); + } + + if(empty) + { + writer.WriteEndElement(); + } + + break; + + case XmlNodeType.EndElement: + writer.WriteEndElement(); + break; + + case XmlNodeType.Text: + writer.WriteString(reader.Value); + break; + + case XmlNodeType.CDATA: + writer.WriteCData(reader.Value); + break; + + default: + break; + } + } + + if(m_IfStack.Count != 0) + { + throw new WarningException("Mismatched 'if', 'endif' pair"); + } + } + + return xmlText.ToString(); + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Targets/DebugTarget.cs b/Programs/Prebuild/src/Core/Targets/DebugTarget.cs index a57aae7a..d73b8eac 100644 --- a/Programs/Prebuild/src/Core/Targets/DebugTarget.cs +++ b/Programs/Prebuild/src/Core/Targets/DebugTarget.cs @@ -1,102 +1,102 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-09-20 07:42:51 +0000 (Wed, 20 Sep 2006) $ - * $Revision: 164 $ - */ -#endregion - -using System; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; - -#if (DEBUG && _DEBUG_TARGET) -namespace Prebuild.Core.Targets -{ - [Target("debug")] - public class DebugTarget : ITarget - { -#region Fields - - private Kernel m_Kernel = null; - -#endregion - -#region ITarget Members - - public void Write() - { - foreach(SolutionNode s in m_Kernel.Solutions) - { - Console.WriteLine("Solution [ {0}, {1} ]", s.Name, s.Path); - foreach(string file in s.Files) -{ - Console.WriteLine("\tFile [ {0} ]", file); -} - - foreach(ProjectNode proj in s.Projects) - { - Console.WriteLine("\tProject [ {0}, {1}. {2} ]", proj.Name, proj.Path, proj.Language); - foreach(string file in proj.Files) - Console.WriteLine("\t\tFile [ {0} ]", file); - } - } - } - - public void Clean() - { - Console.WriteLine("Not implemented"); - } - - public string Name - { - get - { - return "debug"; - } - } - - public Kernel Kernel - { - get - { - return m_Kernel; - } - set - { - m_Kernel = value; - } - } - -#endregion - } -} -#endif +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2006-09-20 00:42:51 -0700 (Wed, 20 Sep 2006) $ + * $Revision: 164 $ + */ +#endregion + +using System; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; + +#if (DEBUG && _DEBUG_TARGET) +namespace Prebuild.Core.Targets +{ + [Target("debug")] + public class DebugTarget : ITarget + { +#region Fields + + private Kernel m_Kernel = null; + +#endregion + +#region ITarget Members + + public void Write() + { + foreach(SolutionNode s in m_Kernel.Solutions) + { + Console.WriteLine("Solution [ {0}, {1} ]", s.Name, s.Path); + foreach(string file in s.Files) +{ + Console.WriteLine("\tFile [ {0} ]", file); +} + + foreach(ProjectNode proj in s.Projects) + { + Console.WriteLine("\tProject [ {0}, {1}. {2} ]", proj.Name, proj.Path, proj.Language); + foreach(string file in proj.Files) + Console.WriteLine("\t\tFile [ {0} ]", file); + } + } + } + + public void Clean() + { + Console.WriteLine("Not implemented"); + } + + public string Name + { + get + { + return "debug"; + } + } + + public Kernel Kernel + { + get + { + return m_Kernel; + } + set + { + m_Kernel = value; + } + } + +#endregion + } +} +#endif diff --git a/Programs/Prebuild/src/Core/Targets/MakefileTarget.cs b/Programs/Prebuild/src/Core/Targets/MakefileTarget.cs index 86676d08..ed4ba6bf 100644 --- a/Programs/Prebuild/src/Core/Targets/MakefileTarget.cs +++ b/Programs/Prebuild/src/Core/Targets/MakefileTarget.cs @@ -1,471 +1,471 @@ -#region BSD License -/* -Copyright (c) 2004 Crestez Leonard (cleonard@go.ro) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Text.RegularExpressions; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - [Target("makefile")] - public class MakefileTarget : ITarget - { - #region Fields - - private Kernel m_Kernel = null; - - #endregion - - #region Private Methods - - // This converts a path relative to the path of a project to - // a path relative to the solution path. - private string NicePath(ProjectNode proj, string path) - { - string res; - SolutionNode solution = (SolutionNode)proj.Parent; - res = Path.Combine(Helper.NormalizePath(proj.FullPath, '/'), Helper.NormalizePath(path, '/')); - res = Helper.NormalizePath(res, '/'); - res = res.Replace("/./", "/"); - while (res.IndexOf("/../") >= 0) - { - int a = res.IndexOf("/../"); - int b = res.LastIndexOf("/", a - 1); - res = res.Remove(b, a - b + 3); - } - res = Helper.MakePathRelativeTo(solution.FullPath, res); - if (res.StartsWith("./")) - res = res.Substring(2, res.Length - 2); - res = Helper.NormalizePath(res, '/'); - return res; - } - - private void WriteProjectFiles(StreamWriter f, SolutionNode solution, ProjectNode project) - { - // Write list of source code files - f.WriteLine("SOURCES_{0} = \\", project.Name); - foreach (string file in project.Files) - if (project.Files.GetBuildAction(file) == BuildAction.Compile) - f.WriteLine("\t{0} \\", NicePath(project, file)); - f.WriteLine(); - - // Write list of resource files - f.WriteLine("RESOURCES_{0} = \\", project.Name); - foreach (string file in project.Files) - if (project.Files.GetBuildAction(file) == BuildAction.EmbeddedResource) - { - string path = NicePath(project, file); - f.WriteLine("\t-resource:{0},{1} \\", path, Path.GetFileName(path)); - } - f.WriteLine(); - - // There's also Content and None in BuildAction. - // What am I supposed to do with that? - } - - private string FindFileReference(string refName, ProjectNode project) - { - foreach (ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = NicePath(project, Helper.MakeFilePath(refPath.Path, refName, "dll")); - if (File.Exists(fullPath)) - return fullPath; - } - return null; - } - - private void WriteProjectReferences(StreamWriter f, SolutionNode solution, ProjectNode project) - { - f.WriteLine("REFERENCES_{0} = \\", project.Name); - foreach (ReferenceNode refr in project.References) - { - string path; - // Project references change with configurations. - if (solution.ProjectsTable.Contains(refr.Name)) - continue; - path = FindFileReference(refr.Name, project); - if (path != null) - f.WriteLine("\t-r:{0} \\", path); - else - f.WriteLine("\t-r:{0} \\", refr.Name); - } - f.WriteLine(); - } - - private void WriteProjectDependencies(StreamWriter f, SolutionNode solution, ProjectNode project) - { - f.WriteLine("DEPENDENCIES_{0} = \\", project.Name); - f.WriteLine("\t$(SOURCES_{0}) \\", project.Name); - foreach (string file in project.Files) - if (project.Files.GetBuildAction(file) == BuildAction.EmbeddedResource) - f.WriteLine("\t{0} \\", NicePath(project, file)); - f.WriteLine(); - } - - private string ProjectTypeToExtension(ProjectType t) - { - if (t == ProjectType.Exe || t == ProjectType.WinExe) - { - return "exe"; - } - else if (t == ProjectType.Library) - { - return "dll"; - } - else - { - throw new FatalException("Bad ProjectType: {0}", t); - } - } - - private string ProjectTypeToTarget(ProjectType t) - { - if (t == ProjectType.Exe) - { - return "exe"; - } - else if (t == ProjectType.WinExe) - { - return "winexe"; - } - else if (t == ProjectType.Library) - { - return "library"; - } - else - { - throw new FatalException("Bad ProjectType: {0}", t); - } - } - - private string ProjectOutput(ProjectNode project, ConfigurationNode config) - { - string filepath; - filepath = Helper.MakeFilePath((string)config.Options["OutputPath"], - project.AssemblyName, ProjectTypeToExtension(project.Type)); - return NicePath(project, filepath); - } - - // Returns true if two configs in one project have the same output. - private bool ProjectClashes(ProjectNode project) - { - foreach (ConfigurationNode conf1 in project.Configurations) - foreach (ConfigurationNode conf2 in project.Configurations) - if (ProjectOutput(project, conf1) == ProjectOutput(project, conf2) && conf1 != conf2) - { - m_Kernel.Log.Write("Warning: Configurations {0} and {1} for project {2} output the same file", - conf1.Name, conf2.Name, project.Name); - m_Kernel.Log.Write("Warning: I'm going to use some timestamps(extra empty files)."); - return true; - } - return false; - } - - private void WriteProject(StreamWriter f, SolutionNode solution, ProjectNode project) - { - f.WriteLine("# This is for project {0}", project.Name); - f.WriteLine(); - - WriteProjectFiles(f, solution, project); - WriteProjectReferences(f, solution, project); - WriteProjectDependencies(f, solution, project); - - bool clash = ProjectClashes(project); - - foreach (ConfigurationNode conf in project.Configurations) - { - string outpath = ProjectOutput(project, conf); - string filesToClean = outpath; - - if (clash) - { - f.WriteLine("{0}-{1}: .{0}-{1}-timestamp", project.Name, conf.Name); - f.WriteLine(); - f.Write(".{0}-{1}-timestamp: $(DEPENDENCIES_{0})", project.Name, conf.Name); - } - else - { - f.WriteLine("{0}-{1}: {2}", project.Name, conf.Name, outpath); - f.WriteLine(); - f.Write("{2}: $(DEPENDENCIES_{0})", project.Name, conf.Name, outpath); - } - // Dependencies on other projects. - foreach (ReferenceNode refr in project.References) - if (solution.ProjectsTable.Contains(refr.Name)) - { - ProjectNode refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; - if (ProjectClashes(refProj)) - f.Write(" .{0}-{1}-timestamp", refProj.Name, conf.Name); - else - f.Write(" {0}", ProjectOutput(refProj, conf)); - } - f.WriteLine(); - - // make directory for output. - if (Path.GetDirectoryName(outpath) != "") - { - f.WriteLine("\tmkdir -p {0}", Path.GetDirectoryName(outpath)); - } - // mcs command line. - f.Write("\tgmcs", project.Name); - f.Write(" -warn:{0}", conf.Options["WarningLevel"]); - if ((bool)conf.Options["DebugInformation"]) - f.Write(" -debug"); - if ((bool)conf.Options["AllowUnsafe"]) - f.Write(" -unsafe"); - if ((bool)conf.Options["CheckUnderflowOverflow"]) - f.Write(" -checked"); - if (project.StartupObject != "") - f.Write(" -main:{0}", project.StartupObject); - if ((string)conf.Options["CompilerDefines"] != "") - { - f.Write(" -define:\"{0}\"", conf.Options["CompilerDefines"]); - } - - f.Write(" -target:{0} -out:{1}", ProjectTypeToTarget(project.Type), outpath); - - // Build references to other projects. Now that sux. - // We have to reference the other project in the same conf. - foreach (ReferenceNode refr in project.References) - if (solution.ProjectsTable.Contains(refr.Name)) - { - ProjectNode refProj; - refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; - f.Write(" -r:{0}", ProjectOutput(refProj, conf)); - } - - f.Write(" $(REFERENCES_{0})", project.Name); - f.Write(" $(RESOURCES_{0})", project.Name); - f.Write(" $(SOURCES_{0})", project.Name); - f.WriteLine(); - - // Copy references with localcopy. - foreach (ReferenceNode refr in project.References) - if (refr.LocalCopy) - { - string outPath, srcPath, destPath; - outPath = Helper.NormalizePath((string)conf.Options["OutputPath"]); - if (solution.ProjectsTable.Contains(refr.Name)) - { - ProjectNode refProj; - refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; - srcPath = ProjectOutput(refProj, conf); - destPath = Path.Combine(outPath, Path.GetFileName(srcPath)); - destPath = NicePath(project, destPath); - if (srcPath != destPath) - { - f.WriteLine("\tcp -f {0} {1}", srcPath, destPath); - filesToClean += " " + destPath; - } - continue; - } - srcPath = FindFileReference(refr.Name, project); - if (srcPath != null) - { - destPath = Path.Combine(outPath, Path.GetFileName(srcPath)); - destPath = NicePath(project, destPath); - f.WriteLine("\tcp -f {0} {1}", srcPath, destPath); - filesToClean += " " + destPath; - } - } - - if (clash) - { - filesToClean += String.Format(" .{0}-{1}-timestamp", project.Name, conf.Name); - f.WriteLine("\ttouch .{0}-{1}-timestamp", project.Name, conf.Name); - f.Write("\trm -rf"); - foreach (ConfigurationNode otherConf in project.Configurations) - if (otherConf != conf) - f.WriteLine(" .{0}-{1}-timestamp", project.Name, otherConf.Name); - f.WriteLine(); - } - f.WriteLine(); - f.WriteLine("{0}-{1}-clean:", project.Name, conf.Name); - f.WriteLine("\trm -rf {0}", filesToClean); - f.WriteLine(); - } - } - - private void WriteIntro(StreamWriter f, SolutionNode solution) - { - f.WriteLine("# Makefile for {0} generated by Prebuild ( http://dnpb.sf.net )", solution.Name); - f.WriteLine("# Do not edit."); - f.WriteLine("#"); - - f.Write("# Configurations:"); - foreach (ConfigurationNode conf in solution.Configurations) - f.Write(" {0}", conf.Name); - f.WriteLine(); - - f.WriteLine("# Projects:"); - foreach (ProjectNode proj in solution.Projects) - f.WriteLine("#\t{0}", proj.Name); - - f.WriteLine("#"); - f.WriteLine("# Building:"); - f.WriteLine("#\t\"make\" to build everything under the default(first) configuration"); - f.WriteLine("#\t\"make CONF\" to build every project under configuration CONF"); - f.WriteLine("#\t\"make PROJ\" to build project PROJ under the default(first) configuration"); - f.WriteLine("#\t\"make PROJ-CONF\" to build project PROJ under configuration CONF"); - f.WriteLine("#"); - f.WriteLine("# Cleaning (removing results of build):"); - f.WriteLine("#\t\"make clean\" to clean everything, that's what you probably want"); - f.WriteLine("#\t\"make CONF\" to clean everything for a configuration"); - f.WriteLine("#\t\"make PROJ\" to clean everything for a project"); - f.WriteLine("#\t\"make PROJ-CONF\" to clea project PROJ under configuration CONF"); - f.WriteLine(); - } - - private void WritePhony(StreamWriter f, SolutionNode solution) - { - string defconf = ""; - foreach (ConfigurationNode conf in solution.Configurations) - { - defconf = conf.Name; - break; - } - - f.Write(".PHONY: all"); - foreach (ProjectNode proj in solution.Projects) - f.Write(" {0} {0}-clean", proj.Name); - foreach (ConfigurationNode conf in solution.Configurations) - f.Write(" {0} {0}-clean", conf.Name); - foreach (ProjectNode proj in solution.Projects) - foreach (ConfigurationNode conf in solution.Configurations) - f.Write(" {0}-{1} {0}-{1}-clean", proj.Name, conf.Name); - f.WriteLine(); - f.WriteLine(); - - f.WriteLine("all: {0}", defconf); - f.WriteLine(); - - f.Write("clean:"); - foreach (ConfigurationNode conf in solution.Configurations) - f.Write(" {0}-clean", conf.Name); - f.WriteLine(); - f.WriteLine(); - - foreach (ConfigurationNode conf in solution.Configurations) - { - f.Write("{0}: ", conf.Name); - foreach (ProjectNode proj in solution.Projects) - f.Write(" {0}-{1}", proj.Name, conf.Name); - f.WriteLine(); - f.WriteLine(); - - f.Write("{0}-clean: ", conf.Name); - foreach (ProjectNode proj in solution.Projects) - f.Write(" {0}-{1}-clean", proj.Name, conf.Name); - f.WriteLine(); - f.WriteLine(); - } - - foreach (ProjectNode proj in solution.Projects) - { - f.WriteLine("{0}: {0}-{1}", proj.Name, defconf); - f.WriteLine(); - - f.Write("{0}-clean:", proj.Name); - foreach (ConfigurationNode conf in proj.Configurations) - f.Write(" {0}-{1}-clean", proj.Name, conf.Name); - f.WriteLine(); - f.WriteLine(); - } - } - - private void WriteSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Creating makefile for {0}", solution.Name); - m_Kernel.CurrentWorkingDirectory.Push(); - - string file = "Makefile";// Helper.MakeFilePath(solution.FullPath, solution.Name, "make"); - StreamWriter f = new StreamWriter(file); - - Helper.SetCurrentDir(Path.GetDirectoryName(file)); - - using (f) - { - WriteIntro(f, solution); - WritePhony(f, solution); - - foreach (ProjectNode project in solution.Projects) - { - m_Kernel.Log.Write("...Creating Project: {0}", project.Name); - WriteProject(f, solution, project); - } - } - - m_Kernel.Log.Write(""); - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning makefile for {0}", solution.Name); - - string file = Helper.MakeFilePath(solution.FullPath, solution.Name, "make"); - Helper.DeleteIfExists(file); - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - public void Write(Kernel kern) - { - m_Kernel = kern; - foreach (SolutionNode solution in kern.Solutions) - WriteSolution(solution); - m_Kernel = null; - } - - public virtual void Clean(Kernel kern) - { - m_Kernel = kern; - foreach (SolutionNode sol in kern.Solutions) - CleanSolution(sol); - m_Kernel = null; - } - - public string Name - { - get - { - return "makefile"; - } - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004 Crestez Leonard (cleonard@go.ro) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.IO; +using System.Text.RegularExpressions; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + [Target("makefile")] + public class MakefileTarget : ITarget + { + #region Fields + + private Kernel m_Kernel = null; + + #endregion + + #region Private Methods + + // This converts a path relative to the path of a project to + // a path relative to the solution path. + private string NicePath(ProjectNode proj, string path) + { + string res; + SolutionNode solution = (SolutionNode)proj.Parent; + res = Path.Combine(Helper.NormalizePath(proj.FullPath, '/'), Helper.NormalizePath(path, '/')); + res = Helper.NormalizePath(res, '/'); + res = res.Replace("/./", "/"); + while (res.IndexOf("/../") >= 0) + { + int a = res.IndexOf("/../"); + int b = res.LastIndexOf("/", a - 1); + res = res.Remove(b, a - b + 3); + } + res = Helper.MakePathRelativeTo(solution.FullPath, res); + if (res.StartsWith("./")) + res = res.Substring(2, res.Length - 2); + res = Helper.NormalizePath(res, '/'); + return res; + } + + private void WriteProjectFiles(StreamWriter f, SolutionNode solution, ProjectNode project) + { + // Write list of source code files + f.WriteLine("SOURCES_{0} = \\", project.Name); + foreach (string file in project.Files) + if (project.Files.GetBuildAction(file) == BuildAction.Compile) + f.WriteLine("\t{0} \\", NicePath(project, file)); + f.WriteLine(); + + // Write list of resource files + f.WriteLine("RESOURCES_{0} = \\", project.Name); + foreach (string file in project.Files) + if (project.Files.GetBuildAction(file) == BuildAction.EmbeddedResource) + { + string path = NicePath(project, file); + f.WriteLine("\t-resource:{0},{1} \\", path, Path.GetFileName(path)); + } + f.WriteLine(); + + // There's also Content and None in BuildAction. + // What am I supposed to do with that? + } + + private string FindFileReference(string refName, ProjectNode project) + { + foreach (ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = NicePath(project, Helper.MakeFilePath(refPath.Path, refName, "dll")); + if (File.Exists(fullPath)) + return fullPath; + } + return null; + } + + private void WriteProjectReferences(StreamWriter f, SolutionNode solution, ProjectNode project) + { + f.WriteLine("REFERENCES_{0} = \\", project.Name); + foreach (ReferenceNode refr in project.References) + { + string path; + // Project references change with configurations. + if (solution.ProjectsTable.Contains(refr.Name)) + continue; + path = FindFileReference(refr.Name, project); + if (path != null) + f.WriteLine("\t-r:{0} \\", path); + else + f.WriteLine("\t-r:{0} \\", refr.Name); + } + f.WriteLine(); + } + + private void WriteProjectDependencies(StreamWriter f, SolutionNode solution, ProjectNode project) + { + f.WriteLine("DEPENDENCIES_{0} = \\", project.Name); + f.WriteLine("\t$(SOURCES_{0}) \\", project.Name); + foreach (string file in project.Files) + if (project.Files.GetBuildAction(file) == BuildAction.EmbeddedResource) + f.WriteLine("\t{0} \\", NicePath(project, file)); + f.WriteLine(); + } + + private string ProjectTypeToExtension(ProjectType t) + { + if (t == ProjectType.Exe || t == ProjectType.WinExe) + { + return "exe"; + } + else if (t == ProjectType.Library) + { + return "dll"; + } + else + { + throw new FatalException("Bad ProjectType: {0}", t); + } + } + + private string ProjectTypeToTarget(ProjectType t) + { + if (t == ProjectType.Exe) + { + return "exe"; + } + else if (t == ProjectType.WinExe) + { + return "winexe"; + } + else if (t == ProjectType.Library) + { + return "library"; + } + else + { + throw new FatalException("Bad ProjectType: {0}", t); + } + } + + private string ProjectOutput(ProjectNode project, ConfigurationNode config) + { + string filepath; + filepath = Helper.MakeFilePath((string)config.Options["OutputPath"], + project.AssemblyName, ProjectTypeToExtension(project.Type)); + return NicePath(project, filepath); + } + + // Returns true if two configs in one project have the same output. + private bool ProjectClashes(ProjectNode project) + { + foreach (ConfigurationNode conf1 in project.Configurations) + foreach (ConfigurationNode conf2 in project.Configurations) + if (ProjectOutput(project, conf1) == ProjectOutput(project, conf2) && conf1 != conf2) + { + m_Kernel.Log.Write("Warning: Configurations {0} and {1} for project {2} output the same file", + conf1.Name, conf2.Name, project.Name); + m_Kernel.Log.Write("Warning: I'm going to use some timestamps(extra empty files)."); + return true; + } + return false; + } + + private void WriteProject(StreamWriter f, SolutionNode solution, ProjectNode project) + { + f.WriteLine("# This is for project {0}", project.Name); + f.WriteLine(); + + WriteProjectFiles(f, solution, project); + WriteProjectReferences(f, solution, project); + WriteProjectDependencies(f, solution, project); + + bool clash = ProjectClashes(project); + + foreach (ConfigurationNode conf in project.Configurations) + { + string outpath = ProjectOutput(project, conf); + string filesToClean = outpath; + + if (clash) + { + f.WriteLine("{0}-{1}: .{0}-{1}-timestamp", project.Name, conf.Name); + f.WriteLine(); + f.Write(".{0}-{1}-timestamp: $(DEPENDENCIES_{0})", project.Name, conf.Name); + } + else + { + f.WriteLine("{0}-{1}: {2}", project.Name, conf.Name, outpath); + f.WriteLine(); + f.Write("{2}: $(DEPENDENCIES_{0})", project.Name, conf.Name, outpath); + } + // Dependencies on other projects. + foreach (ReferenceNode refr in project.References) + if (solution.ProjectsTable.Contains(refr.Name)) + { + ProjectNode refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; + if (ProjectClashes(refProj)) + f.Write(" .{0}-{1}-timestamp", refProj.Name, conf.Name); + else + f.Write(" {0}", ProjectOutput(refProj, conf)); + } + f.WriteLine(); + + // make directory for output. + if (Path.GetDirectoryName(outpath) != "") + { + f.WriteLine("\tmkdir -p {0}", Path.GetDirectoryName(outpath)); + } + // mcs command line. + f.Write("\tgmcs", project.Name); + f.Write(" -warn:{0}", conf.Options["WarningLevel"]); + if ((bool)conf.Options["DebugInformation"]) + f.Write(" -debug"); + if ((bool)conf.Options["AllowUnsafe"]) + f.Write(" -unsafe"); + if ((bool)conf.Options["CheckUnderflowOverflow"]) + f.Write(" -checked"); + if (project.StartupObject != "") + f.Write(" -main:{0}", project.StartupObject); + if ((string)conf.Options["CompilerDefines"] != "") + { + f.Write(" -define:\"{0}\"", conf.Options["CompilerDefines"]); + } + + f.Write(" -target:{0} -out:{1}", ProjectTypeToTarget(project.Type), outpath); + + // Build references to other projects. Now that sux. + // We have to reference the other project in the same conf. + foreach (ReferenceNode refr in project.References) + if (solution.ProjectsTable.Contains(refr.Name)) + { + ProjectNode refProj; + refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; + f.Write(" -r:{0}", ProjectOutput(refProj, conf)); + } + + f.Write(" $(REFERENCES_{0})", project.Name); + f.Write(" $(RESOURCES_{0})", project.Name); + f.Write(" $(SOURCES_{0})", project.Name); + f.WriteLine(); + + // Copy references with localcopy. + foreach (ReferenceNode refr in project.References) + if (refr.LocalCopy) + { + string outPath, srcPath, destPath; + outPath = Helper.NormalizePath((string)conf.Options["OutputPath"]); + if (solution.ProjectsTable.Contains(refr.Name)) + { + ProjectNode refProj; + refProj = (ProjectNode)solution.ProjectsTable[refr.Name]; + srcPath = ProjectOutput(refProj, conf); + destPath = Path.Combine(outPath, Path.GetFileName(srcPath)); + destPath = NicePath(project, destPath); + if (srcPath != destPath) + { + f.WriteLine("\tcp -f {0} {1}", srcPath, destPath); + filesToClean += " " + destPath; + } + continue; + } + srcPath = FindFileReference(refr.Name, project); + if (srcPath != null) + { + destPath = Path.Combine(outPath, Path.GetFileName(srcPath)); + destPath = NicePath(project, destPath); + f.WriteLine("\tcp -f {0} {1}", srcPath, destPath); + filesToClean += " " + destPath; + } + } + + if (clash) + { + filesToClean += String.Format(" .{0}-{1}-timestamp", project.Name, conf.Name); + f.WriteLine("\ttouch .{0}-{1}-timestamp", project.Name, conf.Name); + f.Write("\trm -rf"); + foreach (ConfigurationNode otherConf in project.Configurations) + if (otherConf != conf) + f.WriteLine(" .{0}-{1}-timestamp", project.Name, otherConf.Name); + f.WriteLine(); + } + f.WriteLine(); + f.WriteLine("{0}-{1}-clean:", project.Name, conf.Name); + f.WriteLine("\trm -rf {0}", filesToClean); + f.WriteLine(); + } + } + + private void WriteIntro(StreamWriter f, SolutionNode solution) + { + f.WriteLine("# Makefile for {0} generated by Prebuild ( http://dnpb.sf.net )", solution.Name); + f.WriteLine("# Do not edit."); + f.WriteLine("#"); + + f.Write("# Configurations:"); + foreach (ConfigurationNode conf in solution.Configurations) + f.Write(" {0}", conf.Name); + f.WriteLine(); + + f.WriteLine("# Projects:"); + foreach (ProjectNode proj in solution.Projects) + f.WriteLine("#\t{0}", proj.Name); + + f.WriteLine("#"); + f.WriteLine("# Building:"); + f.WriteLine("#\t\"make\" to build everything under the default(first) configuration"); + f.WriteLine("#\t\"make CONF\" to build every project under configuration CONF"); + f.WriteLine("#\t\"make PROJ\" to build project PROJ under the default(first) configuration"); + f.WriteLine("#\t\"make PROJ-CONF\" to build project PROJ under configuration CONF"); + f.WriteLine("#"); + f.WriteLine("# Cleaning (removing results of build):"); + f.WriteLine("#\t\"make clean\" to clean everything, that's what you probably want"); + f.WriteLine("#\t\"make CONF\" to clean everything for a configuration"); + f.WriteLine("#\t\"make PROJ\" to clean everything for a project"); + f.WriteLine("#\t\"make PROJ-CONF\" to clea project PROJ under configuration CONF"); + f.WriteLine(); + } + + private void WritePhony(StreamWriter f, SolutionNode solution) + { + string defconf = ""; + foreach (ConfigurationNode conf in solution.Configurations) + { + defconf = conf.Name; + break; + } + + f.Write(".PHONY: all"); + foreach (ProjectNode proj in solution.Projects) + f.Write(" {0} {0}-clean", proj.Name); + foreach (ConfigurationNode conf in solution.Configurations) + f.Write(" {0} {0}-clean", conf.Name); + foreach (ProjectNode proj in solution.Projects) + foreach (ConfigurationNode conf in solution.Configurations) + f.Write(" {0}-{1} {0}-{1}-clean", proj.Name, conf.Name); + f.WriteLine(); + f.WriteLine(); + + f.WriteLine("all: {0}", defconf); + f.WriteLine(); + + f.Write("clean:"); + foreach (ConfigurationNode conf in solution.Configurations) + f.Write(" {0}-clean", conf.Name); + f.WriteLine(); + f.WriteLine(); + + foreach (ConfigurationNode conf in solution.Configurations) + { + f.Write("{0}: ", conf.Name); + foreach (ProjectNode proj in solution.Projects) + f.Write(" {0}-{1}", proj.Name, conf.Name); + f.WriteLine(); + f.WriteLine(); + + f.Write("{0}-clean: ", conf.Name); + foreach (ProjectNode proj in solution.Projects) + f.Write(" {0}-{1}-clean", proj.Name, conf.Name); + f.WriteLine(); + f.WriteLine(); + } + + foreach (ProjectNode proj in solution.Projects) + { + f.WriteLine("{0}: {0}-{1}", proj.Name, defconf); + f.WriteLine(); + + f.Write("{0}-clean:", proj.Name); + foreach (ConfigurationNode conf in proj.Configurations) + f.Write(" {0}-{1}-clean", proj.Name, conf.Name); + f.WriteLine(); + f.WriteLine(); + } + } + + private void WriteSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Creating makefile for {0}", solution.Name); + m_Kernel.CurrentWorkingDirectory.Push(); + + string file = "Makefile";// Helper.MakeFilePath(solution.FullPath, solution.Name, "make"); + StreamWriter f = new StreamWriter(file); + + Helper.SetCurrentDir(Path.GetDirectoryName(file)); + + using (f) + { + WriteIntro(f, solution); + WritePhony(f, solution); + + foreach (ProjectNode project in solution.Projects) + { + m_Kernel.Log.Write("...Creating Project: {0}", project.Name); + WriteProject(f, solution, project); + } + } + + m_Kernel.Log.Write(""); + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning makefile for {0}", solution.Name); + + string file = Helper.MakeFilePath(solution.FullPath, solution.Name, "make"); + Helper.DeleteIfExists(file); + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + public void Write(Kernel kern) + { + m_Kernel = kern; + foreach (SolutionNode solution in kern.Solutions) + WriteSolution(solution); + m_Kernel = null; + } + + public virtual void Clean(Kernel kern) + { + m_Kernel = kern; + foreach (SolutionNode sol in kern.Solutions) + CleanSolution(sol); + m_Kernel = null; + } + + public string Name + { + get + { + return "makefile"; + } + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Targets/MonoDevelopTarget.cs b/Programs/Prebuild/src/Core/Targets/MonoDevelopTarget.cs index 72af0c25..d9158d8d 100644 --- a/Programs/Prebuild/src/Core/Targets/MonoDevelopTarget.cs +++ b/Programs/Prebuild/src/Core/Targets/MonoDevelopTarget.cs @@ -1,473 +1,473 @@ -#region BSD License -/* -Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: cjcollier $ - * $Date: 2007-04-10 22:10:35 +0000 (Tue, 10 Apr 2007) $ - * $Revision: 231 $ - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Reflection; -using System.Text.RegularExpressions; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("monodev")] - public class MonoDevelopTarget : ITarget - { - #region Fields - - private Kernel m_Kernel; - - #endregion - - #region Private Methods - - private static string PrependPath(string path) - { - string tmpPath = Helper.NormalizePath(path, '/'); - Regex regex = new Regex(@"(\w):/(\w+)"); - Match match = regex.Match(tmpPath); - if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') - { - tmpPath = Helper.NormalizePath(tmpPath); - } - else - { - tmpPath = Helper.NormalizePath("./" + tmpPath); - } - - return tmpPath; - } - - private static string BuildReference(SolutionNode solution, ReferenceNode refr) - { - string ret = ""; - } - else - { - ProjectNode project = (ProjectNode)refr.Parent; - string fileRef = FindFileReference(refr.Name, project); - - if(refr.Path != null || fileRef != null) - { - ret += "Assembly\" refto=\""; - - string finalPath = (refr.Path != null) ? Helper.MakeFilePath(refr.Path, refr.Name, "dll") : fileRef; - - ret += finalPath; - ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; - return ret; - } - - ret += "Gac\""; - ret += " localcopy=\"" + refr.LocalCopy.ToString() + "\""; - ret += " refto=\""; - try - { - /* - Day changed to 28 Mar 2007 - ... - 08:09 < cj> is there anything that replaces Assembly.LoadFromPartialName() ? - 08:09 < jonp> no - 08:10 < jonp> in their infinite wisdom [sic], microsoft decided that the - ability to load any assembly version by-name was an inherently - bad idea - 08:11 < cj> I'm thinking of a bunch of four-letter words right now... - 08:11 < cj> security through making it difficult for the developer!!! - 08:12 < jonp> just use the Obsolete API - 08:12 < jonp> it should still work - 08:12 < cj> alrighty. - 08:12 < jonp> you just get warnings when using it - */ - Assembly assem = Assembly.LoadWithPartialName(refr.Name); - ret += assem.FullName; - //ret += refr.Name; - } - catch (System.NullReferenceException e) - { - e.ToString(); - ret += refr.Name; - } - ret += "\" />"; - } - - return ret; - } - - private static string FindFileReference(string refName, ProjectNode project) - { - foreach(ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); - - if(File.Exists(fullPath)) - { - return fullPath; - } - } - - return null; - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GenerateXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if( conf == null ) - { - throw new ArgumentNullException("conf"); - } - if( project == null ) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - { - return "False"; - } - return "True"; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - string csComp = "Mcs"; - string netRuntime = "Mono"; - if(project.Runtime == ClrRuntime.Microsoft) - { - csComp = "Csc"; - netRuntime = "MsNet"; - } - - string projFile = Helper.MakeFilePath(project.FullPath, project.Name, "mdp"); - StreamWriter ss = new StreamWriter(projFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); - - using(ss) - { - ss.WriteLine( - "", - project.Name, - project.RootNamespace - ); - - int count = 0; - - ss.WriteLine(" ", solution.ActiveConfig); - - foreach(ConfigurationNode conf in project.Configurations) - { - ss.WriteLine(" ", conf.Name); - ss.Write(" "); - - ss.Write(" "); - - ss.Write(" "); - - ss.Write(" "); - ss.WriteLine(" "); - - count++; - } - ss.WriteLine(" "); - - ss.Write(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - - ss.WriteLine(" "); - foreach(string file in project.Files) - { - string buildAction = "Compile"; - switch(project.Files.GetBuildAction(file)) - { - case BuildAction.None: - buildAction = "Nothing"; - break; - - case BuildAction.Content: - buildAction = "Exclude"; - break; - - case BuildAction.EmbeddedResource: - buildAction = "EmbedAsResource"; - break; - - default: - buildAction = "Compile"; - break; - } - - // Sort of a hack, we try and resolve the path and make it relative, if we can. - string filePath = PrependPath(file); - ss.WriteLine(" ", filePath, buildAction); - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - foreach(ReferenceNode refr in project.References) - { - ss.WriteLine(" {0}", BuildReference(solution, refr)); - } - ss.WriteLine(" "); - - - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteCombine(SolutionNode solution) - { - m_Kernel.Log.Write("Creating MonoDevelop combine and project files"); - foreach(ProjectNode project in solution.Projects) - { - if(m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - } - - m_Kernel.Log.Write(""); - string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "mds"); - StreamWriter ss = new StreamWriter(combFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); - - int count = 0; - - using(ss) - { - ss.WriteLine("", solution.Name); - - count = 0; - foreach(ConfigurationNode conf in solution.Configurations) - { - if(count == 0) - { - ss.WriteLine(" ", conf.Name); - } - - ss.WriteLine(" ", conf.Name); - foreach(ProjectNode project in solution.Projects) - { - ss.WriteLine(" ", project.Name, conf.Name); - } - ss.WriteLine(" "); - - count++; - } - ss.WriteLine(" "); - - count = 0; - - foreach(ProjectNode project in solution.Projects) - { - if(count == 0) - ss.WriteLine(" ", project.Name); - - ss.WriteLine(" ", project.Name); - count++; - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - foreach(ProjectNode project in solution.Projects) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.WriteLine(" ", - Helper.MakeFilePath(path, project.Name, "mdp")); - } - ss.WriteLine(" "); - - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "mdp"); - Helper.DeleteIfExists(projectFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning MonoDevelop combine and project files for", solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "mds"); - Helper.DeleteIfExists(slnFile); - - foreach(ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public void Write(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode solution in kern.Solutions) - { - WriteCombine(solution); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode sol in kern.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return "sharpdev"; - } - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: dmoonfire $ + * $Date: 2008-12-14 13:35:55 -0800 (Sun, 14 Dec 2008) $ + * $Revision: 283 $ + */ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.IO; +using System.Reflection; +using System.Text.RegularExpressions; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("monodev")] + public class MonoDevelopTarget : ITarget + { + #region Fields + + private Kernel m_Kernel; + + #endregion + + #region Private Methods + + private static string PrependPath(string path) + { + string tmpPath = Helper.NormalizePath(path, '/'); + Regex regex = new Regex(@"(\w):/(\w+)"); + Match match = regex.Match(tmpPath); + if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') + { + tmpPath = Helper.NormalizePath(tmpPath); + } + else + { + tmpPath = Helper.NormalizePath("./" + tmpPath); + } + + return tmpPath; + } + + private static string BuildReference(SolutionNode solution, ReferenceNode refr) + { + string ret = ""; + } + else + { + ProjectNode project = (ProjectNode)refr.Parent; + string fileRef = FindFileReference(refr.Name, project); + + if(refr.Path != null || fileRef != null) + { + ret += "Assembly\" refto=\""; + + string finalPath = (refr.Path != null) ? Helper.MakeFilePath(refr.Path, refr.Name, "dll") : fileRef; + + ret += finalPath; + ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; + return ret; + } + + ret += "Gac\""; + ret += " localcopy=\"" + refr.LocalCopy.ToString() + "\""; + ret += " refto=\""; + try + { + /* + Day changed to 28 Mar 2007 + ... + 08:09 < cj> is there anything that replaces Assembly.LoadFromPartialName() ? + 08:09 < jonp> no + 08:10 < jonp> in their infinite wisdom [sic], microsoft decided that the + ability to load any assembly version by-name was an inherently + bad idea + 08:11 < cj> I'm thinking of a bunch of four-letter words right now... + 08:11 < cj> security through making it difficult for the developer!!! + 08:12 < jonp> just use the Obsolete API + 08:12 < jonp> it should still work + 08:12 < cj> alrighty. + 08:12 < jonp> you just get warnings when using it + */ + Assembly assem = Assembly.LoadWithPartialName(refr.Name); + ret += assem.FullName; + //ret += refr.Name; + } + catch (System.NullReferenceException e) + { + e.ToString(); + ret += refr.Name; + } + ret += "\" />"; + } + + return ret; + } + + private static string FindFileReference(string refName, ProjectNode project) + { + foreach(ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); + + if(File.Exists(fullPath)) + { + return fullPath; + } + } + + return null; + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GenerateXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if( conf == null ) + { + throw new ArgumentNullException("conf"); + } + if( project == null ) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + { + return "False"; + } + return "True"; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + string csComp = "Mcs"; + string netRuntime = "Mono"; + if(project.Runtime == ClrRuntime.Microsoft) + { + csComp = "Csc"; + netRuntime = "MsNet"; + } + + string projFile = Helper.MakeFilePath(project.FullPath, project.Name, "mdp"); + StreamWriter ss = new StreamWriter(projFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); + + using(ss) + { + ss.WriteLine( + "", + project.Name, + project.RootNamespace + ); + + int count = 0; + + ss.WriteLine(" ", solution.ActiveConfig); + + foreach(ConfigurationNode conf in project.Configurations) + { + ss.WriteLine(" ", conf.Name); + ss.Write(" "); + + ss.Write(" "); + + ss.Write(" "); + + ss.Write(" "); + ss.WriteLine(" "); + + count++; + } + ss.WriteLine(" "); + + ss.Write(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + + ss.WriteLine(" "); + foreach(string file in project.Files) + { + string buildAction = "Compile"; + switch(project.Files.GetBuildAction(file)) + { + case BuildAction.None: + buildAction = "Nothing"; + break; + + case BuildAction.Content: + buildAction = "Exclude"; + break; + + case BuildAction.EmbeddedResource: + buildAction = "EmbedAsResource"; + break; + + default: + buildAction = "Compile"; + break; + } + + // Sort of a hack, we try and resolve the path and make it relative, if we can. + string filePath = PrependPath(file); + ss.WriteLine(" ", filePath, buildAction); + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + foreach(ReferenceNode refr in project.References) + { + ss.WriteLine(" {0}", BuildReference(solution, refr)); + } + ss.WriteLine(" "); + + + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteCombine(SolutionNode solution) + { + m_Kernel.Log.Write("Creating MonoDevelop combine and project files"); + foreach(ProjectNode project in solution.Projects) + { + if(m_Kernel.AllowProject(project.FilterGroups)) + { + m_Kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + } + + m_Kernel.Log.Write(""); + string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "mds"); + StreamWriter ss = new StreamWriter(combFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); + + int count = 0; + + using(ss) + { + ss.WriteLine("", solution.Name); + + count = 0; + foreach(ConfigurationNode conf in solution.Configurations) + { + if(count == 0) + { + ss.WriteLine(" ", conf.Name); + } + + ss.WriteLine(" ", conf.Name); + foreach(ProjectNode project in solution.Projects) + { + ss.WriteLine(" ", project.Name, conf.Name); + } + ss.WriteLine(" "); + + count++; + } + ss.WriteLine(" "); + + count = 0; + + foreach(ProjectNode project in solution.Projects) + { + if(count == 0) + ss.WriteLine(" ", project.Name); + + ss.WriteLine(" ", project.Name); + count++; + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + foreach(ProjectNode project in solution.Projects) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.WriteLine(" ", + Helper.MakeFilePath(path, project.Name, "mdp")); + } + ss.WriteLine(" "); + + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "mdp"); + Helper.DeleteIfExists(projectFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning MonoDevelop combine and project files for", solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "mds"); + Helper.DeleteIfExists(slnFile); + + foreach(ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public void Write(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode solution in kern.Solutions) + { + WriteCombine(solution); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode sol in kern.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return "sharpdev"; + } + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Targets/NAntTarget.cs b/Programs/Prebuild/src/Core/Targets/NAntTarget.cs index 3ea24645..9c5aea3d 100644 --- a/Programs/Prebuild/src/Core/Targets/NAntTarget.cs +++ b/Programs/Prebuild/src/Core/Targets/NAntTarget.cs @@ -1,9 +1,9 @@ #region BSD License /* Copyright (c) 2004 - 2008 -Matthew Holmes (matthew@wildfiregames.com), -Dan Moorehead (dan05a@gmail.com), -C.J. Adams-Collier (cjac@colliertech.org), +Matthew Holmes (matthew@wildfiregames.com), +Dan Moorehead (dan05a@gmail.com), +C.J. Adams-Collier (cjac@colliertech.org), Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -38,9 +38,9 @@ POSSIBILITY OF SUCH DAMAGE. #region CVS Information /* * $Source$ - * $Author: cjcollier $ - * $Date: 2008-02-07 01:22:36 +0000 (Thu, 07 Feb 2008) $ - * $Revision: 255 $ + * $Author: jhurliman $ + * $Date: 2008-12-17 14:18:25 -0800 (Wed, 17 Dec 2008) $ + * $Revision: 285 $ */ #endregion @@ -58,478 +58,481 @@ using Prebuild.Core.Utilities; namespace Prebuild.Core.Targets { - /// - /// - /// - [Target("nant")] - public class NAntTarget : ITarget - { - #region Fields + /// + /// + /// + [Target("nant")] + public class NAntTarget : ITarget + { + #region Fields - private Kernel m_Kernel; + private Kernel m_Kernel; - #endregion + #endregion - #region Private Methods + #region Private Methods - private static string PrependPath(string path) - { - string tmpPath = Helper.NormalizePath(path, '/'); - Regex regex = new Regex(@"(\w):/(\w+)"); - Match match = regex.Match(tmpPath); - //if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') - //{ - tmpPath = Helper.NormalizePath(tmpPath); - //} - // else - // { - // tmpPath = Helper.NormalizePath("./" + tmpPath); - // } + private static string PrependPath(string path) + { + string tmpPath = Helper.NormalizePath(path, '/'); + Regex regex = new Regex(@"(\w):/(\w+)"); + Match match = regex.Match(tmpPath); + //if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') + //{ + tmpPath = Helper.NormalizePath(tmpPath); + //} + // else + // { + // tmpPath = Helper.NormalizePath("./" + tmpPath); + // } - return tmpPath; - } + return tmpPath; + } - private static string BuildReference(SolutionNode solution, ReferenceNode refr) - { - string ret = ""; - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; - string fileRef = FindFileReference(refr.Name, project); - //string finalPath = Helper.NormalizePath(Helper.MakeFilePath(project.FullPath + "/${build.dir}/", refr.Name, "dll"), '/'); - string finalPath = Helper.NormalizePath(Helper.MakeFilePath("${build.dir}/", refr.Name, "dll"), '/'); - ret += finalPath; - return ret; - } - else - { - ProjectNode project = (ProjectNode)refr.Parent; - string fileRef = FindFileReference(refr.Name, project); + private static string BuildReference(SolutionNode solution, ReferenceNode refr) + { + string ret = ""; + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; + string fileRef = FindFileReference(refr.Name, project); + string finalPath = Helper.NormalizePath(Helper.MakeFilePath("${build.dir}/", refr.Name, GetExtension(refr.Name)), '/'); + ret += finalPath; + return ret; + } + else + { + ProjectNode project = (ProjectNode)refr.Parent; + string fileRef = FindFileReference(refr.Name, project); + string ext = GetExtension(refr.Name); - if (refr.Path != null || fileRef != null) - { - string finalPath = (refr.Path != null) ? Helper.NormalizePath("${build.dir}/" + refr.Name + ".dll", '/') : fileRef; - ret += finalPath; - return ret; - } + if (refr.Path != null || fileRef != null) + { + string finalPath = (refr.Path != null) ? Helper.NormalizePath(Helper.MakeFilePath("${build.dir}/", refr.Name, ext), '/') : fileRef; - try - { - //Assembly assem = Assembly.Load(refr.Name); - //if (assem != null) - //{ - //ret += (refr.Name + ".dll"); - //} - //else - //{ - ret += (refr.Name + ".dll"); - //} - } - catch (System.NullReferenceException e) - { - e.ToString(); + ret += finalPath; + return ret; + } + + if (refr.Name.EndsWith(".exe") || refr.Name.EndsWith(".dll")) + ret += refr.Name; + else ret += refr.Name + ".dll"; - } - } - return ret; - } + } + return ret; + } - private static string BuildReferencePath(SolutionNode solution, ReferenceNode refr) + private static string GetExtension(string refrName) { - string ret = ""; - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; - string fileRef = FindFileReference(refr.Name, project); - string finalPath = Helper.NormalizePath(Helper.MakeReferencePath(project.FullPath + "/${build.dir}/"), '/'); - ret += finalPath; - return ret; - } + if (refrName.EndsWith(".exe") || refrName.EndsWith(".dll")) + return String.Empty; else - { - ProjectNode project = (ProjectNode)refr.Parent; - string fileRef = FindFileReference(refr.Name, project); - - if (refr.Path != null || fileRef != null) - { - string finalPath = (refr.Path != null) ? Helper.NormalizePath(refr.Path, '/') : fileRef; - ret += finalPath; - return ret; - } - - try - { - Assembly assem = Assembly.Load(refr.Name); - if (assem != null) - { - ret += ""; - } - else - { - ret += ""; - } - } - catch (System.NullReferenceException e) - { - e.ToString(); - ret += ""; - } - } - return ret; + return "dll"; } - private static string FindFileReference(string refName, ProjectNode project) - { - foreach (ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = project.FullPath + Path.DirectorySeparatorChar + Helper.MakeFilePath(refPath.Path, refName, "dll"); + private static string BuildReferencePath(SolutionNode solution, ReferenceNode refr) + { + string ret = ""; + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; + string fileRef = FindFileReference(refr.Name, project); + string finalPath = Helper.NormalizePath(Helper.MakeReferencePath("${build.dir}/"), '/'); + ret += finalPath; + return ret; + } + else + { + ProjectNode project = (ProjectNode)refr.Parent; + string fileRef = FindFileReference(refr.Name, project); - if (File.Exists(fullPath)) - { - //Console.WriteLine("fullPath exists=" + fullPath); - return Helper.MakeFilePath("${build.dir}/", refName, "dll"); - } - else - { - //Console.WriteLine("fullPath does not exist=" + fullPath); - } - } + if (refr.Path != null || fileRef != null) + { + string finalPath = (refr.Path != null) ? Helper.NormalizePath(refr.Path, '/') : fileRef; + ret += finalPath; + return ret; + } - return null; - } + try + { + Assembly assem = Assembly.Load(refr.Name); + if (assem != null) + { + ret += ""; + } + else + { + ret += ""; + } + } + catch (System.NullReferenceException e) + { + e.ToString(); + ret += ""; + } + } + return ret; + } - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if (conf == null) - { - throw new ArgumentNullException("conf"); - } - if (project == null) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - // { - // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; - // } - return docFile; - } + private static string FindFileReference(string refName, ProjectNode project) + { + foreach (ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); - private void WriteProject(SolutionNode solution, ProjectNode project) - { - string projFile = Helper.MakeFilePath(project.FullPath, project.Name + (project.Type == ProjectType.Library ? ".dll" : ".exe"), "build"); - StreamWriter ss = new StreamWriter(projFile); + if (File.Exists(fullPath)) + { + return fullPath; + } + } - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); - bool hasDoc = false; + return null; + } - using (ss) - { - ss.WriteLine(""); - ss.WriteLine("", project.Name); - ss.WriteLine(" ", "build"); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ReferenceNode refr in project.References) - { - if (refr.LocalCopy) - { - ss.WriteLine(" ", '/')); - } - } - - ss.WriteLine(" "); - ss.WriteLine(" "); - if (project.ConfigFile != null && project.ConfigFile.Length!=0) - { - ss.Write(" + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if (conf == null) + { + throw new ArgumentNullException("conf"); + } + if (project == null) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + // { + // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; + // } + return docFile; + } - if (project.Type == ProjectType.Library) - { - ss.Write(".dll.config\""); - } - else - { - ss.Write(".exe.config\""); - } - ss.WriteLine(" />"); - } + private void WriteProject(SolutionNode solution, ProjectNode project) + { + string projFile = Helper.MakeFilePath(project.FullPath, project.Name + (project.Type == ProjectType.Library ? ".dll" : ".exe"), "build"); + StreamWriter ss = new StreamWriter(projFile); - // Add the content files to just be copied - ss.WriteLine(" {0}", ""); - ss.WriteLine(" {0}", ""); - - foreach (string file in project.Files) - { - // Ignore if we aren't content - if (project.Files.GetBuildAction(file) != BuildAction.Content) - continue; + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); + bool hasDoc = false; + + using (ss) + { + ss.WriteLine(""); + ss.WriteLine("", project.Name); + ss.WriteLine(" ", "build"); + //ss.WriteLine(" "); + //ss.WriteLine(" "); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (ReferenceNode refr in project.References) + { + if (refr.LocalCopy) + { + ss.WriteLine(" ", '/')); + } + } + + ss.WriteLine(" "); + ss.WriteLine(" "); + if (project.ConfigFile != null && project.ConfigFile.Length!=0) + { + //ss.Write(" "); - } + if (project.Type == ProjectType.Library) + { + ss.Write(".dll.config\""); + } + else + { + ss.Write(".exe.config\""); + } + ss.WriteLine(" />"); + } - ss.WriteLine(" {0}", ""); - ss.WriteLine(" {0}", ""); + // Add the content files to just be copied + //ss.WriteLine(" {0}", ""); + ss.WriteLine(" {0}", ""); + ss.WriteLine(" {0}", ""); + + foreach (string file in project.Files) + { + // Ignore if we aren't content + if (project.Files.GetBuildAction(file) != BuildAction.Content) + continue; - ss.Write(" "); + } - foreach (ConfigurationNode conf in project.Configurations) - { - if (GetXmlDocFile(project, conf) != "") - { + ss.WriteLine(" {0}", ""); + ss.WriteLine(" {0}", ""); + + ss.Write(" "); - ss.WriteLine(" ", project.RootNamespace); - foreach (string file in project.Files) - { - switch (project.Files.GetBuildAction(file)) - { - case BuildAction.EmbeddedResource: - ss.WriteLine(" {0}", ""); - break; - default: - if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) - { - ss.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - } - break; - } - } - //if (project.Files.GetSubType(file).ToString() != "Code") - //{ - // ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + if (project.Type == ProjectType.Library) + { + ss.Write(".dll\""); + } + else + { + ss.Write(".exe\""); + } + if (project.AppIcon != null && project.AppIcon.Length != 0) + { + ss.Write(" win32icon=\"{0}\"", Helper.NormalizePath(project.AppIcon, '/')); + } + ss.WriteLine(">"); + ss.WriteLine(" ", project.RootNamespace); + foreach (string file in project.Files) + { + switch (project.Files.GetBuildAction(file)) + { + case BuildAction.EmbeddedResource: + ss.WriteLine(" {0}", ""); + break; + default: + if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) + { + ss.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + } + break; + } + } + //if (project.Files.GetSubType(file).ToString() != "Code") + //{ + // ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (string file in project.Files) - { - switch (project.Files.GetBuildAction(file)) - { - case BuildAction.Compile: - ss.WriteLine(" "); - break; - default: - break; - } - } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ReferenceNode refr in project.References) - { - ss.WriteLine(" ", '/')); - } - ss.WriteLine(" "); - - ArrayList suppressWarningsArray = new ArrayList(); - ss.WriteLine(" "); - foreach (ConfigurationNode conf in project.Configurations) - { - foreach (string s in conf.Options.SuppressWarnings.Split(new char[] { ',', ' ' })) - { - // duplicate check - if (!suppressWarningsArray.Contains(s)) - { - suppressWarningsArray.Add(s); - ss.WriteLine(" ", s); - } - } - } - suppressWarningsArray.Clear(); + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (string file in project.Files) + { + switch (project.Files.GetBuildAction(file)) + { + case BuildAction.Compile: + ss.WriteLine(" "); + break; + default: + break; + } + } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (ReferenceNode refr in project.References) + { + ss.WriteLine(" ", '/')); + } + ss.WriteLine(" "); - ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); - ss.WriteLine(" "); - if (hasDoc) - { - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.Write(" "); - } - else - { - ss.WriteLine(".exe\" />"); - } + ss.WriteLine(" "); + if (hasDoc) + { + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.Write(" "); + } + else + { + ss.WriteLine(".exe\" />"); + } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - // foreach(ReferenceNode refr in project.References) - // { - // string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReferencePath(solution, refr)), '/'); - // if (path != "") - // { - // ss.WriteLine(" ", path); - // } - // } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - } - ss.WriteLine(" "); - ss.WriteLine(""); - } - m_Kernel.CurrentWorkingDirectory.Pop(); - } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + // foreach(ReferenceNode refr in project.References) + // { + // string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReferencePath(solution, refr)), '/'); + // if (path != "") + // { + // ss.WriteLine(" ", path); + // } + // } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + } + ss.WriteLine(" "); + ss.WriteLine("
"); + } + m_Kernel.CurrentWorkingDirectory.Pop(); + } - private void WriteCombine(SolutionNode solution) - { - m_Kernel.Log.Write("Creating NAnt build files"); - foreach (ProjectNode project in solution.Projects) - { - if (m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - } + private void WriteCombine(SolutionNode solution) + { + m_Kernel.Log.Write("Creating NAnt build files"); + foreach (ProjectNode project in solution.Projects) + { + if (m_Kernel.AllowProject(project.FilterGroups)) + { + m_Kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + } - m_Kernel.Log.Write(""); - string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); - StreamWriter ss = new StreamWriter(combFile); + m_Kernel.Log.Write(""); + string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); + StreamWriter ss = new StreamWriter(combFile); - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); - using (ss) - { - ss.WriteLine(""); - ss.WriteLine("", solution.Name); - ss.WriteLine(" "); - ss.WriteLine(); + using (ss) + { + ss.WriteLine(""); + ss.WriteLine("", solution.Name); + ss.WriteLine(" "); + ss.WriteLine(); - //ss.WriteLine(" "); - //ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); + //ss.WriteLine(" "); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); - foreach (ConfigurationNode conf in solution.Configurations) - { - // Set the project.config to a non-debug configuration - if (conf.Options["DebugInformation"].ToString().ToLower() != "true") - { - ss.WriteLine(" ", conf.Name); - } - ss.WriteLine(); - ss.WriteLine(" ", conf.Name); - ss.WriteLine(" ", conf.Name); - ss.WriteLine(" ", conf.Options["DebugInformation"].ToString().ToLower()); - ss.WriteLine(" "); - ss.WriteLine(); - } + foreach (ConfigurationNode conf in solution.Configurations) + { + // Set the project.config to a non-debug configuration + if (conf.Options["DebugInformation"].ToString().ToLower() != "true") + { + ss.WriteLine(" ", conf.Name); + } + ss.WriteLine(); + ss.WriteLine(" ", conf.Name); + ss.WriteLine(" ", conf.Name); + ss.WriteLine(" ", conf.Options["DebugInformation"].ToString().ToLower()); + ss.WriteLine(" "); + ss.WriteLine(); + } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); ss.WriteLine(" "); ss.WriteLine(" "); @@ -544,30 +547,7 @@ namespace Prebuild.Core.Targets ss.WriteLine(" "); ss.WriteLine(" "); //ss.WriteLine(" "); - //ss.WriteLine(" "); - // This is really bad, hard coding names of files we don't want nant clobbering - // Hack until prebuild supports some sort of exclusion property - Anonymous - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); + ss.WriteLine(" "); ss.WriteLine(" "); foreach (ProjectNode project in solution.Projects) { diff --git a/Programs/Prebuild/src/Core/Targets/SharpDevelopTarget.cs b/Programs/Prebuild/src/Core/Targets/SharpDevelopTarget.cs index 5f46fab4..08aab44c 100644 --- a/Programs/Prebuild/src/Core/Targets/SharpDevelopTarget.cs +++ b/Programs/Prebuild/src/Core/Targets/SharpDevelopTarget.cs @@ -1,437 +1,437 @@ -#region BSD License -/* -Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2007-02-13 20:58:03 +0000 (Tue, 13 Feb 2007) $ - * $Revision: 205 $ - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Text.RegularExpressions; -using System.Reflection; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("sharpdev")] - public class SharpDevelopTarget : ITarget - { - #region Fields - - private Kernel m_Kernel; - - #endregion - - #region Private Methods - - private static string PrependPath(string path) - { - string tmpPath = Helper.NormalizePath(path, '/'); - Regex regex = new Regex(@"(\w):/(\w+)"); - Match match = regex.Match(tmpPath); - if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') - { - tmpPath = Helper.NormalizePath(tmpPath); - } - else - { - tmpPath = Helper.NormalizePath("./" + tmpPath); - } - - return tmpPath; - } - - private static string BuildReference(SolutionNode solution, ReferenceNode refr) - { - string ret = ""; - } - else - { - ProjectNode project = (ProjectNode)refr.Parent; - string fileRef = FindFileReference(refr.Name, project); - - if(refr.Path != null || fileRef != null) - { - ret += "Assembly\" refto=\""; - - string finalPath = (refr.Path != null) ? Helper.MakeFilePath(refr.Path, refr.Name, "dll") : fileRef; - - ret += finalPath; - ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; - return ret; - } - - ret += "Gac\" refto=\""; - try - { - //Assembly assem = Assembly.Load(refr.Name); - ret += refr.Name;// assem.FullName; - } - catch (System.NullReferenceException e) - { - e.ToString(); - ret += refr.Name; - } - ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; - } - - return ret; - } - - private static string FindFileReference(string refName, ProjectNode project) - { - foreach(ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); - - if(File.Exists(fullPath)) - { - return fullPath; - } - } - - return null; - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GenerateXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if( conf == null ) - { - throw new ArgumentNullException("conf"); - } - if( project == null ) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - { - return "False"; - } - return "True"; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - string csComp = "Csc"; - string netRuntime = "MsNet"; - if(project.Runtime == ClrRuntime.Mono) - { - csComp = "Mcs"; - netRuntime = "Mono"; - } - - string projFile = Helper.MakeFilePath(project.FullPath, project.Name, "prjx"); - StreamWriter ss = new StreamWriter(projFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); - - using(ss) - { - ss.WriteLine( - "", - project.Name, - project.RootNamespace - ); - - ss.WriteLine(" "); - foreach(string file in project.Files) - { - string buildAction = "Compile"; - switch(project.Files.GetBuildAction(file)) - { - case BuildAction.None: - buildAction = "Nothing"; - break; - - case BuildAction.Content: - buildAction = "Exclude"; - break; - - case BuildAction.EmbeddedResource: - buildAction = "EmbedAsResource"; - break; - - default: - buildAction = "Compile"; - break; - } - - // Sort of a hack, we try and resolve the path and make it relative, if we can. - string filePath = PrependPath(file); - ss.WriteLine(" ", filePath, buildAction); - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - foreach(ReferenceNode refr in project.References) - { - ss.WriteLine(" {0}", BuildReference(solution, refr)); - } - ss.WriteLine(" "); - - ss.Write(" "); - - int count = 0; - - ss.WriteLine(" ", solution.ActiveConfig); - - foreach(ConfigurationNode conf in project.Configurations) - { - ss.Write(" "); - ss.Write(" "); - - ss.Write(" "); - - ss.Write(" "); - ss.WriteLine(" "); - - count++; - } - ss.WriteLine(" "); - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteCombine(SolutionNode solution) - { - m_Kernel.Log.Write("Creating SharpDevelop combine and project files"); - foreach(ProjectNode project in solution.Projects) - { - if(m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - } - - m_Kernel.Log.Write(""); - string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "cmbx"); - StreamWriter ss = new StreamWriter(combFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); - - using(ss) - { - ss.WriteLine("", solution.Name); - - int count = 0; - foreach(ProjectNode project in solution.Projects) - { - if(count == 0) - ss.WriteLine(" ", project.Name); - - ss.WriteLine(" ", project.Name); - count++; - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - foreach(ProjectNode project in solution.Projects) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.WriteLine(" ", - Helper.MakeFilePath(path, project.Name, "prjx")); - } - ss.WriteLine(" "); - - count = 0; - foreach(ConfigurationNode conf in solution.Configurations) - { - if(count == 0) - { - ss.WriteLine(" ", conf.Name); - } - - ss.WriteLine(" ", conf.Name); - foreach(ProjectNode project in solution.Projects) - { - ss.WriteLine(" ", project.Name, conf.Name); - } - ss.WriteLine(" "); - - count++; - } - ss.WriteLine(" "); - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "prjx"); - Helper.DeleteIfExists(projectFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning SharpDevelop combine and project files for", solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "cmbx"); - Helper.DeleteIfExists(slnFile); - - foreach(ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public void Write(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode solution in kern.Solutions) - { - WriteCombine(solution); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode sol in kern.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return "sharpdev"; - } - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2007-02-13 12:58:03 -0800 (Tue, 13 Feb 2007) $ + * $Revision: 205 $ + */ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.IO; +using System.Text.RegularExpressions; +using System.Reflection; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("sharpdev")] + public class SharpDevelopTarget : ITarget + { + #region Fields + + private Kernel m_Kernel; + + #endregion + + #region Private Methods + + private static string PrependPath(string path) + { + string tmpPath = Helper.NormalizePath(path, '/'); + Regex regex = new Regex(@"(\w):/(\w+)"); + Match match = regex.Match(tmpPath); + if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') + { + tmpPath = Helper.NormalizePath(tmpPath); + } + else + { + tmpPath = Helper.NormalizePath("./" + tmpPath); + } + + return tmpPath; + } + + private static string BuildReference(SolutionNode solution, ReferenceNode refr) + { + string ret = ""; + } + else + { + ProjectNode project = (ProjectNode)refr.Parent; + string fileRef = FindFileReference(refr.Name, project); + + if(refr.Path != null || fileRef != null) + { + ret += "Assembly\" refto=\""; + + string finalPath = (refr.Path != null) ? Helper.MakeFilePath(refr.Path, refr.Name, "dll") : fileRef; + + ret += finalPath; + ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; + return ret; + } + + ret += "Gac\" refto=\""; + try + { + //Assembly assem = Assembly.Load(refr.Name); + ret += refr.Name;// assem.FullName; + } + catch (System.NullReferenceException e) + { + e.ToString(); + ret += refr.Name; + } + ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; + } + + return ret; + } + + private static string FindFileReference(string refName, ProjectNode project) + { + foreach(ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); + + if(File.Exists(fullPath)) + { + return fullPath; + } + } + + return null; + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GenerateXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if( conf == null ) + { + throw new ArgumentNullException("conf"); + } + if( project == null ) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + { + return "False"; + } + return "True"; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + string csComp = "Csc"; + string netRuntime = "MsNet"; + if(project.Runtime == ClrRuntime.Mono) + { + csComp = "Mcs"; + netRuntime = "Mono"; + } + + string projFile = Helper.MakeFilePath(project.FullPath, project.Name, "prjx"); + StreamWriter ss = new StreamWriter(projFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); + + using(ss) + { + ss.WriteLine( + "", + project.Name, + project.RootNamespace + ); + + ss.WriteLine(" "); + foreach(string file in project.Files) + { + string buildAction = "Compile"; + switch(project.Files.GetBuildAction(file)) + { + case BuildAction.None: + buildAction = "Nothing"; + break; + + case BuildAction.Content: + buildAction = "Exclude"; + break; + + case BuildAction.EmbeddedResource: + buildAction = "EmbedAsResource"; + break; + + default: + buildAction = "Compile"; + break; + } + + // Sort of a hack, we try and resolve the path and make it relative, if we can. + string filePath = PrependPath(file); + ss.WriteLine(" ", filePath, buildAction); + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + foreach(ReferenceNode refr in project.References) + { + ss.WriteLine(" {0}", BuildReference(solution, refr)); + } + ss.WriteLine(" "); + + ss.Write(" "); + + int count = 0; + + ss.WriteLine(" ", solution.ActiveConfig); + + foreach(ConfigurationNode conf in project.Configurations) + { + ss.Write(" "); + ss.Write(" "); + + ss.Write(" "); + + ss.Write(" "); + ss.WriteLine(" "); + + count++; + } + ss.WriteLine(" "); + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteCombine(SolutionNode solution) + { + m_Kernel.Log.Write("Creating SharpDevelop combine and project files"); + foreach(ProjectNode project in solution.Projects) + { + if(m_Kernel.AllowProject(project.FilterGroups)) + { + m_Kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + } + + m_Kernel.Log.Write(""); + string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "cmbx"); + StreamWriter ss = new StreamWriter(combFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); + + using(ss) + { + ss.WriteLine("", solution.Name); + + int count = 0; + foreach(ProjectNode project in solution.Projects) + { + if(count == 0) + ss.WriteLine(" ", project.Name); + + ss.WriteLine(" ", project.Name); + count++; + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + foreach(ProjectNode project in solution.Projects) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.WriteLine(" ", + Helper.MakeFilePath(path, project.Name, "prjx")); + } + ss.WriteLine(" "); + + count = 0; + foreach(ConfigurationNode conf in solution.Configurations) + { + if(count == 0) + { + ss.WriteLine(" ", conf.Name); + } + + ss.WriteLine(" ", conf.Name); + foreach(ProjectNode project in solution.Projects) + { + ss.WriteLine(" ", project.Name, conf.Name); + } + ss.WriteLine(" "); + + count++; + } + ss.WriteLine(" "); + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "prjx"); + Helper.DeleteIfExists(projectFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning SharpDevelop combine and project files for", solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "cmbx"); + Helper.DeleteIfExists(slnFile); + + foreach(ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public void Write(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode solution in kern.Solutions) + { + WriteCombine(solution); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode sol in kern.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return "sharpdev"; + } + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Targets/VS2002Target.cs b/Programs/Prebuild/src/Core/Targets/VS2002Target.cs index aa390222..81e00080 100644 --- a/Programs/Prebuild/src/Core/Targets/VS2002Target.cs +++ b/Programs/Prebuild/src/Core/Targets/VS2002Target.cs @@ -1,96 +1,96 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 00:49:58 +0000 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - -using System; - -using Prebuild.Core.Attributes; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("vs2002")] - public class VS2002Target : VS2003Target - { - #region Private Methods - - private void SetVS2002() - { - this.SolutionVersion = "7.00"; - this.ProductVersion = "7.0.9254"; - this.SchemaVersion = "1.0"; - this.VersionName = "2002"; - this.Version = VSVersion.VS70; - } - - #endregion - - #region Public Methods - - /// - /// Writes the specified kern. - /// - /// The kern. - public override void Write(Kernel kern) - { - SetVS2002(); - base.Write(kern); - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public override void Clean(Kernel kern) - { - SetVS2002(); - base.Clean(kern); - } - - /// - /// Gets the name. - /// - /// The name. - public override string Name - { - get - { - return "vs2002"; - } - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2006-01-27 16:49:58 -0800 (Fri, 27 Jan 2006) $ + * $Revision: 71 $ + */ +#endregion + +using System; + +using Prebuild.Core.Attributes; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("vs2002")] + public class VS2002Target : VS2003Target + { + #region Private Methods + + private void SetVS2002() + { + this.SolutionVersion = "7.00"; + this.ProductVersion = "7.0.9254"; + this.SchemaVersion = "1.0"; + this.VersionName = "2002"; + this.Version = VSVersion.VS70; + } + + #endregion + + #region Public Methods + + /// + /// Writes the specified kern. + /// + /// The kern. + public override void Write(Kernel kern) + { + SetVS2002(); + base.Write(kern); + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public override void Clean(Kernel kern) + { + SetVS2002(); + base.Clean(kern); + } + + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get + { + return "vs2002"; + } + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Targets/VS2003Target.cs b/Programs/Prebuild/src/Core/Targets/VS2003Target.cs index efdfe9b3..7f5b3ecd 100644 --- a/Programs/Prebuild/src/Core/Targets/VS2003Target.cs +++ b/Programs/Prebuild/src/Core/Targets/VS2003Target.cs @@ -1,611 +1,611 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: sontek $ - * $Date: 2008-04-24 22:21:41 +0000 (Thu, 24 Apr 2008) $ - * $Revision: 259 $ - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.IO; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - [Target("vs2003")] - public class VS2003Target : ITarget - { - - #region Fields - - string solutionVersion = "8.00"; - string productVersion = "7.10.3077"; - string schemaVersion = "2.0"; - string versionName = "2003"; - VSVersion version = VSVersion.VS71; - - Hashtable m_Tools; - Kernel m_Kernel; - - /// - /// Gets or sets the solution version. - /// - /// The solution version. - protected string SolutionVersion - { - get - { - return this.solutionVersion; - } - set - { - this.solutionVersion = value; - } - } - /// - /// Gets or sets the product version. - /// - /// The product version. - protected string ProductVersion - { - get - { - return this.productVersion; - } - set - { - this.productVersion = value; - } - } - /// - /// Gets or sets the schema version. - /// - /// The schema version. - protected string SchemaVersion - { - get - { - return this.schemaVersion; - } - set - { - this.schemaVersion = value; - } - } - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - protected string VersionName - { - get - { - return this.versionName; - } - set - { - this.versionName = value; - } - } - /// - /// Gets or sets the version. - /// - /// The version. - protected VSVersion Version - { - get - { - return this.version; - } - set - { - this.version = value; - } - } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public VS2003Target() - { - m_Tools = new Hashtable(); - - m_Tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP"); - m_Tools["VB.NET"] = new ToolInfo("VB.NET", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic"); - } - - #endregion - - #region Private Methods - - private string MakeRefPath(ProjectNode project) - { - string ret = ""; - foreach(ReferencePathNode node in project.ReferencePaths) - { - try - { - string fullPath = Helper.ResolvePath(node.Path); - if(ret.Length < 1) - { - ret = fullPath; - } - else - { - ret += ";" + fullPath; - } - } - catch(ArgumentException) - { - m_Kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); - } - } - - return ret; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - if(!m_Tools.ContainsKey(project.Language)) - { - throw new UnknownLanguageException("Unknown .NET language: " + project.Language); - } - - ToolInfo toolInfo = (ToolInfo)m_Tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - StreamWriter ps = new StreamWriter(projectFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); - - IEnumerator enumerator; - //ConfigurationNode scripts; - - using(ps) - { - ps.WriteLine(""); - ps.WriteLine(" <{0}", toolInfo.XmlTag); - ps.WriteLine("\t\t\t\tProjectType = \"Local\""); - ps.WriteLine("\t\t\t\tProductVersion = \"{0}\"", this.ProductVersion); - ps.WriteLine("\t\t\t\tSchemaVersion = \"{0}\"", this.SchemaVersion); - ps.WriteLine("\t\t\t\tProjectGuid = \"{{{0}}}\"", project.Guid.ToString().ToUpper()); - ps.WriteLine("\t\t>"); - - ps.WriteLine("\t\t\t\t"); - ps.WriteLine(" "); - - foreach(ConfigurationNode conf in project.Configurations) - { - ps.WriteLine("\t\t\t\t "); - } - - ps.WriteLine(" "); - - ps.WriteLine(" "); - foreach(ReferenceNode refr in project.References) - { - ps.WriteLine(" "); - } - ps.WriteLine(" "); - - ps.WriteLine(" "); - ps.WriteLine(" "); - - ps.WriteLine(" "); - - foreach(string file in project.Files) - { - string fileName = file.Replace(".\\", ""); - ps.WriteLine(" "); - - if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) - { - ps.WriteLine(" "); - - } - } - ps.WriteLine(" "); - - ps.WriteLine(" "); - ps.WriteLine(" ", toolInfo.XmlTag); - ps.WriteLine(""); - } - - ps = new StreamWriter(projectFile + ".user"); - using(ps) - { - ps.WriteLine(""); - ps.WriteLine(" <{0}>", toolInfo.XmlTag); - ps.WriteLine(" "); - - ps.WriteLine(" ", MakeRefPath(project)); - foreach(ConfigurationNode conf in project.Configurations) - { - ps.WriteLine(" "); - } - ps.WriteLine(" "); - - ps.WriteLine(" "); - ps.WriteLine(" ", toolInfo.XmlTag); - ps.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if( conf == null ) - { - throw new ArgumentNullException("conf"); - } - if( project == null ) - { - throw new ArgumentNullException("project"); - } - // if(!(bool)conf.Options["GenerateXmlDocFile"]) //default to none, if the generate option is false - // { - // return string.Empty; - // } - - //default to "AssemblyName.xml" - //string defaultValue = Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; - //return (string)conf.Options["XmlDocFile", defaultValue]; - - //default to no XmlDocFile file - return (string)conf.Options["XmlDocFile", ""]; - } - - private void WriteSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Creating Visual Studio {0} solution and project files", this.VersionName); - - foreach(ProjectNode project in solution.Projects) - { - if(m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - } - - m_Kernel.Log.Write(""); - string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - StreamWriter ss = new StreamWriter(solutionFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); - - using(ss) - { - ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", this.SolutionVersion); - foreach(ProjectNode project in solution.Projects) - { - if(!m_Tools.ContainsKey(project.Language)) - { - throw new UnknownLanguageException("Unknown .NET language: " + project.Language); - } - - ToolInfo toolInfo = (ToolInfo)m_Tools[project.Language]; - - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.WriteLine("Project(\"{0}\") = \"{1}\", \"{2}\", \"{{{3}}}\"", - toolInfo.Guid, project.Name, Helper.MakeFilePath(path, project.Name, - toolInfo.FileExtension), project.Guid.ToString().ToUpper()); - - ss.WriteLine("\tProjectSection(ProjectDependencies) = postProject"); - ss.WriteLine("\tEndProjectSection"); - - ss.WriteLine("EndProject"); - } - - ss.WriteLine("Global"); - - ss.WriteLine("\tGlobalSection(SolutionConfiguration) = preSolution"); - foreach(ConfigurationNode conf in solution.Configurations) - { - ss.WriteLine("\t\t{0} = {0}", conf.Name); - } - ss.WriteLine("\tEndGlobalSection"); - - ss.WriteLine("\tGlobalSection(ProjectDependencies) = postSolution"); - foreach(ProjectNode project in solution.Projects) - { - for(int i = 0; i < project.References.Count; i++) - { - ReferenceNode refr = (ReferenceNode)project.References[i]; - if(solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode refProject = (ProjectNode)solution.ProjectsTable[refr.Name]; - ss.WriteLine("\t\t({{{0}}}).{1} = ({{{2}}})", - project.Guid.ToString().ToUpper() - , i, - refProject.Guid.ToString().ToUpper() - ); - } - } - } - ss.WriteLine("\tEndGlobalSection"); - - ss.WriteLine("\tGlobalSection(ProjectConfiguration) = postSolution"); - foreach(ProjectNode project in solution.Projects) - { - foreach(ConfigurationNode conf in solution.Configurations) - { - ss.WriteLine("\t\t{{{0}}}.{1}.ActiveCfg = {1}|.NET", - project.Guid.ToString().ToUpper(), - conf.Name); - - ss.WriteLine("\t\t{{{0}}}.{1}.Build.0 = {1}|.NET", - project.Guid.ToString().ToUpper(), - conf.Name); - } - } - ss.WriteLine("\tEndGlobalSection"); - - if(solution.Files != null) - { - ss.WriteLine("\tGlobalSection(SolutionItems) = postSolution"); - foreach(string file in solution.Files) - { - ss.WriteLine("\t\t{0} = {0}", file); - } - ss.WriteLine("\tEndGlobalSection"); - } - - ss.WriteLine("\tGlobalSection(ExtensibilityGlobals) = postSolution"); - ss.WriteLine("\tEndGlobalSection"); - ss.WriteLine("\tGlobalSection(ExtensibilityAddIns) = postSolution"); - ss.WriteLine("\tEndGlobalSection"); - - ss.WriteLine("EndGlobal"); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - - ToolInfo toolInfo = (ToolInfo)m_Tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - string userFile = projectFile + ".user"; - - Helper.DeleteIfExists(projectFile); - Helper.DeleteIfExists(userFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning Visual Studio {0} solution and project files", this.VersionName, solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); - - Helper.DeleteIfExists(slnFile); - Helper.DeleteIfExists(suoFile); - - foreach(ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public virtual void Write(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode sol in m_Kernel.Solutions) - { - WriteSolution(sol); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if( kern == null ) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach(SolutionNode sol in m_Kernel.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public virtual string Name - { - get - { - return "vs2003"; - } - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: sontek $ + * $Date: 2008-04-24 15:21:41 -0700 (Thu, 24 Apr 2008) $ + * $Revision: 259 $ + */ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.IO; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + [Target("vs2003")] + public class VS2003Target : ITarget + { + + #region Fields + + string solutionVersion = "8.00"; + string productVersion = "7.10.3077"; + string schemaVersion = "2.0"; + string versionName = "2003"; + VSVersion version = VSVersion.VS71; + + Hashtable m_Tools; + Kernel m_Kernel; + + /// + /// Gets or sets the solution version. + /// + /// The solution version. + protected string SolutionVersion + { + get + { + return this.solutionVersion; + } + set + { + this.solutionVersion = value; + } + } + /// + /// Gets or sets the product version. + /// + /// The product version. + protected string ProductVersion + { + get + { + return this.productVersion; + } + set + { + this.productVersion = value; + } + } + /// + /// Gets or sets the schema version. + /// + /// The schema version. + protected string SchemaVersion + { + get + { + return this.schemaVersion; + } + set + { + this.schemaVersion = value; + } + } + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + protected string VersionName + { + get + { + return this.versionName; + } + set + { + this.versionName = value; + } + } + /// + /// Gets or sets the version. + /// + /// The version. + protected VSVersion Version + { + get + { + return this.version; + } + set + { + this.version = value; + } + } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public VS2003Target() + { + m_Tools = new Hashtable(); + + m_Tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP"); + m_Tools["VB.NET"] = new ToolInfo("VB.NET", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic"); + } + + #endregion + + #region Private Methods + + private string MakeRefPath(ProjectNode project) + { + string ret = ""; + foreach(ReferencePathNode node in project.ReferencePaths) + { + try + { + string fullPath = Helper.ResolvePath(node.Path); + if(ret.Length < 1) + { + ret = fullPath; + } + else + { + ret += ";" + fullPath; + } + } + catch(ArgumentException) + { + m_Kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); + } + } + + return ret; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + if(!m_Tools.ContainsKey(project.Language)) + { + throw new UnknownLanguageException("Unknown .NET language: " + project.Language); + } + + ToolInfo toolInfo = (ToolInfo)m_Tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + StreamWriter ps = new StreamWriter(projectFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); + + IEnumerator enumerator; + //ConfigurationNode scripts; + + using(ps) + { + ps.WriteLine(""); + ps.WriteLine(" <{0}", toolInfo.XmlTag); + ps.WriteLine("\t\t\t\tProjectType = \"Local\""); + ps.WriteLine("\t\t\t\tProductVersion = \"{0}\"", this.ProductVersion); + ps.WriteLine("\t\t\t\tSchemaVersion = \"{0}\"", this.SchemaVersion); + ps.WriteLine("\t\t\t\tProjectGuid = \"{{{0}}}\"", project.Guid.ToString().ToUpper()); + ps.WriteLine("\t\t>"); + + ps.WriteLine("\t\t\t\t"); + ps.WriteLine(" "); + + foreach(ConfigurationNode conf in project.Configurations) + { + ps.WriteLine("\t\t\t\t "); + } + + ps.WriteLine(" "); + + ps.WriteLine(" "); + foreach(ReferenceNode refr in project.References) + { + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + ps.WriteLine(" "); + ps.WriteLine(" "); + + ps.WriteLine(" "); + + foreach(string file in project.Files) + { + string fileName = file.Replace(".\\", ""); + ps.WriteLine(" "); + + if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) + { + ps.WriteLine(" "); + + } + } + ps.WriteLine(" "); + + ps.WriteLine(" "); + ps.WriteLine(" ", toolInfo.XmlTag); + ps.WriteLine(""); + } + + ps = new StreamWriter(projectFile + ".user"); + using(ps) + { + ps.WriteLine(""); + ps.WriteLine(" <{0}>", toolInfo.XmlTag); + ps.WriteLine(" "); + + ps.WriteLine(" ", MakeRefPath(project)); + foreach(ConfigurationNode conf in project.Configurations) + { + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + ps.WriteLine(" "); + ps.WriteLine(" ", toolInfo.XmlTag); + ps.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if( conf == null ) + { + throw new ArgumentNullException("conf"); + } + if( project == null ) + { + throw new ArgumentNullException("project"); + } + // if(!(bool)conf.Options["GenerateXmlDocFile"]) //default to none, if the generate option is false + // { + // return string.Empty; + // } + + //default to "AssemblyName.xml" + //string defaultValue = Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; + //return (string)conf.Options["XmlDocFile", defaultValue]; + + //default to no XmlDocFile file + return (string)conf.Options["XmlDocFile", ""]; + } + + private void WriteSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Creating Visual Studio {0} solution and project files", this.VersionName); + + foreach(ProjectNode project in solution.Projects) + { + if(m_Kernel.AllowProject(project.FilterGroups)) + { + m_Kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + } + + m_Kernel.Log.Write(""); + string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + StreamWriter ss = new StreamWriter(solutionFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); + + using(ss) + { + ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", this.SolutionVersion); + foreach(ProjectNode project in solution.Projects) + { + if(!m_Tools.ContainsKey(project.Language)) + { + throw new UnknownLanguageException("Unknown .NET language: " + project.Language); + } + + ToolInfo toolInfo = (ToolInfo)m_Tools[project.Language]; + + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.WriteLine("Project(\"{0}\") = \"{1}\", \"{2}\", \"{{{3}}}\"", + toolInfo.Guid, project.Name, Helper.MakeFilePath(path, project.Name, + toolInfo.FileExtension), project.Guid.ToString().ToUpper()); + + ss.WriteLine("\tProjectSection(ProjectDependencies) = postProject"); + ss.WriteLine("\tEndProjectSection"); + + ss.WriteLine("EndProject"); + } + + ss.WriteLine("Global"); + + ss.WriteLine("\tGlobalSection(SolutionConfiguration) = preSolution"); + foreach(ConfigurationNode conf in solution.Configurations) + { + ss.WriteLine("\t\t{0} = {0}", conf.Name); + } + ss.WriteLine("\tEndGlobalSection"); + + ss.WriteLine("\tGlobalSection(ProjectDependencies) = postSolution"); + foreach(ProjectNode project in solution.Projects) + { + for(int i = 0; i < project.References.Count; i++) + { + ReferenceNode refr = (ReferenceNode)project.References[i]; + if(solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode refProject = (ProjectNode)solution.ProjectsTable[refr.Name]; + ss.WriteLine("\t\t({{{0}}}).{1} = ({{{2}}})", + project.Guid.ToString().ToUpper() + , i, + refProject.Guid.ToString().ToUpper() + ); + } + } + } + ss.WriteLine("\tEndGlobalSection"); + + ss.WriteLine("\tGlobalSection(ProjectConfiguration) = postSolution"); + foreach(ProjectNode project in solution.Projects) + { + foreach(ConfigurationNode conf in solution.Configurations) + { + ss.WriteLine("\t\t{{{0}}}.{1}.ActiveCfg = {1}|.NET", + project.Guid.ToString().ToUpper(), + conf.Name); + + ss.WriteLine("\t\t{{{0}}}.{1}.Build.0 = {1}|.NET", + project.Guid.ToString().ToUpper(), + conf.Name); + } + } + ss.WriteLine("\tEndGlobalSection"); + + if(solution.Files != null) + { + ss.WriteLine("\tGlobalSection(SolutionItems) = postSolution"); + foreach(string file in solution.Files) + { + ss.WriteLine("\t\t{0} = {0}", file); + } + ss.WriteLine("\tEndGlobalSection"); + } + + ss.WriteLine("\tGlobalSection(ExtensibilityGlobals) = postSolution"); + ss.WriteLine("\tEndGlobalSection"); + ss.WriteLine("\tGlobalSection(ExtensibilityAddIns) = postSolution"); + ss.WriteLine("\tEndGlobalSection"); + + ss.WriteLine("EndGlobal"); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + + ToolInfo toolInfo = (ToolInfo)m_Tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + string userFile = projectFile + ".user"; + + Helper.DeleteIfExists(projectFile); + Helper.DeleteIfExists(userFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning Visual Studio {0} solution and project files", this.VersionName, solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); + + Helper.DeleteIfExists(slnFile); + Helper.DeleteIfExists(suoFile); + + foreach(ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public virtual void Write(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode sol in m_Kernel.Solutions) + { + WriteSolution(sol); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if( kern == null ) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach(SolutionNode sol in m_Kernel.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public virtual string Name + { + get + { + return "vs2003"; + } + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Targets/VS2005Target.cs b/Programs/Prebuild/src/Core/Targets/VS2005Target.cs index 41a2a1df..fd8611cb 100644 --- a/Programs/Prebuild/src/Core/Targets/VS2005Target.cs +++ b/Programs/Prebuild/src/Core/Targets/VS2005Target.cs @@ -1,151 +1,151 @@ -#region BSD License -/* -Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: sontek $ - * $Date: 2008-05-07 20:59:35 +0000 (Wed, 07 May 2008) $ - * $Revision: 270 $ - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Text; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("vs2005")] - public class VS2005Target : VSGenericTarget - { - #region Inner Classes - - #endregion - - #region Fields - - string solutionVersion = "9.00"; - string productVersion = "8.0.50727"; - string schemaVersion = "2.0"; - string versionName = "Visual C# 2005"; - string name = "vs2005"; - - VSVersion version = VSVersion.VS80; - - Hashtable tools; - Kernel kernel; - - /// - /// Gets or sets the solution version. - /// - /// The solution version. - public override string SolutionVersion - { - get - { - return solutionVersion; - } - } - /// - /// Gets or sets the product version. - /// - /// The product version. - public override string ProductVersion - { - get - { - return productVersion; - } - } - /// - /// Gets or sets the schema version. - /// - /// The schema version. - public override string SchemaVersion - { - get - { - return schemaVersion; - } - } - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - public override string VersionName - { - get - { - return versionName; - } - } - /// - /// Gets or sets the version. - /// - /// The version. - public override VSVersion Version - { - get - { - return version; - } - } - /// - /// Gets the name. - /// - /// The name. - public override string Name - { - get - { - return name; - } - } - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public VS2005Target() - : base() - { - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: sontek $ + * $Date: 2008-05-07 13:59:35 -0700 (Wed, 07 May 2008) $ + * $Revision: 270 $ + */ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.IO; +using System.Text; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("vs2005")] + public class VS2005Target : VSGenericTarget + { + #region Inner Classes + + #endregion + + #region Fields + + string solutionVersion = "9.00"; + string productVersion = "8.0.50727"; + string schemaVersion = "2.0"; + string versionName = "Visual C# 2005"; + string name = "vs2005"; + + VSVersion version = VSVersion.VS80; + + Hashtable tools; + Kernel kernel; + + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public override string SolutionVersion + { + get + { + return solutionVersion; + } + } + /// + /// Gets or sets the product version. + /// + /// The product version. + public override string ProductVersion + { + get + { + return productVersion; + } + } + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public override string SchemaVersion + { + get + { + return schemaVersion; + } + } + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public override string VersionName + { + get + { + return versionName; + } + } + /// + /// Gets or sets the version. + /// + /// The version. + public override VSVersion Version + { + get + { + return version; + } + } + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get + { + return name; + } + } + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public VS2005Target() + : base() + { + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Targets/VSGenericTarget.cs b/Programs/Prebuild/src/Core/Targets/VSGenericTarget.cs index 0855d88c..a375f4a8 100644 --- a/Programs/Prebuild/src/Core/Targets/VSGenericTarget.cs +++ b/Programs/Prebuild/src/Core/Targets/VSGenericTarget.cs @@ -175,7 +175,9 @@ namespace Prebuild.Core.Targets private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) { - if (solution.ProjectsTable.ContainsKey(name)) + name = name.Replace(".exe", String.Empty); + + if (solution.ProjectsTable.ContainsKey(name.Replace(".exe", String.Empty))) return (ProjectNode)solution.ProjectsTable[name]; foreach (SolutionNode child in solution.Solutions) @@ -270,6 +272,7 @@ namespace Prebuild.Core.Targets ps.WriteLine(" {0}", conf.Options["RemoveIntegerChecks"]); ps.WriteLine(" {0}", conf.Options["WarningsAsErrors"]); ps.WriteLine(" {0}", conf.Options["WarningLevel"]); + ps.WriteLine(" {0}", conf.Options["NoStdLib"]); ps.WriteLine(" {0}", conf.Options["SuppressWarnings"]); ps.WriteLine(" "); } @@ -283,10 +286,15 @@ namespace Prebuild.Core.Targets { ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); - if (projectNode == null) - otherReferences.Add(refr); - else - projectReferences.Add(projectNode); + if (projectNode == null) + { + otherReferences.Add(refr); + } + else + { + refr.Name = refr.Name.Replace(".exe", String.Empty); + projectReferences.Add(projectNode); + } } // Assembly References ps.WriteLine(" "); @@ -301,7 +309,8 @@ namespace Prebuild.Core.Targets ps.WriteLine(""); // TODO: Allow reference to *.exe files - ps.WriteLine(" {0}", Helper.MakePathRelativeTo(project.FullPath, refr.Path + "\\" + refr.Name + ".dll")); + if (!String.IsNullOrEmpty(refr.Path)) + ps.WriteLine(" {0}", Helper.MakePathRelativeTo(project.FullPath, refr.Path + "\\" + refr.Name + ".dll")); ps.WriteLine(" "); } ps.WriteLine(" "); @@ -365,39 +374,30 @@ namespace Prebuild.Core.Targets { ps.WriteLine(" ", file); ps.WriteLine(" " + subType + ""); + ps.WriteLine(" ResXFileCodeGenerator"); string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; string dependent_name = file.Substring(0, file.LastIndexOf('.')) + ".cs"; - ps.WriteLine(" {0}", Path.GetFileName(autogen_name)); + ps.WriteLine(" {0}", autogen_name); // Check for a parent .cs file with the same name as this designer file if (File.Exists(dependent_name)) - { ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); - } - else - { - ps.WriteLine(" ResXFileCodeGenerator"); - } ps.WriteLine(" "); if (File.Exists(autogen_name)) { ps.WriteLine(" ", autogen_name); - + ps.WriteLine(" True"); + ps.WriteLine(" True"); + // If a parent .cs file exists, link this autogen file to it. Otherwise link // to the designer file if (File.Exists(dependent_name)) - { ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); - } else - { - ps.WriteLine(" True"); - //ps.WriteLine(" True"); ps.WriteLine(" {0}", Path.GetFileName(file)); - } ps.WriteLine(" "); } @@ -477,11 +477,7 @@ namespace Prebuild.Core.Targets { if (project.Files.GetBuildAction(file) != BuildAction.EmbeddedResource) { - // HACK: Ugly method of supporting WinForms - if (file.Contains("frm")) - ps.WriteLine(" Form"); - else - ps.WriteLine(" {0}", subType); + ps.WriteLine(" {0}", subType); } } @@ -718,7 +714,8 @@ namespace Prebuild.Core.Targets private void WriteProject(SolutionNode solution, StreamWriter ss, DatabaseProjectNode dbProject) { - WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); + if (solution.Files != null && solution.Files.Count > 0) + WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); } const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; diff --git a/Programs/Prebuild/src/Core/Targets/XcodeTarget.cs b/Programs/Prebuild/src/Core/Targets/XcodeTarget.cs index ee3b241c..513c4bd3 100644 --- a/Programs/Prebuild/src/Core/Targets/XcodeTarget.cs +++ b/Programs/Prebuild/src/Core/Targets/XcodeTarget.cs @@ -1,605 +1,605 @@ -#region BSD License -/* -Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2007-02-13 12:58:03 -0800 (Tue, 13 Feb 2007) $ - * $Revision: 205 $ - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Reflection; -using System.Text.RegularExpressions; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - /// - /// - /// - [Target("xcode")] - public class XcodeTarget : ITarget - { - #region Fields - - private Kernel m_Kernel; - - #endregion - - #region Private Methods - - private static string PrependPath(string path) - { - string tmpPath = Helper.NormalizePath(path, '/'); - Regex regex = new Regex(@"(\w):/(\w+)"); - Match match = regex.Match(tmpPath); - //if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') - //{ - tmpPath = Helper.NormalizePath(tmpPath); - //} - // else - // { - // tmpPath = Helper.NormalizePath("./" + tmpPath); - // } - - return tmpPath; - } - - private static string BuildReference(SolutionNode solution, ReferenceNode refr) - { - string ret = ""; - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; - string fileRef = FindFileReference(refr.Name, project); - string finalPath = Helper.NormalizePath(Helper.MakeFilePath(project.FullPath + "/${build.dir}/", refr.Name, "dll"), '/'); - ret += finalPath; - return ret; - } - else - { - ProjectNode project = (ProjectNode)refr.Parent; - string fileRef = FindFileReference(refr.Name, project); - - if (refr.Path != null || fileRef != null) - { - string finalPath = (refr.Path != null) ? Helper.NormalizePath(refr.Path + "/" + refr.Name + ".dll", '/') : fileRef; - ret += finalPath; - return ret; - } - - try - { - //Assembly assem = Assembly.Load(refr.Name); - //if (assem != null) - //{ - //ret += (refr.Name + ".dll"); - //} - //else - //{ - ret += (refr.Name + ".dll"); - //} - } - catch (System.NullReferenceException e) - { - e.ToString(); - ret += refr.Name + ".dll"; - } - } - return ret; - } - - private static string BuildReferencePath(SolutionNode solution, ReferenceNode refr) - { - string ret = ""; - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; - string fileRef = FindFileReference(refr.Name, project); - string finalPath = Helper.NormalizePath(Helper.MakeReferencePath(project.FullPath + "/${build.dir}/"), '/'); - ret += finalPath; - return ret; - } - else - { - ProjectNode project = (ProjectNode)refr.Parent; - string fileRef = FindFileReference(refr.Name, project); - - if (refr.Path != null || fileRef != null) - { - string finalPath = (refr.Path != null) ? Helper.NormalizePath(refr.Path, '/') : fileRef; - ret += finalPath; - return ret; - } - - try - { - Assembly assem = Assembly.Load(refr.Name); - if (assem != null) - { - ret += ""; - } - else - { - ret += ""; - } - } - catch (System.NullReferenceException e) - { - e.ToString(); - ret += ""; - } - } - return ret; - } - - private static string FindFileReference(string refName, ProjectNode project) - { - foreach (ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); - - if (File.Exists(fullPath)) - { - return fullPath; - } - } - - return null; - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if (conf == null) - { - throw new ArgumentNullException("conf"); - } - if (project == null) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - // { - // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; - // } - return docFile; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - string projFile = Helper.MakeFilePath(project.FullPath, project.Name + (project.Type == ProjectType.Library ? ".dll" : ".exe"), "build"); - StreamWriter ss = new StreamWriter(projFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); - bool hasDoc = false; - - using (ss) - { - ss.WriteLine(""); - ss.WriteLine("", project.Name); - ss.WriteLine(" ", "build"); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ReferenceNode refr in project.References) - { - if (refr.LocalCopy) - { - ss.WriteLine(" ", '/')); - } - } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.Write(" "); - ss.WriteLine(" ", project.RootNamespace); - foreach (string file in project.Files) - { - switch (project.Files.GetBuildAction(file)) - { - case BuildAction.EmbeddedResource: - ss.WriteLine(" {0}", ""); - break; - default: - if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) - { - ss.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - } - break; - } - } - //if (project.Files.GetSubType(file).ToString() != "Code") - //{ - // ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (string file in project.Files) - { - switch (project.Files.GetBuildAction(file)) - { - case BuildAction.Compile: - ss.WriteLine(" "); - break; - default: - break; - } - } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ReferenceNode refr in project.References) - { - ss.WriteLine(" ", '/')); - } - ss.WriteLine(" "); - - ss.WriteLine(" "); - ss.WriteLine(" "); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - - ss.WriteLine(" "); - if (hasDoc) - { - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.Write(" "); - } - else - { - ss.WriteLine(".exe\" />"); - } - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - // foreach(ReferenceNode refr in project.References) - // { - // string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReferencePath(solution, refr)), '/'); - // if (path != "") - // { - // ss.WriteLine(" ", path); - // } - // } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - } - ss.WriteLine(" "); - ss.WriteLine(""); - } - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteCombine(SolutionNode solution) - { - m_Kernel.Log.Write("Creating Xcode build files"); - foreach (ProjectNode project in solution.Projects) - { - if (m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - } - - m_Kernel.Log.Write(""); - DirectoryInfo directoryInfo = new DirectoryInfo(Path.Combine(solution.FullPath, solution.Name + ".xcodeproj")); - if (!directoryInfo.Exists) - { - directoryInfo.Create(); - } - string combFile = Helper.MakeFilePath(Path.Combine(solution.FullPath, solution.Name + ".xcodeproj"), "project", "pbxproj"); - StreamWriter ss = new StreamWriter(combFile); - - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); - - using (ss) - { - ss.WriteLine(""); - ss.WriteLine("", solution.Name); - ss.WriteLine(" "); - ss.WriteLine(); - - //ss.WriteLine(" "); - //ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - - foreach (ConfigurationNode conf in solution.Configurations) - { - // Set the project.config to a non-debug configuration - if (conf.Options["DebugInformation"].ToString().ToLower() != "true") - { - ss.WriteLine(" ", conf.Name); - } - ss.WriteLine(); - ss.WriteLine(" ", conf.Name); - ss.WriteLine(" ", conf.Name); - ss.WriteLine(" ", conf.Options["DebugInformation"].ToString().ToLower()); - ss.WriteLine(" "); - ss.WriteLine(); - } - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - //ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - //foreach(ProjectNode project in solution.Projects) - //{ - // string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - // ss.Write(" "); - //} - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - - foreach (ProjectNode project in solution.ProjectsTableOrder) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.Write(" "); - } - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(); - ss.WriteLine(" "); - ss.WriteLine(); - //ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); - - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ProjectNode project in solution.Projects) - { - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.Write(" "); - } - ss.WriteLine(" "); - ss.WriteLine(); - ss.WriteLine(""); - } - - m_Kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name + (project.Type == ProjectType.Library ? ".dll" : ".exe"), "build"); - Helper.DeleteIfExists(projectFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning Xcode build files for", solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); - Helper.DeleteIfExists(slnFile); - - foreach (ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public void Write(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach (SolutionNode solution in kern.Solutions) - { - WriteCombine(solution); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach (SolutionNode sol in kern.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return "xcode"; - } - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2007-02-13 12:58:03 -0800 (Tue, 13 Feb 2007) $ + * $Revision: 205 $ + */ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.IO; +using System.Reflection; +using System.Text.RegularExpressions; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + [Target("xcode")] + public class XcodeTarget : ITarget + { + #region Fields + + private Kernel m_Kernel; + + #endregion + + #region Private Methods + + private static string PrependPath(string path) + { + string tmpPath = Helper.NormalizePath(path, '/'); + Regex regex = new Regex(@"(\w):/(\w+)"); + Match match = regex.Match(tmpPath); + //if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') + //{ + tmpPath = Helper.NormalizePath(tmpPath); + //} + // else + // { + // tmpPath = Helper.NormalizePath("./" + tmpPath); + // } + + return tmpPath; + } + + private static string BuildReference(SolutionNode solution, ReferenceNode refr) + { + string ret = ""; + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; + string fileRef = FindFileReference(refr.Name, project); + string finalPath = Helper.NormalizePath(Helper.MakeFilePath(project.FullPath + "/${build.dir}/", refr.Name, "dll"), '/'); + ret += finalPath; + return ret; + } + else + { + ProjectNode project = (ProjectNode)refr.Parent; + string fileRef = FindFileReference(refr.Name, project); + + if (refr.Path != null || fileRef != null) + { + string finalPath = (refr.Path != null) ? Helper.NormalizePath(refr.Path + "/" + refr.Name + ".dll", '/') : fileRef; + ret += finalPath; + return ret; + } + + try + { + //Assembly assem = Assembly.Load(refr.Name); + //if (assem != null) + //{ + //ret += (refr.Name + ".dll"); + //} + //else + //{ + ret += (refr.Name + ".dll"); + //} + } + catch (System.NullReferenceException e) + { + e.ToString(); + ret += refr.Name + ".dll"; + } + } + return ret; + } + + private static string BuildReferencePath(SolutionNode solution, ReferenceNode refr) + { + string ret = ""; + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; + string fileRef = FindFileReference(refr.Name, project); + string finalPath = Helper.NormalizePath(Helper.MakeReferencePath(project.FullPath + "/${build.dir}/"), '/'); + ret += finalPath; + return ret; + } + else + { + ProjectNode project = (ProjectNode)refr.Parent; + string fileRef = FindFileReference(refr.Name, project); + + if (refr.Path != null || fileRef != null) + { + string finalPath = (refr.Path != null) ? Helper.NormalizePath(refr.Path, '/') : fileRef; + ret += finalPath; + return ret; + } + + try + { + Assembly assem = Assembly.Load(refr.Name); + if (assem != null) + { + ret += ""; + } + else + { + ret += ""; + } + } + catch (System.NullReferenceException e) + { + e.ToString(); + ret += ""; + } + } + return ret; + } + + private static string FindFileReference(string refName, ProjectNode project) + { + foreach (ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); + + if (File.Exists(fullPath)) + { + return fullPath; + } + } + + return null; + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if (conf == null) + { + throw new ArgumentNullException("conf"); + } + if (project == null) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + // { + // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; + // } + return docFile; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + string projFile = Helper.MakeFilePath(project.FullPath, project.Name + (project.Type == ProjectType.Library ? ".dll" : ".exe"), "build"); + StreamWriter ss = new StreamWriter(projFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); + bool hasDoc = false; + + using (ss) + { + ss.WriteLine(""); + ss.WriteLine("", project.Name); + ss.WriteLine(" ", "build"); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (ReferenceNode refr in project.References) + { + if (refr.LocalCopy) + { + ss.WriteLine(" ", '/')); + } + } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.Write(" "); + ss.WriteLine(" ", project.RootNamespace); + foreach (string file in project.Files) + { + switch (project.Files.GetBuildAction(file)) + { + case BuildAction.EmbeddedResource: + ss.WriteLine(" {0}", ""); + break; + default: + if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) + { + ss.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + } + break; + } + } + //if (project.Files.GetSubType(file).ToString() != "Code") + //{ + // ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (string file in project.Files) + { + switch (project.Files.GetBuildAction(file)) + { + case BuildAction.Compile: + ss.WriteLine(" "); + break; + default: + break; + } + } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (ReferenceNode refr in project.References) + { + ss.WriteLine(" ", '/')); + } + ss.WriteLine(" "); + + ss.WriteLine(" "); + ss.WriteLine(" "); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + + ss.WriteLine(" "); + if (hasDoc) + { + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.Write(" "); + } + else + { + ss.WriteLine(".exe\" />"); + } + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + // foreach(ReferenceNode refr in project.References) + // { + // string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReferencePath(solution, refr)), '/'); + // if (path != "") + // { + // ss.WriteLine(" ", path); + // } + // } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + } + ss.WriteLine(" "); + ss.WriteLine(""); + } + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteCombine(SolutionNode solution) + { + m_Kernel.Log.Write("Creating Xcode build files"); + foreach (ProjectNode project in solution.Projects) + { + if (m_Kernel.AllowProject(project.FilterGroups)) + { + m_Kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + } + + m_Kernel.Log.Write(""); + DirectoryInfo directoryInfo = new DirectoryInfo(Path.Combine(solution.FullPath, solution.Name + ".xcodeproj")); + if (!directoryInfo.Exists) + { + directoryInfo.Create(); + } + string combFile = Helper.MakeFilePath(Path.Combine(solution.FullPath, solution.Name + ".xcodeproj"), "project", "pbxproj"); + StreamWriter ss = new StreamWriter(combFile); + + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); + + using (ss) + { + ss.WriteLine(""); + ss.WriteLine("", solution.Name); + ss.WriteLine(" "); + ss.WriteLine(); + + //ss.WriteLine(" "); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + + foreach (ConfigurationNode conf in solution.Configurations) + { + // Set the project.config to a non-debug configuration + if (conf.Options["DebugInformation"].ToString().ToLower() != "true") + { + ss.WriteLine(" ", conf.Name); + } + ss.WriteLine(); + ss.WriteLine(" ", conf.Name); + ss.WriteLine(" ", conf.Name); + ss.WriteLine(" ", conf.Options["DebugInformation"].ToString().ToLower()); + ss.WriteLine(" "); + ss.WriteLine(); + } + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + //foreach(ProjectNode project in solution.Projects) + //{ + // string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + // ss.Write(" "); + //} + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + + foreach (ProjectNode project in solution.ProjectsTableOrder) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.Write(" "); + } + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(); + ss.WriteLine(" "); + ss.WriteLine(); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (ProjectNode project in solution.Projects) + { + string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); + ss.Write(" "); + } + ss.WriteLine(" "); + ss.WriteLine(); + ss.WriteLine(""); + } + + m_Kernel.CurrentWorkingDirectory.Pop(); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name + (project.Type == ProjectType.Library ? ".dll" : ".exe"), "build"); + Helper.DeleteIfExists(projectFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning Xcode build files for", solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); + Helper.DeleteIfExists(slnFile); + + foreach (ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public void Write(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach (SolutionNode solution in kern.Solutions) + { + WriteCombine(solution); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach (SolutionNode sol in kern.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return "xcode"; + } + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/UnknownLanguageException.cs b/Programs/Prebuild/src/Core/UnknownLanguageException.cs index 607b66c0..cbd1dc1b 100644 --- a/Programs/Prebuild/src/Core/UnknownLanguageException.cs +++ b/Programs/Prebuild/src/Core/UnknownLanguageException.cs @@ -1,63 +1,63 @@ -/* - * $RCSfile$ - * Copyright (C) 2004, 2005 David Hudson (jendave@yahoo.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -using System; -using System.Runtime.Serialization; - -namespace Prebuild.Core -{ - /// - /// - [Serializable()] - public class UnknownLanguageException : Exception - { - /// - /// Basic exception. - /// - public UnknownLanguageException() - { - } - - /// - /// Exception with specified string - /// - /// Exception message - public UnknownLanguageException(string message): base(message) - { - } - - /// - /// - /// - /// - /// - public UnknownLanguageException(string message, Exception exception) : base(message, exception) - { - } - - /// - /// - /// - /// - /// - protected UnknownLanguageException(SerializationInfo info, StreamingContext context) : base( info, context ) - { - } - } -} +/* + * $RCSfile$ + * Copyright (C) 2004, 2005 David Hudson (jendave@yahoo.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +using System; +using System.Runtime.Serialization; + +namespace Prebuild.Core +{ + /// + /// + [Serializable()] + public class UnknownLanguageException : Exception + { + /// + /// Basic exception. + /// + public UnknownLanguageException() + { + } + + /// + /// Exception with specified string + /// + /// Exception message + public UnknownLanguageException(string message): base(message) + { + } + + /// + /// + /// + /// + /// + public UnknownLanguageException(string message, Exception exception) : base(message, exception) + { + } + + /// + /// + /// + /// + /// + protected UnknownLanguageException(SerializationInfo info, StreamingContext context) : base( info, context ) + { + } + } +} diff --git a/Programs/Prebuild/src/Core/Utilities/CommandLineCollection.cs b/Programs/Prebuild/src/Core/Utilities/CommandLineCollection.cs index 0be20ad1..67ae6b0d 100644 --- a/Programs/Prebuild/src/Core/Utilities/CommandLineCollection.cs +++ b/Programs/Prebuild/src/Core/Utilities/CommandLineCollection.cs @@ -1,162 +1,162 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: robloach $ - * $Date: 2006-09-25 22:30:53 +0000 (Mon, 25 Sep 2006) $ - * $Revision: 165 $ - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Diagnostics; - -namespace Prebuild.Core.Utilities -{ - /// - /// The CommandLine class parses and interprets the command-line arguments passed to - /// prebuild. - /// - public class CommandLineCollection - { - #region Fields - - // The raw OS arguments - private string[] m_RawArgs; - - // Command-line argument storage - private Hashtable m_Arguments; - - #endregion - - #region Constructors - - /// - /// Create a new CommandLine instance and set some internal variables. - /// - public CommandLineCollection(string[] args) - { - m_RawArgs = args; - m_Arguments = new Hashtable(); - - Parse(); - } - - #endregion - - #region Private Methods - - private void Parse() - { - if(m_RawArgs.Length < 1) - return; - - int idx = 0; - string arg = null, lastArg = null; - - while(idx 2 && arg[0] == '/') - { - arg = arg.Substring(1); - lastArg = arg; - m_Arguments[arg] = ""; - } - else - { - if(lastArg != null) - { - m_Arguments[lastArg] = arg; - lastArg = null; - } - } - - idx++; - } - } - - #endregion - - #region Public Methods - - /// - /// Wases the passed. - /// - /// The arg. - /// - public bool WasPassed(string arg) - { - return (m_Arguments.ContainsKey(arg)); - } - - #endregion - - #region Properties - - /// - /// Gets the parameter associated with the command line option - /// - /// Returns null if option was not specified, - /// null string if no parameter was specified, and the value if a parameter was specified - public string this[string index] - { - get - { - if(m_Arguments.ContainsKey(index)) - { - return (string)(m_Arguments[index]); - } - else - { - return null; - } - } - } - - #endregion - - #region IEnumerable Members - - /// - /// Returns an enumerator that can iterate through a collection. - /// - /// - /// An - /// that can be used to iterate through the collection. - /// - public IDictionaryEnumerator GetEnumerator() - { - return m_Arguments.GetEnumerator(); - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: robloach $ + * $Date: 2006-09-25 15:30:53 -0700 (Mon, 25 Sep 2006) $ + * $Revision: 165 $ + */ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.Diagnostics; + +namespace Prebuild.Core.Utilities +{ + /// + /// The CommandLine class parses and interprets the command-line arguments passed to + /// prebuild. + /// + public class CommandLineCollection + { + #region Fields + + // The raw OS arguments + private string[] m_RawArgs; + + // Command-line argument storage + private Hashtable m_Arguments; + + #endregion + + #region Constructors + + /// + /// Create a new CommandLine instance and set some internal variables. + /// + public CommandLineCollection(string[] args) + { + m_RawArgs = args; + m_Arguments = new Hashtable(); + + Parse(); + } + + #endregion + + #region Private Methods + + private void Parse() + { + if(m_RawArgs.Length < 1) + return; + + int idx = 0; + string arg = null, lastArg = null; + + while(idx 2 && arg[0] == '/') + { + arg = arg.Substring(1); + lastArg = arg; + m_Arguments[arg] = ""; + } + else + { + if(lastArg != null) + { + m_Arguments[lastArg] = arg; + lastArg = null; + } + } + + idx++; + } + } + + #endregion + + #region Public Methods + + /// + /// Wases the passed. + /// + /// The arg. + /// + public bool WasPassed(string arg) + { + return (m_Arguments.ContainsKey(arg)); + } + + #endregion + + #region Properties + + /// + /// Gets the parameter associated with the command line option + /// + /// Returns null if option was not specified, + /// null string if no parameter was specified, and the value if a parameter was specified + public string this[string index] + { + get + { + if(m_Arguments.ContainsKey(index)) + { + return (string)(m_Arguments[index]); + } + else + { + return null; + } + } + } + + #endregion + + #region IEnumerable Members + + /// + /// Returns an enumerator that can iterate through a collection. + /// + /// + /// An + /// that can be used to iterate through the collection. + /// + public IDictionaryEnumerator GetEnumerator() + { + return m_Arguments.GetEnumerator(); + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Utilities/CurrentDirectory.cs b/Programs/Prebuild/src/Core/Utilities/CurrentDirectory.cs index 67676677..f8af4ff7 100644 --- a/Programs/Prebuild/src/Core/Utilities/CurrentDirectory.cs +++ b/Programs/Prebuild/src/Core/Utilities/CurrentDirectory.cs @@ -1,89 +1,89 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 00:49:58 +0000 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - -using System; -using System.Collections; - -namespace Prebuild.Core.Utilities -{ - /// - /// - /// - public class CurrentDirectory - { - #region Fields - - private Stack m_Stack; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public CurrentDirectory() - { - m_Stack = new Stack(); - } - - #endregion - - #region Public Methods - - /// - /// Pushes this instance. - /// - public void Push() - { - m_Stack.Push(Environment.CurrentDirectory); - } - - /// - /// Pops this instance. - /// - public void Pop() - { - if(m_Stack.Count < 1) - { - return; - } - - string cwd = (string)m_Stack.Pop(); - Helper.SetCurrentDir(cwd); - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2006-01-27 16:49:58 -0800 (Fri, 27 Jan 2006) $ + * $Revision: 71 $ + */ +#endregion + +using System; +using System.Collections; + +namespace Prebuild.Core.Utilities +{ + /// + /// + /// + public class CurrentDirectory + { + #region Fields + + private Stack m_Stack; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public CurrentDirectory() + { + m_Stack = new Stack(); + } + + #endregion + + #region Public Methods + + /// + /// Pushes this instance. + /// + public void Push() + { + m_Stack.Push(Environment.CurrentDirectory); + } + + /// + /// Pops this instance. + /// + public void Pop() + { + if(m_Stack.Count < 1) + { + return; + } + + string cwd = (string)m_Stack.Pop(); + Helper.SetCurrentDir(cwd); + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Utilities/Helper.cs b/Programs/Prebuild/src/Core/Utilities/Helper.cs index 07998d0b..cd778ddc 100644 --- a/Programs/Prebuild/src/Core/Utilities/Helper.cs +++ b/Programs/Prebuild/src/Core/Utilities/Helper.cs @@ -1,663 +1,663 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: sontek $ - * $Date: 2008-04-29 22:51:17 +0000 (Tue, 29 Apr 2008) $ - * $Revision: 264 $ - */ -#endregion - -using System; -using System.Collections; -using System.Diagnostics; -using System.IO; -using System.Runtime.InteropServices; -using System.Text.RegularExpressions; -using System.Collections.Specialized; -using System.Xml; -using Prebuild.Core.Nodes; - -namespace Prebuild.Core.Utilities -{ - /// - /// - /// - public class Helper - { - #region Fields - - private static Stack dirStack; - private static Regex varRegex; - static bool checkForOSVariables; - - /// - /// - /// - public static bool CheckForOSVariables - { - get - { - return checkForOSVariables; - } - set - { - checkForOSVariables = value; - } - } - - #endregion - - #region Constructors - - /// - /// Initializes the class. - /// - static Helper() - { - dirStack = new Stack(); - //m_VarRegex = new Regex(@"\${(?[\w|_]+)}"); - } - - #endregion - - #region Properties - - /// - /// - /// - public static Stack DirStack - { - get - { - return dirStack; - } - } - - /// - /// - /// - public static Regex VarRegex - { - get - { - return varRegex; - } - set - { - varRegex = value; - } - } - - #endregion - - #region Public Methods - - #region String Parsing - #region Inner Classes and Delegates - /// - /// - /// - public delegate string StringLookup(string key); - - #endregion - - /// - /// Gets a collection of StringLocationPair objects that represent the matches - /// - /// The target. - /// The before group. - /// The after group. - /// if set to true [include delimiters in substrings]. - /// - public static StringCollection FindGroups(string target, string beforeGroup, string afterGroup, bool includeDelimitersInSubstrings) - { - if( beforeGroup == null ) - { - throw new ArgumentNullException("beforeGroup"); - } - if( afterGroup == null ) - { - throw new ArgumentNullException("afterGroup"); - } - StringCollection results = new StringCollection(); - if(target == null || target.Length == 0) - { - return results; - } - - int beforeMod = 0; - int afterMod = 0; - if(includeDelimitersInSubstrings) - { - //be sure to not exlude the delims - beforeMod = beforeGroup.Length; - afterMod = afterGroup.Length; - } - int startIndex = 0; - while((startIndex = target.IndexOf(beforeGroup,startIndex)) != -1) { - int endIndex = target.IndexOf(afterGroup,startIndex);//the index of the char after it - if(endIndex == -1) - { - break; - } - int length = endIndex - startIndex - beforeGroup.Length;//move to the first char in the string - string substring = substring = target.Substring(startIndex + beforeGroup.Length - beforeMod, - length - afterMod); - - results.Add(substring); - //results.Add(new StringLocationPair(substring,startIndex)); - startIndex = endIndex + 1; - //the Interpolate*() methods will not work if expressions are expandded inside expression due to an optimization - //so start after endIndex - - } - return results; - } - - /// - /// Replaces the groups. - /// - /// The target. - /// The before group. - /// The after group. - /// The lookup. - /// - public static string ReplaceGroups(string target, string beforeGroup, string afterGroup, StringLookup lookup) { - if( target == null ) - { - throw new ArgumentNullException("target"); - } - //int targetLength = target.Length; - StringCollection strings = FindGroups(target,beforeGroup,afterGroup,false); - if( lookup == null ) - { - throw new ArgumentNullException("lookup"); - } - foreach(string substring in strings) - { - target = target.Replace(beforeGroup + substring + afterGroup, lookup(substring) ); - } - return target; - } - - /// - /// Replaces ${var} statements in a string with the corresonding values as detirmined by the lookup delegate - /// - /// The target. - /// The lookup. - /// - public static string InterpolateForVariables(string target, StringLookup lookup) - { - return ReplaceGroups(target, "${" , "}" , lookup); - } - - /// - /// Replaces ${var} statements in a string with the corresonding environment variable with name var - /// - /// - /// - public static string InterpolateForEnvironmentVariables(string target) - { - return InterpolateForVariables(target, new StringLookup(Environment.GetEnvironmentVariable)); - } - - #endregion - - /// - /// Translates the value. - /// - /// Type of the translate. - /// The translation item. - /// - public static object TranslateValue(Type translateType, string translationItem) - { - if(translationItem == null) - { - return null; - } - - try - { - string lowerVal = translationItem.ToLower(); - if(translateType == typeof(bool)) - { - return (lowerVal == "true" || lowerVal == "1" || lowerVal == "y" || lowerVal == "yes" || lowerVal == "on"); - } - else if(translateType == typeof(int)) - { - return (Int32.Parse(translationItem)); - } - else - { - return translationItem; - } - } - catch(FormatException) - { - return null; - } - } - - /// - /// Deletes if exists. - /// - /// The file. - /// - public static bool DeleteIfExists(string file) - { - string resFile = null; - try - { - resFile = ResolvePath(file); - } - catch(ArgumentException) - { - return false; - } - - if(!File.Exists(resFile)) - { - return false; - } - - File.Delete(resFile); - return true; - } - - static readonly char seperator = Path.DirectorySeparatorChar; - - // This little gem was taken from the NeL source, thanks guys! - /// - /// Makes a relative path - /// - /// Path to start from - /// Path to end at - /// Path that will get from startPath to endPath - public static string MakePathRelativeTo(string startPath, string endPath) - { - string tmp = NormalizePath(startPath, seperator); - string src = NormalizePath(endPath, seperator); - string prefix = ""; - - while(true) - { - if((String.Compare(tmp, 0, src, 0, tmp.Length) == 0)) - { - string ret; - int size = tmp.Length; - if(size == src.Length) - { - return "./"; - } - if((src.Length > tmp.Length) && src[tmp.Length - 1] != seperator) - { - } - else - { - ret = prefix + endPath.Substring(size, endPath.Length - size); - ret = ret.Trim(); - if(ret[0] == seperator) - { - ret = "." + ret; - } - - return NormalizePath(ret); - } - - } - - if(tmp.Length < 2) - { - break; - } - - int lastPos = tmp.LastIndexOf(seperator, tmp.Length - 2); - int prevPos = tmp.IndexOf(seperator); - - if((lastPos == prevPos) || (lastPos == -1)) - { - break; - } - - tmp = tmp.Substring(0, lastPos + 1); - prefix += ".." + seperator.ToString(); - } - - return endPath; - } - - /// - /// Resolves the path. - /// - /// The path. - /// - public static string ResolvePath(string path) - { - string tmpPath = NormalizePath(path); - if(tmpPath.Length < 1) - { - tmpPath = "."; - } - - tmpPath = Path.GetFullPath(tmpPath); - if(!File.Exists(tmpPath) && !Directory.Exists(tmpPath)) - { - throw new ArgumentException("Path could not be resolved: " + tmpPath); - } - - return tmpPath; - } - - /// - /// Normalizes the path. - /// - /// The path. - /// The separator character. - /// - public static string NormalizePath(string path, char separatorCharacter) - { - if(path == null || path == "" || path.Length < 1) - { - return ""; - } - - string tmpPath = path.Replace('\\', '/'); - tmpPath = tmpPath.Replace('/', separatorCharacter); - return tmpPath; - } - - /// - /// Normalizes the path. - /// - /// The path. - /// - public static string NormalizePath(string path) - { - return NormalizePath(path, Path.DirectorySeparatorChar); - } - - /// - /// Ends the path. - /// - /// The path. - /// The separator character. - /// - public static string EndPath(string path, char separatorCharacter) - { - if(path == null || path == "" || path.Length < 1) - { - return ""; - } - - if(!path.EndsWith(separatorCharacter.ToString())) - { - return (path + separatorCharacter); - } - - return path; - } - - /// - /// Ends the path. - /// - /// The path. - /// - public static string EndPath(string path) - { - return EndPath(path, Path.DirectorySeparatorChar); - } - - /// - /// Makes the file path. - /// - /// The path. - /// The name. - /// The ext. - /// - public static string MakeFilePath(string path, string name, string ext) - { - string ret = EndPath(NormalizePath(path)); - - if( name == null ) - { - throw new ArgumentNullException("name"); - } - - ret += name; - if(!name.EndsWith("." + ext)) - { - ret += "." + ext; - } - - foreach(char c in Path.GetInvalidPathChars()) - { - ret = ret.Replace(c, '_'); - } - - return ret; - } - - /// - /// Makes the file path. - /// - /// The path. - /// The name. - /// - public static string MakeFilePath(string path, string name) - { - string ret = EndPath(NormalizePath(path)); - - if( name == null ) - { - throw new ArgumentNullException("name"); - } - - ret += name; - - foreach (char c in Path.GetInvalidPathChars()) - { - ret = ret.Replace(c, '_'); - } - - return ret; - } - - /// - /// - /// - /// - /// - public static string MakeReferencePath(string path) - { - string ret = EndPath(NormalizePath(path)); - - foreach (char c in Path.GetInvalidPathChars()) - { - ret = ret.Replace(c, '_'); - } - - return ret; - } - - /// - /// Sets the current dir. - /// - /// The path. - public static void SetCurrentDir(string path) - { - if( path == null ) - { - throw new ArgumentNullException("path"); - } - if(path.Length < 1) - { - return; - } - - Environment.CurrentDirectory = path; - } - - /// - /// Checks the type. - /// - /// The type to check. - /// The attr. - /// The inter. - /// - public static object CheckType(Type typeToCheck, Type attr, Type inter) - { - if(typeToCheck == null || attr == null) - { - return null; - } - - object[] attrs = typeToCheck.GetCustomAttributes(attr, false); - if(attrs == null || attrs.Length < 1) - { - return null; - } - if( inter == null ) - { - throw new ArgumentNullException("inter"); - } - - if(typeToCheck.GetInterface(inter.FullName) == null) - { - return null; - } - - return attrs[0]; - } - - /* A bit of overhead for simple group parsing, there are problems with Regex in Mono - public static string ParseValue(string val) - { - if(val == null || val.Length < 1 || !CheckForOSVariables) - return val; - - string tmp = val; - Match m = m_VarRegex.Match(val); - while(m.Success) - { - if(m.Groups["var"] == null) - continue; - - Capture c = m.Groups["var"].Captures[0]; - if(c == null) - continue; - - string var = c.Value; - string envVal = Environment.GetEnvironmentVariable(var); - if(envVal == null) - envVal = ""; - - tmp = tmp.Replace("${" + var + "}", envVal); - m = m.NextMatch(); - } - - return tmp; - }*/ - - /// - /// Attributes the value. - /// - /// The node. - /// The attr. - /// The def. - /// - public static string AttributeValue(XmlNode node, string attr, string def) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - if(node.Attributes[attr] == null) - { - return def; - } - string val = node.Attributes[attr].Value; - if(!CheckForOSVariables) - { - return val; - } - - return InterpolateForEnvironmentVariables(val); - } - - /// - /// Parses the boolean. - /// - /// The node. - /// The attr. - /// if set to true [default value]. - /// - public static bool ParseBoolean(XmlNode node, string attr, bool defaultValue) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - if(node.Attributes[attr] == null) - { - return defaultValue; - } - return bool.Parse(node.Attributes[attr].Value); - } - - /// - /// Enums the attribute value. - /// - /// The node. - /// The attr. - /// Type of the enum. - /// The def. - /// - public static object EnumAttributeValue(XmlNode node, string attr, Type enumType, object def) - { - if( def == null ) - { - throw new ArgumentNullException("def"); - } - string val = AttributeValue(node, attr, def.ToString()); - return Enum.Parse(enumType, val, true); - } - - /// - /// - /// - /// - /// - /// - public static string AssemblyFullName(string assemblyName, ProjectType projectType) - { - return assemblyName + (projectType == ProjectType.Library ? ".dll" : ".exe"); - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: sontek $ + * $Date: 2008-04-29 15:51:17 -0700 (Tue, 29 Apr 2008) $ + * $Revision: 264 $ + */ +#endregion + +using System; +using System.Collections; +using System.Diagnostics; +using System.IO; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using System.Collections.Specialized; +using System.Xml; +using Prebuild.Core.Nodes; + +namespace Prebuild.Core.Utilities +{ + /// + /// + /// + public class Helper + { + #region Fields + + private static Stack dirStack; + private static Regex varRegex; + static bool checkForOSVariables; + + /// + /// + /// + public static bool CheckForOSVariables + { + get + { + return checkForOSVariables; + } + set + { + checkForOSVariables = value; + } + } + + #endregion + + #region Constructors + + /// + /// Initializes the class. + /// + static Helper() + { + dirStack = new Stack(); + //m_VarRegex = new Regex(@"\${(?[\w|_]+)}"); + } + + #endregion + + #region Properties + + /// + /// + /// + public static Stack DirStack + { + get + { + return dirStack; + } + } + + /// + /// + /// + public static Regex VarRegex + { + get + { + return varRegex; + } + set + { + varRegex = value; + } + } + + #endregion + + #region Public Methods + + #region String Parsing + #region Inner Classes and Delegates + /// + /// + /// + public delegate string StringLookup(string key); + + #endregion + + /// + /// Gets a collection of StringLocationPair objects that represent the matches + /// + /// The target. + /// The before group. + /// The after group. + /// if set to true [include delimiters in substrings]. + /// + public static StringCollection FindGroups(string target, string beforeGroup, string afterGroup, bool includeDelimitersInSubstrings) + { + if( beforeGroup == null ) + { + throw new ArgumentNullException("beforeGroup"); + } + if( afterGroup == null ) + { + throw new ArgumentNullException("afterGroup"); + } + StringCollection results = new StringCollection(); + if(target == null || target.Length == 0) + { + return results; + } + + int beforeMod = 0; + int afterMod = 0; + if(includeDelimitersInSubstrings) + { + //be sure to not exlude the delims + beforeMod = beforeGroup.Length; + afterMod = afterGroup.Length; + } + int startIndex = 0; + while((startIndex = target.IndexOf(beforeGroup,startIndex)) != -1) { + int endIndex = target.IndexOf(afterGroup,startIndex);//the index of the char after it + if(endIndex == -1) + { + break; + } + int length = endIndex - startIndex - beforeGroup.Length;//move to the first char in the string + string substring = substring = target.Substring(startIndex + beforeGroup.Length - beforeMod, + length - afterMod); + + results.Add(substring); + //results.Add(new StringLocationPair(substring,startIndex)); + startIndex = endIndex + 1; + //the Interpolate*() methods will not work if expressions are expandded inside expression due to an optimization + //so start after endIndex + + } + return results; + } + + /// + /// Replaces the groups. + /// + /// The target. + /// The before group. + /// The after group. + /// The lookup. + /// + public static string ReplaceGroups(string target, string beforeGroup, string afterGroup, StringLookup lookup) { + if( target == null ) + { + throw new ArgumentNullException("target"); + } + //int targetLength = target.Length; + StringCollection strings = FindGroups(target,beforeGroup,afterGroup,false); + if( lookup == null ) + { + throw new ArgumentNullException("lookup"); + } + foreach(string substring in strings) + { + target = target.Replace(beforeGroup + substring + afterGroup, lookup(substring) ); + } + return target; + } + + /// + /// Replaces ${var} statements in a string with the corresonding values as detirmined by the lookup delegate + /// + /// The target. + /// The lookup. + /// + public static string InterpolateForVariables(string target, StringLookup lookup) + { + return ReplaceGroups(target, "${" , "}" , lookup); + } + + /// + /// Replaces ${var} statements in a string with the corresonding environment variable with name var + /// + /// + /// + public static string InterpolateForEnvironmentVariables(string target) + { + return InterpolateForVariables(target, new StringLookup(Environment.GetEnvironmentVariable)); + } + + #endregion + + /// + /// Translates the value. + /// + /// Type of the translate. + /// The translation item. + /// + public static object TranslateValue(Type translateType, string translationItem) + { + if(translationItem == null) + { + return null; + } + + try + { + string lowerVal = translationItem.ToLower(); + if(translateType == typeof(bool)) + { + return (lowerVal == "true" || lowerVal == "1" || lowerVal == "y" || lowerVal == "yes" || lowerVal == "on"); + } + else if(translateType == typeof(int)) + { + return (Int32.Parse(translationItem)); + } + else + { + return translationItem; + } + } + catch(FormatException) + { + return null; + } + } + + /// + /// Deletes if exists. + /// + /// The file. + /// + public static bool DeleteIfExists(string file) + { + string resFile = null; + try + { + resFile = ResolvePath(file); + } + catch(ArgumentException) + { + return false; + } + + if(!File.Exists(resFile)) + { + return false; + } + + File.Delete(resFile); + return true; + } + + static readonly char seperator = Path.DirectorySeparatorChar; + + // This little gem was taken from the NeL source, thanks guys! + /// + /// Makes a relative path + /// + /// Path to start from + /// Path to end at + /// Path that will get from startPath to endPath + public static string MakePathRelativeTo(string startPath, string endPath) + { + string tmp = NormalizePath(startPath, seperator); + string src = NormalizePath(endPath, seperator); + string prefix = ""; + + while(true) + { + if((String.Compare(tmp, 0, src, 0, tmp.Length) == 0)) + { + string ret; + int size = tmp.Length; + if(size == src.Length) + { + return "./"; + } + if((src.Length > tmp.Length) && src[tmp.Length - 1] != seperator) + { + } + else + { + ret = prefix + endPath.Substring(size, endPath.Length - size); + ret = ret.Trim(); + if(ret[0] == seperator) + { + ret = "." + ret; + } + + return NormalizePath(ret); + } + + } + + if(tmp.Length < 2) + { + break; + } + + int lastPos = tmp.LastIndexOf(seperator, tmp.Length - 2); + int prevPos = tmp.IndexOf(seperator); + + if((lastPos == prevPos) || (lastPos == -1)) + { + break; + } + + tmp = tmp.Substring(0, lastPos + 1); + prefix += ".." + seperator.ToString(); + } + + return endPath; + } + + /// + /// Resolves the path. + /// + /// The path. + /// + public static string ResolvePath(string path) + { + string tmpPath = NormalizePath(path); + if(tmpPath.Length < 1) + { + tmpPath = "."; + } + + tmpPath = Path.GetFullPath(tmpPath); + if(!File.Exists(tmpPath) && !Directory.Exists(tmpPath)) + { + throw new ArgumentException("Path could not be resolved: " + tmpPath); + } + + return tmpPath; + } + + /// + /// Normalizes the path. + /// + /// The path. + /// The separator character. + /// + public static string NormalizePath(string path, char separatorCharacter) + { + if(path == null || path == "" || path.Length < 1) + { + return ""; + } + + string tmpPath = path.Replace('\\', '/'); + tmpPath = tmpPath.Replace('/', separatorCharacter); + return tmpPath; + } + + /// + /// Normalizes the path. + /// + /// The path. + /// + public static string NormalizePath(string path) + { + return NormalizePath(path, Path.DirectorySeparatorChar); + } + + /// + /// Ends the path. + /// + /// The path. + /// The separator character. + /// + public static string EndPath(string path, char separatorCharacter) + { + if(path == null || path == "" || path.Length < 1) + { + return ""; + } + + if(!path.EndsWith(separatorCharacter.ToString())) + { + return (path + separatorCharacter); + } + + return path; + } + + /// + /// Ends the path. + /// + /// The path. + /// + public static string EndPath(string path) + { + return EndPath(path, Path.DirectorySeparatorChar); + } + + /// + /// Makes the file path. + /// + /// The path. + /// The name. + /// The ext. + /// + public static string MakeFilePath(string path, string name, string ext) + { + string ret = EndPath(NormalizePath(path)); + + if( name == null ) + { + throw new ArgumentNullException("name"); + } + + ret += name; + if(!name.EndsWith("." + ext)) + { + ret += "." + ext; + } + + foreach(char c in Path.GetInvalidPathChars()) + { + ret = ret.Replace(c, '_'); + } + + return ret; + } + + /// + /// Makes the file path. + /// + /// The path. + /// The name. + /// + public static string MakeFilePath(string path, string name) + { + string ret = EndPath(NormalizePath(path)); + + if( name == null ) + { + throw new ArgumentNullException("name"); + } + + ret += name; + + foreach (char c in Path.GetInvalidPathChars()) + { + ret = ret.Replace(c, '_'); + } + + return ret; + } + + /// + /// + /// + /// + /// + public static string MakeReferencePath(string path) + { + string ret = EndPath(NormalizePath(path)); + + foreach (char c in Path.GetInvalidPathChars()) + { + ret = ret.Replace(c, '_'); + } + + return ret; + } + + /// + /// Sets the current dir. + /// + /// The path. + public static void SetCurrentDir(string path) + { + if( path == null ) + { + throw new ArgumentNullException("path"); + } + if(path.Length < 1) + { + return; + } + + Environment.CurrentDirectory = path; + } + + /// + /// Checks the type. + /// + /// The type to check. + /// The attr. + /// The inter. + /// + public static object CheckType(Type typeToCheck, Type attr, Type inter) + { + if(typeToCheck == null || attr == null) + { + return null; + } + + object[] attrs = typeToCheck.GetCustomAttributes(attr, false); + if(attrs == null || attrs.Length < 1) + { + return null; + } + if( inter == null ) + { + throw new ArgumentNullException("inter"); + } + + if(typeToCheck.GetInterface(inter.FullName) == null) + { + return null; + } + + return attrs[0]; + } + + /* A bit of overhead for simple group parsing, there are problems with Regex in Mono + public static string ParseValue(string val) + { + if(val == null || val.Length < 1 || !CheckForOSVariables) + return val; + + string tmp = val; + Match m = m_VarRegex.Match(val); + while(m.Success) + { + if(m.Groups["var"] == null) + continue; + + Capture c = m.Groups["var"].Captures[0]; + if(c == null) + continue; + + string var = c.Value; + string envVal = Environment.GetEnvironmentVariable(var); + if(envVal == null) + envVal = ""; + + tmp = tmp.Replace("${" + var + "}", envVal); + m = m.NextMatch(); + } + + return tmp; + }*/ + + /// + /// Attributes the value. + /// + /// The node. + /// The attr. + /// The def. + /// + public static string AttributeValue(XmlNode node, string attr, string def) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + if(node.Attributes[attr] == null) + { + return def; + } + string val = node.Attributes[attr].Value; + if(!CheckForOSVariables) + { + return val; + } + + return InterpolateForEnvironmentVariables(val); + } + + /// + /// Parses the boolean. + /// + /// The node. + /// The attr. + /// if set to true [default value]. + /// + public static bool ParseBoolean(XmlNode node, string attr, bool defaultValue) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + if(node.Attributes[attr] == null) + { + return defaultValue; + } + return bool.Parse(node.Attributes[attr].Value); + } + + /// + /// Enums the attribute value. + /// + /// The node. + /// The attr. + /// Type of the enum. + /// The def. + /// + public static object EnumAttributeValue(XmlNode node, string attr, Type enumType, object def) + { + if( def == null ) + { + throw new ArgumentNullException("def"); + } + string val = AttributeValue(node, attr, def.ToString()); + return Enum.Parse(enumType, val, true); + } + + /// + /// + /// + /// + /// + /// + public static string AssemblyFullName(string assemblyName, ProjectType projectType) + { + return assemblyName + (projectType == ProjectType.Library ? ".dll" : ".exe"); + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/Utilities/Log.cs b/Programs/Prebuild/src/Core/Utilities/Log.cs index f38b7463..aafa0f2b 100644 --- a/Programs/Prebuild/src/Core/Utilities/Log.cs +++ b/Programs/Prebuild/src/Core/Utilities/Log.cs @@ -1,279 +1,279 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 00:49:58 +0000 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - -using System; -using System.IO; - -namespace Prebuild.Core.Utilities -{ - /// - /// - /// - public enum LogType - { - /// - /// - /// - None, - /// - /// - /// - Info, - /// - /// - /// - Warning, - /// - /// - /// - Error - } - - /// - /// - /// - [Flags] - public enum LogTargets - { - /// - /// - /// - None = 0, - /// - /// - /// - Null = 1, - /// - /// - /// - File = 2, - /// - /// - /// - Console = 4 - } - - /// - /// Summary description for Log. - /// - public class Log : IDisposable - { - #region Fields - - private StreamWriter m_Writer; - private LogTargets m_Target = LogTargets.Null; - bool disposed; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The target. - /// Name of the file. - public Log(LogTargets target, string fileName) - { - m_Target = target; - - if((m_Target & LogTargets.File) != 0) - { - m_Writer = new StreamWriter(fileName, false); - } - } - - #endregion - - #region Public Methods - - /// - /// Writes this instance. - /// - public void Write() - { - Write(string.Empty); - } - - /// - /// Writes the specified MSG. - /// - /// The MSG. - public void Write(string msg) - { - if((m_Target & LogTargets.Null) != 0) - { - return; - } - - if((m_Target & LogTargets.Console) != 0) - { - Console.WriteLine(msg); - } - if((m_Target & LogTargets.File) != 0 && m_Writer != null) - { - m_Writer.WriteLine(msg); - } - } - - /// - /// Writes the specified format. - /// - /// The format. - /// The args. - public void Write(string format, params object[] args) - { - Write(string.Format(format,args)); - } - - /// - /// Writes the specified type. - /// - /// The type. - /// The format. - /// The args. - public void Write(LogType type, string format, params object[] args) - { - if((m_Target & LogTargets.Null) != 0) - { - return; - } - - string str = ""; - switch(type) - { - case LogType.Info: - str = "[I] "; - break; - case LogType.Warning: - str = "[!] "; - break; - case LogType.Error: - str = "[X] "; - break; - } - - Write(str + format,args); - } - - /// - /// Writes the exception. - /// - /// The type. - /// The ex. - public void WriteException(LogType type, Exception ex) - { - if(ex != null) - { - Write(type, ex.Message); - //#if DEBUG - m_Writer.WriteLine("Exception @{0} stack trace [[", ex.TargetSite.Name); - m_Writer.WriteLine(ex.StackTrace); - m_Writer.WriteLine("]]"); - //#endif - } - } - - /// - /// Flushes this instance. - /// - public void Flush() - { - if(m_Writer != null) - { - m_Writer.Flush(); - } - } - - #endregion - - #region IDisposable Members - - /// - /// Performs application-defined tasks associated with freeing, releasing, or - /// resetting unmanaged resources. - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// Dispose objects - /// - /// - /// If true, it will dispose close the handle - /// - /// - /// Will dispose managed and unmanaged resources. - /// - protected virtual void Dispose(bool disposing) - { - if (!this.disposed) - { - if (disposing) - { - if (m_Writer != null) - { - m_Writer.Close(); - m_Writer = null; - } - } - } - this.disposed = true; - } - - /// - /// - /// - ~Log() - { - this.Dispose(false); - } - - /// - /// Closes and destroys this object - /// - /// - /// Same as Dispose(true) - /// - public void Close() - { - Dispose(); - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2006-01-27 16:49:58 -0800 (Fri, 27 Jan 2006) $ + * $Revision: 71 $ + */ +#endregion + +using System; +using System.IO; + +namespace Prebuild.Core.Utilities +{ + /// + /// + /// + public enum LogType + { + /// + /// + /// + None, + /// + /// + /// + Info, + /// + /// + /// + Warning, + /// + /// + /// + Error + } + + /// + /// + /// + [Flags] + public enum LogTargets + { + /// + /// + /// + None = 0, + /// + /// + /// + Null = 1, + /// + /// + /// + File = 2, + /// + /// + /// + Console = 4 + } + + /// + /// Summary description for Log. + /// + public class Log : IDisposable + { + #region Fields + + private StreamWriter m_Writer; + private LogTargets m_Target = LogTargets.Null; + bool disposed; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The target. + /// Name of the file. + public Log(LogTargets target, string fileName) + { + m_Target = target; + + if((m_Target & LogTargets.File) != 0) + { + m_Writer = new StreamWriter(fileName, false); + } + } + + #endregion + + #region Public Methods + + /// + /// Writes this instance. + /// + public void Write() + { + Write(string.Empty); + } + + /// + /// Writes the specified MSG. + /// + /// The MSG. + public void Write(string msg) + { + if((m_Target & LogTargets.Null) != 0) + { + return; + } + + if((m_Target & LogTargets.Console) != 0) + { + Console.WriteLine(msg); + } + if((m_Target & LogTargets.File) != 0 && m_Writer != null) + { + m_Writer.WriteLine(msg); + } + } + + /// + /// Writes the specified format. + /// + /// The format. + /// The args. + public void Write(string format, params object[] args) + { + Write(string.Format(format,args)); + } + + /// + /// Writes the specified type. + /// + /// The type. + /// The format. + /// The args. + public void Write(LogType type, string format, params object[] args) + { + if((m_Target & LogTargets.Null) != 0) + { + return; + } + + string str = ""; + switch(type) + { + case LogType.Info: + str = "[I] "; + break; + case LogType.Warning: + str = "[!] "; + break; + case LogType.Error: + str = "[X] "; + break; + } + + Write(str + format,args); + } + + /// + /// Writes the exception. + /// + /// The type. + /// The ex. + public void WriteException(LogType type, Exception ex) + { + if(ex != null) + { + Write(type, ex.Message); + //#if DEBUG + m_Writer.WriteLine("Exception @{0} stack trace [[", ex.TargetSite.Name); + m_Writer.WriteLine(ex.StackTrace); + m_Writer.WriteLine("]]"); + //#endif + } + } + + /// + /// Flushes this instance. + /// + public void Flush() + { + if(m_Writer != null) + { + m_Writer.Flush(); + } + } + + #endregion + + #region IDisposable Members + + /// + /// Performs application-defined tasks associated with freeing, releasing, or + /// resetting unmanaged resources. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Dispose objects + /// + /// + /// If true, it will dispose close the handle + /// + /// + /// Will dispose managed and unmanaged resources. + /// + protected virtual void Dispose(bool disposing) + { + if (!this.disposed) + { + if (disposing) + { + if (m_Writer != null) + { + m_Writer.Close(); + m_Writer = null; + } + } + } + this.disposed = true; + } + + /// + /// + /// + ~Log() + { + this.Dispose(false); + } + + /// + /// Closes and destroys this object + /// + /// + /// Same as Dispose(true) + /// + public void Close() + { + Dispose(); + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Core/WarningException.cs b/Programs/Prebuild/src/Core/WarningException.cs index df90dc8d..3c4556cd 100644 --- a/Programs/Prebuild/src/Core/WarningException.cs +++ b/Programs/Prebuild/src/Core/WarningException.cs @@ -1,84 +1,84 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -using System; -using System.Runtime.Serialization; - -namespace Prebuild.Core -{ - /// - /// - /// - [Serializable()] - public class WarningException : Exception - { - #region Constructors - - /// - /// - /// - public WarningException() - { - } - - /// - /// - /// - /// - /// - public WarningException(string format, params object[] args) - : base(String.Format(format, args)) - { - } - - /// - /// Exception with specified string - /// - /// Exception message - public WarningException(string message): base(message) - { - } - - /// - /// - /// - /// - /// - public WarningException(string message, Exception exception) : base(message, exception) - { - } - - /// - /// - /// - /// - /// - protected WarningException(SerializationInfo info, StreamingContext context) : base( info, context ) - { - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Runtime.Serialization; + +namespace Prebuild.Core +{ + /// + /// + /// + [Serializable()] + public class WarningException : Exception + { + #region Constructors + + /// + /// + /// + public WarningException() + { + } + + /// + /// + /// + /// + /// + public WarningException(string format, params object[] args) + : base(String.Format(format, args)) + { + } + + /// + /// Exception with specified string + /// + /// Exception message + public WarningException(string message): base(message) + { + } + + /// + /// + /// + /// + /// + public WarningException(string message, Exception exception) : base(message, exception) + { + } + + /// + /// + /// + /// + /// + protected WarningException(SerializationInfo info, StreamingContext context) : base( info, context ) + { + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Prebuild.cs b/Programs/Prebuild/src/Prebuild.cs index 1c059ebe..315f8b7a 100644 --- a/Programs/Prebuild/src/Prebuild.cs +++ b/Programs/Prebuild/src/Prebuild.cs @@ -1,165 +1,165 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-09-26 21:43:35 +0000 (Tue, 26 Sep 2006) $ - * $Revision: 168 $ - */ -#endregion - -using System; -using System.Collections.Specialized; -using System.IO; -using System.Reflection; -using System.Runtime.InteropServices; -using System.EnterpriseServices.Internal; - -using Prebuild.Core; -using Prebuild.Core.Utilities; - -namespace Prebuild -{ - /// - /// - /// - class Prebuild - { - #region Main - - [STAThread] - static void Main(string[] args) - { - Kernel kernel = null; - try - { - kernel = Kernel.Instance; - kernel.Initialize(LogTargets.File | LogTargets.Console, args); - bool exit = false; - - if(kernel.CommandLine.WasPassed("usage")) - { - exit = true; - OutputUsage(); - } - if(kernel.CommandLine.WasPassed("showtargets")) - { - exit = true; - OutputTargets(kernel); - } - if(kernel.CommandLine.WasPassed("install")) - { - exit = true; - InstallAssembly(kernel); - } - if(kernel.CommandLine.WasPassed("remove")) - { - exit = true; - RemoveAssembly(kernel); - } - - if(!exit) - { - kernel.Process(); - } - } - catch(Exception ex) - { - Console.WriteLine("Unhandled error: {0}", ex.Message); - //#if DEBUG - Console.WriteLine("{0}", ex.StackTrace); - //#endif - } - finally - { - if(kernel.PauseAfterFinish) - { - Console.WriteLine("\nPress enter to continue..."); - Console.ReadLine(); - } - } - } - - #endregion - - #region Private Methods - - private static void InstallAssembly(Kernel kernel) - { - Publish publish = new Publish(); - string file = kernel.CommandLine["install"]; - //Console.WriteLine(".."+file+".."); - publish.GacInstall(file); - } - - private static void RemoveAssembly(Kernel kernel) - { - Publish publish = new Publish(); - string file = kernel.CommandLine["remove"]; - publish.GacRemove(file); - } - - private static void OutputUsage() - { - Console.WriteLine("Usage: prebuild /target [options]"); - Console.WriteLine("Available command-line switches:"); - Console.WriteLine(); - Console.WriteLine("/target Target for Prebuild"); - Console.WriteLine("/clean Clean the build files for the given target"); - Console.WriteLine("/file XML file to process"); - Console.WriteLine("/log Log file to write to"); - Console.WriteLine("/ppo Pre-process the file, but perform no other processing"); - Console.WriteLine("/pause Pauses the application after execution to view the output"); - Console.WriteLine("/yes Default to yes to any questions asked"); - Console.WriteLine("/install Install assembly into the GAC"); - Console.WriteLine("/remove Remove assembly from the GAC"); - Console.WriteLine(); - Console.WriteLine("See 'prebuild /showtargets for a list of available targets"); - Console.WriteLine("See readme.txt or check out http://dnpb.sourceforge.net for more information"); - Console.WriteLine(); - } - - private static void OutputTargets(Kernel kern) - { - Console.WriteLine("Targets available in Prebuild:"); - Console.WriteLine(""); - if(kern.Targets.Keys.Count > 0) - { - string[] targs = new string[kern.Targets.Keys.Count]; - kern.Targets.Keys.CopyTo(targs, 0); - Array.Sort(targs); - foreach(string target in targs) - { - Console.WriteLine(target); - } - } - Console.WriteLine(""); - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: jendave $ + * $Date: 2006-09-26 14:43:35 -0700 (Tue, 26 Sep 2006) $ + * $Revision: 168 $ + */ +#endregion + +using System; +using System.Collections.Specialized; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; +using System.EnterpriseServices.Internal; + +using Prebuild.Core; +using Prebuild.Core.Utilities; + +namespace Prebuild +{ + /// + /// + /// + class Prebuild + { + #region Main + + [STAThread] + static void Main(string[] args) + { + Kernel kernel = null; + try + { + kernel = Kernel.Instance; + kernel.Initialize(LogTargets.File | LogTargets.Console, args); + bool exit = false; + + if(kernel.CommandLine.WasPassed("usage")) + { + exit = true; + OutputUsage(); + } + if(kernel.CommandLine.WasPassed("showtargets")) + { + exit = true; + OutputTargets(kernel); + } + if(kernel.CommandLine.WasPassed("install")) + { + exit = true; + InstallAssembly(kernel); + } + if(kernel.CommandLine.WasPassed("remove")) + { + exit = true; + RemoveAssembly(kernel); + } + + if(!exit) + { + kernel.Process(); + } + } + catch(Exception ex) + { + Console.WriteLine("Unhandled error: {0}", ex.Message); + //#if DEBUG + Console.WriteLine("{0}", ex.StackTrace); + //#endif + } + finally + { + if(kernel.PauseAfterFinish) + { + Console.WriteLine("\nPress enter to continue..."); + Console.ReadLine(); + } + } + } + + #endregion + + #region Private Methods + + private static void InstallAssembly(Kernel kernel) + { + Publish publish = new Publish(); + string file = kernel.CommandLine["install"]; + //Console.WriteLine(".."+file+".."); + publish.GacInstall(file); + } + + private static void RemoveAssembly(Kernel kernel) + { + Publish publish = new Publish(); + string file = kernel.CommandLine["remove"]; + publish.GacRemove(file); + } + + private static void OutputUsage() + { + Console.WriteLine("Usage: prebuild /target [options]"); + Console.WriteLine("Available command-line switches:"); + Console.WriteLine(); + Console.WriteLine("/target Target for Prebuild"); + Console.WriteLine("/clean Clean the build files for the given target"); + Console.WriteLine("/file XML file to process"); + Console.WriteLine("/log Log file to write to"); + Console.WriteLine("/ppo Pre-process the file, but perform no other processing"); + Console.WriteLine("/pause Pauses the application after execution to view the output"); + Console.WriteLine("/yes Default to yes to any questions asked"); + Console.WriteLine("/install Install assembly into the GAC"); + Console.WriteLine("/remove Remove assembly from the GAC"); + Console.WriteLine(); + Console.WriteLine("See 'prebuild /showtargets for a list of available targets"); + Console.WriteLine("See readme.txt or check out http://dnpb.sourceforge.net for more information"); + Console.WriteLine(); + } + + private static void OutputTargets(Kernel kern) + { + Console.WriteLine("Targets available in Prebuild:"); + Console.WriteLine(""); + if(kern.Targets.Keys.Count > 0) + { + string[] targs = new string[kern.Targets.Keys.Count]; + kern.Targets.Keys.CopyTo(targs, 0); + Array.Sort(targs); + foreach(string target in targs) + { + Console.WriteLine(target); + } + } + Console.WriteLine(""); + } + + #endregion + } +} diff --git a/Programs/Prebuild/src/Properties/AssemblyInfo.cs b/Programs/Prebuild/src/Properties/AssemblyInfo.cs index fcf2b164..5f61a66c 100644 --- a/Programs/Prebuild/src/Properties/AssemblyInfo.cs +++ b/Programs/Prebuild/src/Properties/AssemblyInfo.cs @@ -1,121 +1,121 @@ -#region BSD License -/* - -Copyright (c) 2004 - 2008 -Matthew Holmes (matthew@wildfiregames.com), -Dan Moorehead (dan05a@gmail.com), -Dave Hudson (jendave@yahoo.com), -Rob Loach (http://www.robloach.net), -C.J. Adams-Collier (cjac@colliertech.org), - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ -#endregion - -#region CVS Information -/* - * $Source$ - * $Author: cjcollier $ - * $Date: 2008-02-07 16:31:29 +0000 (Thu, 07 Feb 2008) $ - * $Revision: 256 $ - */ -#endregion - -using System; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security.Permissions; -using System.Resources; - - -// FxCop recommended attributes -[assembly: ComVisible(false)] -[assembly: FileIOPermission(SecurityAction.RequestMinimum, Unrestricted=true)] -[assembly: CLSCompliant(true)] - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle(".NET Prebuild")] -[assembly: AssemblyDescription("A .NET project file build tool")] -[assembly: AssemblyConfiguration(".NET CLR")] -[assembly: AssemblyCompany("The Prebuild Project")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("Copyright 2004-2008 " + - "Matthew Holmes, " + - "Dan Moorehead, " + - "C.J. Adams-Collier, " + - "Rob Loach, " + - "David Hudson,")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: NeutralResourcesLanguageAttribute("en-US")] -[assembly: AssemblyVersion("2.0.3.*")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyName("")] +#region BSD License +/* + +Copyright (c) 2004 - 2008 +Matthew Holmes (matthew@wildfiregames.com), +Dan Moorehead (dan05a@gmail.com), +Dave Hudson (jendave@yahoo.com), +Rob Loach (http://www.robloach.net), +C.J. Adams-Collier (cjac@colliertech.org), + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ +#endregion + +#region CVS Information +/* + * $Source$ + * $Author: cjcollier $ + * $Date: 2008-02-07 08:31:29 -0800 (Thu, 07 Feb 2008) $ + * $Revision: 256 $ + */ +#endregion + +using System; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security.Permissions; +using System.Resources; + + +// FxCop recommended attributes +[assembly: ComVisible(false)] +[assembly: FileIOPermission(SecurityAction.RequestMinimum, Unrestricted=true)] +[assembly: CLSCompliant(true)] + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle(".NET Prebuild")] +[assembly: AssemblyDescription("A .NET project file build tool")] +[assembly: AssemblyConfiguration(".NET CLR")] +[assembly: AssemblyCompany("The Prebuild Project")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("Copyright 2004-2008 " + + "Matthew Holmes, " + + "Dan Moorehead, " + + "C.J. Adams-Collier, " + + "Rob Loach, " + + "David Hudson,")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguageAttribute("en-US")] +[assembly: AssemblyVersion("2.0.3.*")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyName("")] diff --git a/Programs/Prebuild/src/data/dnpb-1.0.xsd b/Programs/Prebuild/src/data/dnpb-1.0.xsd index b9e0e4ea..45cab863 100644 --- a/Programs/Prebuild/src/data/dnpb-1.0.xsd +++ b/Programs/Prebuild/src/data/dnpb-1.0.xsd @@ -1,183 +1,183 @@ - - - - - Copyright (c) 2004 Matthew Holmes (kerion@houston.rr.com) - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Copyright (c) 2004 Matthew Holmes (kerion@houston.rr.com) + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Programs/Prebuild/src/data/dnpb-1.1.xsd b/Programs/Prebuild/src/data/dnpb-1.1.xsd index 2c065a32..c402cebc 100644 --- a/Programs/Prebuild/src/data/dnpb-1.1.xsd +++ b/Programs/Prebuild/src/data/dnpb-1.1.xsd @@ -1,184 +1,184 @@ - - - - - Copyright (c) 2004 Matthew Holmes (kerion@houston.rr.com) - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Copyright (c) 2004 Matthew Holmes (kerion@houston.rr.com) + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Programs/Prebuild/src/data/dnpb-1.2.xsd b/Programs/Prebuild/src/data/dnpb-1.2.xsd index d694ab43..8004af74 100644 --- a/Programs/Prebuild/src/data/dnpb-1.2.xsd +++ b/Programs/Prebuild/src/data/dnpb-1.2.xsd @@ -1,198 +1,198 @@ - - - - - Copyright (c) 2004 Matthew Holmes (calefaction _at_ houston _._ rr _._ com) - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Copyright (c) 2004 Matthew Holmes (calefaction _at_ houston _._ rr _._ com) + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Programs/Prebuild/src/data/dnpb-1.3.xsd b/Programs/Prebuild/src/data/dnpb-1.3.xsd index 8f31a544..5f8ada1e 100644 --- a/Programs/Prebuild/src/data/dnpb-1.3.xsd +++ b/Programs/Prebuild/src/data/dnpb-1.3.xsd @@ -1,206 +1,206 @@ - - - - - Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) - - .NET Pre-Build is an XML-driven pre-build tool allowing developers to - easily generate project or make files for major IDE's and .NET - development tools including: Visual Studio 2003, Visual Studio 2002, - SharpDevelop, MonoDevelop, and NAnt. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) + + .NET Pre-Build is an XML-driven pre-build tool allowing developers to + easily generate project or make files for major IDE's and .NET + development tools including: Visual Studio 2003, Visual Studio 2002, + SharpDevelop, MonoDevelop, and NAnt. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Programs/Prebuild/src/data/dnpb-1.4.xsd b/Programs/Prebuild/src/data/dnpb-1.4.xsd index 1da50fcc..54f9ac00 100644 --- a/Programs/Prebuild/src/data/dnpb-1.4.xsd +++ b/Programs/Prebuild/src/data/dnpb-1.4.xsd @@ -1,212 +1,212 @@ - - - - - Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002 and - 2003, SharpDevelop, MonoDevelop, and NAnt. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002 and + 2003, SharpDevelop, MonoDevelop, and NAnt. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Programs/Prebuild/src/data/dnpb-1.5.xsd b/Programs/Prebuild/src/data/dnpb-1.5.xsd index e2b21f0c..2270e836 100644 --- a/Programs/Prebuild/src/data/dnpb-1.5.xsd +++ b/Programs/Prebuild/src/data/dnpb-1.5.xsd @@ -1,215 +1,215 @@ - - - - - Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002 and - 2003, SharpDevelop, MonoDevelop, and NAnt. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002 and + 2003, SharpDevelop, MonoDevelop, and NAnt. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Programs/Prebuild/src/data/prebuild-1.6.xsd b/Programs/Prebuild/src/data/prebuild-1.6.xsd index 57ebd2eb..f944fafc 100644 --- a/Programs/Prebuild/src/data/prebuild-1.6.xsd +++ b/Programs/Prebuild/src/data/prebuild-1.6.xsd @@ -1,231 +1,231 @@ - - - - - Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002 and - 2003, SharpDevelop, MonoDevelop, and NAnt. - - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Copyright (c) 2004-2005 Matthew Holmes (calefaction at houston . rr . com), Dan Moorehead (dan05a at gmail . com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002 and + 2003, SharpDevelop, MonoDevelop, and NAnt. + + BSD License: + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +