Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/windirstat/premake-4.x-stable.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES.txt490
-rw-r--r--LICENSE.txt680
-rw-r--r--README.txt62
-rw-r--r--premake.lua322
-rw-r--r--premake4.lua20
-rw-r--r--src/action/action.c230
-rw-r--r--src/action/action.h114
-rw-r--r--src/action/make/gmake.c176
-rw-r--r--src/action/make/gmake_project.c98
-rw-r--r--src/action/make/gmake_solution.c432
-rw-r--r--src/action/make/make.c306
-rw-r--r--src/action/make/make.h32
-rw-r--r--src/action/make/make_project.c640
-rw-r--r--src/action/make/make_project.h70
-rw-r--r--src/action/make/make_solution.c68
-rw-r--r--src/action/make/make_solution.h40
-rw-r--r--src/action/make/tests/gmake_project_tests.cpp498
-rw-r--r--src/action/make/tests/gmake_solution_tests.cpp242
-rw-r--r--src/action/make/tests/make_solution_tests.cpp/make_solution_tests.cpp56
-rw-r--r--src/action/make/tests/make_tests.cpp196
-rw-r--r--src/action/tests/action_tests.h126
-rw-r--r--src/action/vs200x/tests/vs2002_config_tests.cpp58
-rw-r--r--src/action/vs200x/tests/vs2002_project_tests.cpp176
-rw-r--r--src/action/vs200x/tests/vs2002_solution_tests.cpp216
-rw-r--r--src/action/vs200x/tests/vs2003_config_tests.cpp58
-rw-r--r--src/action/vs200x/tests/vs2003_project_tests.cpp180
-rw-r--r--src/action/vs200x/tests/vs2003_solution_tests.cpp90
-rw-r--r--src/action/vs200x/tests/vs2005_config_tests.cpp58
-rw-r--r--src/action/vs200x/tests/vs2005_project_tests.cpp190
-rw-r--r--src/action/vs200x/tests/vs2005_solution_tests.cpp160
-rw-r--r--src/action/vs200x/tests/vs2008_config_tests.cpp58
-rw-r--r--src/action/vs200x/tests/vs2008_project_tests.cpp190
-rw-r--r--src/action/vs200x/tests/vs2008_solution_tests.cpp60
-rw-r--r--src/action/vs200x/tests/vs200x_project_tests.cpp588
-rw-r--r--src/action/vs200x/tests/vs200x_tests.cpp98
-rw-r--r--src/action/vs200x/tests/vs200x_xml_tests.cpp188
-rw-r--r--src/action/vs200x/vs2002.c170
-rw-r--r--src/action/vs200x/vs2002_solution.c338
-rw-r--r--src/action/vs200x/vs2003.c168
-rw-r--r--src/action/vs200x/vs2003_solution.c110
-rw-r--r--src/action/vs200x/vs2005.c184
-rw-r--r--src/action/vs200x/vs2005_solution.c220
-rw-r--r--src/action/vs200x/vs2008.c182
-rw-r--r--src/action/vs200x/vs2008_solution.c58
-rw-r--r--src/action/vs200x/vs200x.c326
-rw-r--r--src/action/vs200x/vs200x.h40
-rw-r--r--src/action/vs200x/vs200x_config.c96
-rw-r--r--src/action/vs200x/vs200x_config.h32
-rw-r--r--src/action/vs200x/vs200x_project.c946
-rw-r--r--src/action/vs200x/vs200x_project.h82
-rw-r--r--src/action/vs200x/vs200x_solution.c66
-rw-r--r--src/action/vs200x/vs200x_solution.h60
-rw-r--r--src/base/array.c222
-rw-r--r--src/base/array.h54
-rw-r--r--src/base/base.h24
-rw-r--r--src/base/buffers.c170
-rw-r--r--src/base/buffers.h50
-rw-r--r--src/base/cstr.c248
-rw-r--r--src/base/cstr.h48
-rw-r--r--src/base/dir.c212
-rw-r--r--src/base/dir.h44
-rw-r--r--src/base/error.c102
-rw-r--r--src/base/error.h42
-rw-r--r--src/base/guid.c218
-rw-r--r--src/base/guid.h40
-rw-r--r--src/base/path.c708
-rw-r--r--src/base/path.h58
-rw-r--r--src/base/stream.c578
-rw-r--r--src/base/stream.h74
-rw-r--r--src/base/string.c134
-rw-r--r--src/base/string.h46
-rw-r--r--src/base/strings.c194
-rw-r--r--src/base/strings.h56
-rw-r--r--src/base/tests/base_tests.cpp46
-rw-r--r--src/base/tests/cstr_tests.cpp298
-rw-r--r--src/base/tests/dir_tests.cpp54
-rw-r--r--src/base/tests/guid_tests.cpp172
-rw-r--r--src/base/tests/path_tests.cpp532
-rw-r--r--src/base/tests/stream_tests.cpp214
-rw-r--r--src/base/tests/string_tests.cpp92
-rw-r--r--src/host/host.c344
-rw-r--r--src/host/host.h86
-rw-r--r--src/host/tests/host_args_tests.cpp88
-rw-r--r--src/host/tests/host_help_tests.cpp154
-rw-r--r--src/host/tests/host_results_tests.cpp96
-rw-r--r--src/host/tests/host_run_tests.cpp250
-rw-r--r--src/host/tests/host_tests.cpp52
-rw-r--r--src/platform/platform.c68
-rw-r--r--src/platform/platform.h242
-rw-r--r--src/platform/posix.c272
-rw-r--r--src/platform/windows.c210
-rw-r--r--src/premake.c116
-rw-r--r--src/premake.h86
-rw-r--r--src/premake.lua202
-rw-r--r--src/project/fields.c332
-rw-r--r--src/project/fields.h116
-rw-r--r--src/project/project.c716
-rw-r--r--src/project/project.h128
-rw-r--r--src/project/solution.c660
-rw-r--r--src/project/solution.h122
-rw-r--r--src/project/tests/fields_tests.cpp128
-rw-r--r--src/project/tests/project_tests.cpp468
-rw-r--r--src/project/tests/solution_tests.cpp412
-rw-r--r--src/script/fn_accessor.c455
-rw-r--r--src/script/fn_configurations.c43
-rw-r--r--src/script/fn_dofile.c152
-rw-r--r--src/script/fn_error.c42
-rw-r--r--src/script/fn_getcwd.c40
-rw-r--r--src/script/fn_include.c52
-rw-r--r--src/script/fn_project.c153
-rw-r--r--src/script/fn_solution.c124
-rw-r--r--src/script/lua-5.1.2/PREMAKE_CHANGES.txt4
-rw-r--r--src/script/script.c529
-rw-r--r--src/script/script.h58
-rw-r--r--src/script/script_internal.c336
-rw-r--r--src/script/script_internal.h148
-rw-r--r--src/script/tests/fn_accessor_tests.cpp226
-rw-r--r--src/script/tests/fn_configurations_tests.cpp20
-rw-r--r--src/script/tests/fn_dofile_tests.cpp146
-rw-r--r--src/script/tests/fn_error_tests.cpp50
-rw-r--r--src/script/tests/fn_files_tests.cpp70
-rw-r--r--src/script/tests/fn_getcwd_tests.cpp58
-rw-r--r--src/script/tests/fn_guid_tests.cpp90
-rw-r--r--src/script/tests/fn_include_tests.cpp72
-rw-r--r--src/script/tests/fn_language_tests.cpp84
-rw-r--r--src/script/tests/fn_project_tests.cpp243
-rw-r--r--src/script/tests/fn_solution_tests.cpp240
-rw-r--r--src/script/tests/script_tests.cpp104
-rw-r--r--src/script/tests/script_tests.h79
-rw-r--r--src/script/tests/unload_project_tests.cpp171
-rw-r--r--src/script/tests/unload_solution_tests.cpp130
-rw-r--r--src/script/tests/unload_tests.cpp349
-rw-r--r--src/script/unload.c312
-rw-r--r--src/session/session.c726
-rw-r--r--src/session/session.h194
-rw-r--r--src/session/tests/session_tests.cpp794
-rw-r--r--src/testing/UnitTest++/PREMAKE_CHANGES.txt6
-rw-r--r--src/testing/test_files/_FILE.lua4
-rw-r--r--src/testing/test_files/dofile.lua4
-rw-r--r--src/testing/test_files/dofile_getcwd.lua8
-rw-r--r--src/testing/test_files/error.lua2
-rw-r--r--src/testing/test_files/getcwd.lua2
-rw-r--r--src/testing/test_files/nested/getcwd.lua2
-rw-r--r--src/testing/test_files/premake4.lua6
-rw-r--r--src/testing/test_files/true.lua4
-rw-r--r--src/testing/testing.cpp44
-rw-r--r--src/testing/testing.h18
147 files changed, 13419 insertions, 13397 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index 4505c0e..e01b308 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,245 +1,245 @@
- 4.0 (in progress)
---------------------
-This version is a complete rewrite of Premake.
-
-- New, more readable syntax for project information
-- Better validation of command-line arguments
-- Standardized path handling across all project settings
-- Upgraded to Lua 5.1.2
-
- 3.5
---------------------
-- Prevent creation of import libraries on OS X
-- Improved handling of dylibs on OS X
-- Patch 1771977: Ability to compile C source as C++ in Code::Blocks (Ryan Pusztai)
-- Patch 1771168: luaL_getn speed optimization (Richard O'Grady)
-- Bug 1804810: out-implib not present in linux gnu compler toolchain
-- Bug 1806949: .Net reference paths are broken when bindir is specified
-- Bug 1806960: Make clean does not remove .mdb files
-- Bug 1831389: Makefiles stored in subdirs contain no targets on first run
-
- 3.4
---------------------
-- Added `no-pch` flag to suppress precompiled headers
-- Added App.config support to GNU makefiles
-- Add os.mkdir() to script environment
-- Makefile now creates target directory before copying .NET references
-- Feature 1520182: Enhanced file-handling functions
-- Bug 531878: Problems with relative paths
-- Bug 1723867: Config-specific post-build on GNU target (Benoit Miller)
-- Bug 1596826: XML targets doesn't escape xml entities
-- Bug 1600155: Core dump due to newpackage() and matchfiles()
-- Bug 1608895: resgen command shown
-- Bug 1639730: Output filename is not set
-- Bug 1729227: non-portable executable with relative library path
-- Bug 1559951: default clean rule removes package dir
-- Patch 1733674: PCH support for Code::Block targets (Ryan Pusztai)
-- Patch 1746563: Ability to specify GUID for VS targets (Ryan Pusztai)
-- Patch 1754867: Creating import lib of different name (Ryan Pusztai)
-
- 3.3
---------------------
-- Added support for prebuild, prelink, and postbuild commands
-- Added `target` global variable to script environment
-- Added build flag `no-edit-and-continue`
-- Added build flags `native-wchar` and `no-native-wchar`
-- Added build flag `no-manifest`
-- Added build flag `seh-exceptions` (VS2005 only)
-- Added `resdefines`, `respaths`, and `resoptions`
-- Added `prebuildcommands`, `prelinkcommands`, and `postbuildcommands`
-- Added `pchheader` and `pchsource` (Visual Studio only)
-- Feature 1337547: Package-level bindir and libdir
-- Bug 1565755: Generated makefiles do not work with MSYS
-- Bug 1587955: Target path ignored for libs
-- Bug 1574725: Static library extension for "gnu" target
-- Bug 1522861: Fixed by using "ar -rcs" instead of "ar -cr && ranlib"
-- Bug 1656816: Mkdir set wrong directory rights
-- Bug 1655595: Compile/build problem on FreeBSD
-- Bug: "gnu" clean rule doesn't work in cmd.exe
-- Improved behavior of Linux findlib()
-- Updated Code::Blocks support to latest project version (major="1" minor="6")
-- Patch 1681666: GNU targets always show the console if kind = 'winexe'
-
- 3.2
---------------------
-- Added support for Code::Blocks
-- Updated MonoDevelop support
-- Upgraded Lua to 5.0.3
-- Added new matchdirs() to Lua script environment
-- Expose list of packages as _PACKAGES global in Lua
-- Turn off edit-and-continue in release builds with symbols
-- Bug 1559873: libpaths inserts extra space after -L
-
- 3.1
---------------------
-- Added support for Visual Studio 2005
-- Added support for Windows resources to GNU make target
-- Added path handling functions to Lua environment
-- Added matchrecursive() for recursive file searches
-- Added os.fileexists() function to Lua environment
-- Added os.appendfile() function to Lua environment
-- Changed `monoresgen` to `resgen` to keep up with Mono project
-- Added `mono2` .NET compiler set for Mono .NET 2.0 support
-- Feature 1096677: exclude files from matchfiles (package.excludes)
-- Bug 1439463: VS2003 RTTI problem
-- Bug 1439446: GNU Makefile problem under Mingw32
-- Bug 1422068: package.path="." causes bad makefiles
-- Bug 1431530: makefile target fails when project path specified
-
- 3.0
---------------------
-- Upgraded Lua interpreter to version 5.0.1
-- The options table now stores simple values, rather than tables
-- Completed MonoDevelop support
-- Improved .NET resource handling for GNU generator
-- Added unit test suite
-- Merged Scott Graham unicode build flag patch
-- Removed package.warninglevel in favor of extra-warnings flag
-- Added package.targetprefix
-- Overhauled structure of generated GNU makefiles
-- Added --os command line option
-- Fixed bug 1268588: Use gcc to link C packages
-- Fixed bug 1363306: GNU C# should copy referenced DLLs
-
- 2.4
---------------------
-- Added chdir() to Lua script environment
-- Merged Thomas Harning's patch for .NET resources on GNU
-- Fixed bug 1194702: Can't put multiple packages in same directory
-- Fixed bug in GNU shared library builds (doh!)
-- Added target 'vs2002' to replace 'vs7'
-
- 2.3
---------------------
-- Added 'project.config[]' with 'bindir' and 'libdir'
-- Merged Scott Graham's "warninglevel" patch.
-- Fixed bug 1153484: Import lib in wrong directory.
-- Fixed bug 1013352: Stack overflow with large projects.
-- Fixed bug 945406: package.files, bad value = crash
-
- 2.2
---------------------
-- Worked around VS.NET bug for .NET assemblies > 64K.
-- Added --very-verbose flag to GNU generator.
-- GNU generator now supports assembly sources.
-
- 2.1
---------------------
-- File extension of generated binaries can now be set
- with config.targetextension.
-- Windows targets now handle .def files for DLLs.
-
- 2.0
---------------------
-- Can now specify build actions per file
-- Include paths are now passed to VC7 resource compiler
-- Removed _WIN32 define from Cygwin makefiles
-- Added package.objdir to set intermediates directory
-- Added rmdir() to Lua script environment
-- A big bag of bug fixes
-
- 1.9
---------------------
-- Made verbose mode even more verbose.
-- posix.c now builds properly as C.
-- Fixed package dependency generation for GNU and VS2003.
-- Display Lua version number in usage text.
-- Fixed VS link between *.aspx and *.aspx.cs files.
-- Fixed VS link between *.resx and *.cs files.
-- Fixed *.d file generation for gcc 2.9x.
-- Unified various help options under '--help'.
-- Bin and Lib paths can now be arbitrarily long.
-- linkoptions are now applied in VC6 and VC7 projects.
-
- 1.8
---------------------
-- Added support for ASP.NET projects.
-- Fixed a bug in VC6 support for static libraries.
-- matchfiles() now uses package path instead of script path.
-- Added --verbose option.
-- No longer apply no-rtti and no-exceptions to *.c files.
-
- 1.7
---------------------
-- Location of generated project files can now be specified with
- the project.path variable.
-- Inter-package dependencies are fixed for GNU makefiles.
-- No longer need to execute in same directory as project script.
-- Added "c" language specifier.
-- Added support for .resx and .config files to C# projects.
-- Added support for full assembly names in .NET references.
-- Fixed handling of paths in package.target variable.
-- Improved support for SharpDevelop.
-- Started support for OS X.
-- Added support for Digital Mars compiler.
-
- 1.6
---------------------
-- VS7 generator crashed if a package was built before one of its
- dependencies. Now immediately assigns UUID before processing.
-- Added support for Visual Studio 2003 and SharpDevelop.
-- Added binaries directory as a reference path for VS7.
-
- 1.5
---------------------
-- Added initial support for building static libraries.
-- Added "no-main" flag, prevents overriding WinMain() on
- Windows builds.
-- Added "--no-rtti" and "no-exceptions" build flags to
- disable those C++ features.
-- Display error message when project has no packages.
-- Moved VC7 *.pdb files into intermediates directory.
-
- 1.4
---------------------
-- Bug fixes to the path manipulation routines.
-- GNU makefiles are regenerated when premake scripts change.
-
- 1.3
---------------------
-- Added support for the Cygwin environment.
-- Added "static-runtime" build flag to statically link against C/C++
- standard runtime libraries.
-- Bug fixes to Visual Studio 6 and 7 generators and path reversing
- algorithm.
-
- 1.2
---------------------
-- Standardized format of command-line options.
-- Can now handle custom command-line options in script.
-- Added new function findlib().
-- Added new C++ build flag "managed" for writing C++ .NET code.
-- Can now use open-source C# compilers in VS6 generator.
-- Several bug fixes to the VS7 generator.
-
- 1.1
---------------------
-- Added support for custom build configurations. Added "optimize",
- "optimize-size", "optimize-speed", and "no-symbols" flags to control
- build settings.
-- Added matchfiles() to select files using wildcards.
-- Added "unsafe" flag for C# projects.
-- Added newpackage() function for creating new package objects inline,
- instead of creating separate scripts.
-- Changed include() to dopackage() and option() to addoption(). The old
- versions have been kept for compatibility, but will be deprecated
- eventually.
-- Major cleanup of the source code.
-
- 1.0
---------------------
-- Fixed a bug related to the reference paths in VS7 C# projects.
-- Display a warning message if a reference path can't be found.
-- Automatically create bin and lib directories if they do not exist.
-- GNU C# projects will now properly use the configured library paths.
-- Added --with-mono and --with-pnet options.
-- VS7 C# projects will now properly use the configured library paths.
-- Switched to Lua (http://www.lua.org/) for project script parsing.
-- Add support for custom project options.
-- Changed 'type' to 'kind' to avoid conflict with Lua function of the same name.
-- Changed 'conexe' to 'exe' because I liked it better.
-- Changed 'library' to 'dll' for C# projects to keep things consistent.
-
- 0.9
---------------------
-- Initial public release.
+ 4.0 (in progress)
+--------------------
+This version is a complete rewrite of Premake.
+
+- New, more readable syntax for project information
+- Better validation of command-line arguments
+- Standardized path handling across all project settings
+- Upgraded to Lua 5.1.2
+
+ 3.5
+--------------------
+- Prevent creation of import libraries on OS X
+- Improved handling of dylibs on OS X
+- Patch 1771977: Ability to compile C source as C++ in Code::Blocks (Ryan Pusztai)
+- Patch 1771168: luaL_getn speed optimization (Richard O'Grady)
+- Bug 1804810: out-implib not present in linux gnu compler toolchain
+- Bug 1806949: .Net reference paths are broken when bindir is specified
+- Bug 1806960: Make clean does not remove .mdb files
+- Bug 1831389: Makefiles stored in subdirs contain no targets on first run
+
+ 3.4
+--------------------
+- Added `no-pch` flag to suppress precompiled headers
+- Added App.config support to GNU makefiles
+- Add os.mkdir() to script environment
+- Makefile now creates target directory before copying .NET references
+- Feature 1520182: Enhanced file-handling functions
+- Bug 531878: Problems with relative paths
+- Bug 1723867: Config-specific post-build on GNU target (Benoit Miller)
+- Bug 1596826: XML targets doesn't escape xml entities
+- Bug 1600155: Core dump due to newpackage() and matchfiles()
+- Bug 1608895: resgen command shown
+- Bug 1639730: Output filename is not set
+- Bug 1729227: non-portable executable with relative library path
+- Bug 1559951: default clean rule removes package dir
+- Patch 1733674: PCH support for Code::Block targets (Ryan Pusztai)
+- Patch 1746563: Ability to specify GUID for VS targets (Ryan Pusztai)
+- Patch 1754867: Creating import lib of different name (Ryan Pusztai)
+
+ 3.3
+--------------------
+- Added support for prebuild, prelink, and postbuild commands
+- Added `target` global variable to script environment
+- Added build flag `no-edit-and-continue`
+- Added build flags `native-wchar` and `no-native-wchar`
+- Added build flag `no-manifest`
+- Added build flag `seh-exceptions` (VS2005 only)
+- Added `resdefines`, `respaths`, and `resoptions`
+- Added `prebuildcommands`, `prelinkcommands`, and `postbuildcommands`
+- Added `pchheader` and `pchsource` (Visual Studio only)
+- Feature 1337547: Package-level bindir and libdir
+- Bug 1565755: Generated makefiles do not work with MSYS
+- Bug 1587955: Target path ignored for libs
+- Bug 1574725: Static library extension for "gnu" target
+- Bug 1522861: Fixed by using "ar -rcs" instead of "ar -cr && ranlib"
+- Bug 1656816: Mkdir set wrong directory rights
+- Bug 1655595: Compile/build problem on FreeBSD
+- Bug: "gnu" clean rule doesn't work in cmd.exe
+- Improved behavior of Linux findlib()
+- Updated Code::Blocks support to latest project version (major="1" minor="6")
+- Patch 1681666: GNU targets always show the console if kind = 'winexe'
+
+ 3.2
+--------------------
+- Added support for Code::Blocks
+- Updated MonoDevelop support
+- Upgraded Lua to 5.0.3
+- Added new matchdirs() to Lua script environment
+- Expose list of packages as _PACKAGES global in Lua
+- Turn off edit-and-continue in release builds with symbols
+- Bug 1559873: libpaths inserts extra space after -L
+
+ 3.1
+--------------------
+- Added support for Visual Studio 2005
+- Added support for Windows resources to GNU make target
+- Added path handling functions to Lua environment
+- Added matchrecursive() for recursive file searches
+- Added os.fileexists() function to Lua environment
+- Added os.appendfile() function to Lua environment
+- Changed `monoresgen` to `resgen` to keep up with Mono project
+- Added `mono2` .NET compiler set for Mono .NET 2.0 support
+- Feature 1096677: exclude files from matchfiles (package.excludes)
+- Bug 1439463: VS2003 RTTI problem
+- Bug 1439446: GNU Makefile problem under Mingw32
+- Bug 1422068: package.path="." causes bad makefiles
+- Bug 1431530: makefile target fails when project path specified
+
+ 3.0
+--------------------
+- Upgraded Lua interpreter to version 5.0.1
+- The options table now stores simple values, rather than tables
+- Completed MonoDevelop support
+- Improved .NET resource handling for GNU generator
+- Added unit test suite
+- Merged Scott Graham unicode build flag patch
+- Removed package.warninglevel in favor of extra-warnings flag
+- Added package.targetprefix
+- Overhauled structure of generated GNU makefiles
+- Added --os command line option
+- Fixed bug 1268588: Use gcc to link C packages
+- Fixed bug 1363306: GNU C# should copy referenced DLLs
+
+ 2.4
+--------------------
+- Added chdir() to Lua script environment
+- Merged Thomas Harning's patch for .NET resources on GNU
+- Fixed bug 1194702: Can't put multiple packages in same directory
+- Fixed bug in GNU shared library builds (doh!)
+- Added target 'vs2002' to replace 'vs7'
+
+ 2.3
+--------------------
+- Added 'project.config[]' with 'bindir' and 'libdir'
+- Merged Scott Graham's "warninglevel" patch.
+- Fixed bug 1153484: Import lib in wrong directory.
+- Fixed bug 1013352: Stack overflow with large projects.
+- Fixed bug 945406: package.files, bad value = crash
+
+ 2.2
+--------------------
+- Worked around VS.NET bug for .NET assemblies > 64K.
+- Added --very-verbose flag to GNU generator.
+- GNU generator now supports assembly sources.
+
+ 2.1
+--------------------
+- File extension of generated binaries can now be set
+ with config.targetextension.
+- Windows targets now handle .def files for DLLs.
+
+ 2.0
+--------------------
+- Can now specify build actions per file
+- Include paths are now passed to VC7 resource compiler
+- Removed _WIN32 define from Cygwin makefiles
+- Added package.objdir to set intermediates directory
+- Added rmdir() to Lua script environment
+- A big bag of bug fixes
+
+ 1.9
+--------------------
+- Made verbose mode even more verbose.
+- posix.c now builds properly as C.
+- Fixed package dependency generation for GNU and VS2003.
+- Display Lua version number in usage text.
+- Fixed VS link between *.aspx and *.aspx.cs files.
+- Fixed VS link between *.resx and *.cs files.
+- Fixed *.d file generation for gcc 2.9x.
+- Unified various help options under '--help'.
+- Bin and Lib paths can now be arbitrarily long.
+- linkoptions are now applied in VC6 and VC7 projects.
+
+ 1.8
+--------------------
+- Added support for ASP.NET projects.
+- Fixed a bug in VC6 support for static libraries.
+- matchfiles() now uses package path instead of script path.
+- Added --verbose option.
+- No longer apply no-rtti and no-exceptions to *.c files.
+
+ 1.7
+--------------------
+- Location of generated project files can now be specified with
+ the project.path variable.
+- Inter-package dependencies are fixed for GNU makefiles.
+- No longer need to execute in same directory as project script.
+- Added "c" language specifier.
+- Added support for .resx and .config files to C# projects.
+- Added support for full assembly names in .NET references.
+- Fixed handling of paths in package.target variable.
+- Improved support for SharpDevelop.
+- Started support for OS X.
+- Added support for Digital Mars compiler.
+
+ 1.6
+--------------------
+- VS7 generator crashed if a package was built before one of its
+ dependencies. Now immediately assigns UUID before processing.
+- Added support for Visual Studio 2003 and SharpDevelop.
+- Added binaries directory as a reference path for VS7.
+
+ 1.5
+--------------------
+- Added initial support for building static libraries.
+- Added "no-main" flag, prevents overriding WinMain() on
+ Windows builds.
+- Added "--no-rtti" and "no-exceptions" build flags to
+ disable those C++ features.
+- Display error message when project has no packages.
+- Moved VC7 *.pdb files into intermediates directory.
+
+ 1.4
+--------------------
+- Bug fixes to the path manipulation routines.
+- GNU makefiles are regenerated when premake scripts change.
+
+ 1.3
+--------------------
+- Added support for the Cygwin environment.
+- Added "static-runtime" build flag to statically link against C/C++
+ standard runtime libraries.
+- Bug fixes to Visual Studio 6 and 7 generators and path reversing
+ algorithm.
+
+ 1.2
+--------------------
+- Standardized format of command-line options.
+- Can now handle custom command-line options in script.
+- Added new function findlib().
+- Added new C++ build flag "managed" for writing C++ .NET code.
+- Can now use open-source C# compilers in VS6 generator.
+- Several bug fixes to the VS7 generator.
+
+ 1.1
+--------------------
+- Added support for custom build configurations. Added "optimize",
+ "optimize-size", "optimize-speed", and "no-symbols" flags to control
+ build settings.
+- Added matchfiles() to select files using wildcards.
+- Added "unsafe" flag for C# projects.
+- Added newpackage() function for creating new package objects inline,
+ instead of creating separate scripts.
+- Changed include() to dopackage() and option() to addoption(). The old
+ versions have been kept for compatibility, but will be deprecated
+ eventually.
+- Major cleanup of the source code.
+
+ 1.0
+--------------------
+- Fixed a bug related to the reference paths in VS7 C# projects.
+- Display a warning message if a reference path can't be found.
+- Automatically create bin and lib directories if they do not exist.
+- GNU C# projects will now properly use the configured library paths.
+- Added --with-mono and --with-pnet options.
+- VS7 C# projects will now properly use the configured library paths.
+- Switched to Lua (http://www.lua.org/) for project script parsing.
+- Add support for custom project options.
+- Changed 'type' to 'kind' to avoid conflict with Lua function of the same name.
+- Changed 'conexe' to 'exe' because I liked it better.
+- Changed 'library' to 'dll' for C# projects to keep things consistent.
+
+ 0.9
+--------------------
+- Initial public release.
diff --git a/LICENSE.txt b/LICENSE.txt
index 45645b4..5b6e7c6 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,340 +1,340 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/README.txt b/README.txt
index 50e4ca4..3130143 100644
--- a/README.txt
+++ b/README.txt
@@ -1,31 +1,31 @@
-PREMAKE
-A build configuration tool
-
- Copyright (C) 2002-2008 by Jason Perkins
- Distributed under the GNU General Public License, see LICENSE.txt
-
- The Lua language and runtime library is (C) TeCGraf, PUC-Rio.
- See their website at http://www.lua.org/
-
-
-BUILDING PREMAKE
-
- Until an official release is made you will need to use an existing
- Premake 3.x executable to generate the project files. Grab a binary
- or source package from the project site at:
-
- http://premake.sourceforge.net/
-
- Then use it to create the project files for your particular toolset.
-
- $ cd premake-4.0
- $ premake --target vs2005 # For Visual Studio 2005 files
- $ premake --target gnu # For GNU makefile
-
- Run `premake --help` for a complete list of supported toolsets.
-
-
-SUPPORT
-
- For questions, comments, or more information, visit the project
- website at http://industriousone.com/premake
+PREMAKE
+A build configuration tool
+
+ Copyright (C) 2002-2008 by Jason Perkins
+ Distributed under the GNU General Public License, see LICENSE.txt
+
+ The Lua language and runtime library is (C) TeCGraf, PUC-Rio.
+ See their website at http://www.lua.org/
+
+
+BUILDING PREMAKE
+
+ Until an official release is made you will need to use an existing
+ Premake 3.x executable to generate the project files. Grab a binary
+ or source package from the project site at:
+
+ http://premake.sourceforge.net/
+
+ Then use it to create the project files for your particular toolset.
+
+ $ cd premake-4.0
+ $ premake --target vs2005 # For Visual Studio 2005 files
+ $ premake --target gnu # For GNU makefile
+
+ Run `premake --help` for a complete list of supported toolsets.
+
+
+SUPPORT
+
+ For questions, comments, or more information, visit the project
+ website at http://industriousone.com/premake
diff --git a/premake.lua b/premake.lua
index 9074afd..afc12bc 100644
--- a/premake.lua
+++ b/premake.lua
@@ -1,161 +1,161 @@
-project.name = "Premake4"
-
--- Project options
-
- addoption("no-tests", "Build without automated tests")
-
-
--- Output directories
-
- project.config["Debug"].bindir = "bin/debug"
- project.config["Release"].bindir = "bin/release"
-
-
--- Packages
-
- dopackage("src")
-
-
--- Cleanup code
-
- function doclean(cmd, arg)
- docommand(cmd, arg)
- os.rmdir("bin")
- os.rmdir("doc")
- end
-
-
--- Release code
-
- REPOS = "https://premake.svn.sourceforge.net/svnroot/premake"
- TRUNK = "/trunk"
- BRANCHES = "/branches/4.0-alpha/"
-
- function dorelease(cmd, arg)
-
- if (not arg) then
- error "You must specify a version"
- end
-
- -------------------------------------------------------------------
- -- Make sure everything is good before I start
- -------------------------------------------------------------------
- print("")
- print("PRE-FLIGHT CHECKLIST")
- print(" * is README up-to-date?")
- print(" * is CHANGELOG up-to-date?")
- print(" * did you test build with GCC?")
- print(" * did you test build with Doxygen?")
- print(" * are 'svn' (all) and '7z' (Windows) available?")
- print("")
- print("Press [Enter] to continue or [^C] to quit.")
- io.stdin:read("*l")
-
- -------------------------------------------------------------------
- -- Set up environment
- -------------------------------------------------------------------
- local version = arg
-
- os.mkdir("releases")
-
- local folder = "premake-"..version
- local trunk = REPOS..TRUNK
- local branch = REPOS..BRANCHES..version
-
- -------------------------------------------------------------------
- -- Build and run all automated tests on working copy
- -------------------------------------------------------------------
- print("Building tests on working copy...")
- os.execute("premake --target gnu >releases/release.log")
- result = os.execute("make CONFIG=Release >releases/release.log")
- if (result ~= 0) then
- error("Test build failed; see release.log for details")
- end
-
- -------------------------------------------------------------------
- -- Look for a release branch in SVN, and create one from trunk if necessary
- -------------------------------------------------------------------
- print("Checking for release branch...")
- os.chdir("releases")
- result = os.execute(string.format("svn ls %s >release.log 2>&1", branch))
- if (result ~= 0) then
- print("Creating release branch...")
- result = os.execute(string.format('svn copy %s %s -m "Creating release branch for %s" >release.log', trunk, branch, version))
- if (result ~= 0) then
- error("Failed to create release branch at "..branch)
- end
- end
-
- -------------------------------------------------------------------
- -- Checkout a local copy of the release branch
- -------------------------------------------------------------------
- print("Getting source code from release branch...")
- os.execute(string.format("svn co %s %s >release.log", branch, folder))
- if (not os.fileexists(folder.."/README.txt")) then
- error("Unable to checkout from repository at "..branch)
- end
-
- -------------------------------------------------------------------
- -- Embed version numbers into the files
- -------------------------------------------------------------------
- -- (embed version #s)
- -- (check into branch)
-
- -------------------------------------------------------------------
- -- Build the release binary for this platform
- -------------------------------------------------------------------
- print("Building release version...")
- os.chdir(folder)
- os.execute("premake --clean --no-tests --target gnu >../release.log")
-
- if (windows) then
- os.execute("make CONFIG=Release >../release.log")
- os.chdir("bin/release")
- result = os.execute(string.format("7z a -tzip ..\\..\\..\\premake-win32-%s.zip premake4.exe >../release.log", version))
- elseif (macosx) then
- os.execute('TARGET_ARCH="-arch i386 -arch ppc" make CONFIG=Release >../release.log')
- os.chdir("bin/release")
- result = os.execute(string.format("tar czvf ../../../premake-macosx-%s.tar.gz premake4 >../release.log", version))
- else
- os.execute("make CONFIG=Release >../release.log")
- os.chdir("bin/release")
- result = os.execute(string.format("tar czvf ../../../premake-linux-%s.tar.gz bin/release/premake4 >../release.log", version))
- end
-
- if (result ~= 0) then
- error("Failed to build binary package; see release.log for details")
- end
-
- os.chdir("../../..")
-
- -------------------------------------------------------------------
- -- Build the source code package (MacOSX only)
- -------------------------------------------------------------------
- if (macosx) then
- result = os.execute(string.format("zip -r9 premake-src-%s.zip %s/* >release.log", version, folder))
- if (result ~= 0) then
- error("Failed to build source code package; see release.log for details")
- end
- end
-
- -------------------------------------------------------------------
- -- Clean up
- -------------------------------------------------------------------
- print("Cleaning up...")
- os.rmdir(folder)
- os.remove("release.log")
-
-
- -------------------------------------------------------------------
- -- Next steps
- -------------------------------------------------------------------
- if (windows) then
- print("DONE - now run release script under Linux")
- elseif (linux) then
- print("DONE - now run release script under Mac OS X")
- else
- print("DONE - really this time")
- end
-
- end
-
+project.name = "Premake4"
+
+-- Project options
+
+ addoption("no-tests", "Build without automated tests")
+
+
+-- Output directories
+
+ project.config["Debug"].bindir = "bin/debug"
+ project.config["Release"].bindir = "bin/release"
+
+
+-- Packages
+
+ dopackage("src")
+
+
+-- Cleanup code
+
+ function doclean(cmd, arg)
+ docommand(cmd, arg)
+ os.rmdir("bin")
+ os.rmdir("doc")
+ end
+
+
+-- Release code
+
+ REPOS = "https://premake.svn.sourceforge.net/svnroot/premake"
+ TRUNK = "/trunk"
+ BRANCHES = "/branches/4.0-alpha/"
+
+ function dorelease(cmd, arg)
+
+ if (not arg) then
+ error "You must specify a version"
+ end
+
+ -------------------------------------------------------------------
+ -- Make sure everything is good before I start
+ -------------------------------------------------------------------
+ print("")
+ print("PRE-FLIGHT CHECKLIST")
+ print(" * is README up-to-date?")
+ print(" * is CHANGELOG up-to-date?")
+ print(" * did you test build with GCC?")
+ print(" * did you test build with Doxygen?")
+ print(" * are 'svn' (all) and '7z' (Windows) available?")
+ print("")
+ print("Press [Enter] to continue or [^C] to quit.")
+ io.stdin:read("*l")
+
+ -------------------------------------------------------------------
+ -- Set up environment
+ -------------------------------------------------------------------
+ local version = arg
+
+ os.mkdir("releases")
+
+ local folder = "premake-"..version
+ local trunk = REPOS..TRUNK
+ local branch = REPOS..BRANCHES..version
+
+ -------------------------------------------------------------------
+ -- Build and run all automated tests on working copy
+ -------------------------------------------------------------------
+ print("Building tests on working copy...")
+ os.execute("premake --target gnu >releases/release.log")
+ result = os.execute("make CONFIG=Release >releases/release.log")
+ if (result ~= 0) then
+ error("Test build failed; see release.log for details")
+ end
+
+ -------------------------------------------------------------------
+ -- Look for a release branch in SVN, and create one from trunk if necessary
+ -------------------------------------------------------------------
+ print("Checking for release branch...")
+ os.chdir("releases")
+ result = os.execute(string.format("svn ls %s >release.log 2>&1", branch))
+ if (result ~= 0) then
+ print("Creating release branch...")
+ result = os.execute(string.format('svn copy %s %s -m "Creating release branch for %s" >release.log', trunk, branch, version))
+ if (result ~= 0) then
+ error("Failed to create release branch at "..branch)
+ end
+ end
+
+ -------------------------------------------------------------------
+ -- Checkout a local copy of the release branch
+ -------------------------------------------------------------------
+ print("Getting source code from release branch...")
+ os.execute(string.format("svn co %s %s >release.log", branch, folder))
+ if (not os.fileexists(folder.."/README.txt")) then
+ error("Unable to checkout from repository at "..branch)
+ end
+
+ -------------------------------------------------------------------
+ -- Embed version numbers into the files
+ -------------------------------------------------------------------
+ -- (embed version #s)
+ -- (check into branch)
+
+ -------------------------------------------------------------------
+ -- Build the release binary for this platform
+ -------------------------------------------------------------------
+ print("Building release version...")
+ os.chdir(folder)
+ os.execute("premake --clean --no-tests --target gnu >../release.log")
+
+ if (windows) then
+ os.execute("make CONFIG=Release >../release.log")
+ os.chdir("bin/release")
+ result = os.execute(string.format("7z a -tzip ..\\..\\..\\premake-win32-%s.zip premake4.exe >../release.log", version))
+ elseif (macosx) then
+ os.execute('TARGET_ARCH="-arch i386 -arch ppc" make CONFIG=Release >../release.log')
+ os.chdir("bin/release")
+ result = os.execute(string.format("tar czvf ../../../premake-macosx-%s.tar.gz premake4 >../release.log", version))
+ else
+ os.execute("make CONFIG=Release >../release.log")
+ os.chdir("bin/release")
+ result = os.execute(string.format("tar czvf ../../../premake-linux-%s.tar.gz bin/release/premake4 >../release.log", version))
+ end
+
+ if (result ~= 0) then
+ error("Failed to build binary package; see release.log for details")
+ end
+
+ os.chdir("../../..")
+
+ -------------------------------------------------------------------
+ -- Build the source code package (MacOSX only)
+ -------------------------------------------------------------------
+ if (macosx) then
+ result = os.execute(string.format("zip -r9 premake-src-%s.zip %s/* >release.log", version, folder))
+ if (result ~= 0) then
+ error("Failed to build source code package; see release.log for details")
+ end
+ end
+
+ -------------------------------------------------------------------
+ -- Clean up
+ -------------------------------------------------------------------
+ print("Cleaning up...")
+ os.rmdir(folder)
+ os.remove("release.log")
+
+
+ -------------------------------------------------------------------
+ -- Next steps
+ -------------------------------------------------------------------
+ if (windows) then
+ print("DONE - now run release script under Linux")
+ elseif (linux) then
+ print("DONE - now run release script under Mac OS X")
+ else
+ print("DONE - really this time")
+ end
+
+ end
+
diff --git a/premake4.lua b/premake4.lua
index 8a975d8..e300f47 100644
--- a/premake4.lua
+++ b/premake4.lua
@@ -1,10 +1,10 @@
----------------------------------------------------------------------------
--- Premake4 solution script for Premake4
--- Copyright (c) 2002-2008 Jason Perkins and the Premake project
----------------------------------------------------------------------------
-
-solution "Premake4"
-
-
-
-
+---------------------------------------------------------------------------
+-- Premake4 solution script for Premake4
+-- Copyright (c) 2002-2008 Jason Perkins and the Premake project
+---------------------------------------------------------------------------
+
+solution "Premake4"
+
+
+
+
diff --git a/src/action/action.c b/src/action/action.c
index f8bdacf..9a10740 100644
--- a/src/action/action.c
+++ b/src/action/action.c
@@ -1,115 +1,115 @@
-/**
- * \file action.c
- * \brief Built-in engine actions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <string.h>
-#include "premake.h"
-#include "action/action.h"
-#include "base/buffers.h"
-#include "base/cstr.h"
-
-SessionAction Actions[] =
-{
- { "gmake", "GNU Makefiles for POSIX, MinGW, and Cygwin", gmake_action },
- { "vs2002", "Microsoft Visual Studio 2002", vs2002_action },
- { "vs2003", "Microsoft Visual Studio 2003", vs2003_action },
- { "vs2005", "Microsoft Visual Studio 2005 (includes Express editions)", vs2005_action },
- { "vs2008", "Microsoft Visual Studio 2008 (includes Express editions)", vs2008_action },
- { 0, 0, 0 }
-};
-
-static int action_source_tree_do(Session sess, Project prj, Stream strm, ActionSourceCallback handler, const char* group);
-
-
-/**
- * Walk a list of source files and pass them off, in nesting order, to
- * the specified callback. Handles the grouping of related files info
- * groups (by directory currently).
- * \param sess The current execution session context.
- * \param prj The project containing the files to enumerate.
- * \param strm The active output stream.
- * \param handler The per-file handler function.
- * \returns OKAY on success.
- */
-int action_source_tree(Session sess, Project prj, Stream strm, ActionSourceCallback handler)
-{
- return action_source_tree_do(sess, prj, strm, handler, "");
-}
-
-
-static int action_source_tree_do(Session sess, Project prj, Stream strm, ActionSourceCallback handler, const char* group)
-{
- int i, n, group_len;
- Strings files;
- char* buffer = buffers_next();
-
- /* open an enclosing group */
- group_len = strlen(group);
- strcpy(buffer, group);
- if (cstr_ends_with(buffer, "/")) /* Trim off trailing path separator */
- {
- buffer[strlen(buffer)-1] = '\0';
- }
- handler(sess, prj, strm, buffer, GroupStart);
-
- /* scan all files in this group and process any subdirectories (subgroups) */
- files = project_get_files(prj);
- n = strings_size(files);
- for (i = 0; i < n; ++i)
- {
- const char* filename = strings_item(files, i);
-
- /* is this file in the group that I am currently processing? */
- if (cstr_starts_with(filename, group))
- {
- /* see if this file contains an additional directory level (a new group) */
- const char* ptr = strchr(filename + group_len, '/');
- if (ptr)
- {
- int j;
-
- /* pull out the name of this new group */
- size_t len = ptr - filename + 1;
- strncpy(buffer, filename, len);
- buffer[len] = '\0';
-
- /* have I processed this subdirectory already? See if it appears earlier in the list */
- for (j = 0; j < i; ++j)
- {
- if (cstr_starts_with(strings_item(files, j), buffer))
- break;
- }
-
- if (i == j)
- {
- /* a new group, process it now */
- if (action_source_tree_do(sess, prj, strm, handler, buffer) != OKAY)
- return !OKAY;
- }
- }
- }
- }
-
- /* now process all files that belong to this current group (and not a subgroup) */
- for (i = 0; i < n; ++i)
- {
- const char* filename = strings_item(files, i);
- if (!strchr(filename + group_len, '/'))
- {
- if (handler(sess, prj, strm, filename, SourceFile) != OKAY)
- return !OKAY;
- }
- }
-
- /* close the group */
- strcpy(buffer, group);
- if (cstr_ends_with(buffer, "/")) /* Trim off trailing path separator */
- {
- buffer[strlen(buffer)-1] = '\0';
- }
- handler(sess, prj, strm, buffer, GroupEnd);
- return OKAY;
-}
-
+/**
+ * \file action.c
+ * \brief Built-in engine actions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <string.h>
+#include "premake.h"
+#include "action/action.h"
+#include "base/buffers.h"
+#include "base/cstr.h"
+
+SessionAction Actions[] =
+{
+ { "gmake", "GNU Makefiles for POSIX, MinGW, and Cygwin", gmake_action },
+ { "vs2002", "Microsoft Visual Studio 2002", vs2002_action },
+ { "vs2003", "Microsoft Visual Studio 2003", vs2003_action },
+ { "vs2005", "Microsoft Visual Studio 2005 (includes Express editions)", vs2005_action },
+ { "vs2008", "Microsoft Visual Studio 2008 (includes Express editions)", vs2008_action },
+ { 0, 0, 0 }
+};
+
+static int action_source_tree_do(Session sess, Project prj, Stream strm, ActionSourceCallback handler, const char* group);
+
+
+/**
+ * Walk a list of source files and pass them off, in nesting order, to
+ * the specified callback. Handles the grouping of related files info
+ * groups (by directory currently).
+ * \param sess The current execution session context.
+ * \param prj The project containing the files to enumerate.
+ * \param strm The active output stream.
+ * \param handler The per-file handler function.
+ * \returns OKAY on success.
+ */
+int action_source_tree(Session sess, Project prj, Stream strm, ActionSourceCallback handler)
+{
+ return action_source_tree_do(sess, prj, strm, handler, "");
+}
+
+
+static int action_source_tree_do(Session sess, Project prj, Stream strm, ActionSourceCallback handler, const char* group)
+{
+ int i, n, group_len;
+ Strings files;
+ char* buffer = buffers_next();
+
+ /* open an enclosing group */
+ group_len = strlen(group);
+ strcpy(buffer, group);
+ if (cstr_ends_with(buffer, "/")) /* Trim off trailing path separator */
+ {
+ buffer[strlen(buffer)-1] = '\0';
+ }
+ handler(sess, prj, strm, buffer, GroupStart);
+
+ /* scan all files in this group and process any subdirectories (subgroups) */
+ files = project_get_files(prj);
+ n = strings_size(files);
+ for (i = 0; i < n; ++i)
+ {
+ const char* filename = strings_item(files, i);
+
+ /* is this file in the group that I am currently processing? */
+ if (cstr_starts_with(filename, group))
+ {
+ /* see if this file contains an additional directory level (a new group) */
+ const char* ptr = strchr(filename + group_len, '/');
+ if (ptr)
+ {
+ int j;
+
+ /* pull out the name of this new group */
+ size_t len = ptr - filename + 1;
+ strncpy(buffer, filename, len);
+ buffer[len] = '\0';
+
+ /* have I processed this subdirectory already? See if it appears earlier in the list */
+ for (j = 0; j < i; ++j)
+ {
+ if (cstr_starts_with(strings_item(files, j), buffer))
+ break;
+ }
+
+ if (i == j)
+ {
+ /* a new group, process it now */
+ if (action_source_tree_do(sess, prj, strm, handler, buffer) != OKAY)
+ return !OKAY;
+ }
+ }
+ }
+ }
+
+ /* now process all files that belong to this current group (and not a subgroup) */
+ for (i = 0; i < n; ++i)
+ {
+ const char* filename = strings_item(files, i);
+ if (!strchr(filename + group_len, '/'))
+ {
+ if (handler(sess, prj, strm, filename, SourceFile) != OKAY)
+ return !OKAY;
+ }
+ }
+
+ /* close the group */
+ strcpy(buffer, group);
+ if (cstr_ends_with(buffer, "/")) /* Trim off trailing path separator */
+ {
+ buffer[strlen(buffer)-1] = '\0';
+ }
+ handler(sess, prj, strm, buffer, GroupEnd);
+ return OKAY;
+}
+
diff --git a/src/action/action.h b/src/action/action.h
index 097546d..0f0e190 100644
--- a/src/action/action.h
+++ b/src/action/action.h
@@ -1,57 +1,57 @@
-/**
- * \file action.h
- * \brief Built-in engine actions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- *
- * \defgroup action Actions
- *
- * The actions component contains the implementation of all of the built-in
- * Premake actions, along with a few common support functions.
- *
- * @{
- */
-#if !defined(PREMAKE_ACTION_H)
-#define PREMAKE_ACTION_H
-
-#include "session/session.h"
-
-
-/**
- * State values for the source tree enumeration functions.
- */
-enum ActionSourceState
-{
- GroupStart,
- GroupEnd,
- SourceFile
-};
-
-
-/**
- * Per-file callback signature for action_source_tree.
- * \param sess The current execution state context.
- * \param prj The current project; contains the file being enumerated.
- * \param strm The active output stream; for writing the file markup.
- * \param filename The name of the file to process.
- * \param state One of the ActionSourceStates, enabling file grouping.
- * \returns OKAY if successful.
- */
-typedef int (*ActionSourceCallback)(Session sess, Project prj, Stream strm, const char* filename, int state);
-
-
-/* the list of built-in Premake actions */
-extern SessionAction Actions[];
-
-int gmake_action(Session sess);
-int vs2002_action(Session sess);
-int vs2003_action(Session sess);
-int vs2005_action(Session sess);
-int vs2008_action(Session sess);
-
-
-/* support functions */
-int action_source_tree(Session sess, Project prj, Stream strm, ActionSourceCallback handler);
-
-
-#endif
-/** @} */
+/**
+ * \file action.h
+ * \brief Built-in engine actions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ *
+ * \defgroup action Actions
+ *
+ * The actions component contains the implementation of all of the built-in
+ * Premake actions, along with a few common support functions.
+ *
+ * @{
+ */
+#if !defined(PREMAKE_ACTION_H)
+#define PREMAKE_ACTION_H
+
+#include "session/session.h"
+
+
+/**
+ * State values for the source tree enumeration functions.
+ */
+enum ActionSourceState
+{
+ GroupStart,
+ GroupEnd,
+ SourceFile
+};
+
+
+/**
+ * Per-file callback signature for action_source_tree.
+ * \param sess The current execution state context.
+ * \param prj The current project; contains the file being enumerated.
+ * \param strm The active output stream; for writing the file markup.
+ * \param filename The name of the file to process.
+ * \param state One of the ActionSourceStates, enabling file grouping.
+ * \returns OKAY if successful.
+ */
+typedef int (*ActionSourceCallback)(Session sess, Project prj, Stream strm, const char* filename, int state);
+
+
+/* the list of built-in Premake actions */
+extern SessionAction Actions[];
+
+int gmake_action(Session sess);
+int vs2002_action(Session sess);
+int vs2003_action(Session sess);
+int vs2005_action(Session sess);
+int vs2008_action(Session sess);
+
+
+/* support functions */
+int action_source_tree(Session sess, Project prj, Stream strm, ActionSourceCallback handler);
+
+
+#endif
+/** @} */
diff --git a/src/action/make/gmake.c b/src/action/make/gmake.c
index 46ecead..e6c4721 100644
--- a/src/action/make/gmake.c
+++ b/src/action/make/gmake.c
@@ -1,88 +1,88 @@
-/**
- * \file gmake.c
- * \brief GNU makefile generation action.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <stdlib.h>
-#include "premake.h"
-#include "action/action.h"
-#include "make.h"
-#include "make_solution.h"
-#include "make_project.h"
-
-
-/** The project features supported by this action */
-static SessionFeatures Features =
-{
- { "c", "c++", NULL },
-};
-
-
-/** The GNU make solution writing process, for session_enumerate_objects() */
-static SessionSolutionCallback SolutionCallbacks[] =
-{
- make_solution_create,
- gmake_solution_signature,
- gmake_solution_default_config,
- gmake_solution_phony_rule,
- gmake_solution_all_rule,
- gmake_solution_projects,
- gmake_solution_clean_rule,
- NULL
-};
-
-/** The GNU make project writing process, for session_enumerate_objects() */
-static SessionProjectCallback ProjectCallbacks[] =
-{
- make_project_create,
- make_project_signature,
- session_enumerate_configurations,
- make_project_objects,
- make_project_resources,
- gmake_project_shell_detect,
- make_project_phony_rule,
- make_project_target,
- make_project_mkdir_rules,
- make_project_clean_rules,
- make_project_source_rules,
- make_project_include_dependencies,
- NULL
-};
-
-
-/** The GNU make configuration writing process, for session_enumerate_configurations() */
-static SessionProjectCallback ConfigCallbacks[] =
-{
- make_project_config_conditional,
- make_project_config_outdir,
- make_project_config_outfile,
- make_project_config_objdir,
- make_project_config_cppflags,
- make_project_config_cflags,
- make_project_config_cxxflags,
- make_project_config_ldflags,
- make_project_config_lddeps,
- make_project_config_resflags,
- make_project_config_end,
- NULL
-};
-
-
-/**
- * The GNU make action handler.
- * \param sess The active session object.
- * \returns OKAY if successful.
- */
-int gmake_action(Session sess)
-{
- /* make sure I can support all of the features used in the session */
- if (session_validate(sess, &Features) != OKAY)
- {
- return !OKAY;
- }
-
- stream_writeline(Console, "Generating project files for GNU make...");
- return session_enumerate_objects(sess, SolutionCallbacks, ProjectCallbacks, ConfigCallbacks);
-}
-
+/**
+ * \file gmake.c
+ * \brief GNU makefile generation action.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <stdlib.h>
+#include "premake.h"
+#include "action/action.h"
+#include "make.h"
+#include "make_solution.h"
+#include "make_project.h"
+
+
+/** The project features supported by this action */
+static SessionFeatures Features =
+{
+ { "c", "c++", NULL },
+};
+
+
+/** The GNU make solution writing process, for session_enumerate_objects() */
+static SessionSolutionCallback SolutionCallbacks[] =
+{
+ make_solution_create,
+ gmake_solution_signature,
+ gmake_solution_default_config,
+ gmake_solution_phony_rule,
+ gmake_solution_all_rule,
+ gmake_solution_projects,
+ gmake_solution_clean_rule,
+ NULL
+};
+
+/** The GNU make project writing process, for session_enumerate_objects() */
+static SessionProjectCallback ProjectCallbacks[] =
+{
+ make_project_create,
+ make_project_signature,
+ session_enumerate_configurations,
+ make_project_objects,
+ make_project_resources,
+ gmake_project_shell_detect,
+ make_project_phony_rule,
+ make_project_target,
+ make_project_mkdir_rules,
+ make_project_clean_rules,
+ make_project_source_rules,
+ make_project_include_dependencies,
+ NULL
+};
+
+
+/** The GNU make configuration writing process, for session_enumerate_configurations() */
+static SessionProjectCallback ConfigCallbacks[] =
+{
+ make_project_config_conditional,
+ make_project_config_outdir,
+ make_project_config_outfile,
+ make_project_config_objdir,
+ make_project_config_cppflags,
+ make_project_config_cflags,
+ make_project_config_cxxflags,
+ make_project_config_ldflags,
+ make_project_config_lddeps,
+ make_project_config_resflags,
+ make_project_config_end,
+ NULL
+};
+
+
+/**
+ * The GNU make action handler.
+ * \param sess The active session object.
+ * \returns OKAY if successful.
+ */
+int gmake_action(Session sess)
+{
+ /* make sure I can support all of the features used in the session */
+ if (session_validate(sess, &Features) != OKAY)
+ {
+ return !OKAY;
+ }
+
+ stream_writeline(Console, "Generating project files for GNU make...");
+ return session_enumerate_objects(sess, SolutionCallbacks, ProjectCallbacks, ConfigCallbacks);
+}
+
diff --git a/src/action/make/gmake_project.c b/src/action/make/gmake_project.c
index adb5660..3788e2d 100644
--- a/src/action/make/gmake_project.c
+++ b/src/action/make/gmake_project.c
@@ -1,49 +1,49 @@
-/**
- * \file gmake_project.c
- * \brief GNU makefile project generation functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "make_project.h"
-
-
-/**
- * Write the shell detection block, which is used while building on Windows in
- * order to detect the enclosing shell type: MS-DOS, Cygwin, or MinGW. The shell
- * determines how directories and files should be created and removed.
- *
- * While the detection in important only on Windows, I write for all platforms.
- * This simplifies the code generation, and makes portable makefiles possible
- * (even though most will have platform-specific bits in them).
- */
-int gmake_project_shell_detect(Session sess, Project prj, Stream strm)
-{
- int z = OKAY;
-
- UNUSED(sess);
- UNUSED(prj);
-
- z |= stream_writeline(strm, "SHELLTYPE := msdos");
- z |= stream_writeline(strm, "ifeq (,$(ComSpec)$(COMSPEC))");
- z |= stream_writeline(strm, " SHELLTYPE := posix");
- z |= stream_writeline(strm, "endif");
- z |= stream_writeline(strm, "ifeq (/bin,$(findstring /bin,$(SHELL)))");
- z |= stream_writeline(strm, " SHELLTYPE := posix");
- z |= stream_writeline(strm, "endif");
- z |= stream_writeline(strm, "");
- z |= stream_writeline(strm, "ifeq (posix,$(SHELLTYPE))");
- z |= stream_writeline(strm, " MKDIR := mkdir -p");
- z |= stream_writeline(strm, " PATHSEP := /");
- z |= stream_writeline(strm, "else");
- z |= stream_writeline(strm, " MKDIR := mkdir");
- z |= stream_writeline(strm, " PATHSEP := \\\\");
- z |= stream_writeline(strm, "endif");
- z |= stream_writeline(strm, "");
- z |= stream_writeline(strm, "SYS_OUTDIR := $(subst /,$(PATHSEP),$(OUTDIR))");
- z |= stream_writeline(strm, "SYS_OUTFILE := $(subst /,$(PATHSEP),$(OUTFILE))");
- z |= stream_writeline(strm, "SYS_OBJDIR := $(subst /,$(PATHSEP),$(OBJDIR))");
- z |= stream_writeline(strm, "");
- return z;
-}
-
+/**
+ * \file gmake_project.c
+ * \brief GNU makefile project generation functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "make_project.h"
+
+
+/**
+ * Write the shell detection block, which is used while building on Windows in
+ * order to detect the enclosing shell type: MS-DOS, Cygwin, or MinGW. The shell
+ * determines how directories and files should be created and removed.
+ *
+ * While the detection in important only on Windows, I write for all platforms.
+ * This simplifies the code generation, and makes portable makefiles possible
+ * (even though most will have platform-specific bits in them).
+ */
+int gmake_project_shell_detect(Session sess, Project prj, Stream strm)
+{
+ int z = OKAY;
+
+ UNUSED(sess);
+ UNUSED(prj);
+
+ z |= stream_writeline(strm, "SHELLTYPE := msdos");
+ z |= stream_writeline(strm, "ifeq (,$(ComSpec)$(COMSPEC))");
+ z |= stream_writeline(strm, " SHELLTYPE := posix");
+ z |= stream_writeline(strm, "endif");
+ z |= stream_writeline(strm, "ifeq (/bin,$(findstring /bin,$(SHELL)))");
+ z |= stream_writeline(strm, " SHELLTYPE := posix");
+ z |= stream_writeline(strm, "endif");
+ z |= stream_writeline(strm, "");
+ z |= stream_writeline(strm, "ifeq (posix,$(SHELLTYPE))");
+ z |= stream_writeline(strm, " MKDIR := mkdir -p");
+ z |= stream_writeline(strm, " PATHSEP := /");
+ z |= stream_writeline(strm, "else");
+ z |= stream_writeline(strm, " MKDIR := mkdir");
+ z |= stream_writeline(strm, " PATHSEP := \\\\");
+ z |= stream_writeline(strm, "endif");
+ z |= stream_writeline(strm, "");
+ z |= stream_writeline(strm, "SYS_OUTDIR := $(subst /,$(PATHSEP),$(OUTDIR))");
+ z |= stream_writeline(strm, "SYS_OUTFILE := $(subst /,$(PATHSEP),$(OUTFILE))");
+ z |= stream_writeline(strm, "SYS_OBJDIR := $(subst /,$(PATHSEP),$(OBJDIR))");
+ z |= stream_writeline(strm, "");
+ return z;
+}
+
diff --git a/src/action/make/gmake_solution.c b/src/action/make/gmake_solution.c
index 77da051..50c7415 100644
--- a/src/action/make/gmake_solution.c
+++ b/src/action/make/gmake_solution.c
@@ -1,216 +1,216 @@
-/**
- * \file gmake_solution.c
- * \brief GNU makefile solution generation functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include "premake.h"
-#include "make.h"
-#include "make_solution.h"
-#include "base/buffers.h"
-#include "base/cstr.h"
-#include "base/path.h"
-#include "base/strings.h"
-
-const char* gmake_solution_project_rule(Session sess, Solution sln, Project prj);
-
-
-/**
- * Write the GNU makefile all rule.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int gmake_solution_all_rule(Session sess, Solution sln, Stream strm)
-{
- Strings prj_names;
- int z;
-
- UNUSED(sess);
- assert(sln);
- assert(strm);
-
- prj_names = make_get_project_names(sln);
- z = stream_writeline_strings(strm, prj_names, "all:", " ", "", "");
- z |= stream_writeline(strm, "");
- strings_destroy(prj_names);
- return z;
-}
-
-
-/**
- * Write the GNU solution makefile clean rules.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int gmake_solution_clean_rule(Session sess, Solution sln, Stream strm)
-{
- int i, n, z;
-
- assert(sess);
- assert(sln);
- assert(strm);
-
- z = stream_writeline(strm, "clean:");
- n = solution_num_projects(sln);
- for (i = 0; i < n; ++i)
- {
- Project prj = solution_get_project(sln, i);
- const char* rule = gmake_solution_project_rule(sess, sln, prj);
- z |= stream_writeline(strm, "%s clean", rule);
- }
-
- return z;
-}
-
-
-/**
- * Write makefile rules to set a default build configuration.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int gmake_solution_default_config(Session sess, Solution sln, Stream strm)
-{
- const char* default_config_name;
- int z;
-
- UNUSED(sess);
- assert(sln);
- assert(strm);
-
- default_config_name = solution_get_config_name(sln, 0);
- z = stream_writeline(strm, "ifndef CONFIG");
- z |= stream_writeline(strm, " CONFIG=%s", default_config_name);
- z |= stream_writeline(strm, "endif");
- z |= stream_writeline(strm, "export CONFIG");
- z |= stream_writeline(strm, "");
- return z;
-}
-
-
-/**
- * Write the GNU makefile .PHONY rule.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int gmake_solution_phony_rule(Session sess, Solution sln, Stream strm)
-{
- Strings prj_names;
- int z;
-
- UNUSED(sess);
- assert(sln);
- assert(strm);
-
- prj_names = make_get_project_names(sln);
- z = stream_writeline_strings(strm, prj_names, ".PHONY: all clean", " ", "", "");
- z |= stream_writeline(strm, "");
- strings_destroy(prj_names);
- return z;
-}
-
-
-/**
- * Build the makefile rule to call an individual project.
- * \param sess The current session context.
- * \param sln The solution containing the project.
- * \param prj The project to be built.
- * \returns The makefile rule to trigger the project build.
- */
-const char* gmake_solution_project_rule(Session sess, Solution sln, Project prj)
-{
- char* buffer = buffers_next();
-
- /* project file paths are specified relative to the solution */
- const char* sln_path = path_directory(solution_get_filename(sln, NULL, NULL));
-
- const char* prj_file = make_get_project_makefile(sess, prj);
- const char* prj_file_dir = path_directory(prj_file);
- const char* prj_file_name = path_filename(prj_file);
- prj_file_dir = path_relative(sln_path, prj_file_dir);
-
- strcpy(buffer, "\t@$(MAKE)");
- if (!cstr_eq(".", prj_file_dir))
- {
- strcat(buffer, " --no-print-directory -C ");
- strcat(buffer, prj_file_dir);
- }
- if (!cstr_eq("Makefile", prj_file_name))
- {
- strcat(buffer, " -f ");
- strcat(buffer, prj_file_name);
- }
-
- return buffer;
-}
-
-
-
-/**
- * Write the GNU solution makefile project entry.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int gmake_solution_projects(Session sess, Solution sln, Stream strm)
-{
- int i, n, z = OKAY;
-
- assert(sess);
- assert(sln);
- assert(strm);
-
- n = solution_num_projects(sln);
- for (i = 0; i < n; ++i)
- {
- Project prj = solution_get_project(sln, i);
- const char* prj_name = project_get_name(prj);
- const char* rule = gmake_solution_project_rule(sess, sln, prj);
-
- z |= stream_writeline(strm, "%s:", prj_name);
- z |= stream_writeline(strm, "\t@echo ==== Building %s ====", prj_name);
- z |= stream_writeline(strm, rule);
- z |= stream_writeline(strm, "");
- }
-
- return z;
-}
-
-
-/**
- * Write the GNU makefile solution file signature block.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int gmake_solution_signature(Session sess, Solution sln, Stream strm)
-{
- Strings config_names;
- int z;
-
- UNUSED(sess);
- assert(sln);
- assert(strm);
-
- z = stream_writeline(strm, "# GNU Makefile autogenerated by Premake");
- z |= stream_writeline(strm, "# Usage: make [ CONFIG=config_name ]");
- z |= stream_writeline(strm, "# Where {config_name} is one of:");
-
- config_names = solution_get_config_names(sln);
- z |= stream_writeline_strings(strm, config_names, "# ", " ", "", ",");
- z |= stream_writeline(strm, "");
-
- return z;
-}
+/**
+ * \file gmake_solution.c
+ * \brief GNU makefile solution generation functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include "premake.h"
+#include "make.h"
+#include "make_solution.h"
+#include "base/buffers.h"
+#include "base/cstr.h"
+#include "base/path.h"
+#include "base/strings.h"
+
+const char* gmake_solution_project_rule(Session sess, Solution sln, Project prj);
+
+
+/**
+ * Write the GNU makefile all rule.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int gmake_solution_all_rule(Session sess, Solution sln, Stream strm)
+{
+ Strings prj_names;
+ int z;
+
+ UNUSED(sess);
+ assert(sln);
+ assert(strm);
+
+ prj_names = make_get_project_names(sln);
+ z = stream_writeline_strings(strm, prj_names, "all:", " ", "", "");
+ z |= stream_writeline(strm, "");
+ strings_destroy(prj_names);
+ return z;
+}
+
+
+/**
+ * Write the GNU solution makefile clean rules.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int gmake_solution_clean_rule(Session sess, Solution sln, Stream strm)
+{
+ int i, n, z;
+
+ assert(sess);
+ assert(sln);
+ assert(strm);
+
+ z = stream_writeline(strm, "clean:");
+ n = solution_num_projects(sln);
+ for (i = 0; i < n; ++i)
+ {
+ Project prj = solution_get_project(sln, i);
+ const char* rule = gmake_solution_project_rule(sess, sln, prj);
+ z |= stream_writeline(strm, "%s clean", rule);
+ }
+
+ return z;
+}
+
+
+/**
+ * Write makefile rules to set a default build configuration.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int gmake_solution_default_config(Session sess, Solution sln, Stream strm)
+{
+ const char* default_config_name;
+ int z;
+
+ UNUSED(sess);
+ assert(sln);
+ assert(strm);
+
+ default_config_name = solution_get_config_name(sln, 0);
+ z = stream_writeline(strm, "ifndef CONFIG");
+ z |= stream_writeline(strm, " CONFIG=%s", default_config_name);
+ z |= stream_writeline(strm, "endif");
+ z |= stream_writeline(strm, "export CONFIG");
+ z |= stream_writeline(strm, "");
+ return z;
+}
+
+
+/**
+ * Write the GNU makefile .PHONY rule.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int gmake_solution_phony_rule(Session sess, Solution sln, Stream strm)
+{
+ Strings prj_names;
+ int z;
+
+ UNUSED(sess);
+ assert(sln);
+ assert(strm);
+
+ prj_names = make_get_project_names(sln);
+ z = stream_writeline_strings(strm, prj_names, ".PHONY: all clean", " ", "", "");
+ z |= stream_writeline(strm, "");
+ strings_destroy(prj_names);
+ return z;
+}
+
+
+/**
+ * Build the makefile rule to call an individual project.
+ * \param sess The current session context.
+ * \param sln The solution containing the project.
+ * \param prj The project to be built.
+ * \returns The makefile rule to trigger the project build.
+ */
+const char* gmake_solution_project_rule(Session sess, Solution sln, Project prj)
+{
+ char* buffer = buffers_next();
+
+ /* project file paths are specified relative to the solution */
+ const char* sln_path = path_directory(solution_get_filename(sln, NULL, NULL));
+
+ const char* prj_file = make_get_project_makefile(sess, prj);
+ const char* prj_file_dir = path_directory(prj_file);
+ const char* prj_file_name = path_filename(prj_file);
+ prj_file_dir = path_relative(sln_path, prj_file_dir);
+
+ strcpy(buffer, "\t@$(MAKE)");
+ if (!cstr_eq(".", prj_file_dir))
+ {
+ strcat(buffer, " --no-print-directory -C ");
+ strcat(buffer, prj_file_dir);
+ }
+ if (!cstr_eq("Makefile", prj_file_name))
+ {
+ strcat(buffer, " -f ");
+ strcat(buffer, prj_file_name);
+ }
+
+ return buffer;
+}
+
+
+
+/**
+ * Write the GNU solution makefile project entry.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int gmake_solution_projects(Session sess, Solution sln, Stream strm)
+{
+ int i, n, z = OKAY;
+
+ assert(sess);
+ assert(sln);
+ assert(strm);
+
+ n = solution_num_projects(sln);
+ for (i = 0; i < n; ++i)
+ {
+ Project prj = solution_get_project(sln, i);
+ const char* prj_name = project_get_name(prj);
+ const char* rule = gmake_solution_project_rule(sess, sln, prj);
+
+ z |= stream_writeline(strm, "%s:", prj_name);
+ z |= stream_writeline(strm, "\t@echo ==== Building %s ====", prj_name);
+ z |= stream_writeline(strm, rule);
+ z |= stream_writeline(strm, "");
+ }
+
+ return z;
+}
+
+
+/**
+ * Write the GNU makefile solution file signature block.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int gmake_solution_signature(Session sess, Solution sln, Stream strm)
+{
+ Strings config_names;
+ int z;
+
+ UNUSED(sess);
+ assert(sln);
+ assert(strm);
+
+ z = stream_writeline(strm, "# GNU Makefile autogenerated by Premake");
+ z |= stream_writeline(strm, "# Usage: make [ CONFIG=config_name ]");
+ z |= stream_writeline(strm, "# Where {config_name} is one of:");
+
+ config_names = solution_get_config_names(sln);
+ z |= stream_writeline_strings(strm, config_names, "# ", " ", "", ",");
+ z |= stream_writeline(strm, "");
+
+ return z;
+}
diff --git a/src/action/make/make.c b/src/action/make/make.c
index 9b7541d..e2a1d7f 100644
--- a/src/action/make/make.c
+++ b/src/action/make/make.c
@@ -1,153 +1,153 @@
-/**
- * \file make.c
- * \brief Support functions for the makefile action.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include "premake.h"
-#include "make.h"
-#include "base/cstr.h"
-#include "base/error.h"
-#include "base/path.h"
-
-
-/**
- * Given a source file filename, returns the name of the corresponding .o file.
- * \param filename The source code filename.
- * \returns The filename of the .o file.
- */
-const char* make_get_obj_filename(const char* filename)
-{
- const char* basename = path_basename(filename);
- const char* obj_name = cstr_format("$(OBJDIR)/%s.o", basename);
- return obj_name;
-}
-
-
-/**
- * Get the name of the project makefile for a particular project.
- * \param sess The current execution session context.
- * \param prj The project being requested.
- * \returns If this project is the only object which will generate output to
- * its target location, then this function will return "Makefile" as
- * the filename. If any other object shares this output location, it
- * will return "ProjectName.make" instead, so that both objects may
- * coexist in the same directory.
- */
-const char* make_get_project_makefile(Session sess, Project prj)
-{
- const char* my_path;
- const char* their_path;
- int si, sn;
-
- assert(sess);
- assert(prj);
-
- /* get the full makefile path for this project */
- my_path = project_get_filename(prj, "Makefile", NULL);
-
- /* see if any other solution wants to use this same path */
- sn = session_num_solutions(sess);
- for (si = 0; si < sn; ++si)
- {
- int pi, pn;
-
- Solution sln2 = session_get_solution(sess, si);
- their_path = solution_get_filename(sln2, "Makefile", NULL);
- if (cstr_eq(my_path, their_path))
- {
- /* conflict; use the alternate name */
- my_path = project_get_filename(prj, NULL, ".make");
- return my_path;
- }
-
- /* check any projects contained by this solution */
- pn = solution_num_projects(sln2);
- for (pi = 0; pi < pn; ++pi)
- {
- Project prj2 = solution_get_project(sln2, pi);
- if (prj != prj2)
- {
- their_path = project_get_filename(prj2, "Makefile", NULL);
- if (cstr_eq(my_path, their_path))
- {
- /* conflict; use the alternate name */
- my_path = project_get_filename(prj, NULL, ".make");
- return my_path;
- }
- }
- }
- }
-
- /* all good */
- return my_path;
-}
-
-
-/**
- * Build a list of project names contained by the solution.
- * \param sln The solution to query.
- * \returns A list of project names. The caller owns this list and must destroy it when done.
- */
-Strings make_get_project_names(Solution sln)
-{
- Strings result;
- int i, n;
-
- result = strings_create();
- n = solution_num_projects(sln);
- for (i = 0; i < n; ++i)
- {
- Project prj = solution_get_project(sln, i);
- const char* name = project_get_name(prj);
- strings_add(result, name);
- }
-
- return result;
-}
-
-
-/**
- * Get the name of the solution makefile for a particular solution.
- * \param sess The current execution session context.
- * \param sln The solution being requested.
- * \returns If this solution is the only object which will generate output to
- * its target location, then this function will return "Makefile" as
- * the filename. If any other solution shares this output location, it
- * will return "SolutionName.make" instead, so that both objects may
- * coexist in the same directory.
- */
-const char* make_get_solution_makefile(Session sess, Solution sln)
-{
- const char* my_path;
- const char* their_path;
- int i, n;
-
- assert(sess);
- assert(sln);
-
- /* get the full makefile path for this solution */
- my_path = solution_get_filename(sln, "Makefile", NULL);
-
- /* see if any other solution wants to use this same path */
- n = session_num_solutions(sess);
- for (i = 0; i < n; ++i)
- {
- Solution them = session_get_solution(sess, i);
- if (them != sln)
- {
- their_path = solution_get_filename(them, "Makefile", NULL);
- if (cstr_eq(my_path, their_path))
- {
- /* conflict; use the alternate name */
- my_path = solution_get_filename(sln, NULL, ".make");
- return my_path;
- }
- }
- }
-
- /* all good */
- return my_path;
-}
+/**
+ * \file make.c
+ * \brief Support functions for the makefile action.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include "premake.h"
+#include "make.h"
+#include "base/cstr.h"
+#include "base/error.h"
+#include "base/path.h"
+
+
+/**
+ * Given a source file filename, returns the name of the corresponding .o file.
+ * \param filename The source code filename.
+ * \returns The filename of the .o file.
+ */
+const char* make_get_obj_filename(const char* filename)
+{
+ const char* basename = path_basename(filename);
+ const char* obj_name = cstr_format("$(OBJDIR)/%s.o", basename);
+ return obj_name;
+}
+
+
+/**
+ * Get the name of the project makefile for a particular project.
+ * \param sess The current execution session context.
+ * \param prj The project being requested.
+ * \returns If this project is the only object which will generate output to
+ * its target location, then this function will return "Makefile" as
+ * the filename. If any other object shares this output location, it
+ * will return "ProjectName.make" instead, so that both objects may
+ * coexist in the same directory.
+ */
+const char* make_get_project_makefile(Session sess, Project prj)
+{
+ const char* my_path;
+ const char* their_path;
+ int si, sn;
+
+ assert(sess);
+ assert(prj);
+
+ /* get the full makefile path for this project */
+ my_path = project_get_filename(prj, "Makefile", NULL);
+
+ /* see if any other solution wants to use this same path */
+ sn = session_num_solutions(sess);
+ for (si = 0; si < sn; ++si)
+ {
+ int pi, pn;
+
+ Solution sln2 = session_get_solution(sess, si);
+ their_path = solution_get_filename(sln2, "Makefile", NULL);
+ if (cstr_eq(my_path, their_path))
+ {
+ /* conflict; use the alternate name */
+ my_path = project_get_filename(prj, NULL, ".make");
+ return my_path;
+ }
+
+ /* check any projects contained by this solution */
+ pn = solution_num_projects(sln2);
+ for (pi = 0; pi < pn; ++pi)
+ {
+ Project prj2 = solution_get_project(sln2, pi);
+ if (prj != prj2)
+ {
+ their_path = project_get_filename(prj2, "Makefile", NULL);
+ if (cstr_eq(my_path, their_path))
+ {
+ /* conflict; use the alternate name */
+ my_path = project_get_filename(prj, NULL, ".make");
+ return my_path;
+ }
+ }
+ }
+ }
+
+ /* all good */
+ return my_path;
+}
+
+
+/**
+ * Build a list of project names contained by the solution.
+ * \param sln The solution to query.
+ * \returns A list of project names. The caller owns this list and must destroy it when done.
+ */
+Strings make_get_project_names(Solution sln)
+{
+ Strings result;
+ int i, n;
+
+ result = strings_create();
+ n = solution_num_projects(sln);
+ for (i = 0; i < n; ++i)
+ {
+ Project prj = solution_get_project(sln, i);
+ const char* name = project_get_name(prj);
+ strings_add(result, name);
+ }
+
+ return result;
+}
+
+
+/**
+ * Get the name of the solution makefile for a particular solution.
+ * \param sess The current execution session context.
+ * \param sln The solution being requested.
+ * \returns If this solution is the only object which will generate output to
+ * its target location, then this function will return "Makefile" as
+ * the filename. If any other solution shares this output location, it
+ * will return "SolutionName.make" instead, so that both objects may
+ * coexist in the same directory.
+ */
+const char* make_get_solution_makefile(Session sess, Solution sln)
+{
+ const char* my_path;
+ const char* their_path;
+ int i, n;
+
+ assert(sess);
+ assert(sln);
+
+ /* get the full makefile path for this solution */
+ my_path = solution_get_filename(sln, "Makefile", NULL);
+
+ /* see if any other solution wants to use this same path */
+ n = session_num_solutions(sess);
+ for (i = 0; i < n; ++i)
+ {
+ Solution them = session_get_solution(sess, i);
+ if (them != sln)
+ {
+ their_path = solution_get_filename(them, "Makefile", NULL);
+ if (cstr_eq(my_path, their_path))
+ {
+ /* conflict; use the alternate name */
+ my_path = solution_get_filename(sln, NULL, ".make");
+ return my_path;
+ }
+ }
+ }
+
+ /* all good */
+ return my_path;
+}
diff --git a/src/action/make/make.h b/src/action/make/make.h
index 8e757d2..4ac8e43 100644
--- a/src/action/make/make.h
+++ b/src/action/make/make.h
@@ -1,16 +1,16 @@
-/**
- * \file make.h
- * \brief Support functions for the makefile action.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-#if !defined(PREMAKE_MAKE_H)
-#define PREMAKE_MAKE_H
-
-#include "session/session.h"
-
-const char* make_get_obj_filename(const char* filename);
-const char* make_get_project_makefile(Session sess, Project prj);
-Strings make_get_project_names(Solution sln);
-const char* make_get_solution_makefile(Session sess, Solution sln);
-
-#endif
+/**
+ * \file make.h
+ * \brief Support functions for the makefile action.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+#if !defined(PREMAKE_MAKE_H)
+#define PREMAKE_MAKE_H
+
+#include "session/session.h"
+
+const char* make_get_obj_filename(const char* filename);
+const char* make_get_project_makefile(Session sess, Project prj);
+Strings make_get_project_names(Solution sln);
+const char* make_get_solution_makefile(Session sess, Solution sln);
+
+#endif
diff --git a/src/action/make/make_project.c b/src/action/make/make_project.c
index 8487e55..8bdac0a 100644
--- a/src/action/make/make_project.c
+++ b/src/action/make/make_project.c
@@ -1,320 +1,320 @@
-/**
- * \file make_project.c
- * \brief Makefile project generation functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include "premake.h"
-#include "action/make/make.h"
-#include "action/make/make_project.h"
-#include "base/error.h"
-#include "base/path.h"
-
-
-/**
- * Write the rules to clean up output files on a `make clean`.
- */
-int make_project_clean_rules(Session sess, Project prj, Stream strm)
-{
- int z = OKAY;
- UNUSED(sess);
- z |= stream_writeline(strm, "clean:");
- z |= stream_writeline(strm, "\t@echo Cleaning %s", project_get_name(prj));
- z |= stream_writeline(strm, "ifeq (posix, $(SHELLTYPE))");
- z |= stream_writeline(strm, "\t@rm -f $(SYS_OUTFILE)");
- z |= stream_writeline(strm, "\t@rm -rf $(SYS_OBJDIR)");
- z |= stream_writeline(strm, "else");
- z |= stream_writeline(strm, "\t@if exist $(SYS_OUTFILE) del $(SYS_OUTFILE)");
- z |= stream_writeline(strm, "\t@if exist $(SYS_OBJDIR) rmdir /s /q $(SYS_OBJDIR)");
- z |= stream_writeline(strm, "endif");
- z |= stream_writeline(strm, "");
- return OKAY;
-}
-
-
-/**
- * Write the opening conditional for a configuration block.
- */
-int make_project_config_conditional(Session sess, Project prj, Stream strm)
-{
- const char* cfg_name = project_get_configuration_filter(prj);
- UNUSED(sess);
- return stream_writeline(strm, "ifeq ($(CONFIG),%s)", cfg_name);
-}
-
-
-/**
- * Write the CFLAGS configuration variable.
- */
-int make_project_config_cflags(Session sess, Project prj, Stream strm)
-{
- UNUSED(sess);
- UNUSED(prj);
- return stream_writeline(strm, " CFLAGS += $(CPPFLAGS) $(ARCHFLAGS)");
-}
-
-
-/**
- * Write the CPPFLAGS configuration variable.
- */
-int make_project_config_cppflags(Session sess, Project prj, Stream strm)
-{
- UNUSED(sess);
- UNUSED(prj);
- return stream_writeline(strm, " CPPFLAGS += -MMD");
-}
-
-
-/**
- * Write the CXXFLAGS configuration variable.
- */
-int make_project_config_cxxflags(Session sess, Project prj, Stream strm)
-{
- UNUSED(sess);
- UNUSED(prj);
- return stream_writeline(strm, " CXXFLAGS += $(CFLAGS)");
-}
-
-
-/**
- * Write the opening conditional for a configuration block.
- */
-int make_project_config_end(Session sess, Project prj, Stream strm)
-{
- int z;
- UNUSED(sess);
- UNUSED(prj);
- z = stream_writeline(strm, "endif");
- z |= stream_writeline(strm, "");
- return z;
-}
-
-
-/**
- * Write the LDDEPS configuration variable.
- */
-int make_project_config_lddeps(Session sess, Project prj, Stream strm)
-{
- UNUSED(sess);
- UNUSED(prj);
- return stream_writeline(strm, " LDDEPS :=");
-}
-
-
-/**
- * Write the LDFLAGS configuration variable.
- */
-int make_project_config_ldflags(Session sess, Project prj, Stream strm)
-{
- UNUSED(sess);
- UNUSED(prj);
- return stream_writeline(strm, " LDFLAGS +=");
-}
-
-
-/**
- * Write the OBJDIR configuration variable.
- */
-int make_project_config_objdir(Session sess, Project prj, Stream strm)
-{
- const char* cfg_name = project_get_configuration_filter(prj);
- UNUSED(sess);
- return stream_writeline(strm, " OBJDIR := obj/%s", cfg_name);
-}
-
-
-/**
- * Write the OUTDIR configuration variable.
- */
-int make_project_config_outdir(Session sess, Project prj, Stream strm)
-{
- UNUSED(sess);
- UNUSED(prj);
- return stream_writeline(strm, " OUTDIR := .");
-}
-
-
-/**
- * Write the OUTFILE configuration variable.
- */
-int make_project_config_outfile(Session sess, Project prj, Stream strm)
-{
- const char* outfile = project_get_outfile(prj);
- UNUSED(sess);
- return stream_writeline(strm, " OUTFILE := $(OUTDIR)/%s", outfile);
-}
-
-
-/**
- * Write the RESFLAGS configuration variable.
- */
-int make_project_config_resflags(Session sess, Project prj, Stream strm)
-{
- UNUSED(sess);
- UNUSED(prj);
- return stream_writeline(strm, " RESFLAGS +=");
-}
-
-
-/**
- * Create a new output stream for a project , and make it active for subsequent writes.
- */
-int make_project_create(Session sess, Project prj, Stream strm)
-{
- /* create the makefile */
- const char* filename = make_get_project_makefile(sess, prj);
- strm = stream_create_file(filename);
- if (!strm)
- {
- return !OKAY;
- }
-
- /* make the stream active for the functions that come after */
- session_set_active_stream(sess, strm);
- return OKAY;
-}
-
-
-/**
- * Include the auto-generated dependencies into the project makefile.
- */
-int make_project_include_dependencies(Session sess, Project prj, Stream strm)
-{
- UNUSED(sess);
- UNUSED(prj);
- return stream_writeline(strm, "-include $(OBJECTS:%%.o=%%.d)");
-}
-
-
-/**
- * Write the rules to create the output and object directories.
- */
-int make_project_mkdir_rules(Session sess, Project prj, Stream strm)
-{
- int z = OKAY;
- UNUSED(sess);
- UNUSED(prj);
- z |= stream_writeline(strm, "$(OUTDIR):");
- z |= stream_writeline(strm, "\t@echo Creating $(OUTDIR)");
- z |= stream_writeline(strm, "\t@$(MKDIR) $(SYS_OUTDIR)");
- z |= stream_writeline(strm, "");
- z |= stream_writeline(strm, "$(OBJDIR):");
- z |= stream_writeline(strm, "\t@echo Creating $(OBJDIR)");
- z |= stream_writeline(strm, "\t@$(MKDIR) $(SYS_OBJDIR)");
- z |= stream_writeline(strm, "");
- return z;
-}
-
-
-/**
- * Write the OBJECTS project variable.
- */
-int make_project_objects(Session sess, Project prj, Stream strm)
-{
- Strings files;
- int i, n, z;
- UNUSED(sess);
-
- z = stream_writeline(strm, "OBJECTS := \\");
-
- files = project_get_files(prj);
- n = strings_size(files);
- for (i = 0; i < n; ++i)
- {
- const char* filename = strings_item(files, i);
- if (path_is_cpp_source(filename))
- {
- const char* obj_name = make_get_obj_filename(filename);
- z |= stream_writeline(strm, "\t%s \\", obj_name);
- }
- }
-
- z |= stream_writeline(strm, "");
- return z;
-}
-
-
-/**
- * Write the .PHONY rule for a project.
- */
-int make_project_phony_rule(Session sess, Project prj, Stream strm)
-{
- int z;
- UNUSED(sess);
- UNUSED(prj);
- z = stream_writeline(strm, ".PHONY: clean");
- z |= stream_writeline(strm, "");
- return z;
-}
-
-
-/**
- * Write the RESOURCES project variable.
- */
-int make_project_resources(Session sess, Project prj, Stream strm)
-{
- int z;
- UNUSED(sess);
- UNUSED(prj);
- z = stream_writeline(strm, "RESOURCES := \\");
- z |= stream_writeline(strm, "");
- return z;
-}
-
-
-/**
- * Write the project makefile signature.
- */
-int make_project_signature(Session sess, Project prj, Stream strm)
-{
- int z;
- UNUSED(sess);
- UNUSED(prj);
- z = stream_writeline(strm, "# GNU Makefile autogenerated by Premake");
- z |= stream_writeline(strm, "");
- return z;
-}
-
-
-/**
- * Write makefile rules for each source code file.
- */
-int make_project_source_rules(Session sess, Project prj, Stream strm)
-{
- Strings files;
- int i, n, z = OKAY;
- UNUSED(sess);
-
- files = project_get_files(prj);
- n = strings_size(files);
- for (i = 0; i < n; ++i)
- {
- const char* filename = strings_item(files, i);
- if (path_is_cpp_source(filename))
- {
- const char* obj_name = make_get_obj_filename(filename);
- z |= stream_writeline(strm, "%s: %s", obj_name, filename);
- z |= stream_writeline(strm, "\t@echo $(notdir $<)");
- z |= stream_writeline(strm, "\t@$(CXX) $(CXXFLAGS) -o $@ -c $<");
- z |= stream_writeline(strm, "");
- }
- }
-
- return z;
-}
-
-
-/**
- * Write the project output target rule.
- */
-int make_project_target(Session sess, Project prj, Stream strm)
-{
- int z = OKAY;
- UNUSED(sess);
- z |= stream_writeline(strm, "$(OUTFILE): $(OUTDIR) $(OBJDIR) $(OBJECTS) $(LDDEPS) $(RESOURCES)");
- z |= stream_writeline(strm, "\t@echo Linking %s", project_get_name(prj));
- z |= stream_writeline(strm, "\t@$(CXX) -o $@ $(LDFLAGS) $(ARCHFLAGS) $(OBJECTS) $(RESOURCES)");
- z |= stream_writeline(strm, "");
- return z;
-}
+/**
+ * \file make_project.c
+ * \brief Makefile project generation functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include "premake.h"
+#include "action/make/make.h"
+#include "action/make/make_project.h"
+#include "base/error.h"
+#include "base/path.h"
+
+
+/**
+ * Write the rules to clean up output files on a `make clean`.
+ */
+int make_project_clean_rules(Session sess, Project prj, Stream strm)
+{
+ int z = OKAY;
+ UNUSED(sess);
+ z |= stream_writeline(strm, "clean:");
+ z |= stream_writeline(strm, "\t@echo Cleaning %s", project_get_name(prj));
+ z |= stream_writeline(strm, "ifeq (posix, $(SHELLTYPE))");
+ z |= stream_writeline(strm, "\t@rm -f $(SYS_OUTFILE)");
+ z |= stream_writeline(strm, "\t@rm -rf $(SYS_OBJDIR)");
+ z |= stream_writeline(strm, "else");
+ z |= stream_writeline(strm, "\t@if exist $(SYS_OUTFILE) del $(SYS_OUTFILE)");
+ z |= stream_writeline(strm, "\t@if exist $(SYS_OBJDIR) rmdir /s /q $(SYS_OBJDIR)");
+ z |= stream_writeline(strm, "endif");
+ z |= stream_writeline(strm, "");
+ return OKAY;
+}
+
+
+/**
+ * Write the opening conditional for a configuration block.
+ */
+int make_project_config_conditional(Session sess, Project prj, Stream strm)
+{
+ const char* cfg_name = project_get_configuration_filter(prj);
+ UNUSED(sess);
+ return stream_writeline(strm, "ifeq ($(CONFIG),%s)", cfg_name);
+}
+
+
+/**
+ * Write the CFLAGS configuration variable.
+ */
+int make_project_config_cflags(Session sess, Project prj, Stream strm)
+{
+ UNUSED(sess);
+ UNUSED(prj);
+ return stream_writeline(strm, " CFLAGS += $(CPPFLAGS) $(ARCHFLAGS)");
+}
+
+
+/**
+ * Write the CPPFLAGS configuration variable.
+ */
+int make_project_config_cppflags(Session sess, Project prj, Stream strm)
+{
+ UNUSED(sess);
+ UNUSED(prj);
+ return stream_writeline(strm, " CPPFLAGS += -MMD");
+}
+
+
+/**
+ * Write the CXXFLAGS configuration variable.
+ */
+int make_project_config_cxxflags(Session sess, Project prj, Stream strm)
+{
+ UNUSED(sess);
+ UNUSED(prj);
+ return stream_writeline(strm, " CXXFLAGS += $(CFLAGS)");
+}
+
+
+/**
+ * Write the opening conditional for a configuration block.
+ */
+int make_project_config_end(Session sess, Project prj, Stream strm)
+{
+ int z;
+ UNUSED(sess);
+ UNUSED(prj);
+ z = stream_writeline(strm, "endif");
+ z |= stream_writeline(strm, "");
+ return z;
+}
+
+
+/**
+ * Write the LDDEPS configuration variable.
+ */
+int make_project_config_lddeps(Session sess, Project prj, Stream strm)
+{
+ UNUSED(sess);
+ UNUSED(prj);
+ return stream_writeline(strm, " LDDEPS :=");
+}
+
+
+/**
+ * Write the LDFLAGS configuration variable.
+ */
+int make_project_config_ldflags(Session sess, Project prj, Stream strm)
+{
+ UNUSED(sess);
+ UNUSED(prj);
+ return stream_writeline(strm, " LDFLAGS +=");
+}
+
+
+/**
+ * Write the OBJDIR configuration variable.
+ */
+int make_project_config_objdir(Session sess, Project prj, Stream strm)
+{
+ const char* cfg_name = project_get_configuration_filter(prj);
+ UNUSED(sess);
+ return stream_writeline(strm, " OBJDIR := obj/%s", cfg_name);
+}
+
+
+/**
+ * Write the OUTDIR configuration variable.
+ */
+int make_project_config_outdir(Session sess, Project prj, Stream strm)
+{
+ UNUSED(sess);
+ UNUSED(prj);
+ return stream_writeline(strm, " OUTDIR := .");
+}
+
+
+/**
+ * Write the OUTFILE configuration variable.
+ */
+int make_project_config_outfile(Session sess, Project prj, Stream strm)
+{
+ const char* outfile = project_get_outfile(prj);
+ UNUSED(sess);
+ return stream_writeline(strm, " OUTFILE := $(OUTDIR)/%s", outfile);
+}
+
+
+/**
+ * Write the RESFLAGS configuration variable.
+ */
+int make_project_config_resflags(Session sess, Project prj, Stream strm)
+{
+ UNUSED(sess);
+ UNUSED(prj);
+ return stream_writeline(strm, " RESFLAGS +=");
+}
+
+
+/**
+ * Create a new output stream for a project , and make it active for subsequent writes.
+ */
+int make_project_create(Session sess, Project prj, Stream strm)
+{
+ /* create the makefile */
+ const char* filename = make_get_project_makefile(sess, prj);
+ strm = stream_create_file(filename);
+ if (!strm)
+ {
+ return !OKAY;
+ }
+
+ /* make the stream active for the functions that come after */
+ session_set_active_stream(sess, strm);
+ return OKAY;
+}
+
+
+/**
+ * Include the auto-generated dependencies into the project makefile.
+ */
+int make_project_include_dependencies(Session sess, Project prj, Stream strm)
+{
+ UNUSED(sess);
+ UNUSED(prj);
+ return stream_writeline(strm, "-include $(OBJECTS:%%.o=%%.d)");
+}
+
+
+/**
+ * Write the rules to create the output and object directories.
+ */
+int make_project_mkdir_rules(Session sess, Project prj, Stream strm)
+{
+ int z = OKAY;
+ UNUSED(sess);
+ UNUSED(prj);
+ z |= stream_writeline(strm, "$(OUTDIR):");
+ z |= stream_writeline(strm, "\t@echo Creating $(OUTDIR)");
+ z |= stream_writeline(strm, "\t@$(MKDIR) $(SYS_OUTDIR)");
+ z |= stream_writeline(strm, "");
+ z |= stream_writeline(strm, "$(OBJDIR):");
+ z |= stream_writeline(strm, "\t@echo Creating $(OBJDIR)");
+ z |= stream_writeline(strm, "\t@$(MKDIR) $(SYS_OBJDIR)");
+ z |= stream_writeline(strm, "");
+ return z;
+}
+
+
+/**
+ * Write the OBJECTS project variable.
+ */
+int make_project_objects(Session sess, Project prj, Stream strm)
+{
+ Strings files;
+ int i, n, z;
+ UNUSED(sess);
+
+ z = stream_writeline(strm, "OBJECTS := \\");
+
+ files = project_get_files(prj);
+ n = strings_size(files);
+ for (i = 0; i < n; ++i)
+ {
+ const char* filename = strings_item(files, i);
+ if (path_is_cpp_source(filename))
+ {
+ const char* obj_name = make_get_obj_filename(filename);
+ z |= stream_writeline(strm, "\t%s \\", obj_name);
+ }
+ }
+
+ z |= stream_writeline(strm, "");
+ return z;
+}
+
+
+/**
+ * Write the .PHONY rule for a project.
+ */
+int make_project_phony_rule(Session sess, Project prj, Stream strm)
+{
+ int z;
+ UNUSED(sess);
+ UNUSED(prj);
+ z = stream_writeline(strm, ".PHONY: clean");
+ z |= stream_writeline(strm, "");
+ return z;
+}
+
+
+/**
+ * Write the RESOURCES project variable.
+ */
+int make_project_resources(Session sess, Project prj, Stream strm)
+{
+ int z;
+ UNUSED(sess);
+ UNUSED(prj);
+ z = stream_writeline(strm, "RESOURCES := \\");
+ z |= stream_writeline(strm, "");
+ return z;
+}
+
+
+/**
+ * Write the project makefile signature.
+ */
+int make_project_signature(Session sess, Project prj, Stream strm)
+{
+ int z;
+ UNUSED(sess);
+ UNUSED(prj);
+ z = stream_writeline(strm, "# GNU Makefile autogenerated by Premake");
+ z |= stream_writeline(strm, "");
+ return z;
+}
+
+
+/**
+ * Write makefile rules for each source code file.
+ */
+int make_project_source_rules(Session sess, Project prj, Stream strm)
+{
+ Strings files;
+ int i, n, z = OKAY;
+ UNUSED(sess);
+
+ files = project_get_files(prj);
+ n = strings_size(files);
+ for (i = 0; i < n; ++i)
+ {
+ const char* filename = strings_item(files, i);
+ if (path_is_cpp_source(filename))
+ {
+ const char* obj_name = make_get_obj_filename(filename);
+ z |= stream_writeline(strm, "%s: %s", obj_name, filename);
+ z |= stream_writeline(strm, "\t@echo $(notdir $<)");
+ z |= stream_writeline(strm, "\t@$(CXX) $(CXXFLAGS) -o $@ -c $<");
+ z |= stream_writeline(strm, "");
+ }
+ }
+
+ return z;
+}
+
+
+/**
+ * Write the project output target rule.
+ */
+int make_project_target(Session sess, Project prj, Stream strm)
+{
+ int z = OKAY;
+ UNUSED(sess);
+ z |= stream_writeline(strm, "$(OUTFILE): $(OUTDIR) $(OBJDIR) $(OBJECTS) $(LDDEPS) $(RESOURCES)");
+ z |= stream_writeline(strm, "\t@echo Linking %s", project_get_name(prj));
+ z |= stream_writeline(strm, "\t@$(CXX) -o $@ $(LDFLAGS) $(ARCHFLAGS) $(OBJECTS) $(RESOURCES)");
+ z |= stream_writeline(strm, "");
+ return z;
+}
diff --git a/src/action/make/make_project.h b/src/action/make/make_project.h
index 65482c1..e8a3ef8 100644
--- a/src/action/make/make_project.h
+++ b/src/action/make/make_project.h
@@ -1,35 +1,35 @@
-/**
- * \file make_project.h
- * \brief Makefile project generation functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-#if !defined(PREMAKE_MAKE_PROJECT_H)
-#define PREMAKE_MAKE_PROJECT_H
-
-#include "session/session.h"
-
-int gmake_project_shell_detect(Session sess, Project prj, Stream strm);
-
-int make_project_clean_rules(Session sess, Project prj, Stream strm);
-int make_project_config_conditional(Session sess, Project prj, Stream strm);
-int make_project_config_cflags(Session sess, Project prj, Stream strm);
-int make_project_config_cppflags(Session sess, Project prj, Stream strm);
-int make_project_config_cxxflags(Session sess, Project prj, Stream strm);
-int make_project_config_end(Session sess, Project prj, Stream strm);
-int make_project_config_lddeps(Session sess, Project prj, Stream strm);
-int make_project_config_ldflags(Session sess, Project prj, Stream strm);
-int make_project_config_objdir(Session sess, Project prj, Stream strm);
-int make_project_config_outdir(Session sess, Project prj, Stream strm);
-int make_project_config_outfile(Session sess, Project prj, Stream strm);
-int make_project_config_resflags(Session sess, Project prj, Stream strm);
-int make_project_create(Session sess, Project prj, Stream strm);
-int make_project_include_dependencies(Session sess, Project prj, Stream strm);
-int make_project_mkdir_rules(Session sess, Project prj, Stream strm);
-int make_project_objects(Session sess, Project prj, Stream strm);
-int make_project_phony_rule(Session sess, Project prj, Stream strm);
-int make_project_resources(Session sess, Project prj, Stream strm);
-int make_project_signature(Session sess, Project prj, Stream strm);
-int make_project_source_rules(Session sess, Project prj, Stream strm);
-int make_project_target(Session sess, Project prj, Stream strm);
-
-#endif
+/**
+ * \file make_project.h
+ * \brief Makefile project generation functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+#if !defined(PREMAKE_MAKE_PROJECT_H)
+#define PREMAKE_MAKE_PROJECT_H
+
+#include "session/session.h"
+
+int gmake_project_shell_detect(Session sess, Project prj, Stream strm);
+
+int make_project_clean_rules(Session sess, Project prj, Stream strm);
+int make_project_config_conditional(Session sess, Project prj, Stream strm);
+int make_project_config_cflags(Session sess, Project prj, Stream strm);
+int make_project_config_cppflags(Session sess, Project prj, Stream strm);
+int make_project_config_cxxflags(Session sess, Project prj, Stream strm);
+int make_project_config_end(Session sess, Project prj, Stream strm);
+int make_project_config_lddeps(Session sess, Project prj, Stream strm);
+int make_project_config_ldflags(Session sess, Project prj, Stream strm);
+int make_project_config_objdir(Session sess, Project prj, Stream strm);
+int make_project_config_outdir(Session sess, Project prj, Stream strm);
+int make_project_config_outfile(Session sess, Project prj, Stream strm);
+int make_project_config_resflags(Session sess, Project prj, Stream strm);
+int make_project_create(Session sess, Project prj, Stream strm);
+int make_project_include_dependencies(Session sess, Project prj, Stream strm);
+int make_project_mkdir_rules(Session sess, Project prj, Stream strm);
+int make_project_objects(Session sess, Project prj, Stream strm);
+int make_project_phony_rule(Session sess, Project prj, Stream strm);
+int make_project_resources(Session sess, Project prj, Stream strm);
+int make_project_signature(Session sess, Project prj, Stream strm);
+int make_project_source_rules(Session sess, Project prj, Stream strm);
+int make_project_target(Session sess, Project prj, Stream strm);
+
+#endif
diff --git a/src/action/make/make_solution.c b/src/action/make/make_solution.c
index 2fa5cec..5f31087 100644
--- a/src/action/make/make_solution.c
+++ b/src/action/make/make_solution.c
@@ -1,34 +1,34 @@
-/**
- * \file make_solution.c
- * \brief Makefile solution generation functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include "premake.h"
-#include "action/make/make.h"
-#include "action/make/make_solution.h"
-#include "base/error.h"
-
-
-/**
- * Create a new output stream for a solution, and make it active for subsequent writes.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int make_solution_create(Session sess, Solution sln, Stream strm)
-{
- /* create the makefile */
- const char* filename = make_get_solution_makefile(sess, sln);
- strm = stream_create_file(filename);
- if (!strm)
- {
- return !OKAY;
- }
-
- /* make the stream active for the functions that come after */
- session_set_active_stream(sess, strm);
- return OKAY;
-}
+/**
+ * \file make_solution.c
+ * \brief Makefile solution generation functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include "premake.h"
+#include "action/make/make.h"
+#include "action/make/make_solution.h"
+#include "base/error.h"
+
+
+/**
+ * Create a new output stream for a solution, and make it active for subsequent writes.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int make_solution_create(Session sess, Solution sln, Stream strm)
+{
+ /* create the makefile */
+ const char* filename = make_get_solution_makefile(sess, sln);
+ strm = stream_create_file(filename);
+ if (!strm)
+ {
+ return !OKAY;
+ }
+
+ /* make the stream active for the functions that come after */
+ session_set_active_stream(sess, strm);
+ return OKAY;
+}
diff --git a/src/action/make/make_solution.h b/src/action/make/make_solution.h
index e7ae51b..01a5989 100644
--- a/src/action/make/make_solution.h
+++ b/src/action/make/make_solution.h
@@ -1,20 +1,20 @@
-/**
- * \file make_solution.h
- * \brief Makefile solution generation functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-#if !defined(PREMAKE_MAKE_SOLUTION_H)
-#define PREMAKE_MAKE_SOLUTION_H
-
-#include "session/session.h"
-
-int make_solution_create(Session sess, Solution sln, Stream strm);
-
-int gmake_solution_all_rule(Session sess, Solution sln, Stream strm);
-int gmake_solution_clean_rule(Session sess, Solution sln, Stream strm);
-int gmake_solution_default_config(Session sess, Solution sln, Stream strm);
-int gmake_solution_phony_rule(Session sess, Solution sln, Stream strm);
-int gmake_solution_projects(Session sess, Solution sln, Stream strm);
-int gmake_solution_signature(Session sess, Solution sln, Stream strm);
-
-#endif
+/**
+ * \file make_solution.h
+ * \brief Makefile solution generation functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+#if !defined(PREMAKE_MAKE_SOLUTION_H)
+#define PREMAKE_MAKE_SOLUTION_H
+
+#include "session/session.h"
+
+int make_solution_create(Session sess, Solution sln, Stream strm);
+
+int gmake_solution_all_rule(Session sess, Solution sln, Stream strm);
+int gmake_solution_clean_rule(Session sess, Solution sln, Stream strm);
+int gmake_solution_default_config(Session sess, Solution sln, Stream strm);
+int gmake_solution_phony_rule(Session sess, Solution sln, Stream strm);
+int gmake_solution_projects(Session sess, Solution sln, Stream strm);
+int gmake_solution_signature(Session sess, Solution sln, Stream strm);
+
+#endif
diff --git a/src/action/make/tests/gmake_project_tests.cpp b/src/action/make/tests/gmake_project_tests.cpp
index 55646d3..ba0821a 100644
--- a/src/action/make/tests/gmake_project_tests.cpp
+++ b/src/action/make/tests/gmake_project_tests.cpp
@@ -1,249 +1,249 @@
-/**
- * \file gmake_project_tests.cpp
- * \brief Automated tests for GNU makefile project processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/make/make_project.h"
-#include "platform/platform.h"
-}
-
-SUITE(action)
-{
- TEST_FIXTURE(FxAction, MakeProject_Signature)
- {
- make_project_signature(sess, prj, strm);
- CHECK_EQUAL(
- "# GNU Makefile autogenerated by Premake\n"
- "\n",
- buffer);
- }
-
- TEST_FIXTURE(FxAction, MakeProject_Config_Conditional)
- {
- make_project_config_conditional(sess, prj, strm);
- CHECK_EQUAL(
- "ifeq ($(CONFIG),Debug)\n",
- buffer);
- }
-
- TEST_FIXTURE(FxAction, MakeProject_Config_End)
- {
- make_project_config_end(sess, prj, strm);
- CHECK_EQUAL(
- "endif\n"
- "\n",
- buffer);
- }
-
- TEST_FIXTURE(FxAction, MakeProject_Config_CFlags)
- {
- make_project_config_cflags(sess, prj, strm);
- CHECK_EQUAL(
- " CFLAGS += $(CPPFLAGS) $(ARCHFLAGS)\n",
- buffer);
- }
-
- TEST_FIXTURE(FxAction, MakeProject_Config_CppFlags)
- {
- make_project_config_cppflags(sess, prj, strm);
- CHECK_EQUAL(
- " CPPFLAGS += -MMD\n",
- buffer);
- }
-
- TEST_FIXTURE(FxAction, MakeProject_Config_CxxFlags)
- {
- make_project_config_cxxflags(sess, prj, strm);
- CHECK_EQUAL(
- " CXXFLAGS += $(CFLAGS)\n",
- buffer);
- }
-
- TEST_FIXTURE(FxAction, MakeProject_Config_LdDeps)
- {
- make_project_config_lddeps(sess, prj, strm);
- CHECK_EQUAL(
- " LDDEPS :=\n",
- buffer);
- }
-
- TEST_FIXTURE(FxAction, MakeProject_Config_LdFlags)
- {
- make_project_config_ldflags(sess, prj, strm);
- CHECK_EQUAL(
- " LDFLAGS +=\n",
- buffer);
- }
-
- TEST_FIXTURE(FxAction, MakeProject_Config_ObjDir)
- {
- make_project_config_objdir(sess, prj, strm);
- CHECK_EQUAL(
- " OBJDIR := obj/Debug\n",
- buffer);
- }
-
- TEST_FIXTURE(FxAction, MakeProject_Config_OutFile)
- {
- platform_set(MacOSX);
- make_project_config_outfile(sess, prj, strm);
- CHECK_EQUAL(
- " OUTFILE := $(OUTDIR)/MyProject\n",
- buffer);
- }
-
- TEST_FIXTURE(FxAction, MakeProject_Config_OutDir)
- {
- make_project_config_outdir(sess, prj, strm);
- CHECK_EQUAL(
- " OUTDIR := .\n",
- buffer);
- }
-
- TEST_FIXTURE(FxAction, MakeProject_Config_ResFlags)
- {
- make_project_config_resflags(sess, prj, strm);
- CHECK_EQUAL(
- " RESFLAGS +=\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Object file list tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, MakeProject_Objects_ConvertsFileExtension)
- {
- char* files[] = { "Hello.cpp", "Goodbye.cpp", NULL };
- SetField(prj, ProjectFiles, files);
- make_project_objects(sess, prj, strm);
- CHECK_EQUAL(
- "OBJECTS := \\\n"
- "\t$(OBJDIR)/Hello.o \\\n"
- "\t$(OBJDIR)/Goodbye.o \\\n"
- "\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Resource file list tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, MakeProject_Resources)
- {
- make_project_resources(sess, prj, strm);
- CHECK_EQUAL(
- "RESOURCES := \\\n"
- "\n",
- buffer);
- }
-
-
- /**********************************************************************
- * .PHONY rule tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, MakeProject_PhonyRule)
- {
- make_project_phony_rule(sess, prj, strm);
- CHECK_EQUAL(
- ".PHONY: clean\n"
- "\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Output target tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, MakeProject_OutputTarget)
- {
- make_project_target(sess, prj, strm);
- CHECK_EQUAL(
- "$(OUTFILE): $(OUTDIR) $(OBJDIR) $(OBJECTS) $(LDDEPS) $(RESOURCES)\n"
- "\t@echo Linking MyProject\n"
- "\t@$(CXX) -o $@ $(LDFLAGS) $(ARCHFLAGS) $(OBJECTS) $(RESOURCES)\n"
- "\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Directory creation rules
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, MakeProject_MkdirRules)
- {
- make_project_mkdir_rules(sess, prj, strm);
- CHECK_EQUAL(
- "$(OUTDIR):\n"
- "\t@echo Creating $(OUTDIR)\n"
- "\t@$(MKDIR) $(SYS_OUTDIR)\n"
- "\n"
- "$(OBJDIR):\n"
- "\t@echo Creating $(OBJDIR)\n"
- "\t@$(MKDIR) $(SYS_OBJDIR)\n"
- "\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Clean rules
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, MakeProject_CleanRules)
- {
- make_project_clean_rules(sess, prj, strm);
- CHECK_EQUAL(
- "clean:\n"
- "\t@echo Cleaning MyProject\n"
- "ifeq (posix, $(SHELLTYPE))\n"
- "\t@rm -f $(SYS_OUTFILE)\n"
- "\t@rm -rf $(SYS_OBJDIR)\n"
- "else\n"
- "\t@if exist $(SYS_OUTFILE) del $(SYS_OUTFILE)\n"
- "\t@if exist $(SYS_OBJDIR) rmdir /s /q $(SYS_OBJDIR)\n"
- "endif\n"
- "\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Source rule tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, MakeProject_SourceRules)
- {
- char* files[] = { "Hello.cpp", NULL };
- SetField(prj, ProjectFiles, files);
- make_project_source_rules(sess, prj, strm);
- CHECK_EQUAL(
- "$(OBJDIR)/Hello.o: Hello.cpp\n"
- "\t@echo $(notdir $<)\n"
- "\t@$(CXX) $(CXXFLAGS) -o $@ -c $<\n"
- "\n",
- buffer);
- }
-
-
- /**********************************************************************
- * File dependency generation tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, MakeProject_IncludeDependencies)
- {
- make_project_include_dependencies(sess, prj, strm);
- CHECK_EQUAL(
- "-include $(OBJECTS:%.o=%.d)\n",
- buffer);
- }
-}
+/**
+ * \file gmake_project_tests.cpp
+ * \brief Automated tests for GNU makefile project processing.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/make/make_project.h"
+#include "platform/platform.h"
+}
+
+SUITE(action)
+{
+ TEST_FIXTURE(FxAction, MakeProject_Signature)
+ {
+ make_project_signature(sess, prj, strm);
+ CHECK_EQUAL(
+ "# GNU Makefile autogenerated by Premake\n"
+ "\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxAction, MakeProject_Config_Conditional)
+ {
+ make_project_config_conditional(sess, prj, strm);
+ CHECK_EQUAL(
+ "ifeq ($(CONFIG),Debug)\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxAction, MakeProject_Config_End)
+ {
+ make_project_config_end(sess, prj, strm);
+ CHECK_EQUAL(
+ "endif\n"
+ "\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxAction, MakeProject_Config_CFlags)
+ {
+ make_project_config_cflags(sess, prj, strm);
+ CHECK_EQUAL(
+ " CFLAGS += $(CPPFLAGS) $(ARCHFLAGS)\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxAction, MakeProject_Config_CppFlags)
+ {
+ make_project_config_cppflags(sess, prj, strm);
+ CHECK_EQUAL(
+ " CPPFLAGS += -MMD\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxAction, MakeProject_Config_CxxFlags)
+ {
+ make_project_config_cxxflags(sess, prj, strm);
+ CHECK_EQUAL(
+ " CXXFLAGS += $(CFLAGS)\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxAction, MakeProject_Config_LdDeps)
+ {
+ make_project_config_lddeps(sess, prj, strm);
+ CHECK_EQUAL(
+ " LDDEPS :=\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxAction, MakeProject_Config_LdFlags)
+ {
+ make_project_config_ldflags(sess, prj, strm);
+ CHECK_EQUAL(
+ " LDFLAGS +=\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxAction, MakeProject_Config_ObjDir)
+ {
+ make_project_config_objdir(sess, prj, strm);
+ CHECK_EQUAL(
+ " OBJDIR := obj/Debug\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxAction, MakeProject_Config_OutFile)
+ {
+ platform_set(MacOSX);
+ make_project_config_outfile(sess, prj, strm);
+ CHECK_EQUAL(
+ " OUTFILE := $(OUTDIR)/MyProject\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxAction, MakeProject_Config_OutDir)
+ {
+ make_project_config_outdir(sess, prj, strm);
+ CHECK_EQUAL(
+ " OUTDIR := .\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxAction, MakeProject_Config_ResFlags)
+ {
+ make_project_config_resflags(sess, prj, strm);
+ CHECK_EQUAL(
+ " RESFLAGS +=\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Object file list tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, MakeProject_Objects_ConvertsFileExtension)
+ {
+ char* files[] = { "Hello.cpp", "Goodbye.cpp", NULL };
+ SetField(prj, ProjectFiles, files);
+ make_project_objects(sess, prj, strm);
+ CHECK_EQUAL(
+ "OBJECTS := \\\n"
+ "\t$(OBJDIR)/Hello.o \\\n"
+ "\t$(OBJDIR)/Goodbye.o \\\n"
+ "\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Resource file list tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, MakeProject_Resources)
+ {
+ make_project_resources(sess, prj, strm);
+ CHECK_EQUAL(
+ "RESOURCES := \\\n"
+ "\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * .PHONY rule tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, MakeProject_PhonyRule)
+ {
+ make_project_phony_rule(sess, prj, strm);
+ CHECK_EQUAL(
+ ".PHONY: clean\n"
+ "\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Output target tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, MakeProject_OutputTarget)
+ {
+ make_project_target(sess, prj, strm);
+ CHECK_EQUAL(
+ "$(OUTFILE): $(OUTDIR) $(OBJDIR) $(OBJECTS) $(LDDEPS) $(RESOURCES)\n"
+ "\t@echo Linking MyProject\n"
+ "\t@$(CXX) -o $@ $(LDFLAGS) $(ARCHFLAGS) $(OBJECTS) $(RESOURCES)\n"
+ "\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Directory creation rules
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, MakeProject_MkdirRules)
+ {
+ make_project_mkdir_rules(sess, prj, strm);
+ CHECK_EQUAL(
+ "$(OUTDIR):\n"
+ "\t@echo Creating $(OUTDIR)\n"
+ "\t@$(MKDIR) $(SYS_OUTDIR)\n"
+ "\n"
+ "$(OBJDIR):\n"
+ "\t@echo Creating $(OBJDIR)\n"
+ "\t@$(MKDIR) $(SYS_OBJDIR)\n"
+ "\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Clean rules
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, MakeProject_CleanRules)
+ {
+ make_project_clean_rules(sess, prj, strm);
+ CHECK_EQUAL(
+ "clean:\n"
+ "\t@echo Cleaning MyProject\n"
+ "ifeq (posix, $(SHELLTYPE))\n"
+ "\t@rm -f $(SYS_OUTFILE)\n"
+ "\t@rm -rf $(SYS_OBJDIR)\n"
+ "else\n"
+ "\t@if exist $(SYS_OUTFILE) del $(SYS_OUTFILE)\n"
+ "\t@if exist $(SYS_OBJDIR) rmdir /s /q $(SYS_OBJDIR)\n"
+ "endif\n"
+ "\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Source rule tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, MakeProject_SourceRules)
+ {
+ char* files[] = { "Hello.cpp", NULL };
+ SetField(prj, ProjectFiles, files);
+ make_project_source_rules(sess, prj, strm);
+ CHECK_EQUAL(
+ "$(OBJDIR)/Hello.o: Hello.cpp\n"
+ "\t@echo $(notdir $<)\n"
+ "\t@$(CXX) $(CXXFLAGS) -o $@ -c $<\n"
+ "\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * File dependency generation tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, MakeProject_IncludeDependencies)
+ {
+ make_project_include_dependencies(sess, prj, strm);
+ CHECK_EQUAL(
+ "-include $(OBJECTS:%.o=%.d)\n",
+ buffer);
+ }
+}
diff --git a/src/action/make/tests/gmake_solution_tests.cpp b/src/action/make/tests/gmake_solution_tests.cpp
index 531289d..f9e918b 100644
--- a/src/action/make/tests/gmake_solution_tests.cpp
+++ b/src/action/make/tests/gmake_solution_tests.cpp
@@ -1,121 +1,121 @@
-/**
- * \file gmake_solution_tests.cpp
- * \brief Automated tests for GNU makefile solution processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/make/make_solution.h"
-}
-
-
-SUITE(action)
-{
- /**********************************************************************
- * Signature tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Gmake_SolutionSignature_IsCorrect)
- {
- gmake_solution_signature(sess, sln, strm);
- CHECK_EQUAL(
- "# GNU Makefile autogenerated by Premake\n"
- "# Usage: make [ CONFIG=config_name ]\n"
- "# Where {config_name} is one of:\n"
- "# Debug, Release\n"
- "\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Default configuration tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Gmake_SolutionDefaultConfig_IsCorrect)
- {
- gmake_solution_default_config(sess, sln, strm);
- CHECK_EQUAL(
- "ifndef CONFIG\n"
- " CONFIG=Debug\n"
- "endif\n"
- "export CONFIG\n"
- "\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Phony rule tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Gmake_SolutionPhonyRule_IsCorrect)
- {
- gmake_solution_phony_rule(sess, sln, strm);
- CHECK_EQUAL(
- ".PHONY: all clean MyProject\n"
- "\n",
- buffer);
- }
-
-
- /**********************************************************************
- * All rule tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Gmake_SolutionAllRule_IsCorrect)
- {
- gmake_solution_all_rule(sess, sln, strm);
- CHECK_EQUAL(
- "all: MyProject\n"
- "\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Project entry tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Gmake_ProjectEntry_InSameDirectory)
- {
- project_set_location(prj, "");
- gmake_solution_projects(sess, sln, strm);
- CHECK_EQUAL(
- "MyProject:\n"
- "\t@echo ==== Building MyProject ====\n"
- "\t@$(MAKE) -f MyProject.make\n"
- "\n",
- buffer);
- }
-
- TEST_FIXTURE(FxAction, Gmake_ProjectEntry_InDifferentDirectory)
- {
- project_set_location(prj, "MyProject");
- gmake_solution_projects(sess, sln, strm);
- CHECK_EQUAL(
- "MyProject:\n"
- "\t@echo ==== Building MyProject ====\n"
- "\t@$(MAKE) --no-print-directory -C MyProject\n"
- "\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Clean rule tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Gmake_CleanRule_IsCorrect)
- {
- project_set_location(prj, "");
- gmake_solution_clean_rule(sess, sln, strm);
- CHECK_EQUAL(
- "clean:\n"
- "\t@$(MAKE) -f MyProject.make clean\n",
- buffer);
- }
-
-}
+/**
+ * \file gmake_solution_tests.cpp
+ * \brief Automated tests for GNU makefile solution processing.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/make/make_solution.h"
+}
+
+
+SUITE(action)
+{
+ /**********************************************************************
+ * Signature tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Gmake_SolutionSignature_IsCorrect)
+ {
+ gmake_solution_signature(sess, sln, strm);
+ CHECK_EQUAL(
+ "# GNU Makefile autogenerated by Premake\n"
+ "# Usage: make [ CONFIG=config_name ]\n"
+ "# Where {config_name} is one of:\n"
+ "# Debug, Release\n"
+ "\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Default configuration tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Gmake_SolutionDefaultConfig_IsCorrect)
+ {
+ gmake_solution_default_config(sess, sln, strm);
+ CHECK_EQUAL(
+ "ifndef CONFIG\n"
+ " CONFIG=Debug\n"
+ "endif\n"
+ "export CONFIG\n"
+ "\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Phony rule tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Gmake_SolutionPhonyRule_IsCorrect)
+ {
+ gmake_solution_phony_rule(sess, sln, strm);
+ CHECK_EQUAL(
+ ".PHONY: all clean MyProject\n"
+ "\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * All rule tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Gmake_SolutionAllRule_IsCorrect)
+ {
+ gmake_solution_all_rule(sess, sln, strm);
+ CHECK_EQUAL(
+ "all: MyProject\n"
+ "\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Project entry tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Gmake_ProjectEntry_InSameDirectory)
+ {
+ project_set_location(prj, "");
+ gmake_solution_projects(sess, sln, strm);
+ CHECK_EQUAL(
+ "MyProject:\n"
+ "\t@echo ==== Building MyProject ====\n"
+ "\t@$(MAKE) -f MyProject.make\n"
+ "\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxAction, Gmake_ProjectEntry_InDifferentDirectory)
+ {
+ project_set_location(prj, "MyProject");
+ gmake_solution_projects(sess, sln, strm);
+ CHECK_EQUAL(
+ "MyProject:\n"
+ "\t@echo ==== Building MyProject ====\n"
+ "\t@$(MAKE) --no-print-directory -C MyProject\n"
+ "\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Clean rule tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Gmake_CleanRule_IsCorrect)
+ {
+ project_set_location(prj, "");
+ gmake_solution_clean_rule(sess, sln, strm);
+ CHECK_EQUAL(
+ "clean:\n"
+ "\t@$(MAKE) -f MyProject.make clean\n",
+ buffer);
+ }
+
+}
diff --git a/src/action/make/tests/make_solution_tests.cpp/make_solution_tests.cpp b/src/action/make/tests/make_solution_tests.cpp/make_solution_tests.cpp
deleted file mode 100644
index 62ff1fc..0000000
--- a/src/action/make/tests/make_solution_tests.cpp/make_solution_tests.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * \file make_solution_tests.cpp
- * \brief Automated tests for makefile solution processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "action/make/make_solution.h"
-}
-
-struct FxMakeSln
-{
- Session sess;
- Stream strm;
- Solution sln;
- char buffer[8192];
-
- FxMakeSln()
- {
- sess = session_create();
-
- strm = stream_create_null();
- stream_set_buffer(strm, buffer);
-
- sln = solution_create();
- }
-
- ~FxMakeSln()
- {
- solution_destroy(sln);
- stream_destroy(strm);
- session_destroy(sess);
- }
-};
-
-
-SUITE(action)
-{
- /**********************************************************************
- * Signature tests
- **********************************************************************/
-
- TEST_FIXTURE(FxMakeSln, Signature_IsCorrect_OnGnuMake)
- {
- session_set_action(sess, "gmake");
- make_solution_signature(sess, sln, strm);
- CHECK_EQUAL(
- "# GNU Makefile autogenerated by Premake\n"
- "# Usage: make [ CONFIG=config_name ]\n"
- "# Where {config_name} is one of:\n",
- buffer);
- }
-
-}
diff --git a/src/action/make/tests/make_tests.cpp b/src/action/make/tests/make_tests.cpp
index 10c6ac6..789fd53 100644
--- a/src/action/make/tests/make_tests.cpp
+++ b/src/action/make/tests/make_tests.cpp
@@ -1,98 +1,98 @@
-/**
- * \file make_tests.cpp
- * \brief Automated tests for the makefile generator support functions.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "action/make/make.h"
-#include "base/error.h"
-}
-
-
-struct FxMake
-{
- Session sess;
- Solution sln1;
- Solution sln2;
- Project prj1;
- Project prj2;
-
- FxMake()
- {
- sess = session_create();
- sln1 = AddSolution("MySolution1");
- sln2 = AddSolution("MySolution2");
- prj1 = AddProject("MyProject1");
- prj2 = AddProject("MyProject2");
- }
-
- ~FxMake()
- {
- session_destroy(sess);
- error_clear();
- }
-
- Solution AddSolution(const char* name)
- {
- Solution sln = solution_create();
- session_add_solution(sess, sln);
- solution_set_name(sln, name);
- solution_set_base_dir(sln, ".");
- return sln;
- }
-
- Project AddProject(const char* name)
- {
- Project prj = project_create();
- solution_add_project(sln1, prj);
- project_set_name(prj, name);
- project_set_base_dir(prj, ".");
- return prj;
- }
-};
-
-
-SUITE(action)
-{
- /**********************************************************************
- * Makefile naming tests
- **********************************************************************/
-
- TEST_FIXTURE(FxMake, GetSolutionMakefile_ReturnsMakefile_OnUniqueLocation)
- {
- solution_set_location(sln1, "MySolution");
- const char* result = make_get_solution_makefile(sess, sln1);
- CHECK_EQUAL("./MySolution/Makefile", result);
- }
-
- TEST_FIXTURE(FxMake, GetSolutionMakefile_ReturnsDotMake_OnSharedLocation)
- {
- const char* result = make_get_solution_makefile(sess, sln1);
- CHECK_EQUAL("./MySolution1.make", result);
- }
-
- TEST_FIXTURE(FxMake, GetProjectMakefile_ReturnsMakefile_OnUniqueLocation)
- {
- project_set_location(prj1, "MyProject");
- const char* result = make_get_project_makefile(sess, prj1);
- CHECK_EQUAL("./MyProject/Makefile", result);
- }
-
- TEST_FIXTURE(FxMake, GetProjectMakefile_ReturnsDotMake_OnSharedWithSolution)
- {
- project_set_location(prj2, "MyProject");
- const char* result = make_get_project_makefile(sess, prj1);
- CHECK_EQUAL("./MyProject1.make", result);
- }
-
- TEST_FIXTURE(FxMake, GetProjectMakefile_ReturnsDotMake_OnSharedWithProject)
- {
- project_set_location(prj1, "MyProject");
- project_set_location(prj2, "MyProject");
- const char* result = make_get_project_makefile(sess, prj1);
- CHECK_EQUAL("./MyProject/MyProject1.make", result);
- }
-}
+/**
+ * \file make_tests.cpp
+ * \brief Automated tests for the makefile generator support functions.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "action/make/make.h"
+#include "base/error.h"
+}
+
+
+struct FxMake
+{
+ Session sess;
+ Solution sln1;
+ Solution sln2;
+ Project prj1;
+ Project prj2;
+
+ FxMake()
+ {
+ sess = session_create();
+ sln1 = AddSolution("MySolution1");
+ sln2 = AddSolution("MySolution2");
+ prj1 = AddProject("MyProject1");
+ prj2 = AddProject("MyProject2");
+ }
+
+ ~FxMake()
+ {
+ session_destroy(sess);
+ error_clear();
+ }
+
+ Solution AddSolution(const char* name)
+ {
+ Solution sln = solution_create();
+ session_add_solution(sess, sln);
+ solution_set_name(sln, name);
+ solution_set_base_dir(sln, ".");
+ return sln;
+ }
+
+ Project AddProject(const char* name)
+ {
+ Project prj = project_create();
+ solution_add_project(sln1, prj);
+ project_set_name(prj, name);
+ project_set_base_dir(prj, ".");
+ return prj;
+ }
+};
+
+
+SUITE(action)
+{
+ /**********************************************************************
+ * Makefile naming tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxMake, GetSolutionMakefile_ReturnsMakefile_OnUniqueLocation)
+ {
+ solution_set_location(sln1, "MySolution");
+ const char* result = make_get_solution_makefile(sess, sln1);
+ CHECK_EQUAL("./MySolution/Makefile", result);
+ }
+
+ TEST_FIXTURE(FxMake, GetSolutionMakefile_ReturnsDotMake_OnSharedLocation)
+ {
+ const char* result = make_get_solution_makefile(sess, sln1);
+ CHECK_EQUAL("./MySolution1.make", result);
+ }
+
+ TEST_FIXTURE(FxMake, GetProjectMakefile_ReturnsMakefile_OnUniqueLocation)
+ {
+ project_set_location(prj1, "MyProject");
+ const char* result = make_get_project_makefile(sess, prj1);
+ CHECK_EQUAL("./MyProject/Makefile", result);
+ }
+
+ TEST_FIXTURE(FxMake, GetProjectMakefile_ReturnsDotMake_OnSharedWithSolution)
+ {
+ project_set_location(prj2, "MyProject");
+ const char* result = make_get_project_makefile(sess, prj1);
+ CHECK_EQUAL("./MyProject1.make", result);
+ }
+
+ TEST_FIXTURE(FxMake, GetProjectMakefile_ReturnsDotMake_OnSharedWithProject)
+ {
+ project_set_location(prj1, "MyProject");
+ project_set_location(prj2, "MyProject");
+ const char* result = make_get_project_makefile(sess, prj1);
+ CHECK_EQUAL("./MyProject/MyProject1.make", result);
+ }
+}
diff --git a/src/action/tests/action_tests.h b/src/action/tests/action_tests.h
index 3e8a1fe..2765cda 100644
--- a/src/action/tests/action_tests.h
+++ b/src/action/tests/action_tests.h
@@ -1,63 +1,63 @@
-/**
- * \file action_tests.h
- * \brief Common test fixtures for all action tests.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "testing/testing.h"
-extern "C" {
-#include "session/session.h"
-#include "project/project.h"
-}
-
-struct FxAction
-{
- Session sess;
- Stream strm;
- Solution sln;
- Project prj;
- char buffer[8192];
-
- FxAction()
- {
- sess = session_create();
-
- strm = stream_create_null();
- stream_set_buffer(strm, buffer);
- session_set_active_stream(sess, strm);
-
- sln = solution_create();
- session_add_solution(sess, sln);
- solution_set_name(sln, "MySolution");
- solution_set_base_dir(sln, "/Root");
- solution_add_config_name(sln, "Debug");
- solution_add_config_name(sln, "Release");
-
- prj = project_create();
- solution_add_project(sln, prj);
- project_set_name(prj, "MyProject");
- project_set_base_dir(prj, "/Root");
- project_set_location(prj, "ProjectFolder");
- project_set_guid(prj, "AE2461B7-236F-4278-81D3-F0D476F9A4C0");
- project_set_language(prj, "c++");
- project_set_configuration_filter(prj, "Debug");
- }
-
- ~FxAction()
- {
- stream_destroy(strm);
- session_destroy(sess);
- }
-
-
- void SetField(Project prj, enum ProjectField index, char** values)
- {
- Strings strs = strings_create();
- for (char** value = values; (*value) != NULL; ++value)
- {
- strings_add(strs, *value);
- }
-
- project_set_values(prj, index, strs);
- }
-};
+/**
+ * \file action_tests.h
+ * \brief Common test fixtures for all action tests.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "testing/testing.h"
+extern "C" {
+#include "session/session.h"
+#include "project/project.h"
+}
+
+struct FxAction
+{
+ Session sess;
+ Stream strm;
+ Solution sln;
+ Project prj;
+ char buffer[8192];
+
+ FxAction()
+ {
+ sess = session_create();
+
+ strm = stream_create_null();
+ stream_set_buffer(strm, buffer);
+ session_set_active_stream(sess, strm);
+
+ sln = solution_create();
+ session_add_solution(sess, sln);
+ solution_set_name(sln, "MySolution");
+ solution_set_base_dir(sln, "/Root");
+ solution_add_config_name(sln, "Debug");
+ solution_add_config_name(sln, "Release");
+
+ prj = project_create();
+ solution_add_project(sln, prj);
+ project_set_name(prj, "MyProject");
+ project_set_base_dir(prj, "/Root");
+ project_set_location(prj, "ProjectFolder");
+ project_set_guid(prj, "AE2461B7-236F-4278-81D3-F0D476F9A4C0");
+ project_set_language(prj, "c++");
+ project_set_configuration_filter(prj, "Debug");
+ }
+
+ ~FxAction()
+ {
+ stream_destroy(strm);
+ session_destroy(sess);
+ }
+
+
+ void SetField(Project prj, enum ProjectField index, char** values)
+ {
+ Strings strs = strings_create();
+ for (char** value = values; (*value) != NULL; ++value)
+ {
+ strings_add(strs, *value);
+ }
+
+ project_set_values(prj, index, strs);
+ }
+};
diff --git a/src/action/vs200x/tests/vs2002_config_tests.cpp b/src/action/vs200x/tests/vs2002_config_tests.cpp
index 8cfafe6..e3fe0d1 100644
--- a/src/action/vs200x/tests/vs2002_config_tests.cpp
+++ b/src/action/vs200x/tests/vs2002_config_tests.cpp
@@ -1,29 +1,29 @@
-/**
- * \file vs2002_config_tests.cpp
- * \brief Automated tests for VS2002 configuration processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/vs200x/vs200x_config.h"
-}
-
-struct Fx2002Config : FxAction
-{
- Fx2002Config()
- {
- session_set_action(sess, "vs2002");
- }
-};
-
-
-SUITE(action)
-{
- TEST_FIXTURE(Fx2002Config, CharacterSet_Default)
- {
- vs200x_config_character_set(sess, strm);
- CHECK_EQUAL("\n\t\t\tCharacterSet=\"2\"", buffer);
- }
-}
+/**
+ * \file vs2002_config_tests.cpp
+ * \brief Automated tests for VS2002 configuration processing.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/vs200x/vs200x_config.h"
+}
+
+struct Fx2002Config : FxAction
+{
+ Fx2002Config()
+ {
+ session_set_action(sess, "vs2002");
+ }
+};
+
+
+SUITE(action)
+{
+ TEST_FIXTURE(Fx2002Config, CharacterSet_Default)
+ {
+ vs200x_config_character_set(sess, strm);
+ CHECK_EQUAL("\n\t\t\tCharacterSet=\"2\"", buffer);
+ }
+}
diff --git a/src/action/vs200x/tests/vs2002_project_tests.cpp b/src/action/vs200x/tests/vs2002_project_tests.cpp
index aeb2006..e4704a0 100644
--- a/src/action/vs200x/tests/vs2002_project_tests.cpp
+++ b/src/action/vs200x/tests/vs2002_project_tests.cpp
@@ -1,88 +1,88 @@
-/**
- * \file vs2002_project_tests.cpp
- * \brief Automated tests for VS2002 project processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/vs200x/vs200x_project.h"
-}
-
-struct Fx2002Project : FxAction
-{
- Fx2002Project()
- {
- session_set_action(sess, "vs2002");
- }
-};
-
-
-SUITE(action)
-{
- TEST_FIXTURE(Fx2002Project, Vs2002_VisualStudioProject)
- {
- vs200x_project_element(sess, prj, strm);
- CHECK_EQUAL(
- "<VisualStudioProject\n"
- "\tProjectType=\"Visual C++\"\n"
- "\tVersion=\"7.00\"\n"
- "\tName=\"MyProject\"\n"
- "\tProjectGUID=\"{AE2461B7-236F-4278-81D3-F0D476F9A4C0}\"\n"
- "\tKeyword=\"Win32Proj\">\n",
- buffer);
- }
-
-
- TEST_FIXTURE(Fx2002Project, Vs2002_ToolFiles)
- {
- vs200x_project_tool_files(sess, prj, strm);
- CHECK_EQUAL(
- "\t<Configurations>\n",
- buffer);
- }
-
-
- TEST_FIXTURE(Fx2002Project, VCCLCompilerTool)
- {
- vs200x_project_vc_cl_compiler_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCCLCompilerTool\"\n"
- "\t\t\t\tOptimization=\"0\"\n"
- "\t\t\t\tMinimalRebuild=\"TRUE\"\n"
- "\t\t\t\tBasicRuntimeChecks=\"3\"\n"
- "\t\t\t\tRuntimeLibrary=\"3\"\n"
- "\t\t\t\tRuntimeTypeInfo=\"TRUE\"\n"
- "\t\t\t\tUsePrecompiledHeader=\"2\"\n"
- "\t\t\t\tWarningLevel=\"3\"\n"
- "\t\t\t\tDetect64BitPortabilityProblems=\"TRUE\"\n"
- "\t\t\t\tDebugInformationFormat=\"4\"/>\n",
- buffer);
- }
-
-
- TEST_FIXTURE(Fx2002Project, VCLinkerTool)
- {
- vs200x_project_vc_linker_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCLinkerTool\"\n"
- "\t\t\t\tLinkIncremental=\"2\"\n"
- "\t\t\t\tGenerateDebugInformation=\"TRUE\"\n"
- "\t\t\t\tSubSystem=\"1\"\n"
- "\t\t\t\tEntryPointSymbol=\"mainCRTStartup\"\n"
- "\t\t\t\tTargetMachine=\"1\"/>\n",
- buffer);
- }
-
-
- TEST_FIXTURE(Fx2002Project, References)
- {
- vs200x_project_references(sess, prj, strm);
- CHECK_EQUAL(
- "\t</Configurations>\n",
- buffer);
- }
-}
+/**
+ * \file vs2002_project_tests.cpp
+ * \brief Automated tests for VS2002 project processing.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/vs200x/vs200x_project.h"
+}
+
+struct Fx2002Project : FxAction
+{
+ Fx2002Project()
+ {
+ session_set_action(sess, "vs2002");
+ }
+};
+
+
+SUITE(action)
+{
+ TEST_FIXTURE(Fx2002Project, Vs2002_VisualStudioProject)
+ {
+ vs200x_project_element(sess, prj, strm);
+ CHECK_EQUAL(
+ "<VisualStudioProject\n"
+ "\tProjectType=\"Visual C++\"\n"
+ "\tVersion=\"7.00\"\n"
+ "\tName=\"MyProject\"\n"
+ "\tProjectGUID=\"{AE2461B7-236F-4278-81D3-F0D476F9A4C0}\"\n"
+ "\tKeyword=\"Win32Proj\">\n",
+ buffer);
+ }
+
+
+ TEST_FIXTURE(Fx2002Project, Vs2002_ToolFiles)
+ {
+ vs200x_project_tool_files(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t<Configurations>\n",
+ buffer);
+ }
+
+
+ TEST_FIXTURE(Fx2002Project, VCCLCompilerTool)
+ {
+ vs200x_project_vc_cl_compiler_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCCLCompilerTool\"\n"
+ "\t\t\t\tOptimization=\"0\"\n"
+ "\t\t\t\tMinimalRebuild=\"TRUE\"\n"
+ "\t\t\t\tBasicRuntimeChecks=\"3\"\n"
+ "\t\t\t\tRuntimeLibrary=\"3\"\n"
+ "\t\t\t\tRuntimeTypeInfo=\"TRUE\"\n"
+ "\t\t\t\tUsePrecompiledHeader=\"2\"\n"
+ "\t\t\t\tWarningLevel=\"3\"\n"
+ "\t\t\t\tDetect64BitPortabilityProblems=\"TRUE\"\n"
+ "\t\t\t\tDebugInformationFormat=\"4\"/>\n",
+ buffer);
+ }
+
+
+ TEST_FIXTURE(Fx2002Project, VCLinkerTool)
+ {
+ vs200x_project_vc_linker_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCLinkerTool\"\n"
+ "\t\t\t\tLinkIncremental=\"2\"\n"
+ "\t\t\t\tGenerateDebugInformation=\"TRUE\"\n"
+ "\t\t\t\tSubSystem=\"1\"\n"
+ "\t\t\t\tEntryPointSymbol=\"mainCRTStartup\"\n"
+ "\t\t\t\tTargetMachine=\"1\"/>\n",
+ buffer);
+ }
+
+
+ TEST_FIXTURE(Fx2002Project, References)
+ {
+ vs200x_project_references(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t</Configurations>\n",
+ buffer);
+ }
+}
diff --git a/src/action/vs200x/tests/vs2002_solution_tests.cpp b/src/action/vs200x/tests/vs2002_solution_tests.cpp
index 97c352f..fb51c39 100644
--- a/src/action/vs200x/tests/vs2002_solution_tests.cpp
+++ b/src/action/vs200x/tests/vs2002_solution_tests.cpp
@@ -1,108 +1,108 @@
-/**
- * \file vs2002_solution_tests.cpp
- * \brief Automated tests for VS2002 solution processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/vs200x/vs200x_solution.h"
-}
-
-
-SUITE(action)
-{
- /**********************************************************************
- * Signature tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Vs2002_Signature_IsCorrect)
- {
- vs2002_solution_signature(sess, sln, strm);
- CHECK_EQUAL(
- "Microsoft Visual Studio Solution File, Format Version 7.00\r\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Project entry tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Vs2002_ProjectEntry_UsesRelativePath)
- {
- vs2002_solution_projects(sess, sln, strm);
- CHECK_EQUAL(
- "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"MyProject\", \"ProjectFolder\\MyProject.vcproj\", \"{AE2461B7-236F-4278-81D3-F0D476F9A4C0}\"\n"
- "EndProject\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Solution configuration tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Vs2002_SolutionConfiguration_IsCorrect)
- {
- vs2002_solution_configuration(sess, sln, strm);
- CHECK_EQUAL(
- "Global\n"
- "\tGlobalSection(SolutionConfiguration) = preSolution\n"
- "\t\tConfigName.0 = Debug\n"
- "\t\tConfigName.1 = Release\n"
- "\tEndGlobalSection\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Project dependencies tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Vs2002_ProjectDependencies_IsCorrect)
- {
- vs2002_solution_dependencies(sess, sln, strm);
- CHECK_EQUAL(
- "\tGlobalSection(ProjectDependencies) = postSolution\n"
- "\tEndGlobalSection\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Project configuration tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Vs2002_ProjectConfiguration_IsCorrect)
- {
- vs2002_solution_project_configuration(sess, sln, strm);
- CHECK_EQUAL(
- "\tGlobalSection(ProjectConfiguration) = postSolution\n"
- "\t\t{AE2461B7-236F-4278-81D3-F0D476F9A4C0}.Debug.ActiveCfg = Debug|Win32\n"
- "\t\t{AE2461B7-236F-4278-81D3-F0D476F9A4C0}.Debug.Build.0 = Debug|Win32\n"
- "\t\t{AE2461B7-236F-4278-81D3-F0D476F9A4C0}.Release.ActiveCfg = Release|Win32\n"
- "\t\t{AE2461B7-236F-4278-81D3-F0D476F9A4C0}.Release.Build.0 = Release|Win32\n"
- "\tEndGlobalSection\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Solution extensibility tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Vs2002_Extensibility_IsCorrect)
- {
- vs2002_solution_extensibility(sess, sln, strm);
- CHECK_EQUAL(
- "\tGlobalSection(ExtensibilityGlobals) = postSolution\n"
- "\tEndGlobalSection\n"
- "\tGlobalSection(ExtensibilityAddIns) = postSolution\n"
- "\tEndGlobalSection\n"
- "EndGlobal\n",
- buffer);
- }
-
-}
+/**
+ * \file vs2002_solution_tests.cpp
+ * \brief Automated tests for VS2002 solution processing.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/vs200x/vs200x_solution.h"
+}
+
+
+SUITE(action)
+{
+ /**********************************************************************
+ * Signature tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Vs2002_Signature_IsCorrect)
+ {
+ vs2002_solution_signature(sess, sln, strm);
+ CHECK_EQUAL(
+ "Microsoft Visual Studio Solution File, Format Version 7.00\r\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Project entry tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Vs2002_ProjectEntry_UsesRelativePath)
+ {
+ vs2002_solution_projects(sess, sln, strm);
+ CHECK_EQUAL(
+ "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"MyProject\", \"ProjectFolder\\MyProject.vcproj\", \"{AE2461B7-236F-4278-81D3-F0D476F9A4C0}\"\n"
+ "EndProject\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Solution configuration tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Vs2002_SolutionConfiguration_IsCorrect)
+ {
+ vs2002_solution_configuration(sess, sln, strm);
+ CHECK_EQUAL(
+ "Global\n"
+ "\tGlobalSection(SolutionConfiguration) = preSolution\n"
+ "\t\tConfigName.0 = Debug\n"
+ "\t\tConfigName.1 = Release\n"
+ "\tEndGlobalSection\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Project dependencies tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Vs2002_ProjectDependencies_IsCorrect)
+ {
+ vs2002_solution_dependencies(sess, sln, strm);
+ CHECK_EQUAL(
+ "\tGlobalSection(ProjectDependencies) = postSolution\n"
+ "\tEndGlobalSection\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Project configuration tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Vs2002_ProjectConfiguration_IsCorrect)
+ {
+ vs2002_solution_project_configuration(sess, sln, strm);
+ CHECK_EQUAL(
+ "\tGlobalSection(ProjectConfiguration) = postSolution\n"
+ "\t\t{AE2461B7-236F-4278-81D3-F0D476F9A4C0}.Debug.ActiveCfg = Debug|Win32\n"
+ "\t\t{AE2461B7-236F-4278-81D3-F0D476F9A4C0}.Debug.Build.0 = Debug|Win32\n"
+ "\t\t{AE2461B7-236F-4278-81D3-F0D476F9A4C0}.Release.ActiveCfg = Release|Win32\n"
+ "\t\t{AE2461B7-236F-4278-81D3-F0D476F9A4C0}.Release.Build.0 = Release|Win32\n"
+ "\tEndGlobalSection\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Solution extensibility tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Vs2002_Extensibility_IsCorrect)
+ {
+ vs2002_solution_extensibility(sess, sln, strm);
+ CHECK_EQUAL(
+ "\tGlobalSection(ExtensibilityGlobals) = postSolution\n"
+ "\tEndGlobalSection\n"
+ "\tGlobalSection(ExtensibilityAddIns) = postSolution\n"
+ "\tEndGlobalSection\n"
+ "EndGlobal\n",
+ buffer);
+ }
+
+}
diff --git a/src/action/vs200x/tests/vs2003_config_tests.cpp b/src/action/vs200x/tests/vs2003_config_tests.cpp
index 2b9b1a1..3c8e251 100644
--- a/src/action/vs200x/tests/vs2003_config_tests.cpp
+++ b/src/action/vs200x/tests/vs2003_config_tests.cpp
@@ -1,29 +1,29 @@
-/**
- * \file vs2003_config_tests.cpp
- * \brief Automated tests for VS2003 configuration processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/vs200x/vs200x_config.h"
-}
-
-struct Fx2003Config : FxAction
-{
- Fx2003Config()
- {
- session_set_action(sess, "vs2003");
- }
-};
-
-
-SUITE(action)
-{
- TEST_FIXTURE(Fx2003Config, CharacterSet_Default)
- {
- vs200x_config_character_set(sess, strm);
- CHECK_EQUAL("\n\t\t\tCharacterSet=\"2\"", buffer);
- }
-}
+/**
+ * \file vs2003_config_tests.cpp
+ * \brief Automated tests for VS2003 configuration processing.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/vs200x/vs200x_config.h"
+}
+
+struct Fx2003Config : FxAction
+{
+ Fx2003Config()
+ {
+ session_set_action(sess, "vs2003");
+ }
+};
+
+
+SUITE(action)
+{
+ TEST_FIXTURE(Fx2003Config, CharacterSet_Default)
+ {
+ vs200x_config_character_set(sess, strm);
+ CHECK_EQUAL("\n\t\t\tCharacterSet=\"2\"", buffer);
+ }
+}
diff --git a/src/action/vs200x/tests/vs2003_project_tests.cpp b/src/action/vs200x/tests/vs2003_project_tests.cpp
index c86043e..0cbb999 100644
--- a/src/action/vs200x/tests/vs2003_project_tests.cpp
+++ b/src/action/vs200x/tests/vs2003_project_tests.cpp
@@ -1,90 +1,90 @@
-/**
- * \file vs2003_project_tests.cpp
- * \brief Automated tests for VS2003 project processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/vs200x/vs200x_project.h"
-}
-
-struct Fx2003Project : FxAction
-{
- Fx2003Project()
- {
- session_set_action(sess, "vs2003");
- }
-};
-
-
-SUITE(action)
-{
- TEST_FIXTURE(Fx2003Project, Vs2003_VisualStudioProject)
- {
- vs200x_project_element(sess, prj, strm);
- CHECK_EQUAL(
- "<VisualStudioProject\n"
- "\tProjectType=\"Visual C++\"\n"
- "\tVersion=\"7.10\"\n"
- "\tName=\"MyProject\"\n"
- "\tProjectGUID=\"{AE2461B7-236F-4278-81D3-F0D476F9A4C0}\"\n"
- "\tKeyword=\"Win32Proj\">\n",
- buffer);
- }
-
-
- TEST_FIXTURE(Fx2003Project, Vs2003_ToolFiles)
- {
- vs200x_project_tool_files(sess, prj, strm);
- CHECK_EQUAL(
- "\t<Configurations>\n",
- buffer);
- }
-
-
- TEST_FIXTURE(Fx2003Project, VCCLCompilerTool)
- {
- vs200x_project_vc_cl_compiler_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCCLCompilerTool\"\n"
- "\t\t\t\tOptimization=\"0\"\n"
- "\t\t\t\tMinimalRebuild=\"TRUE\"\n"
- "\t\t\t\tBasicRuntimeChecks=\"3\"\n"
- "\t\t\t\tRuntimeLibrary=\"3\"\n"
- "\t\t\t\tRuntimeTypeInfo=\"TRUE\"\n"
- "\t\t\t\tUsePrecompiledHeader=\"2\"\n"
- "\t\t\t\tWarningLevel=\"3\"\n"
- "\t\t\t\tDetect64BitPortabilityProblems=\"TRUE\"\n"
- "\t\t\t\tDebugInformationFormat=\"4\"/>\n",
- buffer);
- }
-
-
- TEST_FIXTURE(Fx2003Project, VCLinkerTool)
- {
- vs200x_project_vc_linker_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCLinkerTool\"\n"
- "\t\t\t\tLinkIncremental=\"2\"\n"
- "\t\t\t\tGenerateDebugInformation=\"TRUE\"\n"
- "\t\t\t\tSubSystem=\"1\"\n"
- "\t\t\t\tEntryPointSymbol=\"mainCRTStartup\"\n"
- "\t\t\t\tTargetMachine=\"1\"/>\n",
- buffer);
- }
-
-
- TEST_FIXTURE(Fx2003Project, References)
- {
- vs200x_project_references(sess, prj, strm);
- CHECK_EQUAL(
- "\t</Configurations>\n"
- "\t<References>\n"
- "\t</References>\n",
- buffer);
- }
-}
+/**
+ * \file vs2003_project_tests.cpp
+ * \brief Automated tests for VS2003 project processing.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/vs200x/vs200x_project.h"
+}
+
+struct Fx2003Project : FxAction
+{
+ Fx2003Project()
+ {
+ session_set_action(sess, "vs2003");
+ }
+};
+
+
+SUITE(action)
+{
+ TEST_FIXTURE(Fx2003Project, Vs2003_VisualStudioProject)
+ {
+ vs200x_project_element(sess, prj, strm);
+ CHECK_EQUAL(
+ "<VisualStudioProject\n"
+ "\tProjectType=\"Visual C++\"\n"
+ "\tVersion=\"7.10\"\n"
+ "\tName=\"MyProject\"\n"
+ "\tProjectGUID=\"{AE2461B7-236F-4278-81D3-F0D476F9A4C0}\"\n"
+ "\tKeyword=\"Win32Proj\">\n",
+ buffer);
+ }
+
+
+ TEST_FIXTURE(Fx2003Project, Vs2003_ToolFiles)
+ {
+ vs200x_project_tool_files(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t<Configurations>\n",
+ buffer);
+ }
+
+
+ TEST_FIXTURE(Fx2003Project, VCCLCompilerTool)
+ {
+ vs200x_project_vc_cl_compiler_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCCLCompilerTool\"\n"
+ "\t\t\t\tOptimization=\"0\"\n"
+ "\t\t\t\tMinimalRebuild=\"TRUE\"\n"
+ "\t\t\t\tBasicRuntimeChecks=\"3\"\n"
+ "\t\t\t\tRuntimeLibrary=\"3\"\n"
+ "\t\t\t\tRuntimeTypeInfo=\"TRUE\"\n"
+ "\t\t\t\tUsePrecompiledHeader=\"2\"\n"
+ "\t\t\t\tWarningLevel=\"3\"\n"
+ "\t\t\t\tDetect64BitPortabilityProblems=\"TRUE\"\n"
+ "\t\t\t\tDebugInformationFormat=\"4\"/>\n",
+ buffer);
+ }
+
+
+ TEST_FIXTURE(Fx2003Project, VCLinkerTool)
+ {
+ vs200x_project_vc_linker_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCLinkerTool\"\n"
+ "\t\t\t\tLinkIncremental=\"2\"\n"
+ "\t\t\t\tGenerateDebugInformation=\"TRUE\"\n"
+ "\t\t\t\tSubSystem=\"1\"\n"
+ "\t\t\t\tEntryPointSymbol=\"mainCRTStartup\"\n"
+ "\t\t\t\tTargetMachine=\"1\"/>\n",
+ buffer);
+ }
+
+
+ TEST_FIXTURE(Fx2003Project, References)
+ {
+ vs200x_project_references(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t</Configurations>\n"
+ "\t<References>\n"
+ "\t</References>\n",
+ buffer);
+ }
+}
diff --git a/src/action/vs200x/tests/vs2003_solution_tests.cpp b/src/action/vs200x/tests/vs2003_solution_tests.cpp
index ee4fa2b..f545e95 100644
--- a/src/action/vs200x/tests/vs2003_solution_tests.cpp
+++ b/src/action/vs200x/tests/vs2003_solution_tests.cpp
@@ -1,45 +1,45 @@
-/**
- * \file vs2003_solution_tests.cpp
- * \brief Automated tests for VS2003 solution processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/vs200x/vs200x_solution.h"
-}
-
-
-SUITE(action)
-{
- /**********************************************************************
- * Signature tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Vs2003_Signature_IsCorrect)
- {
- vs2003_solution_signature(sess, sln, strm);
- CHECK_EQUAL(
- "Microsoft Visual Studio Solution File, Format Version 8.00\r\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Solution configuration tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Vs2003_SolutionConfiguration_IsCorrect)
- {
- vs2003_solution_configuration(sess, sln, strm);
- CHECK_EQUAL(
- "Global\n"
- "\tGlobalSection(SolutionConfiguration) = preSolution\n"
- "\t\tDebug = Debug\n"
- "\t\tRelease = Release\n"
- "\tEndGlobalSection\n",
- buffer);
- }
-
-}
+/**
+ * \file vs2003_solution_tests.cpp
+ * \brief Automated tests for VS2003 solution processing.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/vs200x/vs200x_solution.h"
+}
+
+
+SUITE(action)
+{
+ /**********************************************************************
+ * Signature tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Vs2003_Signature_IsCorrect)
+ {
+ vs2003_solution_signature(sess, sln, strm);
+ CHECK_EQUAL(
+ "Microsoft Visual Studio Solution File, Format Version 8.00\r\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Solution configuration tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Vs2003_SolutionConfiguration_IsCorrect)
+ {
+ vs2003_solution_configuration(sess, sln, strm);
+ CHECK_EQUAL(
+ "Global\n"
+ "\tGlobalSection(SolutionConfiguration) = preSolution\n"
+ "\t\tDebug = Debug\n"
+ "\t\tRelease = Release\n"
+ "\tEndGlobalSection\n",
+ buffer);
+ }
+
+}
diff --git a/src/action/vs200x/tests/vs2005_config_tests.cpp b/src/action/vs200x/tests/vs2005_config_tests.cpp
index 68f6404..7711643 100644
--- a/src/action/vs200x/tests/vs2005_config_tests.cpp
+++ b/src/action/vs200x/tests/vs2005_config_tests.cpp
@@ -1,29 +1,29 @@
-/**
- * \file vs2005_config_tests.cpp
- * \brief Automated tests for VS2005 configuration processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/vs200x/vs200x_config.h"
-}
-
-struct Fx2005Config : FxAction
-{
- Fx2005Config()
- {
- session_set_action(sess, "vs2005");
- }
-};
-
-
-SUITE(action)
-{
- TEST_FIXTURE(Fx2005Config, CharacterSet_Default)
- {
- vs200x_config_character_set(sess, strm);
- CHECK_EQUAL("\n\t\t\tCharacterSet=\"1\"", buffer);
- }
-}
+/**
+ * \file vs2005_config_tests.cpp
+ * \brief Automated tests for VS2005 configuration processing.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/vs200x/vs200x_config.h"
+}
+
+struct Fx2005Config : FxAction
+{
+ Fx2005Config()
+ {
+ session_set_action(sess, "vs2005");
+ }
+};
+
+
+SUITE(action)
+{
+ TEST_FIXTURE(Fx2005Config, CharacterSet_Default)
+ {
+ vs200x_config_character_set(sess, strm);
+ CHECK_EQUAL("\n\t\t\tCharacterSet=\"1\"", buffer);
+ }
+}
diff --git a/src/action/vs200x/tests/vs2005_project_tests.cpp b/src/action/vs200x/tests/vs2005_project_tests.cpp
index 8729316..2568c35 100644
--- a/src/action/vs200x/tests/vs2005_project_tests.cpp
+++ b/src/action/vs200x/tests/vs2005_project_tests.cpp
@@ -1,95 +1,95 @@
-/**
- * \file vs2005_project_tests.cpp
- * \brief Automated tests for VS2005 project processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/vs200x/vs200x_project.h"
-}
-
-struct Fx2005Project : FxAction
-{
- Fx2005Project()
- {
- session_set_action(sess, "vs2005");
- }
-};
-
-
-SUITE(action)
-{
- TEST_FIXTURE(Fx2005Project, Vs2005_VisualStudioProject)
- {
- vs200x_project_element(sess, prj, strm);
- CHECK_EQUAL(
- "<VisualStudioProject\n"
- "\tProjectType=\"Visual C++\"\n"
- "\tVersion=\"8.00\"\n"
- "\tName=\"MyProject\"\n"
- "\tProjectGUID=\"{AE2461B7-236F-4278-81D3-F0D476F9A4C0}\"\n"
- "\tRootNamespace=\"MyProject\"\n"
- "\tKeyword=\"Win32Proj\"\n"
- "\t>\n",
- buffer);
- }
-
-
- TEST_FIXTURE(Fx2005Project, Vs2005_ToolFiles)
- {
- vs200x_project_tool_files(sess, prj, strm);
- CHECK_EQUAL(
- "\t<ToolFiles>\n"
- "\t</ToolFiles>\n"
- "\t<Configurations>\n",
- buffer);
- }
-
-
- TEST_FIXTURE(Fx2005Project, VCCLCompilerTool)
- {
- vs200x_project_vc_cl_compiler_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCCLCompilerTool\"\n"
- "\t\t\t\tOptimization=\"0\"\n"
- "\t\t\t\tMinimalRebuild=\"true\"\n"
- "\t\t\t\tBasicRuntimeChecks=\"3\"\n"
- "\t\t\t\tRuntimeLibrary=\"3\"\n"
- "\t\t\t\tUsePrecompiledHeader=\"0\"\n"
- "\t\t\t\tWarningLevel=\"3\"\n"
- "\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n"
- "\t\t\t\tDebugInformationFormat=\"4\"\n"
- "\t\t\t/>\n",
- buffer);
- }
-
-
- TEST_FIXTURE(Fx2005Project, VCLinkerTool)
- {
- vs200x_project_vc_linker_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCLinkerTool\"\n"
- "\t\t\t\tLinkIncremental=\"2\"\n"
- "\t\t\t\tGenerateDebugInformation=\"true\"\n"
- "\t\t\t\tSubSystem=\"1\"\n"
- "\t\t\t\tEntryPointSymbol=\"mainCRTStartup\"\n"
- "\t\t\t\tTargetMachine=\"1\"\n"
- "\t\t\t/>\n",
- buffer);
- }
-
-
- TEST_FIXTURE(Fx2005Project, References)
- {
- vs200x_project_references(sess, prj, strm);
- CHECK_EQUAL(
- "\t</Configurations>\n"
- "\t<References>\n"
- "\t</References>\n",
- buffer);
- }
-}
+/**
+ * \file vs2005_project_tests.cpp
+ * \brief Automated tests for VS2005 project processing.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/vs200x/vs200x_project.h"
+}
+
+struct Fx2005Project : FxAction
+{
+ Fx2005Project()
+ {
+ session_set_action(sess, "vs2005");
+ }
+};
+
+
+SUITE(action)
+{
+ TEST_FIXTURE(Fx2005Project, Vs2005_VisualStudioProject)
+ {
+ vs200x_project_element(sess, prj, strm);
+ CHECK_EQUAL(
+ "<VisualStudioProject\n"
+ "\tProjectType=\"Visual C++\"\n"
+ "\tVersion=\"8.00\"\n"
+ "\tName=\"MyProject\"\n"
+ "\tProjectGUID=\"{AE2461B7-236F-4278-81D3-F0D476F9A4C0}\"\n"
+ "\tRootNamespace=\"MyProject\"\n"
+ "\tKeyword=\"Win32Proj\"\n"
+ "\t>\n",
+ buffer);
+ }
+
+
+ TEST_FIXTURE(Fx2005Project, Vs2005_ToolFiles)
+ {
+ vs200x_project_tool_files(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t<ToolFiles>\n"
+ "\t</ToolFiles>\n"
+ "\t<Configurations>\n",
+ buffer);
+ }
+
+
+ TEST_FIXTURE(Fx2005Project, VCCLCompilerTool)
+ {
+ vs200x_project_vc_cl_compiler_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCCLCompilerTool\"\n"
+ "\t\t\t\tOptimization=\"0\"\n"
+ "\t\t\t\tMinimalRebuild=\"true\"\n"
+ "\t\t\t\tBasicRuntimeChecks=\"3\"\n"
+ "\t\t\t\tRuntimeLibrary=\"3\"\n"
+ "\t\t\t\tUsePrecompiledHeader=\"0\"\n"
+ "\t\t\t\tWarningLevel=\"3\"\n"
+ "\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n"
+ "\t\t\t\tDebugInformationFormat=\"4\"\n"
+ "\t\t\t/>\n",
+ buffer);
+ }
+
+
+ TEST_FIXTURE(Fx2005Project, VCLinkerTool)
+ {
+ vs200x_project_vc_linker_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCLinkerTool\"\n"
+ "\t\t\t\tLinkIncremental=\"2\"\n"
+ "\t\t\t\tGenerateDebugInformation=\"true\"\n"
+ "\t\t\t\tSubSystem=\"1\"\n"
+ "\t\t\t\tEntryPointSymbol=\"mainCRTStartup\"\n"
+ "\t\t\t\tTargetMachine=\"1\"\n"
+ "\t\t\t/>\n",
+ buffer);
+ }
+
+
+ TEST_FIXTURE(Fx2005Project, References)
+ {
+ vs200x_project_references(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t</Configurations>\n"
+ "\t<References>\n"
+ "\t</References>\n",
+ buffer);
+ }
+}
diff --git a/src/action/vs200x/tests/vs2005_solution_tests.cpp b/src/action/vs200x/tests/vs2005_solution_tests.cpp
index 416572a..5cfcbee 100644
--- a/src/action/vs200x/tests/vs2005_solution_tests.cpp
+++ b/src/action/vs200x/tests/vs2005_solution_tests.cpp
@@ -1,80 +1,80 @@
-/**
- * \file vs2005_solution_tests.cpp
- * \brief Automated tests for VS2005 solution processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/vs200x/vs200x_solution.h"
-}
-
-
-SUITE(action)
-{
- /**********************************************************************
- * Signature tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Vs2005_Signature_IsCorrect)
- {
- vs2005_solution_signature(sess, sln, strm);
- CHECK_EQUAL(
- "\357\273\277\r\n"
- "Microsoft Visual Studio Solution File, Format Version 9.00\r\n"
- "# Visual Studio 2005\r\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Solution Configuration Platforms tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Platforms_IsCorrect)
- {
- vs2005_solution_platforms(sess, sln, strm);
- CHECK_EQUAL(
- "Global\n"
- "\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n"
- "\t\tDebug|Win32 = Debug|Win32\n"
- "\t\tRelease|Win32 = Release|Win32\n"
- "\tEndGlobalSection\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Project Configuration Platforms tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, ProjectPlatforms_IsCorrect)
- {
- vs2005_solution_project_platforms(sess, sln, strm);
- CHECK_EQUAL(
- "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n"
- "\t\t{AE2461B7-236F-4278-81D3-F0D476F9A4C0}.Debug|Win32.ActiveCfg = Debug|Win32\n"
- "\t\t{AE2461B7-236F-4278-81D3-F0D476F9A4C0}.Debug|Win32.Build.0 = Debug|Win32\n"
- "\t\t{AE2461B7-236F-4278-81D3-F0D476F9A4C0}.Release|Win32.ActiveCfg = Release|Win32\n"
- "\t\t{AE2461B7-236F-4278-81D3-F0D476F9A4C0}.Release|Win32.Build.0 = Release|Win32\n"
- "\tEndGlobalSection\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Solution Project tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Properties_IsCorrect)
- {
- vs2005_solution_properties(sess, sln, strm);
- CHECK_EQUAL(
- "\tGlobalSection(SolutionProperties) = preSolution\n"
- "\t\tHideSolutionNode = FALSE\n"
- "\tEndGlobalSection\n"
- "EndGlobal\n",
- buffer);
- }
-}
+/**
+ * \file vs2005_solution_tests.cpp
+ * \brief Automated tests for VS2005 solution processing.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/vs200x/vs200x_solution.h"
+}
+
+
+SUITE(action)
+{
+ /**********************************************************************
+ * Signature tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Vs2005_Signature_IsCorrect)
+ {
+ vs2005_solution_signature(sess, sln, strm);
+ CHECK_EQUAL(
+ "\357\273\277\r\n"
+ "Microsoft Visual Studio Solution File, Format Version 9.00\r\n"
+ "# Visual Studio 2005\r\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Solution Configuration Platforms tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Platforms_IsCorrect)
+ {
+ vs2005_solution_platforms(sess, sln, strm);
+ CHECK_EQUAL(
+ "Global\n"
+ "\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n"
+ "\t\tDebug|Win32 = Debug|Win32\n"
+ "\t\tRelease|Win32 = Release|Win32\n"
+ "\tEndGlobalSection\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Project Configuration Platforms tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, ProjectPlatforms_IsCorrect)
+ {
+ vs2005_solution_project_platforms(sess, sln, strm);
+ CHECK_EQUAL(
+ "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n"
+ "\t\t{AE2461B7-236F-4278-81D3-F0D476F9A4C0}.Debug|Win32.ActiveCfg = Debug|Win32\n"
+ "\t\t{AE2461B7-236F-4278-81D3-F0D476F9A4C0}.Debug|Win32.Build.0 = Debug|Win32\n"
+ "\t\t{AE2461B7-236F-4278-81D3-F0D476F9A4C0}.Release|Win32.ActiveCfg = Release|Win32\n"
+ "\t\t{AE2461B7-236F-4278-81D3-F0D476F9A4C0}.Release|Win32.Build.0 = Release|Win32\n"
+ "\tEndGlobalSection\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Solution Project tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Properties_IsCorrect)
+ {
+ vs2005_solution_properties(sess, sln, strm);
+ CHECK_EQUAL(
+ "\tGlobalSection(SolutionProperties) = preSolution\n"
+ "\t\tHideSolutionNode = FALSE\n"
+ "\tEndGlobalSection\n"
+ "EndGlobal\n",
+ buffer);
+ }
+}
diff --git a/src/action/vs200x/tests/vs2008_config_tests.cpp b/src/action/vs200x/tests/vs2008_config_tests.cpp
index 2a9a7fd..e2c45a3 100644
--- a/src/action/vs200x/tests/vs2008_config_tests.cpp
+++ b/src/action/vs200x/tests/vs2008_config_tests.cpp
@@ -1,29 +1,29 @@
-/**
- * \file vs2008_config_tests.cpp
- * \brief Automated tests for VS2008 configuration processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/vs200x/vs200x_config.h"
-}
-
-struct Fx2008Config : FxAction
-{
- Fx2008Config()
- {
- session_set_action(sess, "vs2008");
- }
-};
-
-
-SUITE(action)
-{
- TEST_FIXTURE(Fx2008Config, CharacterSet_Default)
- {
- vs200x_config_character_set(sess, strm);
- CHECK_EQUAL("\n\t\t\tCharacterSet=\"1\"", buffer);
- }
-}
+/**
+ * \file vs2008_config_tests.cpp
+ * \brief Automated tests for VS2008 configuration processing.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/vs200x/vs200x_config.h"
+}
+
+struct Fx2008Config : FxAction
+{
+ Fx2008Config()
+ {
+ session_set_action(sess, "vs2008");
+ }
+};
+
+
+SUITE(action)
+{
+ TEST_FIXTURE(Fx2008Config, CharacterSet_Default)
+ {
+ vs200x_config_character_set(sess, strm);
+ CHECK_EQUAL("\n\t\t\tCharacterSet=\"1\"", buffer);
+ }
+}
diff --git a/src/action/vs200x/tests/vs2008_project_tests.cpp b/src/action/vs200x/tests/vs2008_project_tests.cpp
index 8b665c6..ffcdad1 100644
--- a/src/action/vs200x/tests/vs2008_project_tests.cpp
+++ b/src/action/vs200x/tests/vs2008_project_tests.cpp
@@ -1,95 +1,95 @@
-/**
- * \file vs2008_project_tests.cpp
- * \brief Automated tests for VS2008 project processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/vs200x/vs200x_project.h"
-}
-
-struct Fx2008Project : FxAction
-{
- Fx2008Project()
- {
- session_set_action(sess, "vs2008");
- }
-};
-
-
-SUITE(action)
-{
- TEST_FIXTURE(Fx2008Project, Vs2008_VisualStudioProject)
- {
- vs200x_project_element(sess, prj, strm);
- CHECK_EQUAL(
- "<VisualStudioProject\n"
- "\tProjectType=\"Visual C++\"\n"
- "\tVersion=\"9.00\"\n"
- "\tName=\"MyProject\"\n"
- "\tProjectGUID=\"{AE2461B7-236F-4278-81D3-F0D476F9A4C0}\"\n"
- "\tRootNamespace=\"MyProject\"\n"
- "\tKeyword=\"Win32Proj\"\n"
- "\tTargetFrameworkVersion=\"196613\"\n"
- "\t>\n",
- buffer);
- }
-
-
- TEST_FIXTURE(Fx2008Project, Vs2008_ToolFiles)
- {
- vs200x_project_tool_files(sess, prj, strm);
- CHECK_EQUAL(
- "\t<ToolFiles>\n"
- "\t</ToolFiles>\n"
- "\t<Configurations>\n",
- buffer);
- }
-
-
- TEST_FIXTURE(Fx2008Project, VCCLCompilerTool)
- {
- vs200x_project_vc_cl_compiler_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCCLCompilerTool\"\n"
- "\t\t\t\tOptimization=\"0\"\n"
- "\t\t\t\tMinimalRebuild=\"true\"\n"
- "\t\t\t\tBasicRuntimeChecks=\"3\"\n"
- "\t\t\t\tRuntimeLibrary=\"3\"\n"
- "\t\t\t\tUsePrecompiledHeader=\"0\"\n"
- "\t\t\t\tWarningLevel=\"3\"\n"
- "\t\t\t\tDebugInformationFormat=\"4\"\n"
- "\t\t\t/>\n",
- buffer);
- }
-
-
- TEST_FIXTURE(Fx2008Project, VCLinkerTool)
- {
- vs200x_project_vc_linker_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCLinkerTool\"\n"
- "\t\t\t\tLinkIncremental=\"2\"\n"
- "\t\t\t\tGenerateDebugInformation=\"true\"\n"
- "\t\t\t\tSubSystem=\"1\"\n"
- "\t\t\t\tEntryPointSymbol=\"mainCRTStartup\"\n"
- "\t\t\t\tTargetMachine=\"1\"\n"
- "\t\t\t/>\n",
- buffer);
- }
-
-
- TEST_FIXTURE(Fx2008Project, References)
- {
- vs200x_project_references(sess, prj, strm);
- CHECK_EQUAL(
- "\t</Configurations>\n"
- "\t<References>\n"
- "\t</References>\n",
- buffer);
- }
-}
+/**
+ * \file vs2008_project_tests.cpp
+ * \brief Automated tests for VS2008 project processing.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/vs200x/vs200x_project.h"
+}
+
+struct Fx2008Project : FxAction
+{
+ Fx2008Project()
+ {
+ session_set_action(sess, "vs2008");
+ }
+};
+
+
+SUITE(action)
+{
+ TEST_FIXTURE(Fx2008Project, Vs2008_VisualStudioProject)
+ {
+ vs200x_project_element(sess, prj, strm);
+ CHECK_EQUAL(
+ "<VisualStudioProject\n"
+ "\tProjectType=\"Visual C++\"\n"
+ "\tVersion=\"9.00\"\n"
+ "\tName=\"MyProject\"\n"
+ "\tProjectGUID=\"{AE2461B7-236F-4278-81D3-F0D476F9A4C0}\"\n"
+ "\tRootNamespace=\"MyProject\"\n"
+ "\tKeyword=\"Win32Proj\"\n"
+ "\tTargetFrameworkVersion=\"196613\"\n"
+ "\t>\n",
+ buffer);
+ }
+
+
+ TEST_FIXTURE(Fx2008Project, Vs2008_ToolFiles)
+ {
+ vs200x_project_tool_files(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t<ToolFiles>\n"
+ "\t</ToolFiles>\n"
+ "\t<Configurations>\n",
+ buffer);
+ }
+
+
+ TEST_FIXTURE(Fx2008Project, VCCLCompilerTool)
+ {
+ vs200x_project_vc_cl_compiler_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCCLCompilerTool\"\n"
+ "\t\t\t\tOptimization=\"0\"\n"
+ "\t\t\t\tMinimalRebuild=\"true\"\n"
+ "\t\t\t\tBasicRuntimeChecks=\"3\"\n"
+ "\t\t\t\tRuntimeLibrary=\"3\"\n"
+ "\t\t\t\tUsePrecompiledHeader=\"0\"\n"
+ "\t\t\t\tWarningLevel=\"3\"\n"
+ "\t\t\t\tDebugInformationFormat=\"4\"\n"
+ "\t\t\t/>\n",
+ buffer);
+ }
+
+
+ TEST_FIXTURE(Fx2008Project, VCLinkerTool)
+ {
+ vs200x_project_vc_linker_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCLinkerTool\"\n"
+ "\t\t\t\tLinkIncremental=\"2\"\n"
+ "\t\t\t\tGenerateDebugInformation=\"true\"\n"
+ "\t\t\t\tSubSystem=\"1\"\n"
+ "\t\t\t\tEntryPointSymbol=\"mainCRTStartup\"\n"
+ "\t\t\t\tTargetMachine=\"1\"\n"
+ "\t\t\t/>\n",
+ buffer);
+ }
+
+
+ TEST_FIXTURE(Fx2008Project, References)
+ {
+ vs200x_project_references(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t</Configurations>\n"
+ "\t<References>\n"
+ "\t</References>\n",
+ buffer);
+ }
+}
diff --git a/src/action/vs200x/tests/vs2008_solution_tests.cpp b/src/action/vs200x/tests/vs2008_solution_tests.cpp
index aefb249..dd324c2 100644
--- a/src/action/vs200x/tests/vs2008_solution_tests.cpp
+++ b/src/action/vs200x/tests/vs2008_solution_tests.cpp
@@ -1,30 +1,30 @@
-/**
- * \file vs2008_solution_tests.cpp
- * \brief Automated tests for VS2008 solution processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/vs200x/vs200x_solution.h"
-}
-
-
-SUITE(action)
-{
- /**********************************************************************
- * Signature tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Vs2008_Signature_IsCorrect)
- {
- vs2008_solution_signature(sess, sln, strm);
- CHECK_EQUAL(
- "\357\273\277\r\n"
- "Microsoft Visual Studio Solution File, Format Version 10.00\r\n"
- "# Visual Studio 2008\r\n",
- buffer);
- }
-
-}
+/**
+ * \file vs2008_solution_tests.cpp
+ * \brief Automated tests for VS2008 solution processing.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/vs200x/vs200x_solution.h"
+}
+
+
+SUITE(action)
+{
+ /**********************************************************************
+ * Signature tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Vs2008_Signature_IsCorrect)
+ {
+ vs2008_solution_signature(sess, sln, strm);
+ CHECK_EQUAL(
+ "\357\273\277\r\n"
+ "Microsoft Visual Studio Solution File, Format Version 10.00\r\n"
+ "# Visual Studio 2008\r\n",
+ buffer);
+ }
+
+}
diff --git a/src/action/vs200x/tests/vs200x_project_tests.cpp b/src/action/vs200x/tests/vs200x_project_tests.cpp
index 8cded2a..f919b81 100644
--- a/src/action/vs200x/tests/vs200x_project_tests.cpp
+++ b/src/action/vs200x/tests/vs200x_project_tests.cpp
@@ -1,294 +1,294 @@
-/**
- * \file vs200x_project_tests.cpp
- * \brief Automated tests for Visual Studio project processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/vs200x/vs200x_project.h"
-}
-
-
-struct FxVsProject : FxAction
-{
- FxVsProject()
- {
- session_set_action(sess, "vs2002");
- }
-};
-
-
-SUITE(action)
-{
- /**********************************************************************
- * Configuration element tests
- **********************************************************************/
-
- TEST_FIXTURE(FxVsProject, Vs200x_Configuration)
- {
- vs200x_project_config_element(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t<Configuration\n"
- "\t\t\tName=\"Debug|Win32\"\n"
- "\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\n"
- "\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\n"
- "\t\t\tConfigurationType=\"1\"\n"
- "\t\t\tCharacterSet=\"2\">\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Encoding tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Vs200x_Encoding)
- {
- vs200x_project_encoding(sess, prj, strm);
- CHECK_EQUAL(
- "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Platforms tests
- **********************************************************************/
-
- TEST_FIXTURE(FxVsProject, Vs200x_Platforms)
- {
- vs200x_project_platforms(sess, prj, strm);
- CHECK_EQUAL(
- "\t<Platforms>\n"
- "\t\t<Platform\n"
- "\t\t\tName=\"Win32\"/>\n"
- "\t</Platforms>\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Tool element tests
- **********************************************************************/
-
- TEST_FIXTURE(FxVsProject, Vs200x_VCALinkTool)
- {
- vs200x_project_vc_alink_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCALinkTool\"/>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_VCAppVerifierTool)
- {
- vs200x_project_vc_app_verifier_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCAppVerifierTool\"/>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_VCBscMakeTool)
- {
- vs200x_project_vc_bsc_make_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCBscMakeTool\"/>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_VCCustomBuildTool)
- {
- vs200x_project_vc_custom_build_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCCustomBuildTool\"/>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_VCFxCopTool)
- {
- vs200x_project_vc_fx_cop_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCFxCopTool\"/>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_VCManagedResourceCompilerTool)
- {
- vs200x_project_vc_managed_resource_compiler_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCManagedResourceCompilerTool\"/>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_VCManifestTool)
- {
- vs200x_project_vc_manifest_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCManifestTool\"/>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_VCMIDLTool)
- {
- vs200x_project_vc_midl_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCMIDLTool\"/>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_VCPreBuildEventTool)
- {
- vs200x_project_vc_pre_build_event_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCPreBuildEventTool\"/>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_VCPreLinkEventTool)
- {
- vs200x_project_vc_pre_link_event_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCPreLinkEventTool\"/>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_VCPostBuildEventTool)
- {
- vs200x_project_vc_post_build_event_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCPostBuildEventTool\"/>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_VCResourceCompilerTool)
- {
- vs200x_project_vc_resource_compiler_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCResourceCompilerTool\"/>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_VCWebDeploymentTool)
- {
- vs200x_project_vc_web_deployment_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCWebDeploymentTool\"/>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_VCWebServiceProxyGeneratorTool)
- {
- vs200x_project_vc_web_service_proxy_generator_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_VCXDCMakeTool)
- {
- vs200x_project_vc_xdc_make_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCXDCMakeTool\"/>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_VCXMLDataGeneratorTool)
- {
- vs200x_project_vc_xml_data_generator_tool(sess, prj, strm);
- CHECK_EQUAL(
- "\t\t\t<Tool\n"
- "\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Files section tests
- **********************************************************************/
-
- TEST_FIXTURE(FxVsProject, Vs200x_Files_OnNoFiles)
- {
- vs200x_project_files(sess, prj, strm);
- CHECK_EQUAL(
- "\t<Files>\n"
- "\t</Files>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_Files_OnSingleCppFile)
- {
- char* values[] = { "Hello.cpp", 0 };
- SetField(prj, ProjectFiles, values);
- vs200x_project_files(sess, prj, strm);
- CHECK_EQUAL(
- "\t<Files>\n"
- "\t\t<File\n"
- "\t\t\tRelativePath=\".\\Hello.cpp\">\n"
- "\t\t</File>\n"
- "\t</Files>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_Files_OnUpperDirectory)
- {
- char* values[] = { "../../Hello.cpp", 0 };
- SetField(prj, ProjectFiles, values);
- vs200x_project_files(sess, prj, strm);
- CHECK_EQUAL(
- "\t<Files>\n"
- "\t\t<File\n"
- "\t\t\tRelativePath=\"..\\..\\Hello.cpp\">\n"
- "\t\t</File>\n"
- "\t</Files>\n",
- buffer);
- }
-
- TEST_FIXTURE(FxVsProject, Vs200x_Files_OnGroupedCppFile)
- {
- char* values[] = { "Src/Hello.cpp", 0 };
- SetField(prj, ProjectFiles, values);
- vs200x_project_files(sess, prj, strm);
- CHECK_EQUAL(
- "\t<Files>\n"
- "\t\t<Filter\n"
- "\t\t\tName=\"Src\"\n"
- "\t\t\tFilter=\"\">\n"
- "\t\t\t<File\n"
- "\t\t\t\tRelativePath=\".\\Src\\Hello.cpp\">\n"
- "\t\t\t</File>\n"
- "\t\t</Filter>\n"
- "\t</Files>\n",
- buffer);
- }
-
-
- /**********************************************************************
- * Globals section tests
- **********************************************************************/
-
- TEST_FIXTURE(FxVsProject, Vs200x_Globals)
- {
- vs200x_project_globals(sess, prj, strm);
- CHECK_EQUAL(
- "\t<Globals>\n"
- "\t</Globals>\n"
- "</VisualStudioProject>\n",
- buffer);
- }
-}
+/**
+ * \file vs200x_project_tests.cpp
+ * \brief Automated tests for Visual Studio project processing.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/vs200x/vs200x_project.h"
+}
+
+
+struct FxVsProject : FxAction
+{
+ FxVsProject()
+ {
+ session_set_action(sess, "vs2002");
+ }
+};
+
+
+SUITE(action)
+{
+ /**********************************************************************
+ * Configuration element tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxVsProject, Vs200x_Configuration)
+ {
+ vs200x_project_config_element(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t<Configuration\n"
+ "\t\t\tName=\"Debug|Win32\"\n"
+ "\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\n"
+ "\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\n"
+ "\t\t\tConfigurationType=\"1\"\n"
+ "\t\t\tCharacterSet=\"2\">\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Encoding tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Vs200x_Encoding)
+ {
+ vs200x_project_encoding(sess, prj, strm);
+ CHECK_EQUAL(
+ "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Platforms tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxVsProject, Vs200x_Platforms)
+ {
+ vs200x_project_platforms(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t<Platforms>\n"
+ "\t\t<Platform\n"
+ "\t\t\tName=\"Win32\"/>\n"
+ "\t</Platforms>\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Tool element tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxVsProject, Vs200x_VCALinkTool)
+ {
+ vs200x_project_vc_alink_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCALinkTool\"/>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_VCAppVerifierTool)
+ {
+ vs200x_project_vc_app_verifier_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCAppVerifierTool\"/>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_VCBscMakeTool)
+ {
+ vs200x_project_vc_bsc_make_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCBscMakeTool\"/>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_VCCustomBuildTool)
+ {
+ vs200x_project_vc_custom_build_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCCustomBuildTool\"/>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_VCFxCopTool)
+ {
+ vs200x_project_vc_fx_cop_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCFxCopTool\"/>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_VCManagedResourceCompilerTool)
+ {
+ vs200x_project_vc_managed_resource_compiler_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCManagedResourceCompilerTool\"/>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_VCManifestTool)
+ {
+ vs200x_project_vc_manifest_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCManifestTool\"/>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_VCMIDLTool)
+ {
+ vs200x_project_vc_midl_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCMIDLTool\"/>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_VCPreBuildEventTool)
+ {
+ vs200x_project_vc_pre_build_event_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCPreBuildEventTool\"/>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_VCPreLinkEventTool)
+ {
+ vs200x_project_vc_pre_link_event_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCPreLinkEventTool\"/>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_VCPostBuildEventTool)
+ {
+ vs200x_project_vc_post_build_event_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCPostBuildEventTool\"/>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_VCResourceCompilerTool)
+ {
+ vs200x_project_vc_resource_compiler_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCResourceCompilerTool\"/>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_VCWebDeploymentTool)
+ {
+ vs200x_project_vc_web_deployment_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCWebDeploymentTool\"/>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_VCWebServiceProxyGeneratorTool)
+ {
+ vs200x_project_vc_web_service_proxy_generator_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_VCXDCMakeTool)
+ {
+ vs200x_project_vc_xdc_make_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCXDCMakeTool\"/>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_VCXMLDataGeneratorTool)
+ {
+ vs200x_project_vc_xml_data_generator_tool(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t\t\t<Tool\n"
+ "\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Files section tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxVsProject, Vs200x_Files_OnNoFiles)
+ {
+ vs200x_project_files(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t<Files>\n"
+ "\t</Files>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_Files_OnSingleCppFile)
+ {
+ char* values[] = { "Hello.cpp", 0 };
+ SetField(prj, ProjectFiles, values);
+ vs200x_project_files(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t<Files>\n"
+ "\t\t<File\n"
+ "\t\t\tRelativePath=\".\\Hello.cpp\">\n"
+ "\t\t</File>\n"
+ "\t</Files>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_Files_OnUpperDirectory)
+ {
+ char* values[] = { "../../Hello.cpp", 0 };
+ SetField(prj, ProjectFiles, values);
+ vs200x_project_files(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t<Files>\n"
+ "\t\t<File\n"
+ "\t\t\tRelativePath=\"..\\..\\Hello.cpp\">\n"
+ "\t\t</File>\n"
+ "\t</Files>\n",
+ buffer);
+ }
+
+ TEST_FIXTURE(FxVsProject, Vs200x_Files_OnGroupedCppFile)
+ {
+ char* values[] = { "Src/Hello.cpp", 0 };
+ SetField(prj, ProjectFiles, values);
+ vs200x_project_files(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t<Files>\n"
+ "\t\t<Filter\n"
+ "\t\t\tName=\"Src\"\n"
+ "\t\t\tFilter=\"\">\n"
+ "\t\t\t<File\n"
+ "\t\t\t\tRelativePath=\".\\Src\\Hello.cpp\">\n"
+ "\t\t\t</File>\n"
+ "\t\t</Filter>\n"
+ "\t</Files>\n",
+ buffer);
+ }
+
+
+ /**********************************************************************
+ * Globals section tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxVsProject, Vs200x_Globals)
+ {
+ vs200x_project_globals(sess, prj, strm);
+ CHECK_EQUAL(
+ "\t<Globals>\n"
+ "\t</Globals>\n"
+ "</VisualStudioProject>\n",
+ buffer);
+ }
+}
diff --git a/src/action/vs200x/tests/vs200x_tests.cpp b/src/action/vs200x/tests/vs200x_tests.cpp
index 54e385b..2f3d62f 100644
--- a/src/action/vs200x/tests/vs200x_tests.cpp
+++ b/src/action/vs200x/tests/vs200x_tests.cpp
@@ -1,49 +1,49 @@
-/**
- * \file vs200x_tests.cpp
- * \brief Automated tests for VS200x support functions.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/vs200x/vs200x.h"
-}
-
-
-SUITE(action)
-{
- /**********************************************************************
- * Language GUID tests
- **********************************************************************/
-
- TEST(ToolGuid_ReturnsCorrectGUID_OnC)
- {
- const char* result = vs200x_tool_guid("c");
- CHECK_EQUAL("8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942", result);
- }
-
- TEST(ToolGuid_ReturnsCorrectGUID_OnCpp)
- {
- const char* result = vs200x_tool_guid("c++");
- CHECK_EQUAL("8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942", result);
- }
-
- TEST(ToolGuid_ReturnsCorrectGUID_OnCSharp)
- {
- const char* result = vs200x_tool_guid("c#");
- CHECK_EQUAL("FAE04EC0-301F-11D3-BF4B-00C04F79EFBC", result);
- }
-
-
- /**********************************************************************
- * Language file extensions
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, ProjectExtension_IsVcproj_ForC)
- {
- project_set_language(prj, "c");
- const char* result = vs200x_project_file_extension(prj);
- CHECK_EQUAL(".vcproj", result);
- }
-}
+/**
+ * \file vs200x_tests.cpp
+ * \brief Automated tests for VS200x support functions.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/vs200x/vs200x.h"
+}
+
+
+SUITE(action)
+{
+ /**********************************************************************
+ * Language GUID tests
+ **********************************************************************/
+
+ TEST(ToolGuid_ReturnsCorrectGUID_OnC)
+ {
+ const char* result = vs200x_tool_guid("c");
+ CHECK_EQUAL("8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942", result);
+ }
+
+ TEST(ToolGuid_ReturnsCorrectGUID_OnCpp)
+ {
+ const char* result = vs200x_tool_guid("c++");
+ CHECK_EQUAL("8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942", result);
+ }
+
+ TEST(ToolGuid_ReturnsCorrectGUID_OnCSharp)
+ {
+ const char* result = vs200x_tool_guid("c#");
+ CHECK_EQUAL("FAE04EC0-301F-11D3-BF4B-00C04F79EFBC", result);
+ }
+
+
+ /**********************************************************************
+ * Language file extensions
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, ProjectExtension_IsVcproj_ForC)
+ {
+ project_set_language(prj, "c");
+ const char* result = vs200x_project_file_extension(prj);
+ CHECK_EQUAL(".vcproj", result);
+ }
+}
diff --git a/src/action/vs200x/tests/vs200x_xml_tests.cpp b/src/action/vs200x/tests/vs200x_xml_tests.cpp
index 28b8115..dfde57a 100644
--- a/src/action/vs200x/tests/vs200x_xml_tests.cpp
+++ b/src/action/vs200x/tests/vs200x_xml_tests.cpp
@@ -1,94 +1,94 @@
-/**
- * \file vs200x_xml_tests.cpp
- * \brief Automated tests for Visual Studio XML output functions.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "action/tests/action_tests.h"
-extern "C" {
-#include "action/vs200x/vs200x.h"
-}
-
-
-SUITE(action)
-{
- /**********************************************************************
- * Element end tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, ElementEnd_SlashBracket_Vs2002)
- {
- session_set_action(sess, "vs2002");
- vs200x_element_end(sess, strm, 0, "/>");
- CHECK_EQUAL("/>\n", buffer);
- }
-
- TEST_FIXTURE(FxAction, ElementEnd_SlashBracket_Vs2003)
- {
- session_set_action(sess, "vs2003");
- vs200x_element_end(sess, strm, 0, "/>");
- CHECK_EQUAL("/>\n", buffer);
- }
-
- TEST_FIXTURE(FxAction, ElementEnd_SlashBracket_Vs2005)
- {
- session_set_action(sess, "vs2005");
- vs200x_element_end(sess, strm, 0, "/>");
- CHECK_EQUAL("\n/>\n", buffer);
- }
-
- TEST_FIXTURE(FxAction, ElementEnd_SlashBracket_Vs2008)
- {
- session_set_action(sess, "vs2008");
- vs200x_element_end(sess, strm, 0, "/>");
- CHECK_EQUAL("\n/>\n", buffer);
- }
-
- TEST_FIXTURE(FxAction, ElementEnd_Bracket_Vs2002)
- {
- session_set_action(sess, "vs2002");
- vs200x_element_end(sess, strm, 0, ">");
- CHECK_EQUAL(">\n", buffer);
- }
-
- TEST_FIXTURE(FxAction, ElementEnd_Bracket_Vs2003)
- {
- session_set_action(sess, "vs2003");
- vs200x_element_end(sess, strm, 0, ">");
- CHECK_EQUAL(">\n", buffer);
- }
-
- TEST_FIXTURE(FxAction, ElementEnd_Bracket_Vs2005)
- {
- session_set_action(sess, "vs2005");
- vs200x_element_end(sess, strm, 0, ">");
- CHECK_EQUAL("\n\t>\n", buffer);
- }
-
- TEST_FIXTURE(FxAction, ElementEnd_Bracket_Vs2008)
- {
- session_set_action(sess, "vs2008");
- vs200x_element_end(sess, strm, 0, ">");
- CHECK_EQUAL("\n\t>\n", buffer);
- }
-
-
- /**********************************************************************
- * Attribute tests
- **********************************************************************/
-
- TEST_FIXTURE(FxAction, Attribute_OnLevel0)
- {
- session_set_action(sess, "vs2002");
- vs200x_attribute(strm, 0, "ProjectType", "Visual C++");
- CHECK_EQUAL("\nProjectType=\"Visual C++\"", buffer);
- }
-
- TEST_FIXTURE(FxAction, Attribute_OnLevel3)
- {
- session_set_action(sess, "vs2002");
- vs200x_attribute(strm, 3, "ProjectType", "Visual C++");
- CHECK_EQUAL("\n\t\t\tProjectType=\"Visual C++\"", buffer);
- }
-}
+/**
+ * \file vs200x_xml_tests.cpp
+ * \brief Automated tests for Visual Studio XML output functions.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "action/tests/action_tests.h"
+extern "C" {
+#include "action/vs200x/vs200x.h"
+}
+
+
+SUITE(action)
+{
+ /**********************************************************************
+ * Element end tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, ElementEnd_SlashBracket_Vs2002)
+ {
+ session_set_action(sess, "vs2002");
+ vs200x_element_end(sess, strm, 0, "/>");
+ CHECK_EQUAL("/>\n", buffer);
+ }
+
+ TEST_FIXTURE(FxAction, ElementEnd_SlashBracket_Vs2003)
+ {
+ session_set_action(sess, "vs2003");
+ vs200x_element_end(sess, strm, 0, "/>");
+ CHECK_EQUAL("/>\n", buffer);
+ }
+
+ TEST_FIXTURE(FxAction, ElementEnd_SlashBracket_Vs2005)
+ {
+ session_set_action(sess, "vs2005");
+ vs200x_element_end(sess, strm, 0, "/>");
+ CHECK_EQUAL("\n/>\n", buffer);
+ }
+
+ TEST_FIXTURE(FxAction, ElementEnd_SlashBracket_Vs2008)
+ {
+ session_set_action(sess, "vs2008");
+ vs200x_element_end(sess, strm, 0, "/>");
+ CHECK_EQUAL("\n/>\n", buffer);
+ }
+
+ TEST_FIXTURE(FxAction, ElementEnd_Bracket_Vs2002)
+ {
+ session_set_action(sess, "vs2002");
+ vs200x_element_end(sess, strm, 0, ">");
+ CHECK_EQUAL(">\n", buffer);
+ }
+
+ TEST_FIXTURE(FxAction, ElementEnd_Bracket_Vs2003)
+ {
+ session_set_action(sess, "vs2003");
+ vs200x_element_end(sess, strm, 0, ">");
+ CHECK_EQUAL(">\n", buffer);
+ }
+
+ TEST_FIXTURE(FxAction, ElementEnd_Bracket_Vs2005)
+ {
+ session_set_action(sess, "vs2005");
+ vs200x_element_end(sess, strm, 0, ">");
+ CHECK_EQUAL("\n\t>\n", buffer);
+ }
+
+ TEST_FIXTURE(FxAction, ElementEnd_Bracket_Vs2008)
+ {
+ session_set_action(sess, "vs2008");
+ vs200x_element_end(sess, strm, 0, ">");
+ CHECK_EQUAL("\n\t>\n", buffer);
+ }
+
+
+ /**********************************************************************
+ * Attribute tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxAction, Attribute_OnLevel0)
+ {
+ session_set_action(sess, "vs2002");
+ vs200x_attribute(strm, 0, "ProjectType", "Visual C++");
+ CHECK_EQUAL("\nProjectType=\"Visual C++\"", buffer);
+ }
+
+ TEST_FIXTURE(FxAction, Attribute_OnLevel3)
+ {
+ session_set_action(sess, "vs2002");
+ vs200x_attribute(strm, 3, "ProjectType", "Visual C++");
+ CHECK_EQUAL("\n\t\t\tProjectType=\"Visual C++\"", buffer);
+ }
+}
diff --git a/src/action/vs200x/vs2002.c b/src/action/vs200x/vs2002.c
index 4bbb759..ad34a95 100644
--- a/src/action/vs200x/vs2002.c
+++ b/src/action/vs200x/vs2002.c
@@ -1,85 +1,85 @@
-/**
- * \file vs2002.c
- * \brief Visual Studio 2002 project file generation action.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <stdlib.h>
-#include "premake.h"
-#include "action/action.h"
-#include "vs200x.h"
-#include "vs200x_solution.h"
-#include "vs200x_project.h"
-
-
-/** The project features supported by this action */
-static SessionFeatures Features =
-{
- { "c", "c++", NULL },
-};
-
-
-/** The VS2002 solution writing process, for session_enumerate_objects() */
-static SessionSolutionCallback SolutionCallbacks[] =
-{
- vs200x_solution_create,
- vs2002_solution_signature,
- vs2002_solution_projects,
- vs2002_solution_configuration,
- vs2002_solution_dependencies,
- vs2002_solution_project_configuration,
- vs2002_solution_extensibility,
- NULL
-};
-
-/** The VS2002 project writing process, for session_enumerate_objects() */
-static SessionProjectCallback ProjectCallbacks[] =
-{
- vs200x_project_create,
- vs200x_project_encoding,
- vs200x_project_element,
- vs200x_project_platforms,
- vs200x_project_tool_files,
- session_enumerate_configurations,
- vs200x_project_references,
- vs200x_project_files,
- vs200x_project_globals,
- NULL
-};
-
-/** The VS2002 configuration writing process, for session_enumerate_configurations() */
-static SessionProjectCallback ConfigCallbacks[] =
-{
- vs200x_project_config_element,
- vs200x_project_vc_cl_compiler_tool,
- vs200x_project_vc_custom_build_tool,
- vs200x_project_vc_linker_tool,
- vs200x_project_vc_midl_tool,
- vs200x_project_vc_post_build_event_tool,
- vs200x_project_vc_pre_build_event_tool,
- vs200x_project_vc_pre_link_event_tool,
- vs200x_project_vc_resource_compiler_tool,
- vs200x_project_vc_web_service_proxy_generator_tool,
- vs200x_project_vc_web_deployment_tool,
- vs200x_project_config_end,
- NULL
-};
-
-
-/**
- * The Visual Studio 2002 action handler.
- * \param sess The active session object.
- * \returns OKAY if successful.
- */
-int vs2002_action(Session sess)
-{
- /* make sure I can support all of the features used in the session */
- if (session_validate(sess, &Features) != OKAY)
- {
- return !OKAY;
- }
-
- stream_writeline(Console, "Generating project files for Visual Studio 2002...");
- return session_enumerate_objects(sess, SolutionCallbacks, ProjectCallbacks, ConfigCallbacks);
-}
-
+/**
+ * \file vs2002.c
+ * \brief Visual Studio 2002 project file generation action.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <stdlib.h>
+#include "premake.h"
+#include "action/action.h"
+#include "vs200x.h"
+#include "vs200x_solution.h"
+#include "vs200x_project.h"
+
+
+/** The project features supported by this action */
+static SessionFeatures Features =
+{
+ { "c", "c++", NULL },
+};
+
+
+/** The VS2002 solution writing process, for session_enumerate_objects() */
+static SessionSolutionCallback SolutionCallbacks[] =
+{
+ vs200x_solution_create,
+ vs2002_solution_signature,
+ vs2002_solution_projects,
+ vs2002_solution_configuration,
+ vs2002_solution_dependencies,
+ vs2002_solution_project_configuration,
+ vs2002_solution_extensibility,
+ NULL
+};
+
+/** The VS2002 project writing process, for session_enumerate_objects() */
+static SessionProjectCallback ProjectCallbacks[] =
+{
+ vs200x_project_create,
+ vs200x_project_encoding,
+ vs200x_project_element,
+ vs200x_project_platforms,
+ vs200x_project_tool_files,
+ session_enumerate_configurations,
+ vs200x_project_references,
+ vs200x_project_files,
+ vs200x_project_globals,
+ NULL
+};
+
+/** The VS2002 configuration writing process, for session_enumerate_configurations() */
+static SessionProjectCallback ConfigCallbacks[] =
+{
+ vs200x_project_config_element,
+ vs200x_project_vc_cl_compiler_tool,
+ vs200x_project_vc_custom_build_tool,
+ vs200x_project_vc_linker_tool,
+ vs200x_project_vc_midl_tool,
+ vs200x_project_vc_post_build_event_tool,
+ vs200x_project_vc_pre_build_event_tool,
+ vs200x_project_vc_pre_link_event_tool,
+ vs200x_project_vc_resource_compiler_tool,
+ vs200x_project_vc_web_service_proxy_generator_tool,
+ vs200x_project_vc_web_deployment_tool,
+ vs200x_project_config_end,
+ NULL
+};
+
+
+/**
+ * The Visual Studio 2002 action handler.
+ * \param sess The active session object.
+ * \returns OKAY if successful.
+ */
+int vs2002_action(Session sess)
+{
+ /* make sure I can support all of the features used in the session */
+ if (session_validate(sess, &Features) != OKAY)
+ {
+ return !OKAY;
+ }
+
+ stream_writeline(Console, "Generating project files for Visual Studio 2002...");
+ return session_enumerate_objects(sess, SolutionCallbacks, ProjectCallbacks, ConfigCallbacks);
+}
+
diff --git a/src/action/vs200x/vs2002_solution.c b/src/action/vs200x/vs2002_solution.c
index 28d3c88..2cb1ac3 100644
--- a/src/action/vs200x/vs2002_solution.c
+++ b/src/action/vs200x/vs2002_solution.c
@@ -1,169 +1,169 @@
-/**
- * \file vs2002_solution.c
- * \brief Visual Studio 2002 solution generation functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include "premake.h"
-#include "vs200x.h"
-#include "vs200x_solution.h"
-#include "vs200x_project.h"
-#include "base/path.h"
-
-
-/**
- * Create the Visual Studio 2002 solution configuration block.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int vs2002_solution_configuration(Session sess, Solution sln, Stream strm)
-{
- int i, n, z;
- UNUSED(sess);
-
- z = stream_writeline(strm, "Global");
- z |= stream_writeline(strm, "\tGlobalSection(SolutionConfiguration) = preSolution");
-
- n = solution_num_configs(sln);
- for (i = 0; i < n; ++i)
- {
- const char* config_name = solution_get_config_name(sln, i);
- z |= stream_writeline(strm, "\t\tConfigName.%d = %s", i, config_name);
- }
-
- z |= stream_writeline(strm, "\tEndGlobalSection");
- return z;
-}
-
-
-/**
- * Create the Visual Studio 2002 project dependencies block.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int vs2002_solution_dependencies(Session sess, Solution sln, Stream strm)
-{
- int z;
- UNUSED(sess);
- UNUSED(sln);
- z = stream_writeline(strm, "\tGlobalSection(ProjectDependencies) = postSolution");
- z |= stream_writeline(strm, "\tEndGlobalSection");
- return z;
-}
-
-
-/**
- * Write out the Visual Studio 2002 solution extensibility block.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int vs2002_solution_extensibility(Session sess, Solution sln, Stream strm)
-{
- int z;
- UNUSED(sess);
- UNUSED(sln);
- z = stream_writeline(strm, "\tGlobalSection(ExtensibilityGlobals) = postSolution");
- z |= stream_writeline(strm, "\tEndGlobalSection");
- z |= stream_writeline(strm, "\tGlobalSection(ExtensibilityAddIns) = postSolution");
- z |= stream_writeline(strm, "\tEndGlobalSection");
- z |= stream_writeline(strm, "EndGlobal");
- return z;
-}
-
-
-/**
- * Write out the Visual Studio 2002 project configurations block.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int vs2002_solution_project_configuration(Session sess, Solution sln, Stream strm)
-{
- int pi, pn, z;
- UNUSED(sess);
- z = stream_writeline(strm, "\tGlobalSection(ProjectConfiguration) = postSolution");
- pn = solution_num_projects(sln);
- for (pi = 0; pi < pn; ++pi)
- {
- int ci, cn;
- Project prj = solution_get_project(sln, pi);
- const char* prj_id = project_get_guid(prj);
-
- cn = solution_num_configs(sln);
- for (ci = 0; ci < cn; ++ci)
- {
- const char* config_name = solution_get_config_name(sln, ci);
- z |= stream_writeline(strm, "\t\t{%s}.%s.ActiveCfg = %s|Win32", prj_id, config_name, config_name);
- z |= stream_writeline(strm, "\t\t{%s}.%s.Build.0 = %s|Win32", prj_id, config_name, config_name);
- }
- }
- z |= stream_writeline(strm, "\tEndGlobalSection");
- return z;
-}
-
-
-/**
- * Write out the list of projects contained by the solution.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int vs2002_solution_projects(Session sess, Solution sln, Stream strm)
-{
- const char* sln_path;
- int i, n, z = OKAY;
-
- UNUSED(sess);
-
- /* project file paths are specified relative to the solution */
- sln_path = path_directory(solution_get_filename(sln, NULL, NULL));
-
- n = solution_num_projects(sln);
- for (i = 0; i < n; ++i)
- {
- Project prj = solution_get_project(sln, i);
- const char* prj_name = project_get_name(prj);
- const char* prj_id = project_get_guid(prj);
- const char* prj_lang = project_get_language(prj);
- const char* prj_ext = vs200x_project_file_extension(prj);
- const char* prj_file = project_get_filename(prj, prj_name, prj_ext);
- const char* tool_id = vs200x_tool_guid(prj_lang);
-
- /* convert absolute project file name to be relative to solution */
- prj_file = path_relative(sln_path, prj_file);
- prj_file = path_translate(prj_file, "\\");
-
- z |= stream_writeline(strm, "Project(\"{%s}\") = \"%s\", \"%s\", \"{%s}\"", tool_id, prj_name, prj_file, prj_id);
- z |= stream_writeline(strm, "EndProject");
- }
-
- return z;
-}
-
-
-/**
- * Write the Visual Studio 2002 solution file signature.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int vs2002_solution_signature(Session sess, Solution sln, Stream strm)
-{
- int z;
- UNUSED(sess);
- UNUSED(sln);
- stream_set_newline(strm, "\r\n");
- z = stream_writeline(strm, "Microsoft Visual Studio Solution File, Format Version 7.00");
- return z;
-}
+/**
+ * \file vs2002_solution.c
+ * \brief Visual Studio 2002 solution generation functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include "premake.h"
+#include "vs200x.h"
+#include "vs200x_solution.h"
+#include "vs200x_project.h"
+#include "base/path.h"
+
+
+/**
+ * Create the Visual Studio 2002 solution configuration block.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int vs2002_solution_configuration(Session sess, Solution sln, Stream strm)
+{
+ int i, n, z;
+ UNUSED(sess);
+
+ z = stream_writeline(strm, "Global");
+ z |= stream_writeline(strm, "\tGlobalSection(SolutionConfiguration) = preSolution");
+
+ n = solution_num_configs(sln);
+ for (i = 0; i < n; ++i)
+ {
+ const char* config_name = solution_get_config_name(sln, i);
+ z |= stream_writeline(strm, "\t\tConfigName.%d = %s", i, config_name);
+ }
+
+ z |= stream_writeline(strm, "\tEndGlobalSection");
+ return z;
+}
+
+
+/**
+ * Create the Visual Studio 2002 project dependencies block.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int vs2002_solution_dependencies(Session sess, Solution sln, Stream strm)
+{
+ int z;
+ UNUSED(sess);
+ UNUSED(sln);
+ z = stream_writeline(strm, "\tGlobalSection(ProjectDependencies) = postSolution");
+ z |= stream_writeline(strm, "\tEndGlobalSection");
+ return z;
+}
+
+
+/**
+ * Write out the Visual Studio 2002 solution extensibility block.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int vs2002_solution_extensibility(Session sess, Solution sln, Stream strm)
+{
+ int z;
+ UNUSED(sess);
+ UNUSED(sln);
+ z = stream_writeline(strm, "\tGlobalSection(ExtensibilityGlobals) = postSolution");
+ z |= stream_writeline(strm, "\tEndGlobalSection");
+ z |= stream_writeline(strm, "\tGlobalSection(ExtensibilityAddIns) = postSolution");
+ z |= stream_writeline(strm, "\tEndGlobalSection");
+ z |= stream_writeline(strm, "EndGlobal");
+ return z;
+}
+
+
+/**
+ * Write out the Visual Studio 2002 project configurations block.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int vs2002_solution_project_configuration(Session sess, Solution sln, Stream strm)
+{
+ int pi, pn, z;
+ UNUSED(sess);
+ z = stream_writeline(strm, "\tGlobalSection(ProjectConfiguration) = postSolution");
+ pn = solution_num_projects(sln);
+ for (pi = 0; pi < pn; ++pi)
+ {
+ int ci, cn;
+ Project prj = solution_get_project(sln, pi);
+ const char* prj_id = project_get_guid(prj);
+
+ cn = solution_num_configs(sln);
+ for (ci = 0; ci < cn; ++ci)
+ {
+ const char* config_name = solution_get_config_name(sln, ci);
+ z |= stream_writeline(strm, "\t\t{%s}.%s.ActiveCfg = %s|Win32", prj_id, config_name, config_name);
+ z |= stream_writeline(strm, "\t\t{%s}.%s.Build.0 = %s|Win32", prj_id, config_name, config_name);
+ }
+ }
+ z |= stream_writeline(strm, "\tEndGlobalSection");
+ return z;
+}
+
+
+/**
+ * Write out the list of projects contained by the solution.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int vs2002_solution_projects(Session sess, Solution sln, Stream strm)
+{
+ const char* sln_path;
+ int i, n, z = OKAY;
+
+ UNUSED(sess);
+
+ /* project file paths are specified relative to the solution */
+ sln_path = path_directory(solution_get_filename(sln, NULL, NULL));
+
+ n = solution_num_projects(sln);
+ for (i = 0; i < n; ++i)
+ {
+ Project prj = solution_get_project(sln, i);
+ const char* prj_name = project_get_name(prj);
+ const char* prj_id = project_get_guid(prj);
+ const char* prj_lang = project_get_language(prj);
+ const char* prj_ext = vs200x_project_file_extension(prj);
+ const char* prj_file = project_get_filename(prj, prj_name, prj_ext);
+ const char* tool_id = vs200x_tool_guid(prj_lang);
+
+ /* convert absolute project file name to be relative to solution */
+ prj_file = path_relative(sln_path, prj_file);
+ prj_file = path_translate(prj_file, "\\");
+
+ z |= stream_writeline(strm, "Project(\"{%s}\") = \"%s\", \"%s\", \"{%s}\"", tool_id, prj_name, prj_file, prj_id);
+ z |= stream_writeline(strm, "EndProject");
+ }
+
+ return z;
+}
+
+
+/**
+ * Write the Visual Studio 2002 solution file signature.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int vs2002_solution_signature(Session sess, Solution sln, Stream strm)
+{
+ int z;
+ UNUSED(sess);
+ UNUSED(sln);
+ stream_set_newline(strm, "\r\n");
+ z = stream_writeline(strm, "Microsoft Visual Studio Solution File, Format Version 7.00");
+ return z;
+}
diff --git a/src/action/vs200x/vs2003.c b/src/action/vs200x/vs2003.c
index 655aa46..6c9ec3c 100644
--- a/src/action/vs200x/vs2003.c
+++ b/src/action/vs200x/vs2003.c
@@ -1,84 +1,84 @@
-/**
- * \file vs2003.c
- * \brief Visual Studio 2003 project file generation action.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <stdlib.h>
-#include "premake.h"
-#include "action/action.h"
-#include "vs200x.h"
-#include "vs200x_solution.h"
-#include "vs200x_project.h"
-
-
-/** The project features supported by this action */
-static SessionFeatures Features =
-{
- { "c", "c++", NULL },
-};
-
-
-/** The VS2003 solution writing process, for session_enumerate_objects() */
-static SessionSolutionCallback SolutionCallbacks[] =
-{
- vs200x_solution_create,
- vs2003_solution_signature,
- vs2002_solution_projects,
- vs2003_solution_configuration,
- vs2002_solution_project_configuration,
- vs2002_solution_extensibility,
- NULL
-};
-
-/** The VS2003 project writing process, for session_enumerate_objects() */
-static SessionProjectCallback ProjectCallbacks[] =
-{
- vs200x_project_create,
- vs200x_project_encoding,
- vs200x_project_element,
- vs200x_project_platforms,
- vs200x_project_tool_files,
- session_enumerate_configurations,
- vs200x_project_references,
- vs200x_project_files,
- vs200x_project_globals,
- NULL
-};
-
-/** The VS2003 configuration writing process, for session_enumerate_configurations() */
-static SessionProjectCallback ConfigCallbacks[] =
-{
- vs200x_project_config_element,
- vs200x_project_vc_cl_compiler_tool,
- vs200x_project_vc_custom_build_tool,
- vs200x_project_vc_linker_tool,
- vs200x_project_vc_midl_tool,
- vs200x_project_vc_post_build_event_tool,
- vs200x_project_vc_pre_build_event_tool,
- vs200x_project_vc_pre_link_event_tool,
- vs200x_project_vc_resource_compiler_tool,
- vs200x_project_vc_web_service_proxy_generator_tool,
- vs200x_project_vc_xml_data_generator_tool,
- vs200x_project_vc_web_deployment_tool,
- vs200x_project_config_end,
- NULL
-};
-
-
-/**
- * The Visual Studio 2003 action handler.
- * \param sess The active session object.
- * \returns OKAY if successful.
- */
-int vs2003_action(Session sess)
-{
- /* make sure I can support all of the features used in the session */
- if (session_validate(sess, &Features) != OKAY)
- {
- return !OKAY;
- }
-
- stream_writeline(Console, "Generating project files for Visual Studio 2003...");
- return session_enumerate_objects(sess, SolutionCallbacks, ProjectCallbacks, ConfigCallbacks);
-}
+/**
+ * \file vs2003.c
+ * \brief Visual Studio 2003 project file generation action.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <stdlib.h>
+#include "premake.h"
+#include "action/action.h"
+#include "vs200x.h"
+#include "vs200x_solution.h"
+#include "vs200x_project.h"
+
+
+/** The project features supported by this action */
+static SessionFeatures Features =
+{
+ { "c", "c++", NULL },
+};
+
+
+/** The VS2003 solution writing process, for session_enumerate_objects() */
+static SessionSolutionCallback SolutionCallbacks[] =
+{
+ vs200x_solution_create,
+ vs2003_solution_signature,
+ vs2002_solution_projects,
+ vs2003_solution_configuration,
+ vs2002_solution_project_configuration,
+ vs2002_solution_extensibility,
+ NULL
+};
+
+/** The VS2003 project writing process, for session_enumerate_objects() */
+static SessionProjectCallback ProjectCallbacks[] =
+{
+ vs200x_project_create,
+ vs200x_project_encoding,
+ vs200x_project_element,
+ vs200x_project_platforms,
+ vs200x_project_tool_files,
+ session_enumerate_configurations,
+ vs200x_project_references,
+ vs200x_project_files,
+ vs200x_project_globals,
+ NULL
+};
+
+/** The VS2003 configuration writing process, for session_enumerate_configurations() */
+static SessionProjectCallback ConfigCallbacks[] =
+{
+ vs200x_project_config_element,
+ vs200x_project_vc_cl_compiler_tool,
+ vs200x_project_vc_custom_build_tool,
+ vs200x_project_vc_linker_tool,
+ vs200x_project_vc_midl_tool,
+ vs200x_project_vc_post_build_event_tool,
+ vs200x_project_vc_pre_build_event_tool,
+ vs200x_project_vc_pre_link_event_tool,
+ vs200x_project_vc_resource_compiler_tool,
+ vs200x_project_vc_web_service_proxy_generator_tool,
+ vs200x_project_vc_xml_data_generator_tool,
+ vs200x_project_vc_web_deployment_tool,
+ vs200x_project_config_end,
+ NULL
+};
+
+
+/**
+ * The Visual Studio 2003 action handler.
+ * \param sess The active session object.
+ * \returns OKAY if successful.
+ */
+int vs2003_action(Session sess)
+{
+ /* make sure I can support all of the features used in the session */
+ if (session_validate(sess, &Features) != OKAY)
+ {
+ return !OKAY;
+ }
+
+ stream_writeline(Console, "Generating project files for Visual Studio 2003...");
+ return session_enumerate_objects(sess, SolutionCallbacks, ProjectCallbacks, ConfigCallbacks);
+}
diff --git a/src/action/vs200x/vs2003_solution.c b/src/action/vs200x/vs2003_solution.c
index d2ee82b..0b744ed 100644
--- a/src/action/vs200x/vs2003_solution.c
+++ b/src/action/vs200x/vs2003_solution.c
@@ -1,55 +1,55 @@
-/**
- * \file vs2003_solution.c
- * \brief Visual Studio 2003 solution generation functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include "premake.h"
-#include "vs200x_solution.h"
-
-
-/**
- * Create the Visual Studio 2003 solution configuration block.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int vs2003_solution_configuration(Session sess, Solution sln, Stream strm)
-{
- int i, n, z;
- UNUSED(sess);
-
- z = stream_writeline(strm, "Global");
- z |= stream_writeline(strm, "\tGlobalSection(SolutionConfiguration) = preSolution");
-
- n = solution_num_configs(sln);
- for (i = 0; i < n; ++i)
- {
- const char* config_name = solution_get_config_name(sln, i);
- z |= stream_writeline(strm, "\t\t%s = %s", config_name, config_name);
- }
-
- z |= stream_writeline(strm, "\tEndGlobalSection");
- return z;
-}
-
-
-/**
- * Write the Visual Studio 2003 solution file signature.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int vs2003_solution_signature(Session sess, Solution sln, Stream strm)
-{
- int z;
- UNUSED(sess);
- UNUSED(sln);
- stream_set_newline(strm, "\r\n");
- z = stream_writeline(strm, "Microsoft Visual Studio Solution File, Format Version 8.00");
- return z;
-}
+/**
+ * \file vs2003_solution.c
+ * \brief Visual Studio 2003 solution generation functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include "premake.h"
+#include "vs200x_solution.h"
+
+
+/**
+ * Create the Visual Studio 2003 solution configuration block.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int vs2003_solution_configuration(Session sess, Solution sln, Stream strm)
+{
+ int i, n, z;
+ UNUSED(sess);
+
+ z = stream_writeline(strm, "Global");
+ z |= stream_writeline(strm, "\tGlobalSection(SolutionConfiguration) = preSolution");
+
+ n = solution_num_configs(sln);
+ for (i = 0; i < n; ++i)
+ {
+ const char* config_name = solution_get_config_name(sln, i);
+ z |= stream_writeline(strm, "\t\t%s = %s", config_name, config_name);
+ }
+
+ z |= stream_writeline(strm, "\tEndGlobalSection");
+ return z;
+}
+
+
+/**
+ * Write the Visual Studio 2003 solution file signature.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int vs2003_solution_signature(Session sess, Solution sln, Stream strm)
+{
+ int z;
+ UNUSED(sess);
+ UNUSED(sln);
+ stream_set_newline(strm, "\r\n");
+ z = stream_writeline(strm, "Microsoft Visual Studio Solution File, Format Version 8.00");
+ return z;
+}
diff --git a/src/action/vs200x/vs2005.c b/src/action/vs200x/vs2005.c
index ab0a831..8b4175a 100644
--- a/src/action/vs200x/vs2005.c
+++ b/src/action/vs200x/vs2005.c
@@ -1,92 +1,92 @@
-/**
- * \file vs2005.c
- * \brief Visual Studio 2005 project file generation action.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <stdlib.h>
-#include "premake.h"
-#include "action/action.h"
-#include "vs200x.h"
-#include "vs200x_solution.h"
-#include "vs200x_project.h"
-
-
-/** The project features supported by this action */
-static SessionFeatures Features =
-{
- { "c", "c++", NULL },
-};
-
-
-/** The VS2005 solution writing process, for session_enumerate_objects() */
-static SessionSolutionCallback SolutionCallbacks[] =
-{
- vs200x_solution_create,
- vs2005_solution_signature,
- vs2002_solution_projects,
- vs2005_solution_platforms,
- vs2005_solution_project_platforms,
- vs2005_solution_properties,
- NULL
-};
-
-/** The VS2005 project writing process, for session_enumerate_objects() */
-static SessionProjectCallback ProjectCallbacks[] =
-{
- vs200x_project_create,
- vs200x_project_encoding,
- vs200x_project_element,
- vs200x_project_platforms,
- vs200x_project_tool_files,
- session_enumerate_configurations,
- vs200x_project_references,
- vs200x_project_files,
- vs200x_project_globals,
- NULL
-};
-
-/** The VS2005 configuration writing process, for session_enumerate_configurations() */
-static SessionProjectCallback ConfigCallbacks[] =
-{
- vs200x_project_config_element,
- vs200x_project_vc_pre_build_event_tool,
- vs200x_project_vc_custom_build_tool,
- vs200x_project_vc_xml_data_generator_tool,
- vs200x_project_vc_web_service_proxy_generator_tool,
- vs200x_project_vc_midl_tool,
- vs200x_project_vc_cl_compiler_tool,
- vs200x_project_vc_managed_resource_compiler_tool,
- vs200x_project_vc_resource_compiler_tool,
- vs200x_project_vc_pre_link_event_tool,
- vs200x_project_vc_linker_tool,
- vs200x_project_vc_alink_tool,
- vs200x_project_vc_manifest_tool,
- vs200x_project_vc_xdc_make_tool,
- vs200x_project_vc_bsc_make_tool,
- vs200x_project_vc_fx_cop_tool,
- vs200x_project_vc_app_verifier_tool,
- vs200x_project_vc_web_deployment_tool,
- vs200x_project_vc_post_build_event_tool,
- vs200x_project_config_end,
- NULL
-};
-
-
-/**
- * The Visual Studio 2005 action handler.
- * \param sess The active session object.
- * \returns OKAY if successful.
- */
-int vs2005_action(Session sess)
-{
- /* make sure I can support all of the features used in the session */
- if (session_validate(sess, &Features) != OKAY)
- {
- return !OKAY;
- }
-
- stream_writeline(Console, "Generating project files for Visual Studio 2005...");
- return session_enumerate_objects(sess, SolutionCallbacks, ProjectCallbacks, ConfigCallbacks);
-}
-
+/**
+ * \file vs2005.c
+ * \brief Visual Studio 2005 project file generation action.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <stdlib.h>
+#include "premake.h"
+#include "action/action.h"
+#include "vs200x.h"
+#include "vs200x_solution.h"
+#include "vs200x_project.h"
+
+
+/** The project features supported by this action */
+static SessionFeatures Features =
+{
+ { "c", "c++", NULL },
+};
+
+
+/** The VS2005 solution writing process, for session_enumerate_objects() */
+static SessionSolutionCallback SolutionCallbacks[] =
+{
+ vs200x_solution_create,
+ vs2005_solution_signature,
+ vs2002_solution_projects,
+ vs2005_solution_platforms,
+ vs2005_solution_project_platforms,
+ vs2005_solution_properties,
+ NULL
+};
+
+/** The VS2005 project writing process, for session_enumerate_objects() */
+static SessionProjectCallback ProjectCallbacks[] =
+{
+ vs200x_project_create,
+ vs200x_project_encoding,
+ vs200x_project_element,
+ vs200x_project_platforms,
+ vs200x_project_tool_files,
+ session_enumerate_configurations,
+ vs200x_project_references,
+ vs200x_project_files,
+ vs200x_project_globals,
+ NULL
+};
+
+/** The VS2005 configuration writing process, for session_enumerate_configurations() */
+static SessionProjectCallback ConfigCallbacks[] =
+{
+ vs200x_project_config_element,
+ vs200x_project_vc_pre_build_event_tool,
+ vs200x_project_vc_custom_build_tool,
+ vs200x_project_vc_xml_data_generator_tool,
+ vs200x_project_vc_web_service_proxy_generator_tool,
+ vs200x_project_vc_midl_tool,
+ vs200x_project_vc_cl_compiler_tool,
+ vs200x_project_vc_managed_resource_compiler_tool,
+ vs200x_project_vc_resource_compiler_tool,
+ vs200x_project_vc_pre_link_event_tool,
+ vs200x_project_vc_linker_tool,
+ vs200x_project_vc_alink_tool,
+ vs200x_project_vc_manifest_tool,
+ vs200x_project_vc_xdc_make_tool,
+ vs200x_project_vc_bsc_make_tool,
+ vs200x_project_vc_fx_cop_tool,
+ vs200x_project_vc_app_verifier_tool,
+ vs200x_project_vc_web_deployment_tool,
+ vs200x_project_vc_post_build_event_tool,
+ vs200x_project_config_end,
+ NULL
+};
+
+
+/**
+ * The Visual Studio 2005 action handler.
+ * \param sess The active session object.
+ * \returns OKAY if successful.
+ */
+int vs2005_action(Session sess)
+{
+ /* make sure I can support all of the features used in the session */
+ if (session_validate(sess, &Features) != OKAY)
+ {
+ return !OKAY;
+ }
+
+ stream_writeline(Console, "Generating project files for Visual Studio 2005...");
+ return session_enumerate_objects(sess, SolutionCallbacks, ProjectCallbacks, ConfigCallbacks);
+}
+
diff --git a/src/action/vs200x/vs2005_solution.c b/src/action/vs200x/vs2005_solution.c
index 09aef76..27c89be 100644
--- a/src/action/vs200x/vs2005_solution.c
+++ b/src/action/vs200x/vs2005_solution.c
@@ -1,110 +1,110 @@
-/**
- * \file vs2005_solution.c
- * \brief Visual Studio 2005 solution generation functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include "premake.h"
-#include "vs200x_solution.h"
-
-
-/**
- * Write out the Visual Studio solution-level platform configuration block.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int vs2005_solution_platforms(Session sess, Solution sln, Stream strm)
-{
- int i, n, z;
- UNUSED(sess);
-
- z = stream_writeline(strm, "Global");
- z |= stream_writeline(strm, "\tGlobalSection(SolutionConfigurationPlatforms) = preSolution");
-
- n = solution_num_configs(sln);
- for (i = 0; i < n; ++i)
- {
- const char* config_name = solution_get_config_name(sln, i);
- z |= stream_writeline(strm, "\t\t%s|Win32 = %s|Win32", config_name, config_name);
- }
-
- z |= stream_writeline(strm, "\tEndGlobalSection");
- return z;
-}
-
-
-/**
- * Write out the Visual Studio 2005 project-level platform configurations block.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int vs2005_solution_project_platforms(Session sess, Solution sln, Stream strm)
-{
- int pi, pn, z;
- UNUSED(sess);
- z = stream_writeline(strm, "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution");
- pn = solution_num_projects(sln);
- for (pi = 0; pi < pn; ++pi)
- {
- int ci, cn;
- Project prj = solution_get_project(sln, pi);
- const char* prj_id = project_get_guid(prj);
-
- cn = solution_num_configs(sln);
- for (ci = 0; ci < cn; ++ci)
- {
- const char* config_name = solution_get_config_name(sln, ci);
- z |= stream_writeline(strm, "\t\t{%s}.%s|Win32.ActiveCfg = %s|Win32", prj_id, config_name, config_name);
- z |= stream_writeline(strm, "\t\t{%s}.%s|Win32.Build.0 = %s|Win32", prj_id, config_name, config_name);
- }
- }
- z |= stream_writeline(strm, "\tEndGlobalSection");
- return z;
-}
-
-
-/**
- * Write out the Visual Studio 2005 solution properties block.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int vs2005_solution_properties(Session sess, Solution sln, Stream strm)
-{
- int z;
- UNUSED(sess);
- UNUSED(sln);
- z = stream_writeline(strm, "\tGlobalSection(SolutionProperties) = preSolution");
- z |= stream_writeline(strm, "\t\tHideSolutionNode = FALSE");
- z |= stream_writeline(strm, "\tEndGlobalSection");
- z |= stream_writeline(strm, "EndGlobal");
- return z;
-}
-
-
-/**
- * Write the Visual Studio 2005 solution file signature.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int vs2005_solution_signature(Session sess, Solution sln, Stream strm)
-{
- int z;
- UNUSED(sess);
- UNUSED(sln);
- stream_set_newline(strm, "\r\n");
- z = stream_write_unicode_marker(strm);
- z |= stream_writeline(strm, "");
- z |= stream_writeline(strm, "Microsoft Visual Studio Solution File, Format Version 9.00");
- z |= stream_writeline(strm, "# Visual Studio 2005");
- return z;
-}
+/**
+ * \file vs2005_solution.c
+ * \brief Visual Studio 2005 solution generation functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include "premake.h"
+#include "vs200x_solution.h"
+
+
+/**
+ * Write out the Visual Studio solution-level platform configuration block.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int vs2005_solution_platforms(Session sess, Solution sln, Stream strm)
+{
+ int i, n, z;
+ UNUSED(sess);
+
+ z = stream_writeline(strm, "Global");
+ z |= stream_writeline(strm, "\tGlobalSection(SolutionConfigurationPlatforms) = preSolution");
+
+ n = solution_num_configs(sln);
+ for (i = 0; i < n; ++i)
+ {
+ const char* config_name = solution_get_config_name(sln, i);
+ z |= stream_writeline(strm, "\t\t%s|Win32 = %s|Win32", config_name, config_name);
+ }
+
+ z |= stream_writeline(strm, "\tEndGlobalSection");
+ return z;
+}
+
+
+/**
+ * Write out the Visual Studio 2005 project-level platform configurations block.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int vs2005_solution_project_platforms(Session sess, Solution sln, Stream strm)
+{
+ int pi, pn, z;
+ UNUSED(sess);
+ z = stream_writeline(strm, "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution");
+ pn = solution_num_projects(sln);
+ for (pi = 0; pi < pn; ++pi)
+ {
+ int ci, cn;
+ Project prj = solution_get_project(sln, pi);
+ const char* prj_id = project_get_guid(prj);
+
+ cn = solution_num_configs(sln);
+ for (ci = 0; ci < cn; ++ci)
+ {
+ const char* config_name = solution_get_config_name(sln, ci);
+ z |= stream_writeline(strm, "\t\t{%s}.%s|Win32.ActiveCfg = %s|Win32", prj_id, config_name, config_name);
+ z |= stream_writeline(strm, "\t\t{%s}.%s|Win32.Build.0 = %s|Win32", prj_id, config_name, config_name);
+ }
+ }
+ z |= stream_writeline(strm, "\tEndGlobalSection");
+ return z;
+}
+
+
+/**
+ * Write out the Visual Studio 2005 solution properties block.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int vs2005_solution_properties(Session sess, Solution sln, Stream strm)
+{
+ int z;
+ UNUSED(sess);
+ UNUSED(sln);
+ z = stream_writeline(strm, "\tGlobalSection(SolutionProperties) = preSolution");
+ z |= stream_writeline(strm, "\t\tHideSolutionNode = FALSE");
+ z |= stream_writeline(strm, "\tEndGlobalSection");
+ z |= stream_writeline(strm, "EndGlobal");
+ return z;
+}
+
+
+/**
+ * Write the Visual Studio 2005 solution file signature.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int vs2005_solution_signature(Session sess, Solution sln, Stream strm)
+{
+ int z;
+ UNUSED(sess);
+ UNUSED(sln);
+ stream_set_newline(strm, "\r\n");
+ z = stream_write_unicode_marker(strm);
+ z |= stream_writeline(strm, "");
+ z |= stream_writeline(strm, "Microsoft Visual Studio Solution File, Format Version 9.00");
+ z |= stream_writeline(strm, "# Visual Studio 2005");
+ return z;
+}
diff --git a/src/action/vs200x/vs2008.c b/src/action/vs200x/vs2008.c
index 88cbe8d..20f191f 100644
--- a/src/action/vs200x/vs2008.c
+++ b/src/action/vs200x/vs2008.c
@@ -1,91 +1,91 @@
-/**
- * \file vs2008.c
- * \brief Visual Studio 2008 project file generation action.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <stdlib.h>
-#include "premake.h"
-#include "action/action.h"
-#include "vs200x.h"
-#include "vs200x_solution.h"
-#include "vs200x_project.h"
-
-
-/** The project features supported by this action */
-static SessionFeatures Features =
-{
- { "c", "c++", NULL },
-};
-
-
-/** The VS2008 solution writing process, for session_enumerate_objects() */
-static SessionSolutionCallback SolutionCallbacks[] =
-{
- vs200x_solution_create,
- vs2008_solution_signature,
- vs2002_solution_projects,
- vs2005_solution_platforms,
- vs2005_solution_project_platforms,
- vs2005_solution_properties,
- NULL
-};
-
-/** The VS2008 project writing process, for session_enumerate_objects() */
-static SessionProjectCallback ProjectCallbacks[] =
-{
- vs200x_project_create,
- vs200x_project_encoding,
- vs200x_project_element,
- vs200x_project_platforms,
- vs200x_project_tool_files,
- session_enumerate_configurations,
- vs200x_project_references,
- vs200x_project_files,
- vs200x_project_globals,
- NULL
-};
-
-/** The VS2008 configuration writing process, for session_enumerate_configurations() */
-static SessionProjectCallback ConfigCallbacks[] =
-{
- vs200x_project_config_element,
- vs200x_project_vc_pre_build_event_tool,
- vs200x_project_vc_custom_build_tool,
- vs200x_project_vc_xml_data_generator_tool,
- vs200x_project_vc_web_service_proxy_generator_tool,
- vs200x_project_vc_midl_tool,
- vs200x_project_vc_cl_compiler_tool,
- vs200x_project_vc_managed_resource_compiler_tool,
- vs200x_project_vc_resource_compiler_tool,
- vs200x_project_vc_pre_link_event_tool,
- vs200x_project_vc_linker_tool,
- vs200x_project_vc_alink_tool,
- vs200x_project_vc_manifest_tool,
- vs200x_project_vc_xdc_make_tool,
- vs200x_project_vc_bsc_make_tool,
- vs200x_project_vc_fx_cop_tool,
- vs200x_project_vc_app_verifier_tool,
- vs200x_project_vc_post_build_event_tool,
- vs200x_project_config_end,
- NULL
-};
-
-
-/**
- * The Visual Studio 2008 action handler.
- * \param sess The active session object.
- * \returns OKAY if successful.
- */
-int vs2008_action(Session sess)
-{
- /* make sure I can support all of the features used in the session */
- if (session_validate(sess, &Features) != OKAY)
- {
- return !OKAY;
- }
-
- stream_writeline(Console, "Generating project files for Visual Studio 2008...");
- return session_enumerate_objects(sess, SolutionCallbacks, ProjectCallbacks, ConfigCallbacks);
-}
-
+/**
+ * \file vs2008.c
+ * \brief Visual Studio 2008 project file generation action.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <stdlib.h>
+#include "premake.h"
+#include "action/action.h"
+#include "vs200x.h"
+#include "vs200x_solution.h"
+#include "vs200x_project.h"
+
+
+/** The project features supported by this action */
+static SessionFeatures Features =
+{
+ { "c", "c++", NULL },
+};
+
+
+/** The VS2008 solution writing process, for session_enumerate_objects() */
+static SessionSolutionCallback SolutionCallbacks[] =
+{
+ vs200x_solution_create,
+ vs2008_solution_signature,
+ vs2002_solution_projects,
+ vs2005_solution_platforms,
+ vs2005_solution_project_platforms,
+ vs2005_solution_properties,
+ NULL
+};
+
+/** The VS2008 project writing process, for session_enumerate_objects() */
+static SessionProjectCallback ProjectCallbacks[] =
+{
+ vs200x_project_create,
+ vs200x_project_encoding,
+ vs200x_project_element,
+ vs200x_project_platforms,
+ vs200x_project_tool_files,
+ session_enumerate_configurations,
+ vs200x_project_references,
+ vs200x_project_files,
+ vs200x_project_globals,
+ NULL
+};
+
+/** The VS2008 configuration writing process, for session_enumerate_configurations() */
+static SessionProjectCallback ConfigCallbacks[] =
+{
+ vs200x_project_config_element,
+ vs200x_project_vc_pre_build_event_tool,
+ vs200x_project_vc_custom_build_tool,
+ vs200x_project_vc_xml_data_generator_tool,
+ vs200x_project_vc_web_service_proxy_generator_tool,
+ vs200x_project_vc_midl_tool,
+ vs200x_project_vc_cl_compiler_tool,
+ vs200x_project_vc_managed_resource_compiler_tool,
+ vs200x_project_vc_resource_compiler_tool,
+ vs200x_project_vc_pre_link_event_tool,
+ vs200x_project_vc_linker_tool,
+ vs200x_project_vc_alink_tool,
+ vs200x_project_vc_manifest_tool,
+ vs200x_project_vc_xdc_make_tool,
+ vs200x_project_vc_bsc_make_tool,
+ vs200x_project_vc_fx_cop_tool,
+ vs200x_project_vc_app_verifier_tool,
+ vs200x_project_vc_post_build_event_tool,
+ vs200x_project_config_end,
+ NULL
+};
+
+
+/**
+ * The Visual Studio 2008 action handler.
+ * \param sess The active session object.
+ * \returns OKAY if successful.
+ */
+int vs2008_action(Session sess)
+{
+ /* make sure I can support all of the features used in the session */
+ if (session_validate(sess, &Features) != OKAY)
+ {
+ return !OKAY;
+ }
+
+ stream_writeline(Console, "Generating project files for Visual Studio 2008...");
+ return session_enumerate_objects(sess, SolutionCallbacks, ProjectCallbacks, ConfigCallbacks);
+}
+
diff --git a/src/action/vs200x/vs2008_solution.c b/src/action/vs200x/vs2008_solution.c
index 73e4e8e..856bd51 100644
--- a/src/action/vs200x/vs2008_solution.c
+++ b/src/action/vs200x/vs2008_solution.c
@@ -1,29 +1,29 @@
-/**
- * \file vs2008_solution.c
- * \brief Visual Studio 2008 solution generation functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "vs200x_solution.h"
-
-
-/**
- * Write the Visual Studio 2008 solution file signature.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int vs2008_solution_signature(Session sess, Solution sln, Stream strm)
-{
- int z;
- UNUSED(sess);
- UNUSED(sln);
- stream_set_newline(strm, "\r\n");
- z = stream_write_unicode_marker(strm);
- z |= stream_writeline(strm, "");
- z |= stream_writeline(strm, "Microsoft Visual Studio Solution File, Format Version 10.00");
- z |= stream_writeline(strm, "# Visual Studio 2008");
- return z;
-}
+/**
+ * \file vs2008_solution.c
+ * \brief Visual Studio 2008 solution generation functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "vs200x_solution.h"
+
+
+/**
+ * Write the Visual Studio 2008 solution file signature.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int vs2008_solution_signature(Session sess, Solution sln, Stream strm)
+{
+ int z;
+ UNUSED(sess);
+ UNUSED(sln);
+ stream_set_newline(strm, "\r\n");
+ z = stream_write_unicode_marker(strm);
+ z |= stream_writeline(strm, "");
+ z |= stream_writeline(strm, "Microsoft Visual Studio Solution File, Format Version 10.00");
+ z |= stream_writeline(strm, "# Visual Studio 2008");
+ return z;
+}
diff --git a/src/action/vs200x/vs200x.c b/src/action/vs200x/vs200x.c
index 2d19a0b..21b60ff 100644
--- a/src/action/vs200x/vs200x.c
+++ b/src/action/vs200x/vs200x.c
@@ -1,163 +1,163 @@
-/**
- * \file vs200x.c
- * \brief General purpose Visual Studio support functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include "premake.h"
-#include "vs200x.h"
-#include "base/cstr.h"
-#include "base/error.h"
-
-
-/**
- * Write an XML attribute, adjusting for the differing Visual Studio formats.
- * \param strm The output stream, the attribute will be written here.
- * \param indent_size How far to indent (with tabs) the attribute.
- * \param name The attribute name.
- * \param value The attribute value; may contain printf-style formatting codes.
- * \returns OKAY if successful.
- */
-int vs200x_attribute(Stream strm, int indent_size, const char* name, const char* value, ...)
-{
- va_list args;
- int z = OKAY;
-
- va_start(args, value);
- z |= stream_writeline(strm, "");
- z |= stream_write_n(strm, "\t", indent_size);
- z |= stream_write(strm, "%s=\"", name);
- z |= stream_vprintf(strm, value, args);
- z |= stream_write(strm, "\"");
- va_end(args);
- return z;
-}
-
-
-/**
- * Write the ending part of an XML tag, adjust for the differing Visual Studio formats.
- * \param sess The current execution session.
- * \param strm The output stream.
- * \param level The XML element nesting level.
- * \param markup The end tag markup.
- * \returns OKAY if successful.
- */
-int vs200x_element_end(Session sess, Stream strm, int level, const char* markup)
-{
- int z;
- int version = vs200x_get_target_version(sess);
- if (version >= 2005)
- {
- z = stream_writeline(strm, "");
- if (markup[0] == '>')
- {
- level++;
- }
- z |= stream_write_n(strm, "\t", level);
- z |= stream_writeline(strm, "%s", markup);
- }
- else
- {
- z = stream_writeline(strm, markup);
- }
- return z;
-}
-
-
-/**
- * Return the Visual Studio version appropriate version of the string for a false
- * value. Before 2005 this was "FALSE", after it is "false".
- */
-const char* vs200x_false(Session sess)
-{
- int version = vs200x_get_target_version(sess);
- return (version < 2005) ? "FALSE" : "false";
-}
-
-
-/**
- * Converts the session action string to a Visual Studio version number.
- * \param sess The current execution session.
- * \returns The Visual Studio version number corresponding to the current action.
- */
-int vs200x_get_target_version(Session sess)
-{
- const char* action = session_get_action(sess);
- if (cstr_eq(action, "vs2002"))
- {
- return 2002;
- }
- else if (cstr_eq(action, "vs2003"))
- {
- return 2003;
- }
- else if (cstr_eq(action, "vs2005"))
- {
- return 2005;
- }
- else if (cstr_eq(action, "vs2008"))
- {
- return 2008;
- }
- else
- {
- assert(0);
- return 0;
- }
-}
-
-
-/**
- * Return the appropriate file extension for a particular project.
- * \param prj The project object.
- * \returns The appropriate project file extension, based on the project settings.
- */
-const char* vs200x_project_file_extension(Project prj)
-{
- const char* language = project_get_language(prj);
- if (cstr_eq(language, "c") || cstr_eq(language, "c++"))
- {
- return ".vcproj";
- }
- else
- {
- error_set("unsupported language '%s'", language);
- return NULL;
- }
-}
-
-
-/**
- * Returns the Visual Studio GUID for a particular project type.
- * \param language The programming language used in the project.
- * \returns The GUID corresponding the programming language.
- */
-const char* vs200x_tool_guid(const char* language)
-{
- if (cstr_eq(language, "c") || cstr_eq(language, "c++"))
- {
- return "8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942";
- }
- else if (cstr_eq(language, "c#"))
- {
- return "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC";
- }
- else
- {
- error_set("unsupported language '%s'", language);
- return NULL;
- }
-}
-
-
-/**
- * Return the Visual Studio version appropriate version of the string for a true
- * value. Before 2005 this was "TRUE", after it is "true".
- */
-const char* vs200x_true(Session sess)
-{
- int version = vs200x_get_target_version(sess);
- return (version < 2005) ? "TRUE" : "true";
-}
+/**
+ * \file vs200x.c
+ * \brief General purpose Visual Studio support functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include "premake.h"
+#include "vs200x.h"
+#include "base/cstr.h"
+#include "base/error.h"
+
+
+/**
+ * Write an XML attribute, adjusting for the differing Visual Studio formats.
+ * \param strm The output stream, the attribute will be written here.
+ * \param indent_size How far to indent (with tabs) the attribute.
+ * \param name The attribute name.
+ * \param value The attribute value; may contain printf-style formatting codes.
+ * \returns OKAY if successful.
+ */
+int vs200x_attribute(Stream strm, int indent_size, const char* name, const char* value, ...)
+{
+ va_list args;
+ int z = OKAY;
+
+ va_start(args, value);
+ z |= stream_writeline(strm, "");
+ z |= stream_write_n(strm, "\t", indent_size);
+ z |= stream_write(strm, "%s=\"", name);
+ z |= stream_vprintf(strm, value, args);
+ z |= stream_write(strm, "\"");
+ va_end(args);
+ return z;
+}
+
+
+/**
+ * Write the ending part of an XML tag, adjust for the differing Visual Studio formats.
+ * \param sess The current execution session.
+ * \param strm The output stream.
+ * \param level The XML element nesting level.
+ * \param markup The end tag markup.
+ * \returns OKAY if successful.
+ */
+int vs200x_element_end(Session sess, Stream strm, int level, const char* markup)
+{
+ int z;
+ int version = vs200x_get_target_version(sess);
+ if (version >= 2005)
+ {
+ z = stream_writeline(strm, "");
+ if (markup[0] == '>')
+ {
+ level++;
+ }
+ z |= stream_write_n(strm, "\t", level);
+ z |= stream_writeline(strm, "%s", markup);
+ }
+ else
+ {
+ z = stream_writeline(strm, markup);
+ }
+ return z;
+}
+
+
+/**
+ * Return the Visual Studio version appropriate version of the string for a false
+ * value. Before 2005 this was "FALSE", after it is "false".
+ */
+const char* vs200x_false(Session sess)
+{
+ int version = vs200x_get_target_version(sess);
+ return (version < 2005) ? "FALSE" : "false";
+}
+
+
+/**
+ * Converts the session action string to a Visual Studio version number.
+ * \param sess The current execution session.
+ * \returns The Visual Studio version number corresponding to the current action.
+ */
+int vs200x_get_target_version(Session sess)
+{
+ const char* action = session_get_action(sess);
+ if (cstr_eq(action, "vs2002"))
+ {
+ return 2002;
+ }
+ else if (cstr_eq(action, "vs2003"))
+ {
+ return 2003;
+ }
+ else if (cstr_eq(action, "vs2005"))
+ {
+ return 2005;
+ }
+ else if (cstr_eq(action, "vs2008"))
+ {
+ return 2008;
+ }
+ else
+ {
+ assert(0);
+ return 0;
+ }
+}
+
+
+/**
+ * Return the appropriate file extension for a particular project.
+ * \param prj The project object.
+ * \returns The appropriate project file extension, based on the project settings.
+ */
+const char* vs200x_project_file_extension(Project prj)
+{
+ const char* language = project_get_language(prj);
+ if (cstr_eq(language, "c") || cstr_eq(language, "c++"))
+ {
+ return ".vcproj";
+ }
+ else
+ {
+ error_set("unsupported language '%s'", language);
+ return NULL;
+ }
+}
+
+
+/**
+ * Returns the Visual Studio GUID for a particular project type.
+ * \param language The programming language used in the project.
+ * \returns The GUID corresponding the programming language.
+ */
+const char* vs200x_tool_guid(const char* language)
+{
+ if (cstr_eq(language, "c") || cstr_eq(language, "c++"))
+ {
+ return "8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942";
+ }
+ else if (cstr_eq(language, "c#"))
+ {
+ return "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC";
+ }
+ else
+ {
+ error_set("unsupported language '%s'", language);
+ return NULL;
+ }
+}
+
+
+/**
+ * Return the Visual Studio version appropriate version of the string for a true
+ * value. Before 2005 this was "TRUE", after it is "true".
+ */
+const char* vs200x_true(Session sess)
+{
+ int version = vs200x_get_target_version(sess);
+ return (version < 2005) ? "TRUE" : "true";
+}
diff --git a/src/action/vs200x/vs200x.h b/src/action/vs200x/vs200x.h
index ef3b39d..6035cd8 100644
--- a/src/action/vs200x/vs200x.h
+++ b/src/action/vs200x/vs200x.h
@@ -1,20 +1,20 @@
-/**
- * \file vs200x.h
- * \brief General purpose Visual Studio support functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-#if !defined(PREMAKE_VS200X_H)
-#define PREMAKE_VS200X_H
-
-#include "session/session.h"
-
-int vs200x_attribute(Stream strm, int indent_size, const char* name, const char* value, ...);
-int vs200x_element_end(Session sess, Stream strm, int level, const char* markup);
-const char* vs200x_false(Session sess);
-int vs200x_get_target_version(Session sess);
-const char* vs200x_project_file_extension(Project prj);
-const char* vs200x_tool_guid(const char* language);
-const char* vs200x_true(Session sess);
-
-#endif
-
+/**
+ * \file vs200x.h
+ * \brief General purpose Visual Studio support functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+#if !defined(PREMAKE_VS200X_H)
+#define PREMAKE_VS200X_H
+
+#include "session/session.h"
+
+int vs200x_attribute(Stream strm, int indent_size, const char* name, const char* value, ...);
+int vs200x_element_end(Session sess, Stream strm, int level, const char* markup);
+const char* vs200x_false(Session sess);
+int vs200x_get_target_version(Session sess);
+const char* vs200x_project_file_extension(Project prj);
+const char* vs200x_tool_guid(const char* language);
+const char* vs200x_true(Session sess);
+
+#endif
+
diff --git a/src/action/vs200x/vs200x_config.c b/src/action/vs200x/vs200x_config.c
index 85afb07..24e4493 100644
--- a/src/action/vs200x/vs200x_config.c
+++ b/src/action/vs200x/vs200x_config.c
@@ -1,48 +1,48 @@
-/**
- * \file vs200x_config.c
- * \brief Visual Studio 200x configuration generation functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "vs200x.h"
-#include "vs200x_config.h"
-
-
-int vs200x_config_character_set(Session sess, Stream strm)
-{
- int version = vs200x_get_target_version(sess);
- return vs200x_attribute(strm, 3, "CharacterSet", version > 2003 ? "1" : "2");
-}
-
-
-int vs200x_config_detect_64bit_portability(Session sess, Stream strm, Project prj)
-{
- int version = vs200x_get_target_version(sess);
- UNUSED(prj);
- if (version < 2008)
- {
- return vs200x_attribute(strm, 4, "Detect64BitPortabilityProblems", vs200x_true(sess));
- }
- return OKAY;
-}
-
-
-int vs200x_config_runtime_type_info(Session sess, Stream strm, Project prj)
-{
- int version = vs200x_get_target_version(sess);
- UNUSED(prj);
- if (version < 2005)
- {
- return vs200x_attribute(strm, 4, "RuntimeTypeInfo", vs200x_true(sess));
- }
- return OKAY;
-}
-
-
-int vs200x_config_use_precompiled_header(Session sess, Stream strm, Project prj)
-{
- int version = vs200x_get_target_version(sess);
- UNUSED(prj);
- return vs200x_attribute(strm, 4, "UsePrecompiledHeader", (version > 2003) ? "0" : "2");
-}
+/**
+ * \file vs200x_config.c
+ * \brief Visual Studio 200x configuration generation functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "vs200x.h"
+#include "vs200x_config.h"
+
+
+int vs200x_config_character_set(Session sess, Stream strm)
+{
+ int version = vs200x_get_target_version(sess);
+ return vs200x_attribute(strm, 3, "CharacterSet", version > 2003 ? "1" : "2");
+}
+
+
+int vs200x_config_detect_64bit_portability(Session sess, Stream strm, Project prj)
+{
+ int version = vs200x_get_target_version(sess);
+ UNUSED(prj);
+ if (version < 2008)
+ {
+ return vs200x_attribute(strm, 4, "Detect64BitPortabilityProblems", vs200x_true(sess));
+ }
+ return OKAY;
+}
+
+
+int vs200x_config_runtime_type_info(Session sess, Stream strm, Project prj)
+{
+ int version = vs200x_get_target_version(sess);
+ UNUSED(prj);
+ if (version < 2005)
+ {
+ return vs200x_attribute(strm, 4, "RuntimeTypeInfo", vs200x_true(sess));
+ }
+ return OKAY;
+}
+
+
+int vs200x_config_use_precompiled_header(Session sess, Stream strm, Project prj)
+{
+ int version = vs200x_get_target_version(sess);
+ UNUSED(prj);
+ return vs200x_attribute(strm, 4, "UsePrecompiledHeader", (version > 2003) ? "0" : "2");
+}
diff --git a/src/action/vs200x/vs200x_config.h b/src/action/vs200x/vs200x_config.h
index 939eae6..54c1c03 100644
--- a/src/action/vs200x/vs200x_config.h
+++ b/src/action/vs200x/vs200x_config.h
@@ -1,16 +1,16 @@
-/**
- * \file vs200x_config.h
- * \brief Visual Studio 200x configuration generation functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-#if !defined(PREMAKE_VS200X_CONFIG_H)
-#define PREMAKE_VS200X_CONFIG_H
-
-#include "session/session.h"
-
-int vs200x_config_character_set(Session sess, Stream strm);
-int vs200x_config_detect_64bit_portability(Session sess, Stream strm, Project prj);
-int vs200x_config_runtime_type_info(Session sess, Stream strm, Project prj);
-int vs200x_config_use_precompiled_header(Session sess, Stream strm, Project prj);
-
-#endif
+/**
+ * \file vs200x_config.h
+ * \brief Visual Studio 200x configuration generation functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+#if !defined(PREMAKE_VS200X_CONFIG_H)
+#define PREMAKE_VS200X_CONFIG_H
+
+#include "session/session.h"
+
+int vs200x_config_character_set(Session sess, Stream strm);
+int vs200x_config_detect_64bit_portability(Session sess, Stream strm, Project prj);
+int vs200x_config_runtime_type_info(Session sess, Stream strm, Project prj);
+int vs200x_config_use_precompiled_header(Session sess, Stream strm, Project prj);
+
+#endif
diff --git a/src/action/vs200x/vs200x_project.c b/src/action/vs200x/vs200x_project.c
index 9c73cbf..5c5f2a2 100644
--- a/src/action/vs200x/vs200x_project.c
+++ b/src/action/vs200x/vs200x_project.c
@@ -1,473 +1,473 @@
-/**
- * \file vs200x_project.c
- * \brief Visual Studio multiple-version project generation functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include "premake.h"
-#include "action/action.h"
-#include "vs200x.h"
-#include "vs200x_project.h"
-#include "vs200x_config.h"
-#include "base/cstr.h"
-#include "base/path.h"
-
-
-/**
- * Write the opening [Configuration] element and attributes.
- */
-int vs200x_project_config_element(Session sess, Project prj, Stream strm)
-{
- int z = OKAY;
- const char* cfg_name = project_get_configuration_filter(prj);
- z |= stream_write(strm, "\t\t<Configuration");
- z |= vs200x_attribute(strm, 3, "Name", "%s|Win32", cfg_name);
- z |= vs200x_attribute(strm, 3, "OutputDirectory", "$(SolutionDir)$(ConfigurationName)");
- z |= vs200x_attribute(strm, 3, "IntermediateDirectory", "$(ConfigurationName)");
- z |= vs200x_attribute(strm, 3, "ConfigurationType", "1");
- z |= vs200x_config_character_set(sess, strm);
- z |= vs200x_element_end(sess, strm, 2, ">");
- return z;
-}
-
-
-/**
- * Write the closing [Configuration] element.
- */
-int vs200x_project_config_end(Session sess, Project prj, Stream strm)
-{
- UNUSED(sess);
- UNUSED(prj);
- return stream_writeline(strm, "\t\t</Configuration>");
-}
-
-
-/**
- * Create a new output stream for a project, and make it active for subsequent writes.
- */
-int vs200x_project_create(Session sess, Project prj, Stream strm)
-{
- /* create the project file */
- const char* extension = vs200x_project_file_extension(prj);
- const char* filename = project_get_filename(prj, NULL, extension);
- strm = stream_create_file(filename);
- if (!strm)
- {
- return !OKAY;
- }
-
- /* make the stream active for the functions that come after */
- session_set_active_stream(sess, strm);
- return OKAY;
-}
-
-
-/**
- * Write the root [VisualStudioProject] element and attributes.
- */
-int vs200x_project_element(Session sess, Project prj, Stream strm)
-{
- int version, z;
- const char* prj_ver;
- const char* prj_name = project_get_name(prj);
- const char* prj_guid = project_get_guid(prj);
-
- version = vs200x_get_target_version(sess);
- switch (version)
- {
- default:
- prj_ver = "7.00"; break;
- case 2003:
- prj_ver = "7.10"; break;
- case 2005:
- prj_ver = "8.00"; break;
- case 2008:
- prj_ver = "9.00"; break;
- }
-
- z = stream_write(strm, "<VisualStudioProject");
- z |= vs200x_attribute(strm, 1, "ProjectType", "Visual C++");
- z |= vs200x_attribute(strm, 1, "Version", prj_ver);
- z |= vs200x_attribute(strm, 1, "Name", prj_name);
- z |= vs200x_attribute(strm, 1, "ProjectGUID", "{%s}", prj_guid);
- if (version > 2003)
- {
- z |= vs200x_attribute(strm, 1, "RootNamespace", prj_name);
- }
- z |= vs200x_attribute(strm, 1, "Keyword", "Win32Proj");
- if (version > 2005)
- {
- z |= vs200x_attribute(strm, 1, "TargetFrameworkVersion", "196613");
- }
- z |= vs200x_element_end(sess, strm, 0, ">");
- return z;
-}
-
-
-/**
- * Write the file encoding at the start of the project file.
- */
-int vs200x_project_encoding(Session sess, Project prj, Stream strm)
-{
- UNUSED(sess);
- UNUSED(prj);
- stream_set_newline(strm, "\r\n");
- return stream_writeline(strm, "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>");
-}
-
-
-/**
- * Write an individual file entry to the project file; callback for action_source_tree().
- * \param sess The current execution session context.
- * \param prj The current project; contains the file being enumerated.
- * \param strm The active output stream; for writing the file markup.
- * \param filename The name of the file to process.
- * \param state One of the ActionSourceStates, enabling file grouping.
- * \returns OKAY if successful.
- */
-int vs200x_project_file(Session sess, Project prj, Stream strm, const char* filename, int state)
-{
- const char* name;
- const char* ptr;
- int depth, z = OKAY;
-
- /* figure out the grouping depth, skipping over any leading dot directories */
- depth = 2;
-
- ptr = filename;
- while (cstr_starts_with(ptr, "../"))
- {
- ptr += 3;
- }
-
- ptr = strchr(ptr, '/');
- while (ptr != NULL)
- {
- depth++;
- ptr = strchr(ptr + 1, '/');
- }
-
- /* group name is just the last bit of the path */
- name = path_filename(filename);
-
- /* use the Windows path separator */
- filename = path_translate(filename, "\\");
-
- switch (state)
- {
- case GroupStart:
- if (strlen(filename) > 0 && !cstr_eq(name, ".."))
- {
- z |= stream_write_n(strm, "\t", depth);
- z |= stream_write(strm, "<Filter");
- z |= vs200x_attribute(strm, depth + 1, "Name", name);
- z |= vs200x_attribute(strm, depth + 1, "Filter", "");
- z |= vs200x_element_end(sess, strm, depth, ">");
- }
- break;
-
- case GroupEnd:
- if (strlen(filename) > 0 && !cstr_eq(name, ".."))
- {
- z |= stream_write_n(strm, "\t", depth);
- z |= stream_writeline(strm, "</Filter>");
- }
- break;
-
- case SourceFile:
- z |= stream_write_n(strm, "\t", depth);
- z |= stream_write(strm, "<File");
- ptr = (filename[0] == '.') ? "" : ".\\";
- z |= vs200x_attribute(strm, depth + 1, "RelativePath", "%s%s", ptr, filename);
- z |= vs200x_element_end(sess, strm, depth, ">");
- z |= stream_write_n(strm, "\t", depth);
- z |= stream_writeline(strm, "</File>");
- break;
- }
-
- UNUSED(prj);
- return z;
-}
-
-
-/**
- * Write out the [Files] element.
- */
-int vs200x_project_files(Session sess, Project prj, Stream strm)
-{
- int z = OKAY;
- z |= stream_writeline(strm, "\t<Files>");
- z |= action_source_tree(sess, prj, strm, vs200x_project_file);
- z |= stream_writeline(strm, "\t</Files>");
- return z;
-}
-
-
-/**
- * Write out the [Globals] element.
- */
-int vs200x_project_globals(Session sess, Project prj, Stream strm)
-{
- int z = OKAY;
- UNUSED(sess);
- UNUSED(prj);
- z |= stream_writeline(strm, "\t<Globals>");
- z |= stream_writeline(strm, "\t</Globals>");
- z |= stream_writeline(strm, "</VisualStudioProject>");
- return z;
-}
-
-
-/**
- * Write out the platforms section of a project file.
- */
-int vs200x_project_platforms(Session sess, Project prj, Stream strm)
-{
- int z = OKAY;
- UNUSED(prj);
- z |= stream_writeline(strm, "\t<Platforms>");
- z |= stream_write(strm, "\t\t<Platform");
- z |= vs200x_attribute(strm, 3, "Name", "Win32");
- z |= vs200x_element_end(sess, strm, 2, "/>");
- z |= stream_writeline(strm, "\t</Platforms>");
- return OKAY;
-}
-
-
-/**
- * Write out the [References] element and attributes.
- */
-int vs200x_project_references(Session sess, Project prj, Stream strm)
-{
- int z;
- UNUSED(prj);
- z = stream_writeline(strm, "\t</Configurations>");
- if (vs200x_get_target_version(sess) > 2002)
- {
- z |= stream_writeline(strm, "\t<References>");
- z |= stream_writeline(strm, "\t</References>");
- }
- return z;
-}
-
-
-/**
- * Write out the [ToolFiles] section of a Visual Studio project.
- */
-int vs200x_project_tool_files(Session sess, Project prj, Stream strm)
-{
- int version, z = OKAY;
- UNUSED(prj);
-
- version = vs200x_get_target_version(sess);
- if (version > 2003)
- {
- z |= stream_writeline(strm, "\t<ToolFiles>");
- z |= stream_writeline(strm, "\t</ToolFiles>");
- }
- z |= stream_writeline(strm, "\t<Configurations>");
- return z;
-}
-
-
-/**
- * Common function to write an empty [Tool] element.
- */
-static int vs200x_project_vc_empty_tool(Session sess, Project prj, Stream strm, const char* name)
-{
- int z;
- UNUSED(prj);
- z = stream_write(strm, "\t\t\t<Tool");
- z |= vs200x_attribute(strm, 4, "Name", name);
- z |= vs200x_element_end(sess, strm, 3, "/>");
- return z;
-}
-
-
-/**
- * Write the VCALinkTool [Tool] element and attributes.
- */
-int vs200x_project_vc_alink_tool(Session sess, Project prj, Stream strm)
-{
- return vs200x_project_vc_empty_tool(sess, prj, strm, "VCALinkTool");
-}
-
-
-/**
- * Write the VCAppVerifierTool [Tool] element and attributes.
- */
-int vs200x_project_vc_app_verifier_tool(Session sess, Project prj, Stream strm)
-{
- return vs200x_project_vc_empty_tool(sess, prj, strm, "VCAppVerifierTool");
-}
-
-
-/**
- * Write the VCBscMakeTool [Tool] element and attributes.
- */
-int vs200x_project_vc_bsc_make_tool(Session sess, Project prj, Stream strm)
-{
- return vs200x_project_vc_empty_tool(sess, prj, strm, "VCBscMakeTool");
-}
-
-
-/**
- * Write the VCCLCompilerTool [Tool] element and attributes.
- */
-int vs200x_project_vc_cl_compiler_tool(Session sess, Project prj, Stream strm)
-{
- int version, z;
- UNUSED(prj);
- version = vs200x_get_target_version(sess);
- z = stream_write(strm, "\t\t\t<Tool");
- z |= vs200x_attribute(strm, 4, "Name", "VCCLCompilerTool");
- z |= vs200x_attribute(strm, 4, "Optimization", "0");
- z |= vs200x_attribute(strm, 4, "MinimalRebuild", vs200x_true(sess));
- z |= vs200x_attribute(strm, 4, "BasicRuntimeChecks", "3");
- z |= vs200x_attribute(strm, 4, "RuntimeLibrary", "3");
- z |= vs200x_config_runtime_type_info(sess, strm, prj);
- z |= vs200x_config_use_precompiled_header(sess, strm, prj);
- z |= vs200x_attribute(strm, 4, "WarningLevel", "3");
- z |= vs200x_config_detect_64bit_portability(sess, strm, prj);
- z |= vs200x_attribute(strm, 4, "DebugInformationFormat", "4");
- z |= vs200x_element_end(sess, strm, 3, "/>");
- return z;
-}
-
-
-/**
- * Write the VCCustomBuildTool [Tool] element and attributes.
- */
-int vs200x_project_vc_custom_build_tool(Session sess, Project prj, Stream strm)
-{
- return vs200x_project_vc_empty_tool(sess, prj, strm, "VCCustomBuildTool");
-}
-
-
-/**
- * Write the VCFxCopTool [Tool] element and attributes.
- */
-int vs200x_project_vc_fx_cop_tool(Session sess, Project prj, Stream strm)
-{
- return vs200x_project_vc_empty_tool(sess, prj, strm, "VCFxCopTool");
-}
-
-
-/**
- * Write the VCLinkerTool [Tool] element and attributes.
- */
-int vs200x_project_vc_linker_tool(Session sess, Project prj, Stream strm)
-{
- int z;
- UNUSED(prj);
- z = stream_write(strm, "\t\t\t<Tool");
- z |= vs200x_attribute(strm, 4, "Name", "VCLinkerTool");
- z |= vs200x_attribute(strm, 4, "LinkIncremental", "2");
- z |= vs200x_attribute(strm, 4, "GenerateDebugInformation", vs200x_true(sess));
- z |= vs200x_attribute(strm, 4, "SubSystem", "1");
- z |= vs200x_attribute(strm, 4, "EntryPointSymbol", "mainCRTStartup");
- z |= vs200x_attribute(strm, 4, "TargetMachine", "1");
- z |= vs200x_element_end(sess, strm, 3, "/>");
- return z;
-}
-
-
-/**
- * Write the VCManagedResourceCompilerTool [Tool] element and attributes.
- */
-int vs200x_project_vc_managed_resource_compiler_tool(Session sess, Project prj, Stream strm)
-{
- return vs200x_project_vc_empty_tool(sess, prj, strm, "VCManagedResourceCompilerTool");
-}
-
-
-/**
- * Write the VCManifestTool [Tool] element and attributes.
- */
-int vs200x_project_vc_manifest_tool(Session sess, Project prj, Stream strm)
-{
- return vs200x_project_vc_empty_tool(sess, prj, strm, "VCManifestTool");
-}
-
-
-/**
- * Write the VCMIDLTool [Tool] element and attributes.
- */
-int vs200x_project_vc_midl_tool(Session sess, Project prj, Stream strm)
-{
- return vs200x_project_vc_empty_tool(sess, prj, strm, "VCMIDLTool");
-}
-
-
-/**
- * Write the VCPreBuildEventTool [Tool] element and attributes.
- */
-int vs200x_project_vc_pre_build_event_tool(Session sess, Project prj, Stream strm)
-{
- return vs200x_project_vc_empty_tool(sess, prj, strm, "VCPreBuildEventTool");
-}
-
-
-/**
- * Write the VCPreLinkEventTool [Tool] element and attributes.
- */
-int vs200x_project_vc_pre_link_event_tool(Session sess, Project prj, Stream strm)
-{
- return vs200x_project_vc_empty_tool(sess, prj, strm, "VCPreLinkEventTool");
-}
-
-
-/**
- * Write the VCPostBuildEventTool [Tool] element and attributes.
- */
-int vs200x_project_vc_post_build_event_tool(Session sess, Project prj, Stream strm)
-{
- return vs200x_project_vc_empty_tool(sess, prj, strm, "VCPostBuildEventTool");
-}
-
-
-/**
- * Write the VCResourceCompiler [Tool] element and attributes.
- */
-int vs200x_project_vc_resource_compiler_tool(Session sess, Project prj, Stream strm)
-{
- return vs200x_project_vc_empty_tool(sess, prj, strm, "VCResourceCompilerTool");
-}
-
-
-/**
- * Write the VCWebDeploymentTool [Tool] element and attributes.
- */
-int vs200x_project_vc_web_deployment_tool(Session sess, Project prj, Stream strm)
-{
- return vs200x_project_vc_empty_tool(sess, prj, strm, "VCWebDeploymentTool");
-}
-
-
-/**
- * Write the VCWebServiceProxyGeneratorTool [Tool] element and attributes.
- */
-int vs200x_project_vc_web_service_proxy_generator_tool(Session sess, Project prj, Stream strm)
-{
- return vs200x_project_vc_empty_tool(sess, prj, strm, "VCWebServiceProxyGeneratorTool");
-}
-
-
-/**
- * Write the VCXDCMakeTool [Tool] element and attributes.
- */
-int vs200x_project_vc_xdc_make_tool(Session sess, Project prj, Stream strm)
-{
- return vs200x_project_vc_empty_tool(sess, prj, strm, "VCXDCMakeTool");
-}
-
-
-/**
- * Write the VCXMLDataGeneratorTool [Tool] element and attributes.
- */
-int vs200x_project_vc_xml_data_generator_tool(Session sess, Project prj, Stream strm)
-{
- return vs200x_project_vc_empty_tool(sess, prj, strm, "VCXMLDataGeneratorTool");
-}
+/**
+ * \file vs200x_project.c
+ * \brief Visual Studio multiple-version project generation functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "premake.h"
+#include "action/action.h"
+#include "vs200x.h"
+#include "vs200x_project.h"
+#include "vs200x_config.h"
+#include "base/cstr.h"
+#include "base/path.h"
+
+
+/**
+ * Write the opening [Configuration] element and attributes.
+ */
+int vs200x_project_config_element(Session sess, Project prj, Stream strm)
+{
+ int z = OKAY;
+ const char* cfg_name = project_get_configuration_filter(prj);
+ z |= stream_write(strm, "\t\t<Configuration");
+ z |= vs200x_attribute(strm, 3, "Name", "%s|Win32", cfg_name);
+ z |= vs200x_attribute(strm, 3, "OutputDirectory", "$(SolutionDir)$(ConfigurationName)");
+ z |= vs200x_attribute(strm, 3, "IntermediateDirectory", "$(ConfigurationName)");
+ z |= vs200x_attribute(strm, 3, "ConfigurationType", "1");
+ z |= vs200x_config_character_set(sess, strm);
+ z |= vs200x_element_end(sess, strm, 2, ">");
+ return z;
+}
+
+
+/**
+ * Write the closing [Configuration] element.
+ */
+int vs200x_project_config_end(Session sess, Project prj, Stream strm)
+{
+ UNUSED(sess);
+ UNUSED(prj);
+ return stream_writeline(strm, "\t\t</Configuration>");
+}
+
+
+/**
+ * Create a new output stream for a project, and make it active for subsequent writes.
+ */
+int vs200x_project_create(Session sess, Project prj, Stream strm)
+{
+ /* create the project file */
+ const char* extension = vs200x_project_file_extension(prj);
+ const char* filename = project_get_filename(prj, NULL, extension);
+ strm = stream_create_file(filename);
+ if (!strm)
+ {
+ return !OKAY;
+ }
+
+ /* make the stream active for the functions that come after */
+ session_set_active_stream(sess, strm);
+ return OKAY;
+}
+
+
+/**
+ * Write the root [VisualStudioProject] element and attributes.
+ */
+int vs200x_project_element(Session sess, Project prj, Stream strm)
+{
+ int version, z;
+ const char* prj_ver;
+ const char* prj_name = project_get_name(prj);
+ const char* prj_guid = project_get_guid(prj);
+
+ version = vs200x_get_target_version(sess);
+ switch (version)
+ {
+ default:
+ prj_ver = "7.00"; break;
+ case 2003:
+ prj_ver = "7.10"; break;
+ case 2005:
+ prj_ver = "8.00"; break;
+ case 2008:
+ prj_ver = "9.00"; break;
+ }
+
+ z = stream_write(strm, "<VisualStudioProject");
+ z |= vs200x_attribute(strm, 1, "ProjectType", "Visual C++");
+ z |= vs200x_attribute(strm, 1, "Version", prj_ver);
+ z |= vs200x_attribute(strm, 1, "Name", prj_name);
+ z |= vs200x_attribute(strm, 1, "ProjectGUID", "{%s}", prj_guid);
+ if (version > 2003)
+ {
+ z |= vs200x_attribute(strm, 1, "RootNamespace", prj_name);
+ }
+ z |= vs200x_attribute(strm, 1, "Keyword", "Win32Proj");
+ if (version > 2005)
+ {
+ z |= vs200x_attribute(strm, 1, "TargetFrameworkVersion", "196613");
+ }
+ z |= vs200x_element_end(sess, strm, 0, ">");
+ return z;
+}
+
+
+/**
+ * Write the file encoding at the start of the project file.
+ */
+int vs200x_project_encoding(Session sess, Project prj, Stream strm)
+{
+ UNUSED(sess);
+ UNUSED(prj);
+ stream_set_newline(strm, "\r\n");
+ return stream_writeline(strm, "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>");
+}
+
+
+/**
+ * Write an individual file entry to the project file; callback for action_source_tree().
+ * \param sess The current execution session context.
+ * \param prj The current project; contains the file being enumerated.
+ * \param strm The active output stream; for writing the file markup.
+ * \param filename The name of the file to process.
+ * \param state One of the ActionSourceStates, enabling file grouping.
+ * \returns OKAY if successful.
+ */
+int vs200x_project_file(Session sess, Project prj, Stream strm, const char* filename, int state)
+{
+ const char* name;
+ const char* ptr;
+ int depth, z = OKAY;
+
+ /* figure out the grouping depth, skipping over any leading dot directories */
+ depth = 2;
+
+ ptr = filename;
+ while (cstr_starts_with(ptr, "../"))
+ {
+ ptr += 3;
+ }
+
+ ptr = strchr(ptr, '/');
+ while (ptr != NULL)
+ {
+ depth++;
+ ptr = strchr(ptr + 1, '/');
+ }
+
+ /* group name is just the last bit of the path */
+ name = path_filename(filename);
+
+ /* use the Windows path separator */
+ filename = path_translate(filename, "\\");
+
+ switch (state)
+ {
+ case GroupStart:
+ if (strlen(filename) > 0 && !cstr_eq(name, ".."))
+ {
+ z |= stream_write_n(strm, "\t", depth);
+ z |= stream_write(strm, "<Filter");
+ z |= vs200x_attribute(strm, depth + 1, "Name", name);
+ z |= vs200x_attribute(strm, depth + 1, "Filter", "");
+ z |= vs200x_element_end(sess, strm, depth, ">");
+ }
+ break;
+
+ case GroupEnd:
+ if (strlen(filename) > 0 && !cstr_eq(name, ".."))
+ {
+ z |= stream_write_n(strm, "\t", depth);
+ z |= stream_writeline(strm, "</Filter>");
+ }
+ break;
+
+ case SourceFile:
+ z |= stream_write_n(strm, "\t", depth);
+ z |= stream_write(strm, "<File");
+ ptr = (filename[0] == '.') ? "" : ".\\";
+ z |= vs200x_attribute(strm, depth + 1, "RelativePath", "%s%s", ptr, filename);
+ z |= vs200x_element_end(sess, strm, depth, ">");
+ z |= stream_write_n(strm, "\t", depth);
+ z |= stream_writeline(strm, "</File>");
+ break;
+ }
+
+ UNUSED(prj);
+ return z;
+}
+
+
+/**
+ * Write out the [Files] element.
+ */
+int vs200x_project_files(Session sess, Project prj, Stream strm)
+{
+ int z = OKAY;
+ z |= stream_writeline(strm, "\t<Files>");
+ z |= action_source_tree(sess, prj, strm, vs200x_project_file);
+ z |= stream_writeline(strm, "\t</Files>");
+ return z;
+}
+
+
+/**
+ * Write out the [Globals] element.
+ */
+int vs200x_project_globals(Session sess, Project prj, Stream strm)
+{
+ int z = OKAY;
+ UNUSED(sess);
+ UNUSED(prj);
+ z |= stream_writeline(strm, "\t<Globals>");
+ z |= stream_writeline(strm, "\t</Globals>");
+ z |= stream_writeline(strm, "</VisualStudioProject>");
+ return z;
+}
+
+
+/**
+ * Write out the platforms section of a project file.
+ */
+int vs200x_project_platforms(Session sess, Project prj, Stream strm)
+{
+ int z = OKAY;
+ UNUSED(prj);
+ z |= stream_writeline(strm, "\t<Platforms>");
+ z |= stream_write(strm, "\t\t<Platform");
+ z |= vs200x_attribute(strm, 3, "Name", "Win32");
+ z |= vs200x_element_end(sess, strm, 2, "/>");
+ z |= stream_writeline(strm, "\t</Platforms>");
+ return OKAY;
+}
+
+
+/**
+ * Write out the [References] element and attributes.
+ */
+int vs200x_project_references(Session sess, Project prj, Stream strm)
+{
+ int z;
+ UNUSED(prj);
+ z = stream_writeline(strm, "\t</Configurations>");
+ if (vs200x_get_target_version(sess) > 2002)
+ {
+ z |= stream_writeline(strm, "\t<References>");
+ z |= stream_writeline(strm, "\t</References>");
+ }
+ return z;
+}
+
+
+/**
+ * Write out the [ToolFiles] section of a Visual Studio project.
+ */
+int vs200x_project_tool_files(Session sess, Project prj, Stream strm)
+{
+ int version, z = OKAY;
+ UNUSED(prj);
+
+ version = vs200x_get_target_version(sess);
+ if (version > 2003)
+ {
+ z |= stream_writeline(strm, "\t<ToolFiles>");
+ z |= stream_writeline(strm, "\t</ToolFiles>");
+ }
+ z |= stream_writeline(strm, "\t<Configurations>");
+ return z;
+}
+
+
+/**
+ * Common function to write an empty [Tool] element.
+ */
+static int vs200x_project_vc_empty_tool(Session sess, Project prj, Stream strm, const char* name)
+{
+ int z;
+ UNUSED(prj);
+ z = stream_write(strm, "\t\t\t<Tool");
+ z |= vs200x_attribute(strm, 4, "Name", name);
+ z |= vs200x_element_end(sess, strm, 3, "/>");
+ return z;
+}
+
+
+/**
+ * Write the VCALinkTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_alink_tool(Session sess, Project prj, Stream strm)
+{
+ return vs200x_project_vc_empty_tool(sess, prj, strm, "VCALinkTool");
+}
+
+
+/**
+ * Write the VCAppVerifierTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_app_verifier_tool(Session sess, Project prj, Stream strm)
+{
+ return vs200x_project_vc_empty_tool(sess, prj, strm, "VCAppVerifierTool");
+}
+
+
+/**
+ * Write the VCBscMakeTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_bsc_make_tool(Session sess, Project prj, Stream strm)
+{
+ return vs200x_project_vc_empty_tool(sess, prj, strm, "VCBscMakeTool");
+}
+
+
+/**
+ * Write the VCCLCompilerTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_cl_compiler_tool(Session sess, Project prj, Stream strm)
+{
+ int version, z;
+ UNUSED(prj);
+ version = vs200x_get_target_version(sess);
+ z = stream_write(strm, "\t\t\t<Tool");
+ z |= vs200x_attribute(strm, 4, "Name", "VCCLCompilerTool");
+ z |= vs200x_attribute(strm, 4, "Optimization", "0");
+ z |= vs200x_attribute(strm, 4, "MinimalRebuild", vs200x_true(sess));
+ z |= vs200x_attribute(strm, 4, "BasicRuntimeChecks", "3");
+ z |= vs200x_attribute(strm, 4, "RuntimeLibrary", "3");
+ z |= vs200x_config_runtime_type_info(sess, strm, prj);
+ z |= vs200x_config_use_precompiled_header(sess, strm, prj);
+ z |= vs200x_attribute(strm, 4, "WarningLevel", "3");
+ z |= vs200x_config_detect_64bit_portability(sess, strm, prj);
+ z |= vs200x_attribute(strm, 4, "DebugInformationFormat", "4");
+ z |= vs200x_element_end(sess, strm, 3, "/>");
+ return z;
+}
+
+
+/**
+ * Write the VCCustomBuildTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_custom_build_tool(Session sess, Project prj, Stream strm)
+{
+ return vs200x_project_vc_empty_tool(sess, prj, strm, "VCCustomBuildTool");
+}
+
+
+/**
+ * Write the VCFxCopTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_fx_cop_tool(Session sess, Project prj, Stream strm)
+{
+ return vs200x_project_vc_empty_tool(sess, prj, strm, "VCFxCopTool");
+}
+
+
+/**
+ * Write the VCLinkerTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_linker_tool(Session sess, Project prj, Stream strm)
+{
+ int z;
+ UNUSED(prj);
+ z = stream_write(strm, "\t\t\t<Tool");
+ z |= vs200x_attribute(strm, 4, "Name", "VCLinkerTool");
+ z |= vs200x_attribute(strm, 4, "LinkIncremental", "2");
+ z |= vs200x_attribute(strm, 4, "GenerateDebugInformation", vs200x_true(sess));
+ z |= vs200x_attribute(strm, 4, "SubSystem", "1");
+ z |= vs200x_attribute(strm, 4, "EntryPointSymbol", "mainCRTStartup");
+ z |= vs200x_attribute(strm, 4, "TargetMachine", "1");
+ z |= vs200x_element_end(sess, strm, 3, "/>");
+ return z;
+}
+
+
+/**
+ * Write the VCManagedResourceCompilerTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_managed_resource_compiler_tool(Session sess, Project prj, Stream strm)
+{
+ return vs200x_project_vc_empty_tool(sess, prj, strm, "VCManagedResourceCompilerTool");
+}
+
+
+/**
+ * Write the VCManifestTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_manifest_tool(Session sess, Project prj, Stream strm)
+{
+ return vs200x_project_vc_empty_tool(sess, prj, strm, "VCManifestTool");
+}
+
+
+/**
+ * Write the VCMIDLTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_midl_tool(Session sess, Project prj, Stream strm)
+{
+ return vs200x_project_vc_empty_tool(sess, prj, strm, "VCMIDLTool");
+}
+
+
+/**
+ * Write the VCPreBuildEventTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_pre_build_event_tool(Session sess, Project prj, Stream strm)
+{
+ return vs200x_project_vc_empty_tool(sess, prj, strm, "VCPreBuildEventTool");
+}
+
+
+/**
+ * Write the VCPreLinkEventTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_pre_link_event_tool(Session sess, Project prj, Stream strm)
+{
+ return vs200x_project_vc_empty_tool(sess, prj, strm, "VCPreLinkEventTool");
+}
+
+
+/**
+ * Write the VCPostBuildEventTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_post_build_event_tool(Session sess, Project prj, Stream strm)
+{
+ return vs200x_project_vc_empty_tool(sess, prj, strm, "VCPostBuildEventTool");
+}
+
+
+/**
+ * Write the VCResourceCompiler [Tool] element and attributes.
+ */
+int vs200x_project_vc_resource_compiler_tool(Session sess, Project prj, Stream strm)
+{
+ return vs200x_project_vc_empty_tool(sess, prj, strm, "VCResourceCompilerTool");
+}
+
+
+/**
+ * Write the VCWebDeploymentTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_web_deployment_tool(Session sess, Project prj, Stream strm)
+{
+ return vs200x_project_vc_empty_tool(sess, prj, strm, "VCWebDeploymentTool");
+}
+
+
+/**
+ * Write the VCWebServiceProxyGeneratorTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_web_service_proxy_generator_tool(Session sess, Project prj, Stream strm)
+{
+ return vs200x_project_vc_empty_tool(sess, prj, strm, "VCWebServiceProxyGeneratorTool");
+}
+
+
+/**
+ * Write the VCXDCMakeTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_xdc_make_tool(Session sess, Project prj, Stream strm)
+{
+ return vs200x_project_vc_empty_tool(sess, prj, strm, "VCXDCMakeTool");
+}
+
+
+/**
+ * Write the VCXMLDataGeneratorTool [Tool] element and attributes.
+ */
+int vs200x_project_vc_xml_data_generator_tool(Session sess, Project prj, Stream strm)
+{
+ return vs200x_project_vc_empty_tool(sess, prj, strm, "VCXMLDataGeneratorTool");
+}
diff --git a/src/action/vs200x/vs200x_project.h b/src/action/vs200x/vs200x_project.h
index accb053..a4950f9 100644
--- a/src/action/vs200x/vs200x_project.h
+++ b/src/action/vs200x/vs200x_project.h
@@ -1,41 +1,41 @@
-/**
- * \file vs200x_project.h
- * \brief Visual Studio 200x project generation functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-#if !defined(PREMAKE_VS200X_PROJECT_H)
-#define PREMAKE_VS200X_PROJECT_H
-
-#include "session/session.h"
-
-int vs200x_project_config_element(Session sess, Project prj, Stream strm);
-int vs200x_project_config_end(Session sess, Project prj, Stream strm);
-int vs200x_project_create(Session sess, Project prj, Stream strm);
-int vs200x_project_element(Session sess, Project prj, Stream strm);
-int vs200x_project_encoding(Session sess, Project prj, Stream strm);
-int vs200x_project_file(Session sess, Project prj, Stream strm, const char* filename, int state);
-int vs200x_project_files(Session sess, Project prj, Stream strm);
-int vs200x_project_globals(Session sess, Project prj, Stream strm);
-int vs200x_project_platforms(Session sess, Project prj, Stream strm);
-int vs200x_project_references(Session sess, Project prj, Stream strm);
-int vs200x_project_tool_files(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_alink_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_app_verifier_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_bsc_make_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_cl_compiler_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_custom_build_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_fx_cop_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_midl_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_linker_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_managed_resource_compiler_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_manifest_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_pre_build_event_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_pre_link_event_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_post_build_event_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_resource_compiler_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_web_deployment_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_web_service_proxy_generator_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_xdc_make_tool(Session sess, Project prj, Stream strm);
-int vs200x_project_vc_xml_data_generator_tool(Session sess, Project prj, Stream strm);
-
-#endif
+/**
+ * \file vs200x_project.h
+ * \brief Visual Studio 200x project generation functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+#if !defined(PREMAKE_VS200X_PROJECT_H)
+#define PREMAKE_VS200X_PROJECT_H
+
+#include "session/session.h"
+
+int vs200x_project_config_element(Session sess, Project prj, Stream strm);
+int vs200x_project_config_end(Session sess, Project prj, Stream strm);
+int vs200x_project_create(Session sess, Project prj, Stream strm);
+int vs200x_project_element(Session sess, Project prj, Stream strm);
+int vs200x_project_encoding(Session sess, Project prj, Stream strm);
+int vs200x_project_file(Session sess, Project prj, Stream strm, const char* filename, int state);
+int vs200x_project_files(Session sess, Project prj, Stream strm);
+int vs200x_project_globals(Session sess, Project prj, Stream strm);
+int vs200x_project_platforms(Session sess, Project prj, Stream strm);
+int vs200x_project_references(Session sess, Project prj, Stream strm);
+int vs200x_project_tool_files(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_alink_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_app_verifier_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_bsc_make_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_cl_compiler_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_custom_build_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_fx_cop_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_midl_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_linker_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_managed_resource_compiler_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_manifest_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_pre_build_event_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_pre_link_event_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_post_build_event_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_resource_compiler_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_web_deployment_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_web_service_proxy_generator_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_xdc_make_tool(Session sess, Project prj, Stream strm);
+int vs200x_project_vc_xml_data_generator_tool(Session sess, Project prj, Stream strm);
+
+#endif
diff --git a/src/action/vs200x/vs200x_solution.c b/src/action/vs200x/vs200x_solution.c
index 577155e..6578bd4 100644
--- a/src/action/vs200x/vs200x_solution.c
+++ b/src/action/vs200x/vs200x_solution.c
@@ -1,33 +1,33 @@
-/**
- * \file vs200x_solution.c
- * \brief Visual Studio multiple-version solution generation functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <stdlib.h>
-#include "premake.h"
-#include "vs200x.h"
-#include "vs200x_solution.h"
-
-
-/**
- * Create a new output stream for a solution, and make it active for subsequent writes.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream().
- * \returns OKAY if successful.
- */
-int vs200x_solution_create(Session sess, Solution sln, Stream strm)
-{
- /* create the solution file */
- const char* filename = solution_get_filename(sln, NULL, ".sln");
- strm = stream_create_file(filename);
- if (!strm)
- {
- return !OKAY;
- }
-
- /* make the stream active for the functions that come after */
- session_set_active_stream(sess, strm);
- return OKAY;
-}
+/**
+ * \file vs200x_solution.c
+ * \brief Visual Studio multiple-version solution generation functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <stdlib.h>
+#include "premake.h"
+#include "vs200x.h"
+#include "vs200x_solution.h"
+
+
+/**
+ * Create a new output stream for a solution, and make it active for subsequent writes.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream().
+ * \returns OKAY if successful.
+ */
+int vs200x_solution_create(Session sess, Solution sln, Stream strm)
+{
+ /* create the solution file */
+ const char* filename = solution_get_filename(sln, NULL, ".sln");
+ strm = stream_create_file(filename);
+ if (!strm)
+ {
+ return !OKAY;
+ }
+
+ /* make the stream active for the functions that come after */
+ session_set_active_stream(sess, strm);
+ return OKAY;
+}
diff --git a/src/action/vs200x/vs200x_solution.h b/src/action/vs200x/vs200x_solution.h
index d52a474..18683c4 100644
--- a/src/action/vs200x/vs200x_solution.h
+++ b/src/action/vs200x/vs200x_solution.h
@@ -1,30 +1,30 @@
-/**
- * \file vs200x_solution.h
- * \brief Visual Studio 200x solution generation functions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-#if !defined(PREMAKE_VS200X_SOLUTION_H)
-#define PREMAKE_VS200X_SOLUTION_H
-
-#include "session/session.h"
-
-int vs2002_solution_configuration(Session sess, Solution sln, Stream strm);
-int vs2002_solution_dependencies(Session sess, Solution sln, Stream strm);
-int vs2002_solution_extensibility(Session sess, Solution sln, Stream strm);
-int vs2002_solution_project_configuration(Session sess, Solution sln, Stream strm);
-int vs2002_solution_projects(Session sess, Solution sln, Stream strm);
-int vs2002_solution_signature(Session sess, Solution sln, Stream strm);
-
-int vs2003_solution_configuration(Session sess, Solution sln, Stream strm);
-int vs2003_solution_signature(Session sess, Solution sln, Stream strm);
-
-int vs2005_solution_platforms(Session sess, Solution sln, Stream strm);
-int vs2005_solution_project_platforms(Session sess, Solution sln, Stream strm);
-int vs2005_solution_properties(Session sess, Solution sln, Stream strm);
-int vs2005_solution_signature(Session sess, Solution sln, Stream strm);
-
-int vs2008_solution_signature(Session sess, Solution sln, Stream strm);
-
-int vs200x_solution_create(Session sess, Solution sln, Stream strm);
-
-#endif
+/**
+ * \file vs200x_solution.h
+ * \brief Visual Studio 200x solution generation functions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+#if !defined(PREMAKE_VS200X_SOLUTION_H)
+#define PREMAKE_VS200X_SOLUTION_H
+
+#include "session/session.h"
+
+int vs2002_solution_configuration(Session sess, Solution sln, Stream strm);
+int vs2002_solution_dependencies(Session sess, Solution sln, Stream strm);
+int vs2002_solution_extensibility(Session sess, Solution sln, Stream strm);
+int vs2002_solution_project_configuration(Session sess, Solution sln, Stream strm);
+int vs2002_solution_projects(Session sess, Solution sln, Stream strm);
+int vs2002_solution_signature(Session sess, Solution sln, Stream strm);
+
+int vs2003_solution_configuration(Session sess, Solution sln, Stream strm);
+int vs2003_solution_signature(Session sess, Solution sln, Stream strm);
+
+int vs2005_solution_platforms(Session sess, Solution sln, Stream strm);
+int vs2005_solution_project_platforms(Session sess, Solution sln, Stream strm);
+int vs2005_solution_properties(Session sess, Solution sln, Stream strm);
+int vs2005_solution_signature(Session sess, Solution sln, Stream strm);
+
+int vs2008_solution_signature(Session sess, Solution sln, Stream strm);
+
+int vs200x_solution_create(Session sess, Solution sln, Stream strm);
+
+#endif
diff --git a/src/base/array.c b/src/base/array.c
index e000257..e6747b1 100644
--- a/src/base/array.c
+++ b/src/base/array.c
@@ -1,111 +1,111 @@
-/**
- * \file array.c
- * \brief Dynamic array object.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include <stdlib.h>
-#include "premake.h"
-#include "base/array.h"
-
-#define INITIAL_SIZE 16
-
-DEFINE_CLASS(Array)
-{
- void** contents;
- int size;
- int capacity;
-};
-
-
-/**
- * Create a new, empty array object.
- * \returns A new array object.
- */
-Array array_create()
-{
- Array arr = ALLOC_CLASS(Array);
- arr->contents = (void**)malloc(sizeof(void*) * INITIAL_SIZE);
- arr->size = 0;
- arr->capacity = INITIAL_SIZE;
- return arr;
-}
-
-
-/**
- * Destroy an array object and release the associated memory.
- * \param arr The array to destroy.
- */
-void array_destroy(Array arr)
-{
- free(arr->contents);
- free(arr);
-}
-
-
-/**
- * Get the number of item in the array.
- * \param arr The array to query.
- * \returns The number elements currently in the array.
- */
-int array_size(Array arr)
-{
- return arr->size;
-}
-
-
-/**
- * Add a new item to the end of the array, growing the array if necessary.
- * \param arr The array object.
- * \param item The item to add.
- */
-void array_add(Array arr, void* item)
-{
- if (arr->size == arr->capacity)
- {
- arr->capacity *= 2;
- arr->contents = (void**)realloc(arr->contents, arr->capacity);
- }
-
- arr->contents[arr->size] = item;
- arr->size++;
-}
-
-
-/**
- * Retrieve the item at the specified index in the array.
- * \param arr The array to query.
- * \param index The index of the item to retrieve.
- * \returns A pointer to the item.
- */
-void* array_item(Array arr, int index)
-{
- return arr->contents[index];
-}
-
-
-/**
- * Store an item at a particular index in the array, overwriting any existing value.
- * \param arr The array.
- * \param index The index at which to store the item
- * \param item The new item.
- */
-void array_set(Array arr, int index, void* item)
-{
- arr->contents[index] = item;
-}
-
-
-/**
- * Append the contents of one array to another.
- * \param dest The destination array.
- * \param src The source array.
- */
-void array_append(Array dest, Array src)
-{
- int i;
- for (i = 0; i < src->size; ++i)
- {
- array_add(dest, src->contents[i]);
- }
-}
+/**
+ * \file array.c
+ * \brief Dynamic array object.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include <stdlib.h>
+#include "premake.h"
+#include "base/array.h"
+
+#define INITIAL_SIZE 16
+
+DEFINE_CLASS(Array)
+{
+ void** contents;
+ int size;
+ int capacity;
+};
+
+
+/**
+ * Create a new, empty array object.
+ * \returns A new array object.
+ */
+Array array_create()
+{
+ Array arr = ALLOC_CLASS(Array);
+ arr->contents = (void**)malloc(sizeof(void*) * INITIAL_SIZE);
+ arr->size = 0;
+ arr->capacity = INITIAL_SIZE;
+ return arr;
+}
+
+
+/**
+ * Destroy an array object and release the associated memory.
+ * \param arr The array to destroy.
+ */
+void array_destroy(Array arr)
+{
+ free(arr->contents);
+ free(arr);
+}
+
+
+/**
+ * Get the number of item in the array.
+ * \param arr The array to query.
+ * \returns The number elements currently in the array.
+ */
+int array_size(Array arr)
+{
+ return arr->size;
+}
+
+
+/**
+ * Add a new item to the end of the array, growing the array if necessary.
+ * \param arr The array object.
+ * \param item The item to add.
+ */
+void array_add(Array arr, void* item)
+{
+ if (arr->size == arr->capacity)
+ {
+ arr->capacity *= 2;
+ arr->contents = (void**)realloc(arr->contents, arr->capacity);
+ }
+
+ arr->contents[arr->size] = item;
+ arr->size++;
+}
+
+
+/**
+ * Retrieve the item at the specified index in the array.
+ * \param arr The array to query.
+ * \param index The index of the item to retrieve.
+ * \returns A pointer to the item.
+ */
+void* array_item(Array arr, int index)
+{
+ return arr->contents[index];
+}
+
+
+/**
+ * Store an item at a particular index in the array, overwriting any existing value.
+ * \param arr The array.
+ * \param index The index at which to store the item
+ * \param item The new item.
+ */
+void array_set(Array arr, int index, void* item)
+{
+ arr->contents[index] = item;
+}
+
+
+/**
+ * Append the contents of one array to another.
+ * \param dest The destination array.
+ * \param src The source array.
+ */
+void array_append(Array dest, Array src)
+{
+ int i;
+ for (i = 0; i < src->size; ++i)
+ {
+ array_add(dest, src->contents[i]);
+ }
+}
diff --git a/src/base/array.h b/src/base/array.h
index e128779..e4deea2 100644
--- a/src/base/array.h
+++ b/src/base/array.h
@@ -1,27 +1,27 @@
-/**
- * \file array.h
- * \brief Dynamic array object.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- *
- * \defgroup array Array
- * \ingroup base
- *
- * A dynamic array class.
- *
- * @{
- */
-#if !defined(PREMAKE_ARRAY_H)
-#define PREMAKE_ARRAY_H
-
-DECLARE_CLASS(Array);
-
-Array array_create(void);
-void array_destroy(Array arr);
-int array_size(Array arr);
-void array_add(Array arr, void* item);
-void* array_item(Array arr, int index);
-void array_set(Array arr, int index, void* item);
-void array_append(Array dest, Array src);
-
-#endif
-/** @} */
+/**
+ * \file array.h
+ * \brief Dynamic array object.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ *
+ * \defgroup array Array
+ * \ingroup base
+ *
+ * A dynamic array class.
+ *
+ * @{
+ */
+#if !defined(PREMAKE_ARRAY_H)
+#define PREMAKE_ARRAY_H
+
+DECLARE_CLASS(Array);
+
+Array array_create(void);
+void array_destroy(Array arr);
+int array_size(Array arr);
+void array_add(Array arr, void* item);
+void* array_item(Array arr, int index);
+void array_set(Array arr, int index, void* item);
+void array_append(Array dest, Array src);
+
+#endif
+/** @} */
diff --git a/src/base/base.h b/src/base/base.h
index 6f5d82f..bed7f27 100644
--- a/src/base/base.h
+++ b/src/base/base.h
@@ -1,12 +1,12 @@
-/**
- * \file base.h
- * \brief Premake base library API.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- *
- * \defgroup base Base
- *
- * This component defines all of the base classes required by the higher-level
- * functions of Premake.
- */
-
-int base_tests();
+/**
+ * \file base.h
+ * \brief Premake base library API.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ *
+ * \defgroup base Base
+ *
+ * This component defines all of the base classes required by the higher-level
+ * functions of Premake.
+ */
+
+int base_tests();
diff --git a/src/base/buffers.c b/src/base/buffers.c
index 9e14092..42edd58 100644
--- a/src/base/buffers.c
+++ b/src/base/buffers.c
@@ -1,85 +1,85 @@
-/**
- * \file buffers.c
- * \brief Shared working buffer system.
- * \author Copyright (c) 2007-2007 Jason Perkins and the Premake project
- *
- * \note I need to do a lot of string building operations in Premake. Rather than
- * constantly creating, resizing, and releasing (and forgetting to release)
- * dynamic string buffers, I use this shared buffer pool instead. Each request
- * to buffer_next() returns the next buffer in the list. Pointers to the buffers
- * can be safely passed around, and I don't need to remember to release anything
- * when I'm done. The buffers should only be used for transient values, obviously.
- * If you need to keep a value around for any length of time copy it to a string.
- *
- * \note The size and number of the buffers is arbitrary; I just picked some numbers
- * that seemed big enough.
- */
-
-#include <stdlib.h>
-#include "premake.h"
-#include "base/buffers.h"
-
-/** The size of an individual buffer, in bytes. */
-const int BUFFER_SIZE = 0x4000;
-
-/** The number of buffers stored in the pool */
-static const int NUM_BUFFERS = 64;
-
-/** The pool of buffers */
-static char** buffers = NULL;
-
-/** The index of the next available buffer */
-static int next = 0;
-
-
-/**
- * Clean up after the buffer system. Called by atexit().
- */
-static void buffers_destroy(void)
-{
- if (buffers != NULL)
- {
- int i;
- for (i = 0; i < NUM_BUFFERS; ++i)
- {
- free(buffers[i]);
- }
- free(buffers);
- }
-}
-
-
-/**
- * Initialize the buffer system.
- */
-static void buffers_create(void)
-{
- int i;
- buffers = (char**)malloc(sizeof(char*) * NUM_BUFFERS);
- for (i = 0; i < NUM_BUFFERS; ++i)
- {
- buffers[i] = (char*)malloc(BUFFER_SIZE);
- }
- next = 0;
- atexit(buffers_destroy);
-}
-
-
-/**
- * Get a clean buffer.
- * \returns An empty buffer.
- */
-char * buffers_next()
-{
- /* if this is the first call, initialize the buffer system */
- if (buffers == NULL)
- buffers_create();
-
- next++;
- if (next == NUM_BUFFERS)
- next = 0;
-
- /* initialize new buffers to empty string */
- buffers[next][0] = '\0';
- return buffers[next];
-}
+/**
+ * \file buffers.c
+ * \brief Shared working buffer system.
+ * \author Copyright (c) 2007-2007 Jason Perkins and the Premake project
+ *
+ * \note I need to do a lot of string building operations in Premake. Rather than
+ * constantly creating, resizing, and releasing (and forgetting to release)
+ * dynamic string buffers, I use this shared buffer pool instead. Each request
+ * to buffer_next() returns the next buffer in the list. Pointers to the buffers
+ * can be safely passed around, and I don't need to remember to release anything
+ * when I'm done. The buffers should only be used for transient values, obviously.
+ * If you need to keep a value around for any length of time copy it to a string.
+ *
+ * \note The size and number of the buffers is arbitrary; I just picked some numbers
+ * that seemed big enough.
+ */
+
+#include <stdlib.h>
+#include "premake.h"
+#include "base/buffers.h"
+
+/** The size of an individual buffer, in bytes. */
+const int BUFFER_SIZE = 0x4000;
+
+/** The number of buffers stored in the pool */
+static const int NUM_BUFFERS = 64;
+
+/** The pool of buffers */
+static char** buffers = NULL;
+
+/** The index of the next available buffer */
+static int next = 0;
+
+
+/**
+ * Clean up after the buffer system. Called by atexit().
+ */
+static void buffers_destroy(void)
+{
+ if (buffers != NULL)
+ {
+ int i;
+ for (i = 0; i < NUM_BUFFERS; ++i)
+ {
+ free(buffers[i]);
+ }
+ free(buffers);
+ }
+}
+
+
+/**
+ * Initialize the buffer system.
+ */
+static void buffers_create(void)
+{
+ int i;
+ buffers = (char**)malloc(sizeof(char*) * NUM_BUFFERS);
+ for (i = 0; i < NUM_BUFFERS; ++i)
+ {
+ buffers[i] = (char*)malloc(BUFFER_SIZE);
+ }
+ next = 0;
+ atexit(buffers_destroy);
+}
+
+
+/**
+ * Get a clean buffer.
+ * \returns An empty buffer.
+ */
+char * buffers_next()
+{
+ /* if this is the first call, initialize the buffer system */
+ if (buffers == NULL)
+ buffers_create();
+
+ next++;
+ if (next == NUM_BUFFERS)
+ next = 0;
+
+ /* initialize new buffers to empty string */
+ buffers[next][0] = '\0';
+ return buffers[next];
+}
diff --git a/src/base/buffers.h b/src/base/buffers.h
index 7fff300..5bb058c 100644
--- a/src/base/buffers.h
+++ b/src/base/buffers.h
@@ -1,25 +1,25 @@
-/**
- * \file buffers.h
- * \brief Shared working buffer system.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- *
- * \defgroup buffers Buffers
- * \ingroup base
- *
- * A shared working buffer collection. A buffer can be requested from the system, filled,
- * and passed around for a short period of time. This system allows transient string values
- * to be returned from functions and immediately used without having to resort to
- * full-blown string objects, and the ownership issues that would entail.
- *
- * @{
- */
-#if !defined(PREMAKE_BUFFER_H)
-#define PREMAKE_BUFFER_H
-
-extern const int BUFFER_SIZE;
-
-char* buffers_next(void);
-
-#endif
-/** @} */
-
+/**
+ * \file buffers.h
+ * \brief Shared working buffer system.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ *
+ * \defgroup buffers Buffers
+ * \ingroup base
+ *
+ * A shared working buffer collection. A buffer can be requested from the system, filled,
+ * and passed around for a short period of time. This system allows transient string values
+ * to be returned from functions and immediately used without having to resort to
+ * full-blown string objects, and the ownership issues that would entail.
+ *
+ * @{
+ */
+#if !defined(PREMAKE_BUFFER_H)
+#define PREMAKE_BUFFER_H
+
+extern const int BUFFER_SIZE;
+
+char* buffers_next(void);
+
+#endif
+/** @} */
+
diff --git a/src/base/cstr.c b/src/base/cstr.c
index 517e8fe..ea3bd30 100644
--- a/src/base/cstr.c
+++ b/src/base/cstr.c
@@ -1,124 +1,124 @@
-/**
- * \file cstr.c
- * \brief C string handling.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <ctype.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include "premake.h"
-#include "base/buffers.h"
-#include "base/cstr.h"
-
-
-/**
- * Determines if the sequence appears anywhere in the target string.
- * \param str The string to test.
- * \param expected The sequence to search for.
- * \returns True if the sequence is contained in the string.
- */
-int cstr_contains(const char* str, const char* expected)
-{
- return (strstr(str, expected) != NULL);
-}
-
-
-/**
- * Determines if the string ends with a particular sequence.
- * \param str The string to test.
- * \param expected The sequence for which to look.
- * \returns True if the string ends with the sequence, false otherwise.
- */
-int cstr_ends_with(const char* str, const char* expected)
-{
- if (str != NULL && expected != NULL)
- {
- int str_len = strlen(str);
- int exp_len = strlen(expected);
- if (str_len >= exp_len)
- {
- const char* start = str + str_len - exp_len;
- return (strcmp(start, expected) == 0);
- }
- }
- return 0;
-}
-
-
-/**
- * Compares two C strings for equality.
- * \param str The string to compare.
- * \param expected The value to compare against.
- * \returns True if the strings match, zero otherwise.
- */
-int cstr_eq(const char* str, const char* expected)
-{
- if (str != NULL && expected != NULL)
- {
- return (strcmp(str, expected) == 0);
- }
- return 0;
-}
-
-
-/**
- * Performs a case-insensitive comparasion on two C strings for equality.
- * \param str The string to compare.
- * \param expected The value to compare against.
- * \returns True if the strings match, zero otherwise.
- */
-int cstr_eqi(const char* str, const char* expected)
-{
- if (str != NULL && expected != NULL)
- {
- while (*str && *expected)
- {
- if (tolower(*str) != tolower(*expected))
- {
- return 0;
- }
-
- str++;
- expected++;
- }
-
- return (*str == *expected);
- }
- return 0;
-}
-
-
-/**
- * Builds a string using printf-style formatting codes.
- * \param format The format string, which may contain printf-style formatting codes.
- * \returns The formatted string.
- */
-char* cstr_format(const char* format, ...)
-{
- va_list args;
- char* buffer = buffers_next();
-
- va_start(args, format);
- vsprintf(buffer, format, args);
- va_end(args);
-
- return buffer;
-}
-
-
-/**
- * Determines if the given C string starts with a particular sequence.
- * \param str The string to test.
- * \param expected The sequence for which to look.
- * \returns True if the string starts with the sequence, false otherwise.
- */
-int cstr_starts_with(const char* str, const char* expected)
-{
- if (str != NULL && expected != NULL)
- {
- return (strncmp(str, expected, strlen(expected)) == 0);
- }
- return 0;
-}
+/**
+ * \file cstr.c
+ * \brief C string handling.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <ctype.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include "premake.h"
+#include "base/buffers.h"
+#include "base/cstr.h"
+
+
+/**
+ * Determines if the sequence appears anywhere in the target string.
+ * \param str The string to test.
+ * \param expected The sequence to search for.
+ * \returns True if the sequence is contained in the string.
+ */
+int cstr_contains(const char* str, const char* expected)
+{
+ return (strstr(str, expected) != NULL);
+}
+
+
+/**
+ * Determines if the string ends with a particular sequence.
+ * \param str The string to test.
+ * \param expected The sequence for which to look.
+ * \returns True if the string ends with the sequence, false otherwise.
+ */
+int cstr_ends_with(const char* str, const char* expected)
+{
+ if (str != NULL && expected != NULL)
+ {
+ int str_len = strlen(str);
+ int exp_len = strlen(expected);
+ if (str_len >= exp_len)
+ {
+ const char* start = str + str_len - exp_len;
+ return (strcmp(start, expected) == 0);
+ }
+ }
+ return 0;
+}
+
+
+/**
+ * Compares two C strings for equality.
+ * \param str The string to compare.
+ * \param expected The value to compare against.
+ * \returns True if the strings match, zero otherwise.
+ */
+int cstr_eq(const char* str, const char* expected)
+{
+ if (str != NULL && expected != NULL)
+ {
+ return (strcmp(str, expected) == 0);
+ }
+ return 0;
+}
+
+
+/**
+ * Performs a case-insensitive comparasion on two C strings for equality.
+ * \param str The string to compare.
+ * \param expected The value to compare against.
+ * \returns True if the strings match, zero otherwise.
+ */
+int cstr_eqi(const char* str, const char* expected)
+{
+ if (str != NULL && expected != NULL)
+ {
+ while (*str && *expected)
+ {
+ if (tolower(*str) != tolower(*expected))
+ {
+ return 0;
+ }
+
+ str++;
+ expected++;
+ }
+
+ return (*str == *expected);
+ }
+ return 0;
+}
+
+
+/**
+ * Builds a string using printf-style formatting codes.
+ * \param format The format string, which may contain printf-style formatting codes.
+ * \returns The formatted string.
+ */
+char* cstr_format(const char* format, ...)
+{
+ va_list args;
+ char* buffer = buffers_next();
+
+ va_start(args, format);
+ vsprintf(buffer, format, args);
+ va_end(args);
+
+ return buffer;
+}
+
+
+/**
+ * Determines if the given C string starts with a particular sequence.
+ * \param str The string to test.
+ * \param expected The sequence for which to look.
+ * \returns True if the string starts with the sequence, false otherwise.
+ */
+int cstr_starts_with(const char* str, const char* expected)
+{
+ if (str != NULL && expected != NULL)
+ {
+ return (strncmp(str, expected, strlen(expected)) == 0);
+ }
+ return 0;
+}
diff --git a/src/base/cstr.h b/src/base/cstr.h
index 2d6f032..3904126 100644
--- a/src/base/cstr.h
+++ b/src/base/cstr.h
@@ -1,24 +1,24 @@
-/**
- * \file cstr.h
- * \brief C string handling.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- *
- * \defgroup cstr C Strings
- * \ingroup base
- *
- * Functions to handle C strings (zero-terminated byte arrays).
- *
- * @{
- */
-#if !defined(PREMAKE_CSTR_H)
-#define PREMAKE_CSTR_H
-
-int cstr_contains(const char* str, const char* expected);
-int cstr_ends_with(const char* str, const char* expected);
-int cstr_eq(const char* str, const char* expected);
-int cstr_eqi(const char* str, const char* expected);
-char* cstr_format(const char* format, ...);
-int cstr_starts_with(const char* str, const char* expected);
-
-#endif
-/** @} */
+/**
+ * \file cstr.h
+ * \brief C string handling.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ *
+ * \defgroup cstr C Strings
+ * \ingroup base
+ *
+ * Functions to handle C strings (zero-terminated byte arrays).
+ *
+ * @{
+ */
+#if !defined(PREMAKE_CSTR_H)
+#define PREMAKE_CSTR_H
+
+int cstr_contains(const char* str, const char* expected);
+int cstr_ends_with(const char* str, const char* expected);
+int cstr_eq(const char* str, const char* expected);
+int cstr_eqi(const char* str, const char* expected);
+char* cstr_format(const char* format, ...);
+int cstr_starts_with(const char* str, const char* expected);
+
+#endif
+/** @} */
diff --git a/src/base/dir.c b/src/base/dir.c
index 7cad797..dba85f0 100644
--- a/src/base/dir.c
+++ b/src/base/dir.c
@@ -1,106 +1,106 @@
-/**
- * \file dir.c
- * \brief Directory handling.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include <string.h>
-#include <sys/stat.h>
-#include "premake.h"
-#include "base/buffers.h"
-#include "base/dir.h"
-#include "base/error.h"
-#include "base/path.h"
-#include "platform/platform.h"
-
-
-/**
- * Create a directory, if it doesn't exist already.
- * \returns OKAY if successful.
- */
-int dir_create(const char* path)
-{
- char* parent;
-
- assert(path);
-
- if (dir_exists(path))
- return OKAY;
-
- /* make sure the parent directory exists */
- parent = path_directory(path);
- if (strlen(parent) > 0)
- {
- if (dir_create(parent) != OKAY)
- return !OKAY;
- }
-
- if (platform_create_dir(path) != OKAY)
- {
- error_set("Unable to create directory %s", path);
- return !OKAY;
- }
-
- return OKAY;
-}
-
-
-/**
- * Determine if a particular directory exists on the filesystem.
- * \returns True if the directory exists.
- */
-int dir_exists(const char* path)
-{
- struct stat buf;
-
- assert(path);
-
- /* empty path is equivalent to ".", must be true */
- if (strlen(path) == 0)
- {
- return 1;
- }
-
- if (stat(path, &buf) == 0)
- {
- return (buf.st_mode & S_IFDIR);
- }
- else
- {
- return 0;
- }
-}
-
-
-/**
- * Get the current working directory.
- * \returns The current working directory, or NULL on error. Path separators
- * are converted to forward slashes, regardless of platform.
- */
-char* dir_get_current()
-{
- char* buffer = buffers_next();
-
- int result = platform_dir_get_current(buffer, BUFFER_SIZE);
- if (result == OKAY)
- {
- return path_translate(buffer, "/");
- }
- else
- {
- return NULL;
- }
-}
-
-
-/**
- * Set the current working directory.
- * \param path The new working directory.
- * \returns OKAY if successful.
- */
-int dir_set_current(const char* path)
-{
- assert(path);
- return platform_dir_set_current(path);
-}
+/**
+ * \file dir.c
+ * \brief Directory handling.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include <string.h>
+#include <sys/stat.h>
+#include "premake.h"
+#include "base/buffers.h"
+#include "base/dir.h"
+#include "base/error.h"
+#include "base/path.h"
+#include "platform/platform.h"
+
+
+/**
+ * Create a directory, if it doesn't exist already.
+ * \returns OKAY if successful.
+ */
+int dir_create(const char* path)
+{
+ char* parent;
+
+ assert(path);
+
+ if (dir_exists(path))
+ return OKAY;
+
+ /* make sure the parent directory exists */
+ parent = path_directory(path);
+ if (strlen(parent) > 0)
+ {
+ if (dir_create(parent) != OKAY)
+ return !OKAY;
+ }
+
+ if (platform_create_dir(path) != OKAY)
+ {
+ error_set("Unable to create directory %s", path);
+ return !OKAY;
+ }
+
+ return OKAY;
+}
+
+
+/**
+ * Determine if a particular directory exists on the filesystem.
+ * \returns True if the directory exists.
+ */
+int dir_exists(const char* path)
+{
+ struct stat buf;
+
+ assert(path);
+
+ /* empty path is equivalent to ".", must be true */
+ if (strlen(path) == 0)
+ {
+ return 1;
+ }
+
+ if (stat(path, &buf) == 0)
+ {
+ return (buf.st_mode & S_IFDIR);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+
+/**
+ * Get the current working directory.
+ * \returns The current working directory, or NULL on error. Path separators
+ * are converted to forward slashes, regardless of platform.
+ */
+char* dir_get_current()
+{
+ char* buffer = buffers_next();
+
+ int result = platform_dir_get_current(buffer, BUFFER_SIZE);
+ if (result == OKAY)
+ {
+ return path_translate(buffer, "/");
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+
+/**
+ * Set the current working directory.
+ * \param path The new working directory.
+ * \returns OKAY if successful.
+ */
+int dir_set_current(const char* path)
+{
+ assert(path);
+ return platform_dir_set_current(path);
+}
diff --git a/src/base/dir.h b/src/base/dir.h
index 45f2604..856a414 100644
--- a/src/base/dir.h
+++ b/src/base/dir.h
@@ -1,22 +1,22 @@
-/**
- * \file dir.h
- * \brief Directory handling.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- *
- * \defgroup dir Directory Management
- * \ingroup base
- *
- * Directory management functions.
- *
- * @{
- */
-#if !defined(PREMAKE_DIR_H)
-#define PREMAKE_DIR_H
-
-int dir_create(const char* path);
-int dir_exists(const char* path);
-char* dir_get_current(void);
-int dir_set_current(const char* path);
-
-#endif
-/** @} */
+/**
+ * \file dir.h
+ * \brief Directory handling.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ *
+ * \defgroup dir Directory Management
+ * \ingroup base
+ *
+ * Directory management functions.
+ *
+ * @{
+ */
+#if !defined(PREMAKE_DIR_H)
+#define PREMAKE_DIR_H
+
+int dir_create(const char* path);
+int dir_exists(const char* path);
+char* dir_get_current(void);
+int dir_set_current(const char* path);
+
+#endif
+/** @} */
diff --git a/src/base/error.c b/src/base/error.c
index fac6b31..a53eff2 100644
--- a/src/base/error.c
+++ b/src/base/error.c
@@ -1,51 +1,51 @@
-/**
- * \file error.c
- * \brief Application-wide error reporting.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-#include "premake.h"
-#include "error.h"
-
-static char error_message[8192] = { 0 };
-
-
-/**
- * Clear any existing error state.
- */
-void error_clear(void)
-{
- error_message[0] = 0;
-}
-
-
-/**
- * Returns the most recent error message set by error_set().
- * \returns The error message, or NULL if no error message has been set.
- */
-const char* error_get(void)
-{
- return (strlen(error_message) > 0) ? error_message : NULL;
-}
-
-
-/**
- * Set the description of an error condition, which may be retrieved with session_get_error().
- * The session uses a fixed length (around 8K) buffer for storing the error message, so make
- * sure the final size of the formatted message will fall under that limit.
- * \param message A description of the error condition.
- */
-void error_set(const char* message, ...)
-{
- va_list args;
-
- assert(message);
-
- va_start(args, message);
- vsprintf(error_message, message, args);
- va_end(args);
-}
+/**
+ * \file error.c
+ * \brief Application-wide error reporting.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include "premake.h"
+#include "error.h"
+
+static char error_message[8192] = { 0 };
+
+
+/**
+ * Clear any existing error state.
+ */
+void error_clear(void)
+{
+ error_message[0] = 0;
+}
+
+
+/**
+ * Returns the most recent error message set by error_set().
+ * \returns The error message, or NULL if no error message has been set.
+ */
+const char* error_get(void)
+{
+ return (strlen(error_message) > 0) ? error_message : NULL;
+}
+
+
+/**
+ * Set the description of an error condition, which may be retrieved with session_get_error().
+ * The session uses a fixed length (around 8K) buffer for storing the error message, so make
+ * sure the final size of the formatted message will fall under that limit.
+ * \param message A description of the error condition.
+ */
+void error_set(const char* message, ...)
+{
+ va_list args;
+
+ assert(message);
+
+ va_start(args, message);
+ vsprintf(error_message, message, args);
+ va_end(args);
+}
diff --git a/src/base/error.h b/src/base/error.h
index 46da099..dbccda0 100644
--- a/src/base/error.h
+++ b/src/base/error.h
@@ -1,21 +1,21 @@
-/**
- * \file error.h
- * \brief Application-wide error reporting.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- *
- * \defgroup array Array
- * \ingroup base
- *
- * Application-wide error reporting.
- *
- * @{
- */
-#if !defined(PREMAKE_ERROR_H)
-#define PREMAKE_ERROR_H
-
-void error_clear(void);
-const char* error_get(void);
-void error_set(const char* message, ...);
-
-#endif
-/** @} */
+/**
+ * \file error.h
+ * \brief Application-wide error reporting.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ *
+ * \defgroup array Array
+ * \ingroup base
+ *
+ * Application-wide error reporting.
+ *
+ * @{
+ */
+#if !defined(PREMAKE_ERROR_H)
+#define PREMAKE_ERROR_H
+
+void error_clear(void);
+const char* error_get(void);
+void error_set(const char* message, ...);
+
+#endif
+/** @} */
diff --git a/src/base/guid.c b/src/base/guid.c
index b2bc442..f6da2e6 100644
--- a/src/base/guid.c
+++ b/src/base/guid.c
@@ -1,109 +1,109 @@
-/**
- * \file guid.c
- * \brief GUID creation and validation.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <stdio.h>
-#include <string.h>
-#include "premake.h"
-#include "guid.h"
-#include "platform/platform.h"
-#include "base/buffers.h"
-
-
-static void stringify(char* src, char* dst, int count);
-
-
-/**
- * Create a new GUID, with the format "4E67EBCE-BC8B-4058-9AA9-48EE5E003683".
- * \returns The new GUID.
- */
-const char* guid_create()
-{
- char guid[16];
- char* result = buffers_next();
-
- /* get a GUID as an array of 16 bytes */
- platform_create_guid(guid);
-
- /* convert that array to a string in the usual format */
- stringify(guid, result, 4);
- result[8] = '-';
- stringify(guid + 4, result + 9, 2);
- result[13] = '-';
- stringify(guid + 6, result + 14, 2);
- result[18] = '-';
- stringify(guid + 8, result + 19, 2);
- result[23] = '-';
- stringify(guid + 10, result + 24, 6);
- result[36] = '\0';
- return result;
-}
-
-
-/**
- * Validate the format of a GUID, which should use the form "4E67EBCE-BC8B-4058-9AA9-48EE5E003683".
- * \param value The guid to validate.
- * \returns True if valid, zero otherwise.
- */
-int guid_is_valid(const char* value)
-{
- int i, n;
-
- /* make sure it is the right size */
- if (strlen(value) != 36)
- return 0;
-
- /* check for dashes in the right places */
- if (value[8] != '-' ||
- value[13] != '-' ||
- value[18] != '-' ||
- value[23] != '-')
- {
- return 0;
- }
-
- /* make sure only [0-9A-F-] are present; count the number of dashes on the way */
- n = 0;
- for (i = 0; i < 36; ++i)
- {
- if (value[i] == '-')
- {
- ++n;
- }
- else if ((value[i] < '0' || value[i] > '9') &&
- (value[i] < 'A' || value[i] > 'F') &&
- (value[i] < 'a' || value[i] > 'f'))
- {
- return 0;
- }
- }
-
- /* make sure I've got the right number of dashes */
- if (n != 4)
- {
- return 0;
- }
-
- return 1;
-}
-
-
-/**
- * Convert an array of bytes to a string.
- * \param src The source array of bytes.
- * \param dst The destination string buffer.
- * \param count The number of bytes to convert.
- */
-static void stringify(char* src, char* dst, int count)
-{
- int i;
- for (i = 0; i < count; ++i)
- {
- unsigned value = (unsigned char)src[i];
- sprintf(dst, "%02X", value);
- dst += 2;
- }
-}
-
+/**
+ * \file guid.c
+ * \brief GUID creation and validation.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "premake.h"
+#include "guid.h"
+#include "platform/platform.h"
+#include "base/buffers.h"
+
+
+static void stringify(char* src, char* dst, int count);
+
+
+/**
+ * Create a new GUID, with the format "4E67EBCE-BC8B-4058-9AA9-48EE5E003683".
+ * \returns The new GUID.
+ */
+const char* guid_create()
+{
+ char guid[16];
+ char* result = buffers_next();
+
+ /* get a GUID as an array of 16 bytes */
+ platform_create_guid(guid);
+
+ /* convert that array to a string in the usual format */
+ stringify(guid, result, 4);
+ result[8] = '-';
+ stringify(guid + 4, result + 9, 2);
+ result[13] = '-';
+ stringify(guid + 6, result + 14, 2);
+ result[18] = '-';
+ stringify(guid + 8, result + 19, 2);
+ result[23] = '-';
+ stringify(guid + 10, result + 24, 6);
+ result[36] = '\0';
+ return result;
+}
+
+
+/**
+ * Validate the format of a GUID, which should use the form "4E67EBCE-BC8B-4058-9AA9-48EE5E003683".
+ * \param value The guid to validate.
+ * \returns True if valid, zero otherwise.
+ */
+int guid_is_valid(const char* value)
+{
+ int i, n;
+
+ /* make sure it is the right size */
+ if (strlen(value) != 36)
+ return 0;
+
+ /* check for dashes in the right places */
+ if (value[8] != '-' ||
+ value[13] != '-' ||
+ value[18] != '-' ||
+ value[23] != '-')
+ {
+ return 0;
+ }
+
+ /* make sure only [0-9A-F-] are present; count the number of dashes on the way */
+ n = 0;
+ for (i = 0; i < 36; ++i)
+ {
+ if (value[i] == '-')
+ {
+ ++n;
+ }
+ else if ((value[i] < '0' || value[i] > '9') &&
+ (value[i] < 'A' || value[i] > 'F') &&
+ (value[i] < 'a' || value[i] > 'f'))
+ {
+ return 0;
+ }
+ }
+
+ /* make sure I've got the right number of dashes */
+ if (n != 4)
+ {
+ return 0;
+ }
+
+ return 1;
+}
+
+
+/**
+ * Convert an array of bytes to a string.
+ * \param src The source array of bytes.
+ * \param dst The destination string buffer.
+ * \param count The number of bytes to convert.
+ */
+static void stringify(char* src, char* dst, int count)
+{
+ int i;
+ for (i = 0; i < count; ++i)
+ {
+ unsigned value = (unsigned char)src[i];
+ sprintf(dst, "%02X", value);
+ dst += 2;
+ }
+}
+
diff --git a/src/base/guid.h b/src/base/guid.h
index 94091ae..c6e6753 100644
--- a/src/base/guid.h
+++ b/src/base/guid.h
@@ -1,20 +1,20 @@
-/**
- * \file guid.h
- * \brief GUID creation and validation.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- *
- * \defgroup guid GUIDs
- * \ingroup base
- *
- * GUID creation and validation functions.
- *
- * @{
- */
-#if !defined(PREMAKE_GUID_H)
-#define PREMAKE_GUID_H
-
-const char* guid_create();
-int guid_is_valid(const char* value);
-
-#endif
-/** @} */
+/**
+ * \file guid.h
+ * \brief GUID creation and validation.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ *
+ * \defgroup guid GUIDs
+ * \ingroup base
+ *
+ * GUID creation and validation functions.
+ *
+ * @{
+ */
+#if !defined(PREMAKE_GUID_H)
+#define PREMAKE_GUID_H
+
+const char* guid_create();
+int guid_is_valid(const char* value);
+
+#endif
+/** @} */
diff --git a/src/base/path.c b/src/base/path.c
index a170960..1648aa7 100644
--- a/src/base/path.c
+++ b/src/base/path.c
@@ -1,354 +1,354 @@
-/**
- * \file path.c
- * \brief Path handling.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include "premake.h"
-#include "base/path.h"
-#include "platform/platform.h"
-#include "base/buffers.h"
-#include "base/cstr.h"
-#include "base/dir.h"
-
-static char* CppFileExtensions[] = { ".cc", ".cpp", ".cxx", ".c", ".s", NULL };
-
-
-/**
- * Create an absolute path from a relative one.
- * \param path The relative path to convert.
- * \returns An absolute version of the relative path.
- */
-char* path_absolute(const char* path)
-{
- char* source;
- char* result;
-
- assert(path);
-
- /* normalize the target path */
- source = path_translate(path, "/");
- if (strlen(source) == 0)
- strcpy(source, ".");
-
- /* If the directory is already absolute I don't have to do anything */
- if (path_is_absolute(source))
- return source;
-
- /* start from the current location */
- result = dir_get_current();
-
- /* split up the supplied relative path and tackle it bit by bit */
- while (source)
- {
- char* end = strchr(source, '/');
- if (end)
- *end = 0;
-
- if (cstr_eq(source, ".."))
- {
- char* up = strrchr(result, '/');
- if (up)
- *up = 0;
- }
- else if (!cstr_eq(source, "."))
- {
- strcat(result, "/");
- strcat(result, source);
- }
-
- source = end ? end + 1 : NULL;
- }
-
- return result;
-}
-
-
-/**
- * Assemble a complete file path from its component parts.
- * \param dir The directory portion of the path.
- * \param filename The file name portion of the path.
- * \param ext The extension portion of the path.
- * \returns The assembled file path.
- */
-char* path_assemble(const char* dir, const char* filename, const char* ext)
-{
- char* buffer;
-
- assert(dir);
- assert(filename);
- assert(ext);
-
- buffer = path_join(dir, filename);
- if (ext)
- {
- strcat(buffer, ext);
- }
- return buffer;
-}
-
-
-/**
- * Returns the base name in a path: the filename, without the directory or
- * file extension.
- * \param path The path to split.
- * \returns The base name part of the path.
- */
-char* path_basename(const char* path)
-{
- char* buffer = path_filename(path);
- char* ptr = strrchr(buffer, '.');
- if (ptr)
- {
- *ptr = '\0';
- }
- return buffer;
-}
-
-
-/**
- * Retrieve the directory portion of a path.
- * \param path The path to split.
- * \returns The directory portion of the path. Returns an empty string ("") if
- * the path does not contain any directory information.
- */
-char* path_directory(const char* path)
-{
- char* ptr;
- char* buffer = buffers_next();
-
- assert(path);
- strcpy(buffer, path);
-
- ptr = strrchr(buffer, '/');
- if (ptr)
- *ptr = '\0';
- else
- *buffer = '\0';
-
- return buffer;
-}
-
-
-/**
- * Retrieve the file extension portion of a path. If the path has multiple
- * dots in the filename (ie. filename.my.ext) only the last bit (.ext) will
- * be returned. The dot is included in the extension.
- * \param path The path to split.
- * \returns The extension portion of the path, or an empty string if no extension is present.
- */
-char* path_extension(const char* path)
-{
- char* ptr;
- char* buffer = buffers_next();
-
- assert(path);
- strcpy(buffer, path);
- ptr = strrchr(buffer, '.');
- return (ptr) ? ptr : "";
-}
-
-
-/**
- * Retrieve the fileame (filename.ext) portion of a path.
- * \param path The path to split.
- * \returns The filename portion of the path. Returns an empty string ("") if
- * the path is empty.
- */
-char* path_filename(const char* path)
-{
- char* ptr;
- char* buffer = buffers_next();
-
- assert(path);
-
- ptr = strrchr(path, '/');
- if (ptr)
- {
- strcpy(buffer, ptr + 1);
- }
- else
- {
- strcpy(buffer, path);
- }
-
- return buffer;
-}
-
-
-/**
- * Determine is a path is absolute (rooted at base of filesystem).
- * \param path The path to check.
- * \returns True if the path is absolute.
- */
-int path_is_absolute(const char* path)
-{
- assert(path);
-
- if (path[0] == '/' || path[0] == '\\')
- return 1;
- if (path[1] == ':')
- return 1;
- return 0;
-}
-
-
-/**
- * Returns true if the path represents a C++ source code file; by checking
- * the file extension.
- * \param path The path to check.
- * \returns True if the path uses a known C++ file extension.
- */
-int path_is_cpp_source(const char* path)
-{
- int i;
-
- char* ext = path_extension(path);
- if (cstr_eq(ext, ""))
- {
- return 0;
- }
-
- for (i = 0; CppFileExtensions[i] != NULL; ++i)
- {
- if (cstr_eqi(CppFileExtensions[i], ext))
- return 1;
- }
-
- return 0;
-}
-
-
-/**
- * Join two paths togethers.
- * \param leading The leading path.
- * \param trailing The trailing path.
- * \returns A unified path.
- * \note If the trailing path is absolute, that will be the return value.
- * A join is only performed if the trailing path is relative.
- */
-char* path_join(const char* leading, const char* trailing)
-{
- char* buffer = buffers_next();
-
- /* treat nulls like empty paths */
- leading = (leading != NULL) ? leading : "";
- trailing = (trailing != NULL) ? trailing : "";
-
- if (!trailing)
- {
- strcpy(buffer, leading);
- return buffer;
- }
-
- if (!leading || path_is_absolute(trailing))
- {
- strcpy(buffer, trailing);
- return buffer;
- }
-
- if (leading)
- {
- strcat(buffer, leading);
- }
-
- if (strlen(buffer) > 0 && !cstr_ends_with(buffer, "/"))
- {
- strcat(buffer, "/");
- }
-
- strcat(buffer, trailing);
- return buffer;
-}
-
-
-/**
- * \brief Compute the relative path between two locations.
- * \param base The base path.
- * \param target The target path.
- * \returns A relative path from the base to the target.
- */
-char* path_relative(const char* base, const char* target)
-{
- int start, i;
- char* result;
-
- /* normalize the two paths */
- char* full_base = path_absolute(base);
- char* full_targ = path_absolute(target);
-
- strcat(full_base, "/");
- strcat(full_targ, "/");
-
- /* trim off the common directories from the start */
- for (start = 0, i = 0; full_base[i] && full_targ[i] && full_base[i] == full_targ[i]; ++i)
- {
- if (full_base[i] == '/')
- start = i + 1;
- }
-
- /* same directory? */
- if (full_base[i] == 0 && full_targ[i] == 0)
- return ".";
-
- /* build a connecting path */
- result = buffers_next();
- if (strlen(full_base) - start > 0)
- {
- strcpy(result, "../");
- for (i = start; full_base[i]; ++i)
- {
- if (full_base[i] == '/' && full_base[i + 1])
- strcat(result, "../");
- }
- }
-
- if (strlen(full_targ) - start > 0)
- {
- strcat(result, full_targ + start);
- }
-
- /* remove the trailing slash */
- result[strlen(result) - 1] = 0;
-
- if (strlen(result) == 0)
- strcpy(result, ".");
- return result;
-}
-
-
-/**
- * Replace all path separator characters in a path.
- * \param path The path to translate.
- * \param sep The desired separator, or NULL for the platform's native separator.
- * \returns The translated path.
- */
-char* path_translate(const char* path, const char* sep)
-{
- char* ptr;
- char* buffer;
-
- assert(path);
-
- buffer = buffers_next();
- if (sep == NULL)
- {
-#if defined(PLATFORM_WINDOWS)
- sep = "\\";
-#else
- sep = "/";
-#endif
- }
-
- strcpy(buffer, path);
- for (ptr = buffer; *ptr; ++ptr)
- {
- if (*ptr == '/' || *ptr == '\\')
- *ptr = *sep;
- }
-
- return buffer;
-}
+/**
+ * \file path.c
+ * \brief Path handling.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include "premake.h"
+#include "base/path.h"
+#include "platform/platform.h"
+#include "base/buffers.h"
+#include "base/cstr.h"
+#include "base/dir.h"
+
+static char* CppFileExtensions[] = { ".cc", ".cpp", ".cxx", ".c", ".s", NULL };
+
+
+/**
+ * Create an absolute path from a relative one.
+ * \param path The relative path to convert.
+ * \returns An absolute version of the relative path.
+ */
+char* path_absolute(const char* path)
+{
+ char* source;
+ char* result;
+
+ assert(path);
+
+ /* normalize the target path */
+ source = path_translate(path, "/");
+ if (strlen(source) == 0)
+ strcpy(source, ".");
+
+ /* If the directory is already absolute I don't have to do anything */
+ if (path_is_absolute(source))
+ return source;
+
+ /* start from the current location */
+ result = dir_get_current();
+
+ /* split up the supplied relative path and tackle it bit by bit */
+ while (source)
+ {
+ char* end = strchr(source, '/');
+ if (end)
+ *end = 0;
+
+ if (cstr_eq(source, ".."))
+ {
+ char* up = strrchr(result, '/');
+ if (up)
+ *up = 0;
+ }
+ else if (!cstr_eq(source, "."))
+ {
+ strcat(result, "/");
+ strcat(result, source);
+ }
+
+ source = end ? end + 1 : NULL;
+ }
+
+ return result;
+}
+
+
+/**
+ * Assemble a complete file path from its component parts.
+ * \param dir The directory portion of the path.
+ * \param filename The file name portion of the path.
+ * \param ext The extension portion of the path.
+ * \returns The assembled file path.
+ */
+char* path_assemble(const char* dir, const char* filename, const char* ext)
+{
+ char* buffer;
+
+ assert(dir);
+ assert(filename);
+ assert(ext);
+
+ buffer = path_join(dir, filename);
+ if (ext)
+ {
+ strcat(buffer, ext);
+ }
+ return buffer;
+}
+
+
+/**
+ * Returns the base name in a path: the filename, without the directory or
+ * file extension.
+ * \param path The path to split.
+ * \returns The base name part of the path.
+ */
+char* path_basename(const char* path)
+{
+ char* buffer = path_filename(path);
+ char* ptr = strrchr(buffer, '.');
+ if (ptr)
+ {
+ *ptr = '\0';
+ }
+ return buffer;
+}
+
+
+/**
+ * Retrieve the directory portion of a path.
+ * \param path The path to split.
+ * \returns The directory portion of the path. Returns an empty string ("") if
+ * the path does not contain any directory information.
+ */
+char* path_directory(const char* path)
+{
+ char* ptr;
+ char* buffer = buffers_next();
+
+ assert(path);
+ strcpy(buffer, path);
+
+ ptr = strrchr(buffer, '/');
+ if (ptr)
+ *ptr = '\0';
+ else
+ *buffer = '\0';
+
+ return buffer;
+}
+
+
+/**
+ * Retrieve the file extension portion of a path. If the path has multiple
+ * dots in the filename (ie. filename.my.ext) only the last bit (.ext) will
+ * be returned. The dot is included in the extension.
+ * \param path The path to split.
+ * \returns The extension portion of the path, or an empty string if no extension is present.
+ */
+char* path_extension(const char* path)
+{
+ char* ptr;
+ char* buffer = buffers_next();
+
+ assert(path);
+ strcpy(buffer, path);
+ ptr = strrchr(buffer, '.');
+ return (ptr) ? ptr : "";
+}
+
+
+/**
+ * Retrieve the fileame (filename.ext) portion of a path.
+ * \param path The path to split.
+ * \returns The filename portion of the path. Returns an empty string ("") if
+ * the path is empty.
+ */
+char* path_filename(const char* path)
+{
+ char* ptr;
+ char* buffer = buffers_next();
+
+ assert(path);
+
+ ptr = strrchr(path, '/');
+ if (ptr)
+ {
+ strcpy(buffer, ptr + 1);
+ }
+ else
+ {
+ strcpy(buffer, path);
+ }
+
+ return buffer;
+}
+
+
+/**
+ * Determine is a path is absolute (rooted at base of filesystem).
+ * \param path The path to check.
+ * \returns True if the path is absolute.
+ */
+int path_is_absolute(const char* path)
+{
+ assert(path);
+
+ if (path[0] == '/' || path[0] == '\\')
+ return 1;
+ if (path[1] == ':')
+ return 1;
+ return 0;
+}
+
+
+/**
+ * Returns true if the path represents a C++ source code file; by checking
+ * the file extension.
+ * \param path The path to check.
+ * \returns True if the path uses a known C++ file extension.
+ */
+int path_is_cpp_source(const char* path)
+{
+ int i;
+
+ char* ext = path_extension(path);
+ if (cstr_eq(ext, ""))
+ {
+ return 0;
+ }
+
+ for (i = 0; CppFileExtensions[i] != NULL; ++i)
+ {
+ if (cstr_eqi(CppFileExtensions[i], ext))
+ return 1;
+ }
+
+ return 0;
+}
+
+
+/**
+ * Join two paths togethers.
+ * \param leading The leading path.
+ * \param trailing The trailing path.
+ * \returns A unified path.
+ * \note If the trailing path is absolute, that will be the return value.
+ * A join is only performed if the trailing path is relative.
+ */
+char* path_join(const char* leading, const char* trailing)
+{
+ char* buffer = buffers_next();
+
+ /* treat nulls like empty paths */
+ leading = (leading != NULL) ? leading : "";
+ trailing = (trailing != NULL) ? trailing : "";
+
+ if (!trailing)
+ {
+ strcpy(buffer, leading);
+ return buffer;
+ }
+
+ if (!leading || path_is_absolute(trailing))
+ {
+ strcpy(buffer, trailing);
+ return buffer;
+ }
+
+ if (leading)
+ {
+ strcat(buffer, leading);
+ }
+
+ if (strlen(buffer) > 0 && !cstr_ends_with(buffer, "/"))
+ {
+ strcat(buffer, "/");
+ }
+
+ strcat(buffer, trailing);
+ return buffer;
+}
+
+
+/**
+ * \brief Compute the relative path between two locations.
+ * \param base The base path.
+ * \param target The target path.
+ * \returns A relative path from the base to the target.
+ */
+char* path_relative(const char* base, const char* target)
+{
+ int start, i;
+ char* result;
+
+ /* normalize the two paths */
+ char* full_base = path_absolute(base);
+ char* full_targ = path_absolute(target);
+
+ strcat(full_base, "/");
+ strcat(full_targ, "/");
+
+ /* trim off the common directories from the start */
+ for (start = 0, i = 0; full_base[i] && full_targ[i] && full_base[i] == full_targ[i]; ++i)
+ {
+ if (full_base[i] == '/')
+ start = i + 1;
+ }
+
+ /* same directory? */
+ if (full_base[i] == 0 && full_targ[i] == 0)
+ return ".";
+
+ /* build a connecting path */
+ result = buffers_next();
+ if (strlen(full_base) - start > 0)
+ {
+ strcpy(result, "../");
+ for (i = start; full_base[i]; ++i)
+ {
+ if (full_base[i] == '/' && full_base[i + 1])
+ strcat(result, "../");
+ }
+ }
+
+ if (strlen(full_targ) - start > 0)
+ {
+ strcat(result, full_targ + start);
+ }
+
+ /* remove the trailing slash */
+ result[strlen(result) - 1] = 0;
+
+ if (strlen(result) == 0)
+ strcpy(result, ".");
+ return result;
+}
+
+
+/**
+ * Replace all path separator characters in a path.
+ * \param path The path to translate.
+ * \param sep The desired separator, or NULL for the platform's native separator.
+ * \returns The translated path.
+ */
+char* path_translate(const char* path, const char* sep)
+{
+ char* ptr;
+ char* buffer;
+
+ assert(path);
+
+ buffer = buffers_next();
+ if (sep == NULL)
+ {
+#if defined(PLATFORM_WINDOWS)
+ sep = "\\";
+#else
+ sep = "/";
+#endif
+ }
+
+ strcpy(buffer, path);
+ for (ptr = buffer; *ptr; ++ptr)
+ {
+ if (*ptr == '/' || *ptr == '\\')
+ *ptr = *sep;
+ }
+
+ return buffer;
+}
diff --git a/src/base/path.h b/src/base/path.h
index 1600951..caf8b3c 100644
--- a/src/base/path.h
+++ b/src/base/path.h
@@ -1,29 +1,29 @@
-/**
- * \file path.h
- * \brief Path handling.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- *
- * \defgroup path Path
- * \ingroup base
- *
- * Path manipulation functions.
- *
- * @{
- */
-#if !defined(PREMAKE_PATH_H)
-#define PREMAKE_PATH_H
-
-char* path_absolute(const char* path);
-char* path_assemble(const char* dir, const char* filename, const char* ext);
-char* path_basename(const char* path);
-char* path_directory(const char* path);
-char* path_extension(const char* path);
-char* path_filename(const char* path);
-int path_is_absolute(const char* path);
-int path_is_cpp_source(const char* path);
-char* path_join(const char* leading, const char* trailing);
-char* path_relative(const char* base, const char* target);
-char* path_translate(const char* path, const char* sep);
-
-#endif
-/** @} */
+/**
+ * \file path.h
+ * \brief Path handling.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ *
+ * \defgroup path Path
+ * \ingroup base
+ *
+ * Path manipulation functions.
+ *
+ * @{
+ */
+#if !defined(PREMAKE_PATH_H)
+#define PREMAKE_PATH_H
+
+char* path_absolute(const char* path);
+char* path_assemble(const char* dir, const char* filename, const char* ext);
+char* path_basename(const char* path);
+char* path_directory(const char* path);
+char* path_extension(const char* path);
+char* path_filename(const char* path);
+int path_is_absolute(const char* path);
+int path_is_cpp_source(const char* path);
+char* path_join(const char* leading, const char* trailing);
+char* path_relative(const char* base, const char* target);
+char* path_translate(const char* path, const char* sep);
+
+#endif
+/** @} */
diff --git a/src/base/stream.c b/src/base/stream.c
index b93a517..ebe7247 100644
--- a/src/base/stream.c
+++ b/src/base/stream.c
@@ -1,289 +1,289 @@
-/**
- * \file stream.c
- * \brief Output stream handling.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "premake.h"
-#include "base/error.h"
-#include "base/dir.h"
-#include "base/path.h"
-#include "base/stream.h"
-
-
-DEFINE_CLASS(Stream)
-{
- FILE* file;
- const char* newline;
- char* buffer;
-};
-
-
-static struct Stream_impl Console_impl = { NULL, "\n", NULL };
-
-
-/**
- * The console output stream.
- * Use the stream_write() functions and this stream object instead
- * of the usual C functions like printf(). The stream functions have
- * more features -- such as setting the line ending sequence -- and
- * can be captured for automated testing.
- */
-Stream Console = &Console_impl;
-
-
-/**
- * Create a new file output stream, overwriting any existing file.
- * \param filename The name of the file to create.
- * \returns A new file stream.
- */
-Stream stream_create_file(const char* filename)
-{
- Stream strm;
- const char* dirname;
- FILE* file;
-
- /* make sure the directory exists before writing to it */
- dirname = path_directory(filename);
- if (dir_create(dirname) != OKAY)
- {
- return NULL;
- }
-
- /* create the file */
- file = fopen(filename, "wb");
- if (file == NULL)
- {
- error_set("Unable to open file %s", filename);
- return NULL;
- }
-
- /* build the stream object */
- strm = stream_create_null();
- strm->file = file;
- return strm;
-}
-
-
-/**
- * Create a "null" stream, which discards any writes; intended for automated testing.
- * \returns A new stream object.
- */
-Stream stream_create_null()
-{
- Stream strm = ALLOC_CLASS(Stream);
- strm->file = NULL;
- strm->newline = "\n";
- strm->buffer = NULL;
- return strm;
-}
-
-
-/**
- * Close a stream and release the associated memory.
- * \param strm The stream to close.
- */
-void stream_destroy(Stream strm)
-{
- assert(strm);
- if (strm != Console)
- {
- if (strm->file != NULL)
- {
- fclose(strm->file);
- }
- free(strm);
- }
-}
-
-
-/**
- * Capture the text written to a stream into a buffer.
- * When a stream is captured all text is written to the buffer, and
- * output to the associated file is blocked.
- * \param strm The stream to capture.
- * \param buffer The buffer to contain the captured text. No checks are made
- * on the size of the buffer while writing, so use carefully.
- * May be NULL to disable buffering.
- */
-void stream_set_buffer(Stream strm, char* buffer)
-{
- assert(strm);
- strm->buffer = buffer;
- strm->buffer[0] = '\0';
-}
-
-
-/**
- * Set the newline character sequence.
- * \param strm The stream to set.
- * \param newline The EOL sequence.
- */
-void stream_set_newline(Stream strm, const char* newline)
-{
- assert(strm);
- strm->newline = newline;
-}
-
-
-/**
- * Write a formatted list of strings.
- * \param strm The stream to which to write.
- * \param strs The list of strings to write.
- * \param start The start string, always written first, even if there are no items in the list.
- * \param prefix A prefix string, to be written before each item.
- * \param postfix A postfix string, to be written after each item.
- * \param infix An infix strings, to write between items, after the
- * previous postfix string and before the next prefix.
- * \param end The end string, always written last, even if there are no items in the list.
- * \returns OKAY if successful.
- */
-int stream_write_strings(Stream strm, Strings strs, const char* start, const char* prefix, const char* postfix, const char* infix, const char* end)
-{
- int i, n, z;
-
- z = stream_write(strm, start);
-
- n = strings_size(strs);
- for (i = 0; i < n; ++i)
- {
- const char* value = strings_item(strs, i);
- if (i > 0) z |= stream_write(strm, infix);
- z |= stream_write(strm, prefix);
- z |= stream_write(strm, value);
- z |= stream_write(strm, postfix);
- }
-
- z |= stream_write(strm, end);
- return z;
-}
-
-
-/**
- * Write a formatted list of strings, followed by a newline.
- * \param strm The stream to which to write.
- * \param strs The list of strings to write.
- * \param start The start string, always written first, even if there are no items in the list.
- * \param prefix A prefix string, to be written before each item.
- * \param postfix A postfix string, to be written after each item.
- * \param infix An infix strings, to write between items, after the
- * previous postfix string and before the next prefix.
- * \returns OKAY if successful.
- */
-int stream_writeline_strings(Stream strm, Strings strs, const char* start, const char* prefix, const char* postfix, const char* infix)
-{
- int i, n, z;
-
- z = stream_write(strm, start);
-
- n = strings_size(strs);
- for (i = 0; i < n; ++i)
- {
- const char* value = strings_item(strs, i);
- if (i > 0) z |= stream_write(strm, infix);
- z |= stream_write(strm, prefix);
- z |= stream_write(strm, value);
- z |= stream_write(strm, postfix);
- }
-
- z |= stream_writeline(strm, "");
- return z;
-}
-
-
-/**
- * Format and print a string using printf-style codes and a variable argument list.
- * \param strm The stream to which to write.
- * \param value The value to print; may contain printf-style formatting codes.
- * \param args A variable argument list to populate the printf-style codes in `value`.
- * \returns OKAY if successful.
- */
-int stream_vprintf(Stream strm, const char* value, va_list args)
-{
- if (strm->buffer)
- {
- /* write to the end of the current contents of the buffer */
- char* start = strm->buffer + strlen(strm->buffer);
- vsprintf(start, value, args);
- }
- else if (strm == Console)
- {
- vfprintf(stdout, value, args);
- }
- else if (strm->file)
- {
- vfprintf(strm->file, value, args);
- }
- return OKAY;
-}
-
-
-/**
- * Write a string value to a stream.
- * \param strm The stream.
- * \param value The value to append to the stream.
- * \returns OKAY is successful.
- */
-int stream_write(Stream strm, const char* value, ...)
-{
- int status;
- va_list args;
-
- va_start(args, value);
- status = stream_vprintf(strm, value, args);
- va_end(args);
-
- return status;
-}
-
-
-/**
- * Write N copies of a string to a stream.
- * \param strm The stream to which to write.
- * \param value The string to write.
- * \param n The number of copies to write.
- * \returns OKAY if successful.
- */
-int stream_write_n(Stream strm, const char* value, int n)
-{
- int i, z = OKAY;
- for (i = 0; i < n; ++i)
- {
- z |= stream_write(strm, value);
- }
- return z;
-}
-
-
-/**
- * Writes the Unicode encoding marker sequence into the stream.
- * \param strm The stream to which to write.
- */
-int stream_write_unicode_marker(Stream strm)
-{
- return stream_write(strm, "\357\273\277");
-}
-
-
-/**
- * Write a string value, followed by a newline, to a stream.
- * \param strm The stream.
- * \param value The value to append to the stream.
- * \returns OKAY if successful.
- */
-int stream_writeline(Stream strm, const char* value, ...)
-{
- int status;
- va_list args;
-
- va_start(args, value);
- status = stream_vprintf(strm, value, args);
- status |= stream_write(strm, strm->newline);
- va_end(args);
-
- return status;
-}
+/**
+ * \file stream.c
+ * \brief Output stream handling.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "premake.h"
+#include "base/error.h"
+#include "base/dir.h"
+#include "base/path.h"
+#include "base/stream.h"
+
+
+DEFINE_CLASS(Stream)
+{
+ FILE* file;
+ const char* newline;
+ char* buffer;
+};
+
+
+static struct Stream_impl Console_impl = { NULL, "\n", NULL };
+
+
+/**
+ * The console output stream.
+ * Use the stream_write() functions and this stream object instead
+ * of the usual C functions like printf(). The stream functions have
+ * more features -- such as setting the line ending sequence -- and
+ * can be captured for automated testing.
+ */
+Stream Console = &Console_impl;
+
+
+/**
+ * Create a new file output stream, overwriting any existing file.
+ * \param filename The name of the file to create.
+ * \returns A new file stream.
+ */
+Stream stream_create_file(const char* filename)
+{
+ Stream strm;
+ const char* dirname;
+ FILE* file;
+
+ /* make sure the directory exists before writing to it */
+ dirname = path_directory(filename);
+ if (dir_create(dirname) != OKAY)
+ {
+ return NULL;
+ }
+
+ /* create the file */
+ file = fopen(filename, "wb");
+ if (file == NULL)
+ {
+ error_set("Unable to open file %s", filename);
+ return NULL;
+ }
+
+ /* build the stream object */
+ strm = stream_create_null();
+ strm->file = file;
+ return strm;
+}
+
+
+/**
+ * Create a "null" stream, which discards any writes; intended for automated testing.
+ * \returns A new stream object.
+ */
+Stream stream_create_null()
+{
+ Stream strm = ALLOC_CLASS(Stream);
+ strm->file = NULL;
+ strm->newline = "\n";
+ strm->buffer = NULL;
+ return strm;
+}
+
+
+/**
+ * Close a stream and release the associated memory.
+ * \param strm The stream to close.
+ */
+void stream_destroy(Stream strm)
+{
+ assert(strm);
+ if (strm != Console)
+ {
+ if (strm->file != NULL)
+ {
+ fclose(strm->file);
+ }
+ free(strm);
+ }
+}
+
+
+/**
+ * Capture the text written to a stream into a buffer.
+ * When a stream is captured all text is written to the buffer, and
+ * output to the associated file is blocked.
+ * \param strm The stream to capture.
+ * \param buffer The buffer to contain the captured text. No checks are made
+ * on the size of the buffer while writing, so use carefully.
+ * May be NULL to disable buffering.
+ */
+void stream_set_buffer(Stream strm, char* buffer)
+{
+ assert(strm);
+ strm->buffer = buffer;
+ strm->buffer[0] = '\0';
+}
+
+
+/**
+ * Set the newline character sequence.
+ * \param strm The stream to set.
+ * \param newline The EOL sequence.
+ */
+void stream_set_newline(Stream strm, const char* newline)
+{
+ assert(strm);
+ strm->newline = newline;
+}
+
+
+/**
+ * Write a formatted list of strings.
+ * \param strm The stream to which to write.
+ * \param strs The list of strings to write.
+ * \param start The start string, always written first, even if there are no items in the list.
+ * \param prefix A prefix string, to be written before each item.
+ * \param postfix A postfix string, to be written after each item.
+ * \param infix An infix strings, to write between items, after the
+ * previous postfix string and before the next prefix.
+ * \param end The end string, always written last, even if there are no items in the list.
+ * \returns OKAY if successful.
+ */
+int stream_write_strings(Stream strm, Strings strs, const char* start, const char* prefix, const char* postfix, const char* infix, const char* end)
+{
+ int i, n, z;
+
+ z = stream_write(strm, start);
+
+ n = strings_size(strs);
+ for (i = 0; i < n; ++i)
+ {
+ const char* value = strings_item(strs, i);
+ if (i > 0) z |= stream_write(strm, infix);
+ z |= stream_write(strm, prefix);
+ z |= stream_write(strm, value);
+ z |= stream_write(strm, postfix);
+ }
+
+ z |= stream_write(strm, end);
+ return z;
+}
+
+
+/**
+ * Write a formatted list of strings, followed by a newline.
+ * \param strm The stream to which to write.
+ * \param strs The list of strings to write.
+ * \param start The start string, always written first, even if there are no items in the list.
+ * \param prefix A prefix string, to be written before each item.
+ * \param postfix A postfix string, to be written after each item.
+ * \param infix An infix strings, to write between items, after the
+ * previous postfix string and before the next prefix.
+ * \returns OKAY if successful.
+ */
+int stream_writeline_strings(Stream strm, Strings strs, const char* start, const char* prefix, const char* postfix, const char* infix)
+{
+ int i, n, z;
+
+ z = stream_write(strm, start);
+
+ n = strings_size(strs);
+ for (i = 0; i < n; ++i)
+ {
+ const char* value = strings_item(strs, i);
+ if (i > 0) z |= stream_write(strm, infix);
+ z |= stream_write(strm, prefix);
+ z |= stream_write(strm, value);
+ z |= stream_write(strm, postfix);
+ }
+
+ z |= stream_writeline(strm, "");
+ return z;
+}
+
+
+/**
+ * Format and print a string using printf-style codes and a variable argument list.
+ * \param strm The stream to which to write.
+ * \param value The value to print; may contain printf-style formatting codes.
+ * \param args A variable argument list to populate the printf-style codes in `value`.
+ * \returns OKAY if successful.
+ */
+int stream_vprintf(Stream strm, const char* value, va_list args)
+{
+ if (strm->buffer)
+ {
+ /* write to the end of the current contents of the buffer */
+ char* start = strm->buffer + strlen(strm->buffer);
+ vsprintf(start, value, args);
+ }
+ else if (strm == Console)
+ {
+ vfprintf(stdout, value, args);
+ }
+ else if (strm->file)
+ {
+ vfprintf(strm->file, value, args);
+ }
+ return OKAY;
+}
+
+
+/**
+ * Write a string value to a stream.
+ * \param strm The stream.
+ * \param value The value to append to the stream.
+ * \returns OKAY is successful.
+ */
+int stream_write(Stream strm, const char* value, ...)
+{
+ int status;
+ va_list args;
+
+ va_start(args, value);
+ status = stream_vprintf(strm, value, args);
+ va_end(args);
+
+ return status;
+}
+
+
+/**
+ * Write N copies of a string to a stream.
+ * \param strm The stream to which to write.
+ * \param value The string to write.
+ * \param n The number of copies to write.
+ * \returns OKAY if successful.
+ */
+int stream_write_n(Stream strm, const char* value, int n)
+{
+ int i, z = OKAY;
+ for (i = 0; i < n; ++i)
+ {
+ z |= stream_write(strm, value);
+ }
+ return z;
+}
+
+
+/**
+ * Writes the Unicode encoding marker sequence into the stream.
+ * \param strm The stream to which to write.
+ */
+int stream_write_unicode_marker(Stream strm)
+{
+ return stream_write(strm, "\357\273\277");
+}
+
+
+/**
+ * Write a string value, followed by a newline, to a stream.
+ * \param strm The stream.
+ * \param value The value to append to the stream.
+ * \returns OKAY if successful.
+ */
+int stream_writeline(Stream strm, const char* value, ...)
+{
+ int status;
+ va_list args;
+
+ va_start(args, value);
+ status = stream_vprintf(strm, value, args);
+ status |= stream_write(strm, strm->newline);
+ va_end(args);
+
+ return status;
+}
diff --git a/src/base/stream.h b/src/base/stream.h
index 719e77e..89925ea 100644
--- a/src/base/stream.h
+++ b/src/base/stream.h
@@ -1,37 +1,37 @@
-/**
- * \file stream.h
- * \brief Output stream handling.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- *
- * \defgroup stream Streams
- * \ingroup base
- *
- * An output stream class.
- *
- * @{
- */
-#if !defined(PREMAKE_STREAM_H)
-#define PREMAKE_STREAM_H
-
-#include <stdarg.h>
-#include "strings.h"
-
-DECLARE_CLASS(Stream);
-
-extern Stream Console;
-
-Stream stream_create_file(const char* filename);
-Stream stream_create_null(void);
-void stream_destroy(Stream stream);
-void stream_set_buffer(Stream strm, char* buffer);
-void stream_set_newline(Stream strm, const char* newline);
-int stream_vprintf(Stream strm, const char* value, va_list args);
-int stream_write(Stream strm, const char* value, ...);
-int stream_write_n(Stream strm, const char* value, int n);
-int stream_write_strings(Stream strm, Strings strs, const char* start, const char* prefix, const char* postfix, const char* infix, const char* end);
-int stream_write_unicode_marker(Stream strm);
-int stream_writeline(Stream strm, const char* value, ...);
-int stream_writeline_strings(Stream strm, Strings strs, const char* start, const char* prefix, const char* postfix, const char* infix);
-
-#endif
-/** @} */
+/**
+ * \file stream.h
+ * \brief Output stream handling.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ *
+ * \defgroup stream Streams
+ * \ingroup base
+ *
+ * An output stream class.
+ *
+ * @{
+ */
+#if !defined(PREMAKE_STREAM_H)
+#define PREMAKE_STREAM_H
+
+#include <stdarg.h>
+#include "strings.h"
+
+DECLARE_CLASS(Stream);
+
+extern Stream Console;
+
+Stream stream_create_file(const char* filename);
+Stream stream_create_null(void);
+void stream_destroy(Stream stream);
+void stream_set_buffer(Stream strm, char* buffer);
+void stream_set_newline(Stream strm, const char* newline);
+int stream_vprintf(Stream strm, const char* value, va_list args);
+int stream_write(Stream strm, const char* value, ...);
+int stream_write_n(Stream strm, const char* value, int n);
+int stream_write_strings(Stream strm, Strings strs, const char* start, const char* prefix, const char* postfix, const char* infix, const char* end);
+int stream_write_unicode_marker(Stream strm);
+int stream_writeline(Stream strm, const char* value, ...);
+int stream_writeline_strings(Stream strm, Strings strs, const char* start, const char* prefix, const char* postfix, const char* infix);
+
+#endif
+/** @} */
diff --git a/src/base/string.c b/src/base/string.c
index 5868b1f..09db9c9 100644
--- a/src/base/string.c
+++ b/src/base/string.c
@@ -1,67 +1,67 @@
-/**
- * \file string.c
- * \brief Dynamic string handling.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include "premake.h"
-#include "base/string.h"
-
-
-DEFINE_CLASS(String)
-{
- char* contents;
- int capacity;
-};
-
-
-/**
- * Create a new dynamic string object from an existing C string.
- * \param value The C string value.
- * \returns A new dynamic string object containing a copy of the string.
- */
-String string_create(const char* value)
-{
- if (value != NULL)
- {
- String str = ALLOC_CLASS(String);
- str->capacity = strlen(value) + 1;
- str->contents = (char*)malloc(str->capacity);
- strcpy(str->contents, value);
- return str;
- }
- else
- {
- return NULL;
- }
-}
-
-
-/**
- * Destroy a dynamic string object and free the associated memory.
- * \param str The string to destroy.
- */
-void string_destroy(String str)
-{
- if (str != NULL)
- {
- free(str->contents);
- free(str);
- }
-}
-
-
-/**
- * Return the contents of a dynamic string as a C string.
- * \param str The string to query.
- * \returns The C string value.
- */
-const char* string_cstr(String str)
-{
- if (str != NULL)
- return str->contents;
- else
- return NULL;
-}
+/**
+ * \file string.c
+ * \brief Dynamic string handling.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "premake.h"
+#include "base/string.h"
+
+
+DEFINE_CLASS(String)
+{
+ char* contents;
+ int capacity;
+};
+
+
+/**
+ * Create a new dynamic string object from an existing C string.
+ * \param value The C string value.
+ * \returns A new dynamic string object containing a copy of the string.
+ */
+String string_create(const char* value)
+{
+ if (value != NULL)
+ {
+ String str = ALLOC_CLASS(String);
+ str->capacity = strlen(value) + 1;
+ str->contents = (char*)malloc(str->capacity);
+ strcpy(str->contents, value);
+ return str;
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+
+/**
+ * Destroy a dynamic string object and free the associated memory.
+ * \param str The string to destroy.
+ */
+void string_destroy(String str)
+{
+ if (str != NULL)
+ {
+ free(str->contents);
+ free(str);
+ }
+}
+
+
+/**
+ * Return the contents of a dynamic string as a C string.
+ * \param str The string to query.
+ * \returns The C string value.
+ */
+const char* string_cstr(String str)
+{
+ if (str != NULL)
+ return str->contents;
+ else
+ return NULL;
+}
diff --git a/src/base/string.h b/src/base/string.h
index 8b8ba33..47c6281 100644
--- a/src/base/string.h
+++ b/src/base/string.h
@@ -1,23 +1,23 @@
-/**
- * \file string.h
- * \brief Dynamic string handling.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- *
- * \defgroup string Strings
- * \ingroup base
- *
- * A dynamic string class.
- *
- * @{
- */
-#if !defined(PREMAKE_STRING_H)
-#define PREMAKE_STRING_H
-
-DECLARE_CLASS(String);
-
-String string_create(const char* value);
-void string_destroy(String str);
-const char* string_cstr(String str);
-
-#endif
-/** @} */
+/**
+ * \file string.h
+ * \brief Dynamic string handling.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ *
+ * \defgroup string Strings
+ * \ingroup base
+ *
+ * A dynamic string class.
+ *
+ * @{
+ */
+#if !defined(PREMAKE_STRING_H)
+#define PREMAKE_STRING_H
+
+DECLARE_CLASS(String);
+
+String string_create(const char* value);
+void string_destroy(String str);
+const char* string_cstr(String str);
+
+#endif
+/** @} */
diff --git a/src/base/strings.c b/src/base/strings.c
index 8222cc3..7862b68 100644
--- a/src/base/strings.c
+++ b/src/base/strings.c
@@ -1,97 +1,97 @@
-/**
- * \file strings.c
- * \brief A dynamic array of C strings.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <stdlib.h>
-#include "premake.h"
-#include "strings.h"
-#include "base/array.h"
-
-DEFINE_CLASS(Strings)
-{
- Array contents;
-};
-
-
-
-/**
- * Create a new dynamic array of C strings.
- * \returns A new string array.
- */
-Strings strings_create()
-{
- Strings strs = ALLOC_CLASS(Strings);
- strs->contents = array_create();
- return strs;
-}
-
-
-/**
- * Destroy a strings array and free the associated memory.
- * \param strs The string array to destroy.
- */
-void strings_destroy(Strings strs)
-{
- array_destroy(strs->contents);
- free(strs);
-}
-
-
-/**
- * Add a new item to the end of an array of strings.
- * \param strs The array of strings.
- * \param item The C string item to add.
- */
-void strings_add(Strings strs, const char* item)
-{
- array_add(strs->contents, (void*)item);
-}
-
-
-/**
- * Append the contents of one string vector to another.
- * \param dest The destination vector.
- * \param src The source vector.
- */
-void strings_append(Strings dest, Strings src)
-{
- array_append(dest->contents, src->contents);
-}
-
-
-/**
- * Retrieve an C string item from an array of strings.
- * \param strs The string array to query.
- * \param index The index of the item to retrieve.
- * \returns A pointer to the C string item.
- */
-const char* strings_item(Strings strs, int index)
-{
- return (const char*)array_item(strs->contents, index);
-}
-
-
-/**
- * Set the value at a particular index of the array.
- * \param strs The string array.
- * \param index The index of the item to set.
- * \param item The new item.
- */
-void strings_set(Strings strs, int index, const char* item)
-{
- array_set(strs->contents, index, (void*)item);
-}
-
-
-/**
- * Get the number of items in the string array.
- * \param strs The string array to query.
- * \returns The number elements currently in the array.
- */
-int strings_size(Strings strs)
-{
- return array_size(strs->contents);
-}
-
+/**
+ * \file strings.c
+ * \brief A dynamic array of C strings.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <stdlib.h>
+#include "premake.h"
+#include "strings.h"
+#include "base/array.h"
+
+DEFINE_CLASS(Strings)
+{
+ Array contents;
+};
+
+
+
+/**
+ * Create a new dynamic array of C strings.
+ * \returns A new string array.
+ */
+Strings strings_create()
+{
+ Strings strs = ALLOC_CLASS(Strings);
+ strs->contents = array_create();
+ return strs;
+}
+
+
+/**
+ * Destroy a strings array and free the associated memory.
+ * \param strs The string array to destroy.
+ */
+void strings_destroy(Strings strs)
+{
+ array_destroy(strs->contents);
+ free(strs);
+}
+
+
+/**
+ * Add a new item to the end of an array of strings.
+ * \param strs The array of strings.
+ * \param item The C string item to add.
+ */
+void strings_add(Strings strs, const char* item)
+{
+ array_add(strs->contents, (void*)item);
+}
+
+
+/**
+ * Append the contents of one string vector to another.
+ * \param dest The destination vector.
+ * \param src The source vector.
+ */
+void strings_append(Strings dest, Strings src)
+{
+ array_append(dest->contents, src->contents);
+}
+
+
+/**
+ * Retrieve an C string item from an array of strings.
+ * \param strs The string array to query.
+ * \param index The index of the item to retrieve.
+ * \returns A pointer to the C string item.
+ */
+const char* strings_item(Strings strs, int index)
+{
+ return (const char*)array_item(strs->contents, index);
+}
+
+
+/**
+ * Set the value at a particular index of the array.
+ * \param strs The string array.
+ * \param index The index of the item to set.
+ * \param item The new item.
+ */
+void strings_set(Strings strs, int index, const char* item)
+{
+ array_set(strs->contents, index, (void*)item);
+}
+
+
+/**
+ * Get the number of items in the string array.
+ * \param strs The string array to query.
+ * \returns The number elements currently in the array.
+ */
+int strings_size(Strings strs)
+{
+ return array_size(strs->contents);
+}
+
diff --git a/src/base/strings.h b/src/base/strings.h
index 832cb1e..d75daa2 100644
--- a/src/base/strings.h
+++ b/src/base/strings.h
@@ -1,28 +1,28 @@
-/**
- * \file strings.h
- * \brief A dynamic array of C strings.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- *
- * \defgroup strings String Collection
- * \ingroup base
- *
- * A dynamic array of C strings.
- *
- * @{
- */
-#if !defined(PREMAKE_STRINGS_H)
-#define PREMAKE_STRINGS_H
-
-DECLARE_CLASS(Strings);
-
-Strings strings_create(void);
-void strings_destroy(Strings strs);
-
-void strings_add(Strings strs, const char* item);
-void strings_append(Strings dest, Strings src);
-const char* strings_item(Strings strs, int index);
-void strings_set(Strings strs, int index, const char* item);
-int strings_size(Strings strs);
-
-#endif
-/** @} */
+/**
+ * \file strings.h
+ * \brief A dynamic array of C strings.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ *
+ * \defgroup strings String Collection
+ * \ingroup base
+ *
+ * A dynamic array of C strings.
+ *
+ * @{
+ */
+#if !defined(PREMAKE_STRINGS_H)
+#define PREMAKE_STRINGS_H
+
+DECLARE_CLASS(Strings);
+
+Strings strings_create(void);
+void strings_destroy(Strings strs);
+
+void strings_add(Strings strs, const char* item);
+void strings_append(Strings dest, Strings src);
+const char* strings_item(Strings strs, int index);
+void strings_set(Strings strs, int index, const char* item);
+int strings_size(Strings strs);
+
+#endif
+/** @} */
diff --git a/src/base/tests/base_tests.cpp b/src/base/tests/base_tests.cpp
index efdd646..58368ec 100644
--- a/src/base/tests/base_tests.cpp
+++ b/src/base/tests/base_tests.cpp
@@ -1,23 +1,23 @@
-/**
- * \file base_tests.cpp
- * \brief Automated tests for Premake base library.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "base/base.h"
-}
-
-
-/**
- * \brief Run the base library automated tests.
- * \returns OKAY if all tests completed successfully.
- */
-int base_tests()
-{
- int status = tests_run_suite("cstr");
- if (status == OKAY) status = tests_run_suite("base");
- return status;
-}
+/**
+ * \file base_tests.cpp
+ * \brief Automated tests for Premake base library.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "base/base.h"
+}
+
+
+/**
+ * \brief Run the base library automated tests.
+ * \returns OKAY if all tests completed successfully.
+ */
+int base_tests()
+{
+ int status = tests_run_suite("cstr");
+ if (status == OKAY) status = tests_run_suite("base");
+ return status;
+}
diff --git a/src/base/tests/cstr_tests.cpp b/src/base/tests/cstr_tests.cpp
index 3a3f456..bf7a996 100644
--- a/src/base/tests/cstr_tests.cpp
+++ b/src/base/tests/cstr_tests.cpp
@@ -1,149 +1,149 @@
-/**
- * \file cstr_tests.cpp
- * \brief C string automated tests.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "base/cstr.h"
-}
-
-SUITE(cstr)
-{
- /**************************************************************************
- * cstr_contains() tests
- **************************************************************************/
-
- TEST(CStrContains_ReturnsTrue_OnMatch)
- {
- CHECK(cstr_contains("Abcdef", "cd"));
- }
-
- TEST(CStrContains_ReturnsFalse_OnMismatch)
- {
- CHECK(!cstr_contains("Abcdef", "xy"));
- }
-
-
- /**************************************************************************
- * cstr_ends_with() tests
- **************************************************************************/
-
- TEST(CStrEndsWith_ReturnsTrue_OnMatch)
- {
- CHECK(cstr_ends_with("Abcdef", "def"));
- }
-
- TEST(CStrEndsWith_ReturnsFalse_OnMismatch)
- {
- CHECK(!cstr_ends_with("Abcdef", "ghi"));
- }
-
- TEST(CStrEndsWith_ReturnsFalse_OnLongerNeedle)
- {
- CHECK(!cstr_ends_with("Abc", "Abcdef"));
- }
-
- TEST(CStrEndsWith_ReturnsFalse_OnNullHaystack)
- {
- CHECK(!cstr_ends_with(NULL, "ghi"));
- }
-
- TEST(CStrEndsWith_ReturnsFalse_OnNullNeedle)
- {
- CHECK(!cstr_ends_with("Abc", NULL));
- }
-
-
- /**************************************************************************
- * cstr_eq() tests
- **************************************************************************/
-
- TEST(CStrEq_ReturnsTrue_OnMatch)
- {
- CHECK(cstr_eq("A string", "A string"));
- }
-
- TEST(CStrEq_ReturnsFalse_OnMismatch)
- {
- CHECK(!cstr_eq("A string", "A different string"));
- }
-
- TEST(CStrEq_ReturnsFalse_OnNullTarget)
- {
- CHECK(!cstr_eq(NULL, "something"));
- }
-
- TEST(CStrEq_ReturnsFalse_OnNullPattern)
- {
- CHECK(!cstr_eq("something", NULL));
- }
-
-
- /**************************************************************************
- * cstr_eqi() tests
- **************************************************************************/
-
- TEST(CStrEqi_ReturnsTrue_OnMatch)
- {
- CHECK(cstr_eqi("A string", "a String"));
- }
-
- TEST(CStrEqi_ReturnsFalse_OnMismatch)
- {
- CHECK(!cstr_eqi("A string", "a different string"));
- }
-
- TEST(CStrEqi_ReturnsFalse_OnNullTarget)
- {
- CHECK(!cstr_eqi(NULL, "something"));
- }
-
- TEST(CStrEqi_ReturnsFalse_OnNullPattern)
- {
- CHECK(!cstr_eqi("something", NULL));
- }
-
-
- /**************************************************************************
- * cstr_format() tests
- **************************************************************************/
-
- TEST(CstrFormat_ReturnsFormatted)
- {
- char* result = cstr_format("$(OBJDIR)/%s.o", "hello");
- CHECK_EQUAL("$(OBJDIR)/hello.o", result);
- }
-
-
- /**************************************************************************
- * cstr_starts_with() tests
- **************************************************************************/
-
- TEST(CStrStartsWith_ReturnsTrue_OnMatch)
- {
- CHECK(cstr_starts_with("Abcdef", "Abc"));
- }
-
- TEST(CStrStartsWith_ReturnsFalse_OnMismatch)
- {
- CHECK(!cstr_starts_with("Abcdef", "ghi"));
- }
-
- TEST(CStrStartsWith_ReturnsFalse_OnLongerNeedle)
- {
- CHECK(!cstr_starts_with("Abc", "Abcdef"));
- }
-
- TEST(CStrStartsWith_ReturnsFalse_OnNullHaystack)
- {
- CHECK(!cstr_starts_with(NULL, "ghi"));
- }
-
- TEST(CStrStartsWith_ReturnsFalse_OnNullNeedle)
- {
- CHECK(!cstr_starts_with("Abc", NULL));
- }
-}
+/**
+ * \file cstr_tests.cpp
+ * \brief C string automated tests.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "base/cstr.h"
+}
+
+SUITE(cstr)
+{
+ /**************************************************************************
+ * cstr_contains() tests
+ **************************************************************************/
+
+ TEST(CStrContains_ReturnsTrue_OnMatch)
+ {
+ CHECK(cstr_contains("Abcdef", "cd"));
+ }
+
+ TEST(CStrContains_ReturnsFalse_OnMismatch)
+ {
+ CHECK(!cstr_contains("Abcdef", "xy"));
+ }
+
+
+ /**************************************************************************
+ * cstr_ends_with() tests
+ **************************************************************************/
+
+ TEST(CStrEndsWith_ReturnsTrue_OnMatch)
+ {
+ CHECK(cstr_ends_with("Abcdef", "def"));
+ }
+
+ TEST(CStrEndsWith_ReturnsFalse_OnMismatch)
+ {
+ CHECK(!cstr_ends_with("Abcdef", "ghi"));
+ }
+
+ TEST(CStrEndsWith_ReturnsFalse_OnLongerNeedle)
+ {
+ CHECK(!cstr_ends_with("Abc", "Abcdef"));
+ }
+
+ TEST(CStrEndsWith_ReturnsFalse_OnNullHaystack)
+ {
+ CHECK(!cstr_ends_with(NULL, "ghi"));
+ }
+
+ TEST(CStrEndsWith_ReturnsFalse_OnNullNeedle)
+ {
+ CHECK(!cstr_ends_with("Abc", NULL));
+ }
+
+
+ /**************************************************************************
+ * cstr_eq() tests
+ **************************************************************************/
+
+ TEST(CStrEq_ReturnsTrue_OnMatch)
+ {
+ CHECK(cstr_eq("A string", "A string"));
+ }
+
+ TEST(CStrEq_ReturnsFalse_OnMismatch)
+ {
+ CHECK(!cstr_eq("A string", "A different string"));
+ }
+
+ TEST(CStrEq_ReturnsFalse_OnNullTarget)
+ {
+ CHECK(!cstr_eq(NULL, "something"));
+ }
+
+ TEST(CStrEq_ReturnsFalse_OnNullPattern)
+ {
+ CHECK(!cstr_eq("something", NULL));
+ }
+
+
+ /**************************************************************************
+ * cstr_eqi() tests
+ **************************************************************************/
+
+ TEST(CStrEqi_ReturnsTrue_OnMatch)
+ {
+ CHECK(cstr_eqi("A string", "a String"));
+ }
+
+ TEST(CStrEqi_ReturnsFalse_OnMismatch)
+ {
+ CHECK(!cstr_eqi("A string", "a different string"));
+ }
+
+ TEST(CStrEqi_ReturnsFalse_OnNullTarget)
+ {
+ CHECK(!cstr_eqi(NULL, "something"));
+ }
+
+ TEST(CStrEqi_ReturnsFalse_OnNullPattern)
+ {
+ CHECK(!cstr_eqi("something", NULL));
+ }
+
+
+ /**************************************************************************
+ * cstr_format() tests
+ **************************************************************************/
+
+ TEST(CstrFormat_ReturnsFormatted)
+ {
+ char* result = cstr_format("$(OBJDIR)/%s.o", "hello");
+ CHECK_EQUAL("$(OBJDIR)/hello.o", result);
+ }
+
+
+ /**************************************************************************
+ * cstr_starts_with() tests
+ **************************************************************************/
+
+ TEST(CStrStartsWith_ReturnsTrue_OnMatch)
+ {
+ CHECK(cstr_starts_with("Abcdef", "Abc"));
+ }
+
+ TEST(CStrStartsWith_ReturnsFalse_OnMismatch)
+ {
+ CHECK(!cstr_starts_with("Abcdef", "ghi"));
+ }
+
+ TEST(CStrStartsWith_ReturnsFalse_OnLongerNeedle)
+ {
+ CHECK(!cstr_starts_with("Abc", "Abcdef"));
+ }
+
+ TEST(CStrStartsWith_ReturnsFalse_OnNullHaystack)
+ {
+ CHECK(!cstr_starts_with(NULL, "ghi"));
+ }
+
+ TEST(CStrStartsWith_ReturnsFalse_OnNullNeedle)
+ {
+ CHECK(!cstr_starts_with("Abc", NULL));
+ }
+}
diff --git a/src/base/tests/dir_tests.cpp b/src/base/tests/dir_tests.cpp
index 0fc7a21..baf3ce3 100644
--- a/src/base/tests/dir_tests.cpp
+++ b/src/base/tests/dir_tests.cpp
@@ -1,27 +1,27 @@
-/**
- * \file dir_tests.cpp
- * \brief Directory handling automated tests.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "base/dir.h"
-#include "base/cstr.h"
-}
-
-SUITE(base)
-{
- TEST(DirExists_ReturnsOkay_OnEmptyPath)
- {
- int result = dir_exists("");
- CHECK(result);
- }
-
- TEST(DirGetCurrent_ReturnsCurrent_WithSlashes)
- {
- const char* result = dir_get_current();
- CHECK(cstr_ends_with(result, "/src"));
- }
-}
+/**
+ * \file dir_tests.cpp
+ * \brief Directory handling automated tests.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "base/dir.h"
+#include "base/cstr.h"
+}
+
+SUITE(base)
+{
+ TEST(DirExists_ReturnsOkay_OnEmptyPath)
+ {
+ int result = dir_exists("");
+ CHECK(result);
+ }
+
+ TEST(DirGetCurrent_ReturnsCurrent_WithSlashes)
+ {
+ const char* result = dir_get_current();
+ CHECK(cstr_ends_with(result, "/src"));
+ }
+}
diff --git a/src/base/tests/guid_tests.cpp b/src/base/tests/guid_tests.cpp
index 77d8b18..4d89b17 100644
--- a/src/base/tests/guid_tests.cpp
+++ b/src/base/tests/guid_tests.cpp
@@ -1,86 +1,86 @@
-/**
- * \file guid_tests.cpp
- * \brief Automated tests for GUID generation and validation.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "base/guid.h"
-}
-
-
-SUITE(base)
-{
- TEST(GuidCreate_ReturnsCorrectSize)
- {
- const char* guid = guid_create();
- CHECK(guid != NULL && strlen(guid) == 36);
- }
-
- TEST(GuidCreate_CorrectDashes)
- {
- const char* guid = guid_create();
- CHECK(guid[8]=='-' && guid[13]=='-' && guid[18]=='-' && guid[23]=='-');
- }
-
- TEST(GuidCreate_CorrectSymbols)
- {
- for (const char* guid = guid_create(); *guid; ++guid)
- {
- const char ch = *guid;
- CHECK((ch>='0' && ch<='9') || (ch>='A' && ch<='F') || (ch=='-'));
- }
- }
-
- TEST(GuidCreate_CorrectNumOfDashes)
- {
- int num = 0;
- for (const char* guid = guid_create(); *guid; ++guid)
- {
- if (*guid=='-') ++num;
- }
- CHECK(num == 4);
- }
-
- TEST(GuidIsValid_ReturnsTrue_OnNoBraces)
- {
- CHECK(guid_is_valid("4E67EBCE-BC8B-4058-9AA9-48EE5E003683"));
- }
-
- TEST(GuidIsValid_ReturnsFalse_OnTooShort)
- {
- CHECK(!guid_is_valid("4E67EBCE-BC8B-4058-9AA9-48EE"));
- }
-
- TEST(GuidIsValid_ReturnsFalse_OnMissingFirstDash)
- {
- CHECK(!guid_is_valid("4E67EBCE BC8B-4058-9AA9-48EE5E003683"));
- }
-
- TEST(GuidIsValid_ReturnsFalse_OnMissingSecondDash)
- {
- CHECK(!guid_is_valid("4E67EBCE-BC8B 4058-9AA9-48EE5E003683"));
- }
-
- TEST(GuidIsValid_ReturnsFalse_OnMissingThirdDash)
- {
- CHECK(!guid_is_valid("4E67EBCE-BC8B-4058 9AA9-48EE5E003683"));
- }
-
- TEST(GuidIsValid_ReturnsFalse_OnMissingLastDash)
- {
- CHECK(!guid_is_valid("4E67EBCE-BC8B-4058-9AA9 48EE5E003683"));
- }
-
- TEST(GuidIsValid_ReturnsFalse_OnTooManyDashes)
- {
- CHECK(!guid_is_valid("4E67EBCE-BC8B-4058-9AA9-48EE5-003683"));
- }
-
- TEST(GuidIsValid_ReturnsFalse_OnInvalidChar)
- {
- CHECK(!guid_is_valid("XE67EBCE-BC8B-4058-9AA9-48EE5X003683"));
- }
-}
+/**
+ * \file guid_tests.cpp
+ * \brief Automated tests for GUID generation and validation.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "base/guid.h"
+}
+
+
+SUITE(base)
+{
+ TEST(GuidCreate_ReturnsCorrectSize)
+ {
+ const char* guid = guid_create();
+ CHECK(guid != NULL && strlen(guid) == 36);
+ }
+
+ TEST(GuidCreate_CorrectDashes)
+ {
+ const char* guid = guid_create();
+ CHECK(guid[8]=='-' && guid[13]=='-' && guid[18]=='-' && guid[23]=='-');
+ }
+
+ TEST(GuidCreate_CorrectSymbols)
+ {
+ for (const char* guid = guid_create(); *guid; ++guid)
+ {
+ const char ch = *guid;
+ CHECK((ch>='0' && ch<='9') || (ch>='A' && ch<='F') || (ch=='-'));
+ }
+ }
+
+ TEST(GuidCreate_CorrectNumOfDashes)
+ {
+ int num = 0;
+ for (const char* guid = guid_create(); *guid; ++guid)
+ {
+ if (*guid=='-') ++num;
+ }
+ CHECK(num == 4);
+ }
+
+ TEST(GuidIsValid_ReturnsTrue_OnNoBraces)
+ {
+ CHECK(guid_is_valid("4E67EBCE-BC8B-4058-9AA9-48EE5E003683"));
+ }
+
+ TEST(GuidIsValid_ReturnsFalse_OnTooShort)
+ {
+ CHECK(!guid_is_valid("4E67EBCE-BC8B-4058-9AA9-48EE"));
+ }
+
+ TEST(GuidIsValid_ReturnsFalse_OnMissingFirstDash)
+ {
+ CHECK(!guid_is_valid("4E67EBCE BC8B-4058-9AA9-48EE5E003683"));
+ }
+
+ TEST(GuidIsValid_ReturnsFalse_OnMissingSecondDash)
+ {
+ CHECK(!guid_is_valid("4E67EBCE-BC8B 4058-9AA9-48EE5E003683"));
+ }
+
+ TEST(GuidIsValid_ReturnsFalse_OnMissingThirdDash)
+ {
+ CHECK(!guid_is_valid("4E67EBCE-BC8B-4058 9AA9-48EE5E003683"));
+ }
+
+ TEST(GuidIsValid_ReturnsFalse_OnMissingLastDash)
+ {
+ CHECK(!guid_is_valid("4E67EBCE-BC8B-4058-9AA9 48EE5E003683"));
+ }
+
+ TEST(GuidIsValid_ReturnsFalse_OnTooManyDashes)
+ {
+ CHECK(!guid_is_valid("4E67EBCE-BC8B-4058-9AA9-48EE5-003683"));
+ }
+
+ TEST(GuidIsValid_ReturnsFalse_OnInvalidChar)
+ {
+ CHECK(!guid_is_valid("XE67EBCE-BC8B-4058-9AA9-48EE5X003683"));
+ }
+}
diff --git a/src/base/tests/path_tests.cpp b/src/base/tests/path_tests.cpp
index b18a12a..0a9fe1e 100644
--- a/src/base/tests/path_tests.cpp
+++ b/src/base/tests/path_tests.cpp
@@ -1,266 +1,266 @@
-/**
- * \file path_tests.cpp
- * \brief Path handling automated tests.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "base/path.h"
-#include "base/cstr.h"
-#include "base/dir.h"
-#include "platform/platform.h"
-}
-
-SUITE(base)
-{
- /**************************************************************************
- * path_absolute() tests
- **************************************************************************/
-
- TEST(PathAbsolute_ReturnsCorrectPath_OnMissingSubdir)
- {
- char* cwd = dir_get_current();
- strcat(cwd, "/a/b/c");
- char* result = path_absolute("a/b/c");
- CHECK_EQUAL(cwd, result);
- }
-
-
- /**************************************************************************
- * path_assemble() tests
- **************************************************************************/
-
- TEST(PathAssemble_ReturnsAssembledPath_OnValidParts)
- {
- char* result = path_assemble("directory", "filename", ".ext");
- CHECK_EQUAL("directory/filename.ext", result);
- }
-
- TEST(PathAssemble_ReturnsAssembledPath_OnNoDirectory)
- {
- char* result = path_assemble("", "filename", ".ext");
- CHECK_EQUAL("filename.ext", result);
- }
-
-
- /**************************************************************************
- * path_basename() tests
- **************************************************************************/
-
- TEST(PathBaseName_ReturnsBase_OnDirAndExt)
- {
- char* result = path_basename("folder/filename.ext");
- CHECK_EQUAL("filename", result);
- }
-
-
- /**************************************************************************
- * path_directory() tests
- **************************************************************************/
-
- TEST(PathDirectory_ReturnsEmptyString_OnNoDirectory)
- {
- char* result = path_directory("filename.ext");
- CHECK_EQUAL("", result);
- }
-
-
- TEST(PathDirectory_ReturnsDirectory_OnSingleLevelPath)
- {
- char* result = path_directory("dir0/filename.ext");
- CHECK_EQUAL("dir0", result);
- }
-
-
- TEST(PathDirectory_ReturnsDirectory_OnMultiLeveLPath)
- {
- char* result = path_directory("dir0/dir1/dir2/filename.ext");
- CHECK_EQUAL("dir0/dir1/dir2", result);
- }
-
-
- /**************************************************************************
- * path_extension() tests
- **************************************************************************/
-
- TEST(PathExt_ReturnsEmptyString_OnNoExtension)
- {
- char* result = path_extension("filename");
- CHECK_EQUAL("", result);
- }
-
- TEST(PathExt_ReturnsExtension)
- {
- char* result = path_extension("filename.txt");
- CHECK_EQUAL(".txt", result);
- }
-
- TEST(PathExt_ReturnsLastExtension_OnMultipleDots)
- {
- char* result = path_extension("filename.mod.txt");
- CHECK_EQUAL(".txt", result);
- }
-
-
- /**************************************************************************
- * path_filename() tests
- **************************************************************************/
-
- TEST(PathFileName_ReturnsAll_OnNoDirectory)
- {
- char* result = path_filename("filename.ext");
- CHECK_EQUAL("filename.ext", result);
- }
-
- TEST(PathFileName_ReturnsEmptyString_OnNoName)
- {
- char* result = path_filename("dir0/dir1/");
- CHECK_EQUAL("", result);
- }
-
- TEST(PathFileName_ReturnsOnlyName_OnFullPath)
- {
- char* result = path_filename("dir0/dir1/filename.ext");
- CHECK_EQUAL("filename.ext", result);
- }
-
-
- /**************************************************************************
- * path_is_absolute() tests
- **************************************************************************/
-
- TEST(PathIsAbsolute_ReturnsTrue_OnAbsolutePosixPath)
- {
- CHECK(path_is_absolute("/a/b/c"));
- }
-
-
- TEST(PathIsAbsolute_ReturnsTrue_OnAbsoluteWindowsPathWithDrive)
- {
- CHECK(path_is_absolute("c:/a/b/c"));
- }
-
-
- TEST(PathIsAbsolute_ReturnsFalse_OnRelativePath)
- {
- CHECK(!path_is_absolute("a/b/c"));
- }
-
-
- /**************************************************************************
- * path_is_absolute() tests
- **************************************************************************/
-
- TEST(PathIsCpp_ReturnsFalse_OnNotCpp)
- {
- CHECK(!path_is_cpp_source("filename.XXX"));
- }
-
- TEST(PathIsCpp_ReturnsTrue_OnC)
- {
- CHECK(path_is_cpp_source("filename.c"));
- }
-
- TEST(PathIsCpp_ReturnsTrue_OnCC)
- {
- CHECK(path_is_cpp_source("filename.cc"));
- }
-
- TEST(PathIsCpp_ReturnsTrue_OnCpp)
- {
- CHECK(path_is_cpp_source("filename.cpp"));
- }
-
- TEST(PathIsCpp_ReturnsTrue_OnCxx)
- {
- CHECK(path_is_cpp_source("filename.cxx"));
- }
-
- TEST(PathIsCpp_ReturnsTrue_OnS)
- {
- CHECK(path_is_cpp_source("filename.s"));
- }
-
- TEST(PathIsCpp_ReturnsTrue_OnUpperCase)
- {
- CHECK(path_is_cpp_source("filename.C"));
- }
-
-
- /**************************************************************************
- * path_join() tests
- **************************************************************************/
-
- TEST(PathJoin_ReturnsJoinedPath_OnValidParts)
- {
- char* result = path_join("leading", "trailing");
- CHECK_EQUAL("leading/trailing", result);
- }
-
- TEST(PathJoin_ReturnsAbsPath_OnAbsUnixPath)
- {
- char* result = path_join("leading", "/trailing");
- CHECK_EQUAL("/trailing", result);
- }
-
- TEST(PathJoin_ReturnsAbsPath_OnAbsWindowsPath)
- {
- char* result = path_join("leading", "C:/trailing");
- CHECK_EQUAL("C:/trailing", result);
- }
-
-
- /**************************************************************************
- * path_relative() tests
- **************************************************************************/
-
- TEST(PathRelative_ReturnsDot_OnMatchingPaths)
- {
- char* result = path_relative("/a/b/c", "/a/b/c");
- CHECK_EQUAL(".", result);
- }
-
-
- TEST(PathRelative_ReturnsDoubleDot_OnChildToParent)
- {
- char* result = path_relative("/a/b/c", "/a/b");
- CHECK_EQUAL("..", result);
- }
-
-
- TEST(PathRelative_ReturnsDoubleDotPath_OnSiblingToSibling)
- {
- char* result = path_relative("/a/b/c", "/a/b/d");
- CHECK_EQUAL("../d", result);
- }
-
-
- TEST(PathRelative_ReturnsChildPath_OnParentToChild)
- {
- char* result = path_relative("/a/b/c", "/a/b/c/d");
- CHECK_EQUAL("d", result);
- }
-
-
- /**************************************************************************
- * path_translate() tests
- **************************************************************************/
-
- TEST(PathTranslate_ReturnsTranslatedPath_OnValidPath)
- {
- char* result = path_translate("dir\\dir\\file", "/");
- CHECK_EQUAL("dir/dir/file", result);
- }
-
- TEST(PathTranslate_ReturnsCorrectSeparator_OnMixedPath)
- {
- char* result = path_translate("dir\\dir/file", NULL);
- #if defined(PLATFORM_WINDOWS)
- CHECK_EQUAL("dir\\dir\\file", result);
- #else
- CHECK_EQUAL("dir/dir/file", result);
- #endif
- }
-}
+/**
+ * \file path_tests.cpp
+ * \brief Path handling automated tests.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "base/path.h"
+#include "base/cstr.h"
+#include "base/dir.h"
+#include "platform/platform.h"
+}
+
+SUITE(base)
+{
+ /**************************************************************************
+ * path_absolute() tests
+ **************************************************************************/
+
+ TEST(PathAbsolute_ReturnsCorrectPath_OnMissingSubdir)
+ {
+ char* cwd = dir_get_current();
+ strcat(cwd, "/a/b/c");
+ char* result = path_absolute("a/b/c");
+ CHECK_EQUAL(cwd, result);
+ }
+
+
+ /**************************************************************************
+ * path_assemble() tests
+ **************************************************************************/
+
+ TEST(PathAssemble_ReturnsAssembledPath_OnValidParts)
+ {
+ char* result = path_assemble("directory", "filename", ".ext");
+ CHECK_EQUAL("directory/filename.ext", result);
+ }
+
+ TEST(PathAssemble_ReturnsAssembledPath_OnNoDirectory)
+ {
+ char* result = path_assemble("", "filename", ".ext");
+ CHECK_EQUAL("filename.ext", result);
+ }
+
+
+ /**************************************************************************
+ * path_basename() tests
+ **************************************************************************/
+
+ TEST(PathBaseName_ReturnsBase_OnDirAndExt)
+ {
+ char* result = path_basename("folder/filename.ext");
+ CHECK_EQUAL("filename", result);
+ }
+
+
+ /**************************************************************************
+ * path_directory() tests
+ **************************************************************************/
+
+ TEST(PathDirectory_ReturnsEmptyString_OnNoDirectory)
+ {
+ char* result = path_directory("filename.ext");
+ CHECK_EQUAL("", result);
+ }
+
+
+ TEST(PathDirectory_ReturnsDirectory_OnSingleLevelPath)
+ {
+ char* result = path_directory("dir0/filename.ext");
+ CHECK_EQUAL("dir0", result);
+ }
+
+
+ TEST(PathDirectory_ReturnsDirectory_OnMultiLeveLPath)
+ {
+ char* result = path_directory("dir0/dir1/dir2/filename.ext");
+ CHECK_EQUAL("dir0/dir1/dir2", result);
+ }
+
+
+ /**************************************************************************
+ * path_extension() tests
+ **************************************************************************/
+
+ TEST(PathExt_ReturnsEmptyString_OnNoExtension)
+ {
+ char* result = path_extension("filename");
+ CHECK_EQUAL("", result);
+ }
+
+ TEST(PathExt_ReturnsExtension)
+ {
+ char* result = path_extension("filename.txt");
+ CHECK_EQUAL(".txt", result);
+ }
+
+ TEST(PathExt_ReturnsLastExtension_OnMultipleDots)
+ {
+ char* result = path_extension("filename.mod.txt");
+ CHECK_EQUAL(".txt", result);
+ }
+
+
+ /**************************************************************************
+ * path_filename() tests
+ **************************************************************************/
+
+ TEST(PathFileName_ReturnsAll_OnNoDirectory)
+ {
+ char* result = path_filename("filename.ext");
+ CHECK_EQUAL("filename.ext", result);
+ }
+
+ TEST(PathFileName_ReturnsEmptyString_OnNoName)
+ {
+ char* result = path_filename("dir0/dir1/");
+ CHECK_EQUAL("", result);
+ }
+
+ TEST(PathFileName_ReturnsOnlyName_OnFullPath)
+ {
+ char* result = path_filename("dir0/dir1/filename.ext");
+ CHECK_EQUAL("filename.ext", result);
+ }
+
+
+ /**************************************************************************
+ * path_is_absolute() tests
+ **************************************************************************/
+
+ TEST(PathIsAbsolute_ReturnsTrue_OnAbsolutePosixPath)
+ {
+ CHECK(path_is_absolute("/a/b/c"));
+ }
+
+
+ TEST(PathIsAbsolute_ReturnsTrue_OnAbsoluteWindowsPathWithDrive)
+ {
+ CHECK(path_is_absolute("c:/a/b/c"));
+ }
+
+
+ TEST(PathIsAbsolute_ReturnsFalse_OnRelativePath)
+ {
+ CHECK(!path_is_absolute("a/b/c"));
+ }
+
+
+ /**************************************************************************
+ * path_is_absolute() tests
+ **************************************************************************/
+
+ TEST(PathIsCpp_ReturnsFalse_OnNotCpp)
+ {
+ CHECK(!path_is_cpp_source("filename.XXX"));
+ }
+
+ TEST(PathIsCpp_ReturnsTrue_OnC)
+ {
+ CHECK(path_is_cpp_source("filename.c"));
+ }
+
+ TEST(PathIsCpp_ReturnsTrue_OnCC)
+ {
+ CHECK(path_is_cpp_source("filename.cc"));
+ }
+
+ TEST(PathIsCpp_ReturnsTrue_OnCpp)
+ {
+ CHECK(path_is_cpp_source("filename.cpp"));
+ }
+
+ TEST(PathIsCpp_ReturnsTrue_OnCxx)
+ {
+ CHECK(path_is_cpp_source("filename.cxx"));
+ }
+
+ TEST(PathIsCpp_ReturnsTrue_OnS)
+ {
+ CHECK(path_is_cpp_source("filename.s"));
+ }
+
+ TEST(PathIsCpp_ReturnsTrue_OnUpperCase)
+ {
+ CHECK(path_is_cpp_source("filename.C"));
+ }
+
+
+ /**************************************************************************
+ * path_join() tests
+ **************************************************************************/
+
+ TEST(PathJoin_ReturnsJoinedPath_OnValidParts)
+ {
+ char* result = path_join("leading", "trailing");
+ CHECK_EQUAL("leading/trailing", result);
+ }
+
+ TEST(PathJoin_ReturnsAbsPath_OnAbsUnixPath)
+ {
+ char* result = path_join("leading", "/trailing");
+ CHECK_EQUAL("/trailing", result);
+ }
+
+ TEST(PathJoin_ReturnsAbsPath_OnAbsWindowsPath)
+ {
+ char* result = path_join("leading", "C:/trailing");
+ CHECK_EQUAL("C:/trailing", result);
+ }
+
+
+ /**************************************************************************
+ * path_relative() tests
+ **************************************************************************/
+
+ TEST(PathRelative_ReturnsDot_OnMatchingPaths)
+ {
+ char* result = path_relative("/a/b/c", "/a/b/c");
+ CHECK_EQUAL(".", result);
+ }
+
+
+ TEST(PathRelative_ReturnsDoubleDot_OnChildToParent)
+ {
+ char* result = path_relative("/a/b/c", "/a/b");
+ CHECK_EQUAL("..", result);
+ }
+
+
+ TEST(PathRelative_ReturnsDoubleDotPath_OnSiblingToSibling)
+ {
+ char* result = path_relative("/a/b/c", "/a/b/d");
+ CHECK_EQUAL("../d", result);
+ }
+
+
+ TEST(PathRelative_ReturnsChildPath_OnParentToChild)
+ {
+ char* result = path_relative("/a/b/c", "/a/b/c/d");
+ CHECK_EQUAL("d", result);
+ }
+
+
+ /**************************************************************************
+ * path_translate() tests
+ **************************************************************************/
+
+ TEST(PathTranslate_ReturnsTranslatedPath_OnValidPath)
+ {
+ char* result = path_translate("dir\\dir\\file", "/");
+ CHECK_EQUAL("dir/dir/file", result);
+ }
+
+ TEST(PathTranslate_ReturnsCorrectSeparator_OnMixedPath)
+ {
+ char* result = path_translate("dir\\dir/file", NULL);
+ #if defined(PLATFORM_WINDOWS)
+ CHECK_EQUAL("dir\\dir\\file", result);
+ #else
+ CHECK_EQUAL("dir/dir/file", result);
+ #endif
+ }
+}
diff --git a/src/base/tests/stream_tests.cpp b/src/base/tests/stream_tests.cpp
index 0504207..1339f68 100644
--- a/src/base/tests/stream_tests.cpp
+++ b/src/base/tests/stream_tests.cpp
@@ -1,107 +1,107 @@
-/**
- * \file stream_tests.cpp
- * \brief Output stream automated tests.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "base/stream.h"
-}
-
-struct FxStream
-{
- Stream strm;
- char buffer[1024];
-
- FxStream()
- {
- strm = stream_create_null();
- stream_set_buffer(strm, buffer);
- }
-
- ~FxStream()
- {
- stream_destroy(strm);
- }
-};
-
-struct FxStreamStrings : FxStream
-{
- Strings strs;
-
- FxStreamStrings()
- {
- strs = strings_create();
- }
-
- ~FxStreamStrings()
- {
- strings_destroy(strs);
- }
-};
-
-
-
-SUITE(base)
-{
- TEST_FIXTURE(FxStream, Write_WritesValue_OnSimpleValue)
- {
- stream_write(strm, "Hi there!");
- CHECK_EQUAL("Hi there!", buffer);
- }
-
- TEST_FIXTURE(FxStream, Write_WritesValue_OnFormattedValue)
- {
- stream_write(strm, "Hi there, %s!", "Mr. Bill");
- CHECK_EQUAL("Hi there, Mr. Bill!", buffer);
- }
-
- TEST_FIXTURE(FxStream, WriteLine_AppendsNewLine_OnSimpleValue)
- {
- stream_writeline(strm, "Hi there!");
- CHECK_EQUAL("Hi there!\n", buffer);
- }
-
- TEST_FIXTURE(FxStream, WriteLine_AppendsNewLine_OnFormattedValue)
- {
- stream_writeline(strm, "Hi there, %s!", "Mr. Bill");
- CHECK_EQUAL("Hi there, Mr. Bill!\n", buffer);
- }
-
- TEST_FIXTURE(FxStream, WriteLine_AppendsNewLine_OnModifiedNewline)
- {
- stream_set_newline(strm, "\r\n");
- stream_writeline(strm, "Hi there!");
- CHECK_EQUAL("Hi there!\r\n", buffer);
- }
-
-
- /**********************************************************************
- * stream_write_strings() tests
- **********************************************************************/
-
- TEST_FIXTURE(FxStreamStrings, WriteStrings_WritesStartEnd_OnEmptyList)
- {
- stream_write_strings(strm, strs, "^", "<", ">", ",", "$");
- CHECK_EQUAL("^$", buffer);
- }
-
- TEST_FIXTURE(FxStreamStrings, WriteStrings_WriteSingleItem_OnSingleItem)
- {
- strings_add(strs, "AAA");
- stream_write_strings(strm, strs, "^", "<", ">", ",", "$");
- CHECK_EQUAL("^<AAA>$", buffer);
- }
-
- TEST_FIXTURE(FxStreamStrings, WriteStrings_WriteMultipleItems_OnMultipleItems)
- {
- strings_add(strs, "AAA");
- strings_add(strs, "BBB");
- strings_add(strs, "CCC");
- stream_write_strings(strm, strs, "^", "<", ">", ",", "$");
- CHECK_EQUAL("^<AAA>,<BBB>,<CCC>$", buffer);
- }
-
-}
+/**
+ * \file stream_tests.cpp
+ * \brief Output stream automated tests.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "base/stream.h"
+}
+
+struct FxStream
+{
+ Stream strm;
+ char buffer[1024];
+
+ FxStream()
+ {
+ strm = stream_create_null();
+ stream_set_buffer(strm, buffer);
+ }
+
+ ~FxStream()
+ {
+ stream_destroy(strm);
+ }
+};
+
+struct FxStreamStrings : FxStream
+{
+ Strings strs;
+
+ FxStreamStrings()
+ {
+ strs = strings_create();
+ }
+
+ ~FxStreamStrings()
+ {
+ strings_destroy(strs);
+ }
+};
+
+
+
+SUITE(base)
+{
+ TEST_FIXTURE(FxStream, Write_WritesValue_OnSimpleValue)
+ {
+ stream_write(strm, "Hi there!");
+ CHECK_EQUAL("Hi there!", buffer);
+ }
+
+ TEST_FIXTURE(FxStream, Write_WritesValue_OnFormattedValue)
+ {
+ stream_write(strm, "Hi there, %s!", "Mr. Bill");
+ CHECK_EQUAL("Hi there, Mr. Bill!", buffer);
+ }
+
+ TEST_FIXTURE(FxStream, WriteLine_AppendsNewLine_OnSimpleValue)
+ {
+ stream_writeline(strm, "Hi there!");
+ CHECK_EQUAL("Hi there!\n", buffer);
+ }
+
+ TEST_FIXTURE(FxStream, WriteLine_AppendsNewLine_OnFormattedValue)
+ {
+ stream_writeline(strm, "Hi there, %s!", "Mr. Bill");
+ CHECK_EQUAL("Hi there, Mr. Bill!\n", buffer);
+ }
+
+ TEST_FIXTURE(FxStream, WriteLine_AppendsNewLine_OnModifiedNewline)
+ {
+ stream_set_newline(strm, "\r\n");
+ stream_writeline(strm, "Hi there!");
+ CHECK_EQUAL("Hi there!\r\n", buffer);
+ }
+
+
+ /**********************************************************************
+ * stream_write_strings() tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxStreamStrings, WriteStrings_WritesStartEnd_OnEmptyList)
+ {
+ stream_write_strings(strm, strs, "^", "<", ">", ",", "$");
+ CHECK_EQUAL("^$", buffer);
+ }
+
+ TEST_FIXTURE(FxStreamStrings, WriteStrings_WriteSingleItem_OnSingleItem)
+ {
+ strings_add(strs, "AAA");
+ stream_write_strings(strm, strs, "^", "<", ">", ",", "$");
+ CHECK_EQUAL("^<AAA>$", buffer);
+ }
+
+ TEST_FIXTURE(FxStreamStrings, WriteStrings_WriteMultipleItems_OnMultipleItems)
+ {
+ strings_add(strs, "AAA");
+ strings_add(strs, "BBB");
+ strings_add(strs, "CCC");
+ stream_write_strings(strm, strs, "^", "<", ">", ",", "$");
+ CHECK_EQUAL("^<AAA>,<BBB>,<CCC>$", buffer);
+ }
+
+}
diff --git a/src/base/tests/string_tests.cpp b/src/base/tests/string_tests.cpp
index 6ddd304..ad6fd8a 100644
--- a/src/base/tests/string_tests.cpp
+++ b/src/base/tests/string_tests.cpp
@@ -1,46 +1,46 @@
-/**
- * \file string_tests.cpp
- * \brief Dynamic string automated tests.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "base/string.h"
-}
-
-SUITE(base)
-{
- /**************************************************************************
- * string_create() tests
- **************************************************************************/
-
- TEST(StringCreate_ReturnsNull_OnNull)
- {
- String str = string_create(NULL);
- CHECK(str == NULL);
- }
-
-
- /**************************************************************************
- * string_destroy() tests
- **************************************************************************/
-
- TEST(StringDestroy_DoesNoOp_OnNull)
- {
- string_destroy(NULL);
- CHECK(1);
- }
-
-
- /**************************************************************************
- * string_cstr() tests
- **************************************************************************/
-
- TEST(StringCStr_ReturnsNull_OnNullString)
- {
- CHECK(string_cstr(NULL) == NULL);
- }
-}
-
+/**
+ * \file string_tests.cpp
+ * \brief Dynamic string automated tests.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "base/string.h"
+}
+
+SUITE(base)
+{
+ /**************************************************************************
+ * string_create() tests
+ **************************************************************************/
+
+ TEST(StringCreate_ReturnsNull_OnNull)
+ {
+ String str = string_create(NULL);
+ CHECK(str == NULL);
+ }
+
+
+ /**************************************************************************
+ * string_destroy() tests
+ **************************************************************************/
+
+ TEST(StringDestroy_DoesNoOp_OnNull)
+ {
+ string_destroy(NULL);
+ CHECK(1);
+ }
+
+
+ /**************************************************************************
+ * string_cstr() tests
+ **************************************************************************/
+
+ TEST(StringCStr_ReturnsNull_OnNullString)
+ {
+ CHECK(string_cstr(NULL) == NULL);
+ }
+}
+
diff --git a/src/host/host.c b/src/host/host.c
index 6fb542b..8226c7b 100644
--- a/src/host/host.c
+++ b/src/host/host.c
@@ -1,172 +1,172 @@
-/**
- * \file host.c
- * \brief Main executable API.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include "premake.h"
-#include "host/host.h"
-#include "action/action.h"
-#include "base/cstr.h"
-#include "base/error.h"
-#include "base/file.h"
-
-
-/** argv, as passed into main(), stored here to be accessible to all host functions. */
-static const char** Args = NULL;
-
-
-/**
- * Initial processing and validation of the command line arguments.
- * \param sess The current execution session.
- * \returns OKAY on success.
- */
-int host_parse_argv(Session sess)
-{
- session_set_action(sess, Args[0]);
- return OKAY;
-}
-
-
-/**
- * Display the results of the application run.
- * Any errors returned during the run will be written to stderr; otherwise, a
- * success message is written to stdout.
- * \param sess The current execution session.
- * \returns OKAY.
- */
-int host_report_results(Session sess)
-{
- const char* error = error_get();
- if (error)
- {
- stream_writeline(Console, "Error: %s", error);
- }
-
- sess = 0; /* unused */
- return OKAY;
-}
-
-
-/**
- * Run the action specified by the user on the command line.
- * \param sess The execution session context.
- * \returns OKAY on success.
- */
-int host_run_action(Session sess)
-{
- const char* action;
- int i;
-
- assert(sess);
-
- /* there must be a project file defined or I can go no further */
- if (!file_exists(DEFAULT_SCRIPT_NAME))
- {
- error_set("script file '%s' not found", DEFAULT_SCRIPT_NAME);
- return !OKAY;
- }
-
- /* find the action in the master list and execute the associated callback */
- action = Args[0];
- for (i = 0; Actions[i].name != NULL; ++i)
- {
- if (cstr_eq(Actions[i].name, action))
- {
- return Actions[i].callback(sess);
- }
- }
-
- /* an invalid action was specified */
- error_set("invalid action '%s'", action);
- return !OKAY;
-}
-
-
-/**
- * Find and execute the project script file.
- * \param sess The session object.
- * \returns OKAY on success.
- */
-int host_run_script(Session sess)
-{
- assert(sess);
-
- /* run the default file for now. If the script file doesn't exist let execution
- * continue so I can display help, etc. */
- if (file_exists(DEFAULT_SCRIPT_NAME))
- {
- session_run_file(sess, DEFAULT_SCRIPT_NAME);
- return (error_get() == NULL) ? OKAY : !OKAY;
- }
- else
- {
- return OKAY;
- }
-}
-
-
-/**
- * Run a list of steps, in order, checking status at each step.
- * \param sess The current session state.
- * \param steps A null-terminated list of step functions.
- * \returns OKAY on success.
- */
-int host_run_steps(Session sess, HostExecutionStep* steps)
-{
- int i, status;
-
- assert(sess);
- assert(steps);
-
- status = OKAY;
- for (i = 0; status == OKAY && steps[i] != NULL; ++i)
- {
- status = steps[i](sess);
- }
-
- return status;
-}
-
-
-/**
- * Remember the list of command-line parameters for subsequent calls
- * to the other host functions later in the processing steps.
- * \param argv The argv variable is passed to main().
- */
-void host_set_argv(const char** argv)
-{
- /* skip over the progam name in argv[0] and just store the arguments */
- Args = &argv[1];
-}
-
-
-/**
- * Display help and version messages as appropriate. If any messages are
- * shown, execution of the main step loop will be stopped and the application
- * will exit (this seems to be the standard behavior of POSIX apps when
- * help is requested).
- * \param sess The current execution session context.
- * \returns OKAY is no help information was required, !OKAY to stop the loop.
- */
-int host_show_help(Session sess)
-{
- assert(Args);
-
- sess = 0; /* unused */
-
- /* while (arg is option) { */
- /* if (/version) ... */
- /* if (/help) ... */
-
- /* if no action was specified give the user a clue */
- if (Args[0] == NULL)
- {
- stream_writeline(Console, HOST_SHORT_HELP);
- return !OKAY;
- }
-
- return OKAY;
-}
+/**
+ * \file host.c
+ * \brief Main executable API.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include "premake.h"
+#include "host/host.h"
+#include "action/action.h"
+#include "base/cstr.h"
+#include "base/error.h"
+#include "base/file.h"
+
+
+/** argv, as passed into main(), stored here to be accessible to all host functions. */
+static const char** Args = NULL;
+
+
+/**
+ * Initial processing and validation of the command line arguments.
+ * \param sess The current execution session.
+ * \returns OKAY on success.
+ */
+int host_parse_argv(Session sess)
+{
+ session_set_action(sess, Args[0]);
+ return OKAY;
+}
+
+
+/**
+ * Display the results of the application run.
+ * Any errors returned during the run will be written to stderr; otherwise, a
+ * success message is written to stdout.
+ * \param sess The current execution session.
+ * \returns OKAY.
+ */
+int host_report_results(Session sess)
+{
+ const char* error = error_get();
+ if (error)
+ {
+ stream_writeline(Console, "Error: %s", error);
+ }
+
+ sess = 0; /* unused */
+ return OKAY;
+}
+
+
+/**
+ * Run the action specified by the user on the command line.
+ * \param sess The execution session context.
+ * \returns OKAY on success.
+ */
+int host_run_action(Session sess)
+{
+ const char* action;
+ int i;
+
+ assert(sess);
+
+ /* there must be a project file defined or I can go no further */
+ if (!file_exists(DEFAULT_SCRIPT_NAME))
+ {
+ error_set("script file '%s' not found", DEFAULT_SCRIPT_NAME);
+ return !OKAY;
+ }
+
+ /* find the action in the master list and execute the associated callback */
+ action = Args[0];
+ for (i = 0; Actions[i].name != NULL; ++i)
+ {
+ if (cstr_eq(Actions[i].name, action))
+ {
+ return Actions[i].callback(sess);
+ }
+ }
+
+ /* an invalid action was specified */
+ error_set("invalid action '%s'", action);
+ return !OKAY;
+}
+
+
+/**
+ * Find and execute the project script file.
+ * \param sess The session object.
+ * \returns OKAY on success.
+ */
+int host_run_script(Session sess)
+{
+ assert(sess);
+
+ /* run the default file for now. If the script file doesn't exist let execution
+ * continue so I can display help, etc. */
+ if (file_exists(DEFAULT_SCRIPT_NAME))
+ {
+ session_run_file(sess, DEFAULT_SCRIPT_NAME);
+ return (error_get() == NULL) ? OKAY : !OKAY;
+ }
+ else
+ {
+ return OKAY;
+ }
+}
+
+
+/**
+ * Run a list of steps, in order, checking status at each step.
+ * \param sess The current session state.
+ * \param steps A null-terminated list of step functions.
+ * \returns OKAY on success.
+ */
+int host_run_steps(Session sess, HostExecutionStep* steps)
+{
+ int i, status;
+
+ assert(sess);
+ assert(steps);
+
+ status = OKAY;
+ for (i = 0; status == OKAY && steps[i] != NULL; ++i)
+ {
+ status = steps[i](sess);
+ }
+
+ return status;
+}
+
+
+/**
+ * Remember the list of command-line parameters for subsequent calls
+ * to the other host functions later in the processing steps.
+ * \param argv The argv variable is passed to main().
+ */
+void host_set_argv(const char** argv)
+{
+ /* skip over the progam name in argv[0] and just store the arguments */
+ Args = &argv[1];
+}
+
+
+/**
+ * Display help and version messages as appropriate. If any messages are
+ * shown, execution of the main step loop will be stopped and the application
+ * will exit (this seems to be the standard behavior of POSIX apps when
+ * help is requested).
+ * \param sess The current execution session context.
+ * \returns OKAY is no help information was required, !OKAY to stop the loop.
+ */
+int host_show_help(Session sess)
+{
+ assert(Args);
+
+ sess = 0; /* unused */
+
+ /* while (arg is option) { */
+ /* if (/version) ... */
+ /* if (/help) ... */
+
+ /* if no action was specified give the user a clue */
+ if (Args[0] == NULL)
+ {
+ stream_writeline(Console, HOST_SHORT_HELP);
+ return !OKAY;
+ }
+
+ return OKAY;
+}
diff --git a/src/host/host.h b/src/host/host.h
index 2e5d007..6849d11 100644
--- a/src/host/host.h
+++ b/src/host/host.h
@@ -1,43 +1,43 @@
-/**
- * \file host.h
- * \brief Main executable API.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- *
- * \defgroup host Host
- *
- * The "host" part of the application, which is responsible for parsing the command
- * line arguments, and the overall flow of the application.
- *
- * @{
- */
-#if !defined(PREMAKE_HOST_H)
-#define PREMAKE_HOST_H
-
-#include "session/session.h"
-
-/**
- * The short help message, displayed if Premake is run with no arguments.
- */
-#define HOST_SHORT_HELP "Type 'premake --help' for help."
-
-
-/**
- * Abstract out one step in the process, so I can treat them all identically.
- * This lets me unit test the higher-level logic.
- * \param sess The current session state.
- * \returns OKAY if successful.
- */
-typedef int (*HostExecutionStep)(Session sess);
-
-
-int host_parse_argv(Session sess);
-int host_report_results(Session sess);
-int host_run_action(Session sess);
-int host_run_script(Session sess);
-int host_run_steps(Session sess, HostExecutionStep* steps);
-void host_set_argv(const char** argv);
-int host_show_help(Session sess);
-int host_tests(void);
-
-#endif
-/** @} */
+/**
+ * \file host.h
+ * \brief Main executable API.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ *
+ * \defgroup host Host
+ *
+ * The "host" part of the application, which is responsible for parsing the command
+ * line arguments, and the overall flow of the application.
+ *
+ * @{
+ */
+#if !defined(PREMAKE_HOST_H)
+#define PREMAKE_HOST_H
+
+#include "session/session.h"
+
+/**
+ * The short help message, displayed if Premake is run with no arguments.
+ */
+#define HOST_SHORT_HELP "Type 'premake --help' for help."
+
+
+/**
+ * Abstract out one step in the process, so I can treat them all identically.
+ * This lets me unit test the higher-level logic.
+ * \param sess The current session state.
+ * \returns OKAY if successful.
+ */
+typedef int (*HostExecutionStep)(Session sess);
+
+
+int host_parse_argv(Session sess);
+int host_report_results(Session sess);
+int host_run_action(Session sess);
+int host_run_script(Session sess);
+int host_run_steps(Session sess, HostExecutionStep* steps);
+void host_set_argv(const char** argv);
+int host_show_help(Session sess);
+int host_tests(void);
+
+#endif
+/** @} */
diff --git a/src/host/tests/host_args_tests.cpp b/src/host/tests/host_args_tests.cpp
index b13e970..8e47d5d 100644
--- a/src/host/tests/host_args_tests.cpp
+++ b/src/host/tests/host_args_tests.cpp
@@ -1,44 +1,44 @@
-/**
- * \file host_args_tests.cpp
- * \brief Automated tests for application command line argument processing.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "host/host.h"
-#include "base/error.h"
-#include "base/stream.h"
-}
-
-struct FxHostArgs
-{
- Session sess;
- char buffer[8192];
-
- FxHostArgs()
- {
- sess = session_create();
- stream_set_buffer(Console, buffer);
- }
-
- ~FxHostArgs()
- {
- session_destroy(sess);
- error_clear();
- host_set_argv(NULL);
- }
-};
-
-
-SUITE(host)
-{
- TEST_FIXTURE(FxHostArgs, ParseArgv_SetsAction_OnAction)
- {
- const char* argv[] = { "premake", "action", NULL };
- host_set_argv(argv);
- host_parse_argv(sess);
- CHECK_EQUAL("action", session_get_action(sess));
- }
-}
+/**
+ * \file host_args_tests.cpp
+ * \brief Automated tests for application command line argument processing.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "host/host.h"
+#include "base/error.h"
+#include "base/stream.h"
+}
+
+struct FxHostArgs
+{
+ Session sess;
+ char buffer[8192];
+
+ FxHostArgs()
+ {
+ sess = session_create();
+ stream_set_buffer(Console, buffer);
+ }
+
+ ~FxHostArgs()
+ {
+ session_destroy(sess);
+ error_clear();
+ host_set_argv(NULL);
+ }
+};
+
+
+SUITE(host)
+{
+ TEST_FIXTURE(FxHostArgs, ParseArgv_SetsAction_OnAction)
+ {
+ const char* argv[] = { "premake", "action", NULL };
+ host_set_argv(argv);
+ host_parse_argv(sess);
+ CHECK_EQUAL("action", session_get_action(sess));
+ }
+}
diff --git a/src/host/tests/host_help_tests.cpp b/src/host/tests/host_help_tests.cpp
index 8e81525..20fd77e 100644
--- a/src/host/tests/host_help_tests.cpp
+++ b/src/host/tests/host_help_tests.cpp
@@ -1,77 +1,77 @@
-/**
- * \file host_help_tests.cpp
- * \brief Automated test for application help and version display.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "host/host.h"
-#include "base/error.h"
-#include "base/stream.h"
-}
-
-struct FxHostHelp
-{
- Session sess;
- char buffer[8192];
-
- FxHostHelp()
- {
- sess = session_create();
- stream_set_buffer(Console, buffer);
- }
-
- ~FxHostHelp()
- {
- session_destroy(sess);
- error_clear();
- host_set_argv(NULL);
- }
-};
-
-
-SUITE(host)
-{
- /**********************************************************************
- * Do nothing if an action is set.
- **********************************************************************/
-
- TEST_FIXTURE(FxHostHelp, Help_ReturnsOkay_OnAction)
- {
- const char* argv[] = { "premake", "vs2005", NULL };
- host_set_argv(argv);
- int result = host_show_help(sess);
- CHECK(result == OKAY);
- }
-
- TEST_FIXTURE(FxHostHelp, Help_PrintsNothing_OnAction)
- {
- const char* argv[] = { "premake", "vs2005", NULL };
- host_set_argv(argv);
- host_show_help(sess);
- CHECK_EQUAL("", buffer);
- }
-
-
- /**********************************************************************
- * Should display short help (and end loop) if there is no action set.
- **********************************************************************/
-
- TEST_FIXTURE(FxHostHelp, Help_ReturnsNotOkay_OnNoAction)
- {
- const char* argv[] = { "premake", NULL };
- host_set_argv(argv);
- int result = host_show_help(sess);
- CHECK(result != OKAY);
- }
-
- TEST_FIXTURE(FxHostHelp, Help_ShowsShortHelp_OnNoAction)
- {
- const char* argv[] = { "premake", NULL };
- host_set_argv(argv);
- host_show_help(sess);
- CHECK_EQUAL(HOST_SHORT_HELP "\n", buffer);
- }
-}
+/**
+ * \file host_help_tests.cpp
+ * \brief Automated test for application help and version display.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "host/host.h"
+#include "base/error.h"
+#include "base/stream.h"
+}
+
+struct FxHostHelp
+{
+ Session sess;
+ char buffer[8192];
+
+ FxHostHelp()
+ {
+ sess = session_create();
+ stream_set_buffer(Console, buffer);
+ }
+
+ ~FxHostHelp()
+ {
+ session_destroy(sess);
+ error_clear();
+ host_set_argv(NULL);
+ }
+};
+
+
+SUITE(host)
+{
+ /**********************************************************************
+ * Do nothing if an action is set.
+ **********************************************************************/
+
+ TEST_FIXTURE(FxHostHelp, Help_ReturnsOkay_OnAction)
+ {
+ const char* argv[] = { "premake", "vs2005", NULL };
+ host_set_argv(argv);
+ int result = host_show_help(sess);
+ CHECK(result == OKAY);
+ }
+
+ TEST_FIXTURE(FxHostHelp, Help_PrintsNothing_OnAction)
+ {
+ const char* argv[] = { "premake", "vs2005", NULL };
+ host_set_argv(argv);
+ host_show_help(sess);
+ CHECK_EQUAL("", buffer);
+ }
+
+
+ /**********************************************************************
+ * Should display short help (and end loop) if there is no action set.
+ **********************************************************************/
+
+ TEST_FIXTURE(FxHostHelp, Help_ReturnsNotOkay_OnNoAction)
+ {
+ const char* argv[] = { "premake", NULL };
+ host_set_argv(argv);
+ int result = host_show_help(sess);
+ CHECK(result != OKAY);
+ }
+
+ TEST_FIXTURE(FxHostHelp, Help_ShowsShortHelp_OnNoAction)
+ {
+ const char* argv[] = { "premake", NULL };
+ host_set_argv(argv);
+ host_show_help(sess);
+ CHECK_EQUAL(HOST_SHORT_HELP "\n", buffer);
+ }
+}
diff --git a/src/host/tests/host_results_tests.cpp b/src/host/tests/host_results_tests.cpp
index ba646fc..64ca4e1 100644
--- a/src/host/tests/host_results_tests.cpp
+++ b/src/host/tests/host_results_tests.cpp
@@ -1,48 +1,48 @@
-/**
- * \file host_results_tests.cpp
- * \brief Automated test for application status reporting.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "host/host.h"
-#include "base/error.h"
-#include "base/stream.h"
-}
-
-struct FxResults
-{
- Session sess;
- char buffer[1024];
-
- FxResults()
- {
- sess = session_create();
- stream_set_buffer(Console, buffer);
- }
-
- ~FxResults()
- {
- session_destroy(sess);
- error_clear();
- }
-};
-
-
-SUITE(host)
-{
- TEST_FIXTURE(FxResults, ReportResults_NoMessage_OnNoError)
- {
- host_report_results(sess);
- CHECK_EQUAL("", buffer);
- }
-
- TEST_FIXTURE(FxResults, ReportResults_ErrorMessage_OnError)
- {
- error_set("an error occurred");
- host_report_results(sess);
- CHECK_EQUAL("Error: an error occurred\n", buffer);
- }
-}
+/**
+ * \file host_results_tests.cpp
+ * \brief Automated test for application status reporting.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "host/host.h"
+#include "base/error.h"
+#include "base/stream.h"
+}
+
+struct FxResults
+{
+ Session sess;
+ char buffer[1024];
+
+ FxResults()
+ {
+ sess = session_create();
+ stream_set_buffer(Console, buffer);
+ }
+
+ ~FxResults()
+ {
+ session_destroy(sess);
+ error_clear();
+ }
+};
+
+
+SUITE(host)
+{
+ TEST_FIXTURE(FxResults, ReportResults_NoMessage_OnNoError)
+ {
+ host_report_results(sess);
+ CHECK_EQUAL("", buffer);
+ }
+
+ TEST_FIXTURE(FxResults, ReportResults_ErrorMessage_OnError)
+ {
+ error_set("an error occurred");
+ host_report_results(sess);
+ CHECK_EQUAL("Error: an error occurred\n", buffer);
+ }
+}
diff --git a/src/host/tests/host_run_tests.cpp b/src/host/tests/host_run_tests.cpp
index 338b62f..f3635d8 100644
--- a/src/host/tests/host_run_tests.cpp
+++ b/src/host/tests/host_run_tests.cpp
@@ -1,125 +1,125 @@
-/**
- * \file host_run_tests.cpp
- * \brief Automated test for the host script execution logic.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "host/host.h"
-#include "base/dir.h"
-#include "base/error.h"
-}
-
-/* Mock steps for testing host_run_steps */
-
-static int num_step_calls;
-
-static int MockStepOkay(Session sess)
-{
- sess = 0;
- num_step_calls++;
- return OKAY;
-}
-
-static int MockStepFail(Session sess)
-{
- sess = 0;
- return !OKAY;
-}
-
-
-struct FxHostRun
-{
- Session sess;
-
- FxHostRun()
- {
- num_step_calls = 0;
- sess = session_create();
- dir_set_current("testing/test_files");
- }
-
- ~FxHostRun()
- {
- dir_set_current("../..");
- session_destroy(sess);
- error_clear();
- }
-};
-
-SUITE(host)
-{
- /**********************************************************************
- * host_run_script() tests
- **********************************************************************/
-
- TEST_FIXTURE(FxHostRun, HostRunScript_ReturnsOkay_OnSuccess)
- {
- int result = host_run_script(sess);
- CHECK(result == OKAY);
- }
-
- TEST_FIXTURE(FxHostRun, HostRunScript_RunsDefaultFile_OnNoFileArg)
- {
- host_run_script(sess);
- const char* result = session_run_string(sess,
- "return script_has_run");
- CHECK_EQUAL("true", result);
- }
-
-
- /**********************************************************************
- * host_run_steps() tests
- **********************************************************************/
-
- TEST_FIXTURE(FxHostRun, HostRunSteps_ReturnsOkay_OnAllStepsSucceed)
- {
- HostExecutionStep steps[] = { MockStepOkay, NULL };
- int result = host_run_steps(sess, steps);
- CHECK(result == OKAY);
- }
-
- TEST_FIXTURE(FxHostRun, HostRunSteps_RunsAllSteps)
- {
- HostExecutionStep steps[] = { MockStepOkay, MockStepOkay, MockStepOkay, NULL };
- host_run_steps(sess, steps);
- CHECK(num_step_calls == 3);
- }
-
- TEST_FIXTURE(FxHostRun, HostRunSteps_ReturnsNotOkay_OnError)
- {
- HostExecutionStep steps[] = { MockStepFail, NULL };
- int result = host_run_steps(sess, steps);
- CHECK(result != OKAY);
- }
-
- TEST_FIXTURE(FxHostRun, HostRunSteps_StopsRunning_OnError)
- {
- HostExecutionStep steps[] = { MockStepOkay, MockStepFail, MockStepOkay, NULL };
- host_run_steps(sess, steps);
- CHECK(num_step_calls == 1);
- }
-
-
- /**********************************************************************
- * host_run_action() tests
- **********************************************************************/
-
- TEST_FIXTURE(FxHostRun, HostRunAction_ReturnsNotOkay_OnInvalidAction)
- {
- const char* argv[] = { "premake", "nonesuch", NULL };
- host_set_argv(argv);
- int result = host_run_action(sess);
- CHECK(result != OKAY);
- }
-
- TEST_FIXTURE(FxHostRun, HostRunAction_SetsError_OnInvalidAction)
- {
- const char* argv[] = { "premake", "nonesuch", NULL };
- host_set_argv(argv);
- host_run_action(sess);
- CHECK_EQUAL("invalid action 'nonesuch'", error_get());
- }
-}
+/**
+ * \file host_run_tests.cpp
+ * \brief Automated test for the host script execution logic.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "host/host.h"
+#include "base/dir.h"
+#include "base/error.h"
+}
+
+/* Mock steps for testing host_run_steps */
+
+static int num_step_calls;
+
+static int MockStepOkay(Session sess)
+{
+ sess = 0;
+ num_step_calls++;
+ return OKAY;
+}
+
+static int MockStepFail(Session sess)
+{
+ sess = 0;
+ return !OKAY;
+}
+
+
+struct FxHostRun
+{
+ Session sess;
+
+ FxHostRun()
+ {
+ num_step_calls = 0;
+ sess = session_create();
+ dir_set_current("testing/test_files");
+ }
+
+ ~FxHostRun()
+ {
+ dir_set_current("../..");
+ session_destroy(sess);
+ error_clear();
+ }
+};
+
+SUITE(host)
+{
+ /**********************************************************************
+ * host_run_script() tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxHostRun, HostRunScript_ReturnsOkay_OnSuccess)
+ {
+ int result = host_run_script(sess);
+ CHECK(result == OKAY);
+ }
+
+ TEST_FIXTURE(FxHostRun, HostRunScript_RunsDefaultFile_OnNoFileArg)
+ {
+ host_run_script(sess);
+ const char* result = session_run_string(sess,
+ "return script_has_run");
+ CHECK_EQUAL("true", result);
+ }
+
+
+ /**********************************************************************
+ * host_run_steps() tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxHostRun, HostRunSteps_ReturnsOkay_OnAllStepsSucceed)
+ {
+ HostExecutionStep steps[] = { MockStepOkay, NULL };
+ int result = host_run_steps(sess, steps);
+ CHECK(result == OKAY);
+ }
+
+ TEST_FIXTURE(FxHostRun, HostRunSteps_RunsAllSteps)
+ {
+ HostExecutionStep steps[] = { MockStepOkay, MockStepOkay, MockStepOkay, NULL };
+ host_run_steps(sess, steps);
+ CHECK(num_step_calls == 3);
+ }
+
+ TEST_FIXTURE(FxHostRun, HostRunSteps_ReturnsNotOkay_OnError)
+ {
+ HostExecutionStep steps[] = { MockStepFail, NULL };
+ int result = host_run_steps(sess, steps);
+ CHECK(result != OKAY);
+ }
+
+ TEST_FIXTURE(FxHostRun, HostRunSteps_StopsRunning_OnError)
+ {
+ HostExecutionStep steps[] = { MockStepOkay, MockStepFail, MockStepOkay, NULL };
+ host_run_steps(sess, steps);
+ CHECK(num_step_calls == 1);
+ }
+
+
+ /**********************************************************************
+ * host_run_action() tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxHostRun, HostRunAction_ReturnsNotOkay_OnInvalidAction)
+ {
+ const char* argv[] = { "premake", "nonesuch", NULL };
+ host_set_argv(argv);
+ int result = host_run_action(sess);
+ CHECK(result != OKAY);
+ }
+
+ TEST_FIXTURE(FxHostRun, HostRunAction_SetsError_OnInvalidAction)
+ {
+ const char* argv[] = { "premake", "nonesuch", NULL };
+ host_set_argv(argv);
+ host_run_action(sess);
+ CHECK_EQUAL("invalid action 'nonesuch'", error_get());
+ }
+}
diff --git a/src/host/tests/host_tests.cpp b/src/host/tests/host_tests.cpp
index 18d6a7a..6b3535c 100644
--- a/src/host/tests/host_tests.cpp
+++ b/src/host/tests/host_tests.cpp
@@ -1,26 +1,26 @@
-/**
- * \file host_tests.cpp
- * \brief Main executable automated tests.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "host/host.h"
-}
-
-
-/**
- * Run the automated host tests.
- * \returns OKAY if all tests completed successfully.
- * \note Also runs the tests for all dependencies, which for the host is everything.
- */
-int host_tests()
-{
- int z = OKAY;
- if (z == OKAY) z = session_tests();
- if (z == OKAY) z = tests_run_suite("action");
- if (z == OKAY) z = tests_run_suite("host");
- return z;
-}
+/**
+ * \file host_tests.cpp
+ * \brief Main executable automated tests.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "host/host.h"
+}
+
+
+/**
+ * Run the automated host tests.
+ * \returns OKAY if all tests completed successfully.
+ * \note Also runs the tests for all dependencies, which for the host is everything.
+ */
+int host_tests()
+{
+ int z = OKAY;
+ if (z == OKAY) z = session_tests();
+ if (z == OKAY) z = tests_run_suite("action");
+ if (z == OKAY) z = tests_run_suite("host");
+ return z;
+}
diff --git a/src/platform/platform.c b/src/platform/platform.c
index cf20a3a..a98987c 100644
--- a/src/platform/platform.c
+++ b/src/platform/platform.c
@@ -1,34 +1,34 @@
-/**
- * \file platform.c
- * \brief Platform abstraction API.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "platform.h"
-
-static enum Platform CurrentPlatform = Unknown;
-
-
-enum Platform platform_get()
-{
- if (CurrentPlatform == Unknown)
- {
-#if defined(PLATFORM_BSD)
- CurrentPlatform = BSD;
-#elif defined(PLATFORM_LINUX)
- CurrentPlatform = Linux;
-#elif defined(PLATFORM_MACOSX)
- CurrentPlatform = MacOSX;
-#else
- CurrentPlatform = Windows;
-#endif
- }
- return CurrentPlatform;
-}
-
-
-void platform_set(enum Platform id)
-{
- CurrentPlatform = id;
-}
+/**
+ * \file platform.c
+ * \brief Platform abstraction API.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "platform.h"
+
+static enum Platform CurrentPlatform = Unknown;
+
+
+enum Platform platform_get()
+{
+ if (CurrentPlatform == Unknown)
+ {
+#if defined(PLATFORM_BSD)
+ CurrentPlatform = BSD;
+#elif defined(PLATFORM_LINUX)
+ CurrentPlatform = Linux;
+#elif defined(PLATFORM_MACOSX)
+ CurrentPlatform = MacOSX;
+#else
+ CurrentPlatform = Windows;
+#endif
+ }
+ return CurrentPlatform;
+}
+
+
+void platform_set(enum Platform id)
+{
+ CurrentPlatform = id;
+}
diff --git a/src/platform/platform.h b/src/platform/platform.h
index 64eccc0..d899401 100644
--- a/src/platform/platform.h
+++ b/src/platform/platform.h
@@ -1,121 +1,121 @@
-/**
- * \file platform.h
- * \brief Platform abstraction API.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- *
- * \defgroup platform Platform
- *
- * Platform abstraction; primarily file system and directory management.
- *
- * @{
- */
-#if !defined(PREMAKE_PLATFORM_H)
-#define PREMAKE_PLATFORM_H
-
-
-/**
- * The currently support platforms. If you add to this list be sure to
- * also update the platform detection logic below, and the platform
- * identifier initialization in platform.c.
- */
-enum Platform
-{
- Unknown,
- BSD,
- Linux,
- MacOSX,
- Windows
-};
-
-
-#if defined(__linux__)
-#define PLATFORM_LINUX (1)
-#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
-#define PLATFORM_BSD (1)
-#elif defined(__APPLE__) && defined(__MACH__)
-#define PLATFORM_MACOSX (1)
-#else
-#define PLATFORM_WINDOWS (1)
-#endif
-
-DECLARE_CLASS(PlatformSearch)
-
-
-/**
- * Create a directory, if it doesn't exist already.
- * \returns OKAY if successful.
- */
-int platform_create_dir(const char* path);
-
-
-/**
- * Create a GUID and copy it into the supplied buffer.
- * \param buffer The buffer to hold the new GUID; must hold at least 36 characters.
- */
-void platform_create_guid(char* buffer);
-
-
-/**
- * Get the current working directory.
- * \param buffer A buffer to hold the directory.
- * \param size The size of the buffer.
- * \returns OKAY if successful.
- */
-int platform_dir_get_current(char* buffer, int size);
-
-
-/**
- * Set the current working directory.
- * \param path The new working directory.
- * \returns OKAY if successful.
- */
-int platform_dir_set_current(const char* path);
-
-
-/**
- * Retrieve the current platform identifier.
- */
-enum Platform platform_get(void);
-
-
-/**
- * Create a new platform file search context.
- */
-PlatformSearch platform_search_create(const char* mask);
-
-
-/**
- * Destroy a platform search context.
- */
-void platform_search_destroy(PlatformSearch search);
-
-
-/**
- * Retrieve the name of the current match in the search.
- */
-const char* platform_search_get_name(PlatformSearch search);
-
-
-/**
- * Determine if the current match is a file or a directory.
- */
-int platform_search_is_file(PlatformSearch search);
-
-
-/**
- * Retrieve the next match in a file system search.
- * \returns True if another match is available.
- */
-int platform_search_next(PlatformSearch search);
-
-
-/**
- * Set the platform identification string, forcing a platform-specific
- * behavior regardless of the actual current platform.
- * \param id One of the platform identifiers.
- */
-void platform_set(enum Platform id);
-
-
-#endif
-/** @} */
+/**
+ * \file platform.h
+ * \brief Platform abstraction API.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ *
+ * \defgroup platform Platform
+ *
+ * Platform abstraction; primarily file system and directory management.
+ *
+ * @{
+ */
+#if !defined(PREMAKE_PLATFORM_H)
+#define PREMAKE_PLATFORM_H
+
+
+/**
+ * The currently support platforms. If you add to this list be sure to
+ * also update the platform detection logic below, and the platform
+ * identifier initialization in platform.c.
+ */
+enum Platform
+{
+ Unknown,
+ BSD,
+ Linux,
+ MacOSX,
+ Windows
+};
+
+
+#if defined(__linux__)
+#define PLATFORM_LINUX (1)
+#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
+#define PLATFORM_BSD (1)
+#elif defined(__APPLE__) && defined(__MACH__)
+#define PLATFORM_MACOSX (1)
+#else
+#define PLATFORM_WINDOWS (1)
+#endif
+
+DECLARE_CLASS(PlatformSearch)
+
+
+/**
+ * Create a directory, if it doesn't exist already.
+ * \returns OKAY if successful.
+ */
+int platform_create_dir(const char* path);
+
+
+/**
+ * Create a GUID and copy it into the supplied buffer.
+ * \param buffer The buffer to hold the new GUID; must hold at least 36 characters.
+ */
+void platform_create_guid(char* buffer);
+
+
+/**
+ * Get the current working directory.
+ * \param buffer A buffer to hold the directory.
+ * \param size The size of the buffer.
+ * \returns OKAY if successful.
+ */
+int platform_dir_get_current(char* buffer, int size);
+
+
+/**
+ * Set the current working directory.
+ * \param path The new working directory.
+ * \returns OKAY if successful.
+ */
+int platform_dir_set_current(const char* path);
+
+
+/**
+ * Retrieve the current platform identifier.
+ */
+enum Platform platform_get(void);
+
+
+/**
+ * Create a new platform file search context.
+ */
+PlatformSearch platform_search_create(const char* mask);
+
+
+/**
+ * Destroy a platform search context.
+ */
+void platform_search_destroy(PlatformSearch search);
+
+
+/**
+ * Retrieve the name of the current match in the search.
+ */
+const char* platform_search_get_name(PlatformSearch search);
+
+
+/**
+ * Determine if the current match is a file or a directory.
+ */
+int platform_search_is_file(PlatformSearch search);
+
+
+/**
+ * Retrieve the next match in a file system search.
+ * \returns True if another match is available.
+ */
+int platform_search_next(PlatformSearch search);
+
+
+/**
+ * Set the platform identification string, forcing a platform-specific
+ * behavior regardless of the actual current platform.
+ * \param id One of the platform identifiers.
+ */
+void platform_set(enum Platform id);
+
+
+#endif
+/** @} */
diff --git a/src/platform/posix.c b/src/platform/posix.c
index 5f595fe..e1cecf1 100644
--- a/src/platform/posix.c
+++ b/src/platform/posix.c
@@ -1,136 +1,136 @@
-/**
- * \file posix.c
- * \brief POSIX implementation of Premake platform abstraction.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "platform/platform.h"
-#include "base/path.h"
-#include "base/string.h"
-
-#if !defined(PLATFORM_WINDOWS)
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <dlfcn.h>
-#include <dirent.h>
-#include <fnmatch.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <ctype.h>
-
-DEFINE_CLASS(PlatformSearch)
-{
- String directory;
- String mask;
- DIR* handle;
- struct dirent* entry;
-};
-
-
-int platform_create_dir(const char* path)
-{
- return mkdir(path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
-}
-
-
-void platform_create_guid(char* buffer)
-{
- /* not sure how to get a UUID here, so I fake it */
- FILE* rnd = fopen("/dev/random", "rb");
- fread(buffer, 16, 1, rnd);
- fclose(rnd);
-}
-
-
-int platform_dir_get_current(char* buffer, int size)
-{
- char* result = getcwd(buffer, size);
- return (result != NULL) ? OKAY : !OKAY;
-}
-
-
-int platform_dir_set_current(const char* path)
-{
- return chdir(path);
-}
-
-
-PlatformSearch platform_search_create(const char* mask)
-{
- PlatformSearch search;
- const char* dir;
-
- dir = path_directory(mask);
- mask = path_filename(mask);
- if (strlen(dir) == 0)
- {
- dir = ".";
- }
-
- search = ALLOC_CLASS(PlatformSearch);
- search->directory = string_create(dir);
- search->mask = string_create(mask);
- search->handle = opendir(dir);
- search->entry = NULL;
- return search;
-}
-
-
-void platform_search_destroy(PlatformSearch search)
-{
- if (search->handle != NULL)
- {
- closedir(search->handle);
- }
- free(search);
-}
-
-
-const char* platform_search_get_name(PlatformSearch search)
-{
- return search->entry->d_name;
-}
-
-
-int platform_search_is_file(PlatformSearch search)
-{
- struct stat info;
-
- const char* dir = string_cstr(search->directory);
- const char* path = path_join(dir, search->entry->d_name);
- if (stat(path, &info) == 0)
- {
- return S_ISREG(info.st_mode);
- }
-
- return 0;
-}
-
-
-int platform_search_next(PlatformSearch search)
-{
- const char* mask = string_cstr(search->mask);
-
- if (search->handle == NULL)
- {
- return 0;
- }
-
- search->entry = readdir(search->handle);
- while (search->entry != NULL)
- {
- if (fnmatch(mask, search->entry->d_name, 0) == 0)
- {
- return 1;
- }
- search->entry = readdir(search->handle);
- }
-
- return 0;
-}
-
-#endif
-
+/**
+ * \file posix.c
+ * \brief POSIX implementation of Premake platform abstraction.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "platform/platform.h"
+#include "base/path.h"
+#include "base/string.h"
+
+#if !defined(PLATFORM_WINDOWS)
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <dlfcn.h>
+#include <dirent.h>
+#include <fnmatch.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <ctype.h>
+
+DEFINE_CLASS(PlatformSearch)
+{
+ String directory;
+ String mask;
+ DIR* handle;
+ struct dirent* entry;
+};
+
+
+int platform_create_dir(const char* path)
+{
+ return mkdir(path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
+}
+
+
+void platform_create_guid(char* buffer)
+{
+ /* not sure how to get a UUID here, so I fake it */
+ FILE* rnd = fopen("/dev/random", "rb");
+ fread(buffer, 16, 1, rnd);
+ fclose(rnd);
+}
+
+
+int platform_dir_get_current(char* buffer, int size)
+{
+ char* result = getcwd(buffer, size);
+ return (result != NULL) ? OKAY : !OKAY;
+}
+
+
+int platform_dir_set_current(const char* path)
+{
+ return chdir(path);
+}
+
+
+PlatformSearch platform_search_create(const char* mask)
+{
+ PlatformSearch search;
+ const char* dir;
+
+ dir = path_directory(mask);
+ mask = path_filename(mask);
+ if (strlen(dir) == 0)
+ {
+ dir = ".";
+ }
+
+ search = ALLOC_CLASS(PlatformSearch);
+ search->directory = string_create(dir);
+ search->mask = string_create(mask);
+ search->handle = opendir(dir);
+ search->entry = NULL;
+ return search;
+}
+
+
+void platform_search_destroy(PlatformSearch search)
+{
+ if (search->handle != NULL)
+ {
+ closedir(search->handle);
+ }
+ free(search);
+}
+
+
+const char* platform_search_get_name(PlatformSearch search)
+{
+ return search->entry->d_name;
+}
+
+
+int platform_search_is_file(PlatformSearch search)
+{
+ struct stat info;
+
+ const char* dir = string_cstr(search->directory);
+ const char* path = path_join(dir, search->entry->d_name);
+ if (stat(path, &info) == 0)
+ {
+ return S_ISREG(info.st_mode);
+ }
+
+ return 0;
+}
+
+
+int platform_search_next(PlatformSearch search)
+{
+ const char* mask = string_cstr(search->mask);
+
+ if (search->handle == NULL)
+ {
+ return 0;
+ }
+
+ search->entry = readdir(search->handle);
+ while (search->entry != NULL)
+ {
+ if (fnmatch(mask, search->entry->d_name, 0) == 0)
+ {
+ return 1;
+ }
+ search->entry = readdir(search->handle);
+ }
+
+ return 0;
+}
+
+#endif
+
diff --git a/src/platform/windows.c b/src/platform/windows.c
index 40de7c6..1a1ae6d 100644
--- a/src/platform/windows.c
+++ b/src/platform/windows.c
@@ -1,105 +1,105 @@
-/**
- * \file windows.c
- * \brief Windows implementation of Premake platform abstraction.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <stdlib.h>
-#include "premake.h"
-#include "platform/platform.h"
-#if defined(PLATFORM_WINDOWS)
-
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-
-
-DEFINE_CLASS(PlatformSearch)
-{
- HANDLE handle;
- int is_first;
- WIN32_FIND_DATA entry;
-};
-
-
-int platform_create_dir(const char* path)
-{
- return CreateDirectory(path, NULL) ? OKAY : !OKAY;
-}
-
-
-void platform_create_guid(char* buffer)
-{
- static int (__stdcall *CoCreateGuid)(char*) = NULL;
- if (CoCreateGuid == NULL)
- {
- HMODULE hOleDll = LoadLibrary("OLE32.DLL");
- CoCreateGuid = (int(__stdcall*)(char*))GetProcAddress(hOleDll, "CoCreateGuid");
- }
- CoCreateGuid(buffer);
-}
-
-
-int platform_dir_get_current(char* buffer, int size)
-{
- DWORD result = GetCurrentDirectory(size, buffer);
- return (result != 0) ? OKAY : !OKAY;
-}
-
-
-int platform_dir_set_current(const char* path)
-{
- DWORD result = SetCurrentDirectory(path);
- return (result != 0) ? OKAY : !OKAY;
-}
-
-
-PlatformSearch platform_search_create(const char* mask)
-{
- PlatformSearch search = ALLOC_CLASS(PlatformSearch);
- search->handle = FindFirstFile(mask, &search->entry);
- search->is_first = 1;
- return search;
-}
-
-
-void platform_search_destroy(PlatformSearch search)
-{
- if (search->handle != INVALID_HANDLE_VALUE)
- {
- FindClose(search->handle);
- }
- free(search);
-}
-
-
-const char* platform_search_get_name(PlatformSearch search)
-{
- return search->entry.cFileName;
-}
-
-
-int platform_search_is_file(PlatformSearch search)
-{
- return (search->entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0;
-}
-
-
-int platform_search_next(PlatformSearch search)
-{
- if (search->handle == INVALID_HANDLE_VALUE)
- {
- return 0;
- }
-
- if (search->is_first)
- {
- search->is_first = 0;
- return 1;
- }
- else
- {
- return FindNextFile(search->handle, &search->entry);
- }
-}
-
-#endif
+/**
+ * \file windows.c
+ * \brief Windows implementation of Premake platform abstraction.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <stdlib.h>
+#include "premake.h"
+#include "platform/platform.h"
+#if defined(PLATFORM_WINDOWS)
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+
+DEFINE_CLASS(PlatformSearch)
+{
+ HANDLE handle;
+ int is_first;
+ WIN32_FIND_DATA entry;
+};
+
+
+int platform_create_dir(const char* path)
+{
+ return CreateDirectory(path, NULL) ? OKAY : !OKAY;
+}
+
+
+void platform_create_guid(char* buffer)
+{
+ static int (__stdcall *CoCreateGuid)(char*) = NULL;
+ if (CoCreateGuid == NULL)
+ {
+ HMODULE hOleDll = LoadLibrary("OLE32.DLL");
+ CoCreateGuid = (int(__stdcall*)(char*))GetProcAddress(hOleDll, "CoCreateGuid");
+ }
+ CoCreateGuid(buffer);
+}
+
+
+int platform_dir_get_current(char* buffer, int size)
+{
+ DWORD result = GetCurrentDirectory(size, buffer);
+ return (result != 0) ? OKAY : !OKAY;
+}
+
+
+int platform_dir_set_current(const char* path)
+{
+ DWORD result = SetCurrentDirectory(path);
+ return (result != 0) ? OKAY : !OKAY;
+}
+
+
+PlatformSearch platform_search_create(const char* mask)
+{
+ PlatformSearch search = ALLOC_CLASS(PlatformSearch);
+ search->handle = FindFirstFile(mask, &search->entry);
+ search->is_first = 1;
+ return search;
+}
+
+
+void platform_search_destroy(PlatformSearch search)
+{
+ if (search->handle != INVALID_HANDLE_VALUE)
+ {
+ FindClose(search->handle);
+ }
+ free(search);
+}
+
+
+const char* platform_search_get_name(PlatformSearch search)
+{
+ return search->entry.cFileName;
+}
+
+
+int platform_search_is_file(PlatformSearch search)
+{
+ return (search->entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0;
+}
+
+
+int platform_search_next(PlatformSearch search)
+{
+ if (search->handle == INVALID_HANDLE_VALUE)
+ {
+ return 0;
+ }
+
+ if (search->is_first)
+ {
+ search->is_first = 0;
+ return 1;
+ }
+ else
+ {
+ return FindNextFile(search->handle, &search->entry);
+ }
+}
+
+#endif
diff --git a/src/premake.c b/src/premake.c
index 084471f..8c57761 100644
--- a/src/premake.c
+++ b/src/premake.c
@@ -1,58 +1,58 @@
-/**
- * \file premake.c
- * \brief Program entry point.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <stdlib.h>
-#include "premake.h"
-#include "host/host.h"
-#include "action/action.h"
-
-
-/**
- * These are the steps in the process; each function runs one part of the whole.
- */
-static HostExecutionStep Steps[] =
-{
- host_parse_argv, /* process the command line arguments */
- host_run_script, /* run the main script (i.e. premake4.lua) */
- session_unload, /* unload the objects built by the script into more accessible C data structures */
- host_show_help, /* show help and version messages as appropriate; may end processing here */
- host_run_action, /* run the action specified on the command line */
- NULL /* all done! */
-};
-
-
-/**
- * \brief Program entry point.
- */
-int main(int argc, const char** argv)
-{
- Session sess;
-
- /* If testing is enabled, calling premake.exe with no arguments will
- * trigger a call to the automated tests. This is used by a post-build
- * step to run the tests after every successful build. */
-#if defined(TESTING_ENABLED)
- if (argc == 1)
- {
- return host_tests();
- }
-#else
- UNUSED(argc);
-#endif
-
- /* initialize */
- host_set_argv(argv);
- sess = session_create();
-
- /* run */
- host_run_steps(sess, Steps);
-
- /* report back to the user and clean up */
- host_report_results(sess);
- session_destroy(sess);
- return OKAY;
-}
-
+/**
+ * \file premake.c
+ * \brief Program entry point.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <stdlib.h>
+#include "premake.h"
+#include "host/host.h"
+#include "action/action.h"
+
+
+/**
+ * These are the steps in the process; each function runs one part of the whole.
+ */
+static HostExecutionStep Steps[] =
+{
+ host_parse_argv, /* process the command line arguments */
+ host_run_script, /* run the main script (i.e. premake4.lua) */
+ session_unload, /* unload the objects built by the script into more accessible C data structures */
+ host_show_help, /* show help and version messages as appropriate; may end processing here */
+ host_run_action, /* run the action specified on the command line */
+ NULL /* all done! */
+};
+
+
+/**
+ * \brief Program entry point.
+ */
+int main(int argc, const char** argv)
+{
+ Session sess;
+
+ /* If testing is enabled, calling premake.exe with no arguments will
+ * trigger a call to the automated tests. This is used by a post-build
+ * step to run the tests after every successful build. */
+#if defined(TESTING_ENABLED)
+ if (argc == 1)
+ {
+ return host_tests();
+ }
+#else
+ UNUSED(argc);
+#endif
+
+ /* initialize */
+ host_set_argv(argv);
+ sess = session_create();
+
+ /* run */
+ host_run_steps(sess, Steps);
+
+ /* report back to the user and clean up */
+ host_report_results(sess);
+ session_destroy(sess);
+ return OKAY;
+}
+
diff --git a/src/premake.h b/src/premake.h
index 88f09ef..c5adb88 100644
--- a/src/premake.h
+++ b/src/premake.h
@@ -1,43 +1,43 @@
-/**
- * \file premake.h
- * \brief Global program definitions.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-
-/**
- * The default filename for Premake scripts.
- */
-#define DEFAULT_SCRIPT_NAME "premake4.lua"
-
-
-/**
- * The success return code; the symbol avoids confusion about zero == false.
- */
-#define OKAY (0)
-
-
-/**
- * Macro to declare new "classes" - just opaque struct pointers. The macro
- * ensures that they all get defined consistently.
- */
-#define DECLARE_CLASS(n) typedef struct n##_impl* n;
-
-
-/**
- * Macro to define new "classes" - just structs with a special name.
- */
-#define DEFINE_CLASS(n) struct n##_impl
-
-
-/**
- * Macro to allocate memory for a "class" - just a struct with a special name.
- */
-#define ALLOC_CLASS(n) (n)malloc(sizeof(struct n##_impl))
-
-
-/**
- * Mark a variable as unused, so the compiler won't complain about it. I suspect
- * there is a better way to do this.
- */
-#define UNUSED(var) var = 0
+/**
+ * \file premake.h
+ * \brief Global program definitions.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+
+/**
+ * The default filename for Premake scripts.
+ */
+#define DEFAULT_SCRIPT_NAME "premake4.lua"
+
+
+/**
+ * The success return code; the symbol avoids confusion about zero == false.
+ */
+#define OKAY (0)
+
+
+/**
+ * Macro to declare new "classes" - just opaque struct pointers. The macro
+ * ensures that they all get defined consistently.
+ */
+#define DECLARE_CLASS(n) typedef struct n##_impl* n;
+
+
+/**
+ * Macro to define new "classes" - just structs with a special name.
+ */
+#define DEFINE_CLASS(n) struct n##_impl
+
+
+/**
+ * Macro to allocate memory for a "class" - just a struct with a special name.
+ */
+#define ALLOC_CLASS(n) (n)malloc(sizeof(struct n##_impl))
+
+
+/**
+ * Mark a variable as unused, so the compiler won't complain about it. I suspect
+ * there is a better way to do this.
+ */
+#define UNUSED(var) var = 0
diff --git a/src/premake.lua b/src/premake.lua
index 16062c1..0754881 100644
--- a/src/premake.lua
+++ b/src/premake.lua
@@ -1,101 +1,101 @@
-package.name = "Premake"
-package.target = "premake4"
-package.language = "c"
-package.kind = "exe"
-
-local subsystems =
-{
- "platform",
- "base",
- "project",
- "action",
- "action/make",
- "action/vs200x",
- "script",
- "session",
- "host"
-}
-
-
--- Build settings
-
- package.buildflags =
- {
- "no-64bit-checks",
- "extra-warnings",
- "fatal-warnings"
- }
-
- package.config["Debug"].defines =
- {
- "_DEBUG"
- }
-
- package.config["Release"].buildflags =
- {
- "no-symbols",
- "optimize-size",
- "no-frame-pointers"
- }
-
- package.config["Release"].defines =
- {
- "NDEBUG"
- }
-
- package.defines =
- {
- "_CRT_SECURE_NO_WARNINGS"
- }
-
- package.includepaths =
- {
- "."
- }
-
-
--- Files
-
- package.files = matchfiles("*.h", "*.c")
- for k,m in subsystems do
- table.insert(package.files, matchfiles(m.."/*.h", m.."/*.c"))
- end
-
-
--- Lua scripting engine
-
- local lua = "script/lua-5.1.2/src"
- table.insert(package.includepaths, lua)
- table.insert(package.files, matchfiles(lua.."/*.h", lua.."/*.c"))
- table.insert(package.excludes, {lua.."/lua.c", lua.."/luac.c"})
-
-
--- Automated tests
-
- if (not options["no-tests"]) then
- local unittest = "testing/UnitTest++/src"
-
- -- UnitTest++ is a C++ system
- package.language = "c++"
-
- -- Define a symbol so I can compile in the testing calls
- table.insert(package.defines, "TESTING_ENABLED")
-
- table.insert(package.files, matchfiles("testing/*.h", "testing/*.cpp", unittest.."/*"))
-
- for k,m in subsystems do
- table.insert(package.files, matchfiles(m.."/tests/*.h", m.."/tests/*.cpp"))
- end
-
- if (windows) then
- table.insert(package.files, matchfiles(unittest.."/Win32/*"))
- package.config["Debug"].postbuildcommands = { "..\\bin\\debug\\premake4.exe" }
- package.config["Release"].postbuildcommands = { "..\\bin\\release\\premake4.exe" }
- else
- table.insert(package.files, matchfiles(unittest.."/Posix/*"))
- package.config["Debug"].postbuildcommands = { "../bin/debug/premake4" }
- package.config["Release"].postbuildcommands = { "../bin/release/premake4" }
- end
-
- end
-
+package.name = "Premake"
+package.target = "premake4"
+package.language = "c"
+package.kind = "exe"
+
+local subsystems =
+{
+ "platform",
+ "base",
+ "project",
+ "action",
+ "action/make",
+ "action/vs200x",
+ "script",
+ "session",
+ "host"
+}
+
+
+-- Build settings
+
+ package.buildflags =
+ {
+ "no-64bit-checks",
+ "extra-warnings",
+ "fatal-warnings"
+ }
+
+ package.config["Debug"].defines =
+ {
+ "_DEBUG"
+ }
+
+ package.config["Release"].buildflags =
+ {
+ "no-symbols",
+ "optimize-size",
+ "no-frame-pointers"
+ }
+
+ package.config["Release"].defines =
+ {
+ "NDEBUG"
+ }
+
+ package.defines =
+ {
+ "_CRT_SECURE_NO_WARNINGS"
+ }
+
+ package.includepaths =
+ {
+ "."
+ }
+
+
+-- Files
+
+ package.files = matchfiles("*.h", "*.c")
+ for k,m in subsystems do
+ table.insert(package.files, matchfiles(m.."/*.h", m.."/*.c"))
+ end
+
+
+-- Lua scripting engine
+
+ local lua = "script/lua-5.1.2/src"
+ table.insert(package.includepaths, lua)
+ table.insert(package.files, matchfiles(lua.."/*.h", lua.."/*.c"))
+ table.insert(package.excludes, {lua.."/lua.c", lua.."/luac.c"})
+
+
+-- Automated tests
+
+ if (not options["no-tests"]) then
+ local unittest = "testing/UnitTest++/src"
+
+ -- UnitTest++ is a C++ system
+ package.language = "c++"
+
+ -- Define a symbol so I can compile in the testing calls
+ table.insert(package.defines, "TESTING_ENABLED")
+
+ table.insert(package.files, matchfiles("testing/*.h", "testing/*.cpp", unittest.."/*"))
+
+ for k,m in subsystems do
+ table.insert(package.files, matchfiles(m.."/tests/*.h", m.."/tests/*.cpp"))
+ end
+
+ if (windows) then
+ table.insert(package.files, matchfiles(unittest.."/Win32/*"))
+ package.config["Debug"].postbuildcommands = { "..\\bin\\debug\\premake4.exe" }
+ package.config["Release"].postbuildcommands = { "..\\bin\\release\\premake4.exe" }
+ else
+ table.insert(package.files, matchfiles(unittest.."/Posix/*"))
+ package.config["Debug"].postbuildcommands = { "../bin/debug/premake4" }
+ package.config["Release"].postbuildcommands = { "../bin/release/premake4" }
+ end
+
+ end
+
diff --git a/src/project/fields.c b/src/project/fields.c
index 7c5c312..7ee178d 100644
--- a/src/project/fields.c
+++ b/src/project/fields.c
@@ -1,166 +1,166 @@
-/**
- * \file fields.c
- * \brief Project object fields enumeration and handling.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include "premake.h"
-#include "fields.h"
-#include "base/strings.h"
-
-
-DEFINE_CLASS(Fields)
-{
- Strings* values;
- int count;
-};
-
-
-/**
- * Create a new, empty collection of fields.
- * \param info Metadata about the field collection.
- * \returns A new collection of fields.
- */
-Fields fields_create(struct FieldInfo* info)
-{
- int i;
- Fields fields;
-
- assert(info);
-
- fields = ALLOC_CLASS(Fields);
-
- /* figure out how many fields are in the collection */
- for (i = 0; info[i].name != NULL; ++i);
- fields->count = i;
-
- /* initialize the values */
- fields->values = (Strings*)malloc(sizeof(Strings) * fields->count);
- for (i = 0; i < fields->count; ++i)
- {
- fields->values[i] = strings_create();
- }
-
- return fields;
-}
-
-
-/**
- * Destroy a collection of fields and release the associated memory.
- * \param fields The collection of fields to destroy.
- */
-void fields_destroy(Fields fields)
-{
- int i;
-
- assert(fields);
-
- for (i = 0; i < fields->count; ++i)
- {
- strings_destroy(fields->values[i]);
- }
- free(fields->values);
- free(fields);
-}
-
-
-/**
- * Add a new value to the end of an existing list.
- * \param fields The collection of fields.
- * \param index The index of the list to contain the new value.
- * \param value The value to add.
- */
-void fields_add_value(Fields fields, int index, const char* value)
-{
- assert(fields);
- assert(index >= 0 && index < fields->count);
- strings_add(fields->values[index], value);
-}
-
-
-/**
- * Retrieve the value of a string (single value) field.
- * \param fields The collection of fields.
- * \param index The index of the field to query.
- * \returns The field value if set, or NULL.
- */
-const char* fields_get_value(Fields fields, int index)
-{
- Strings values;
- assert(fields);
- assert(index >= 0 && index < fields->count);
-
- values = fields->values[index];
- if (strings_size(values) > 0)
- {
- return strings_item(values, 0);
- }
- else
- {
- return NULL;
- }
-}
-
-
-/**
- * Retrieve the list of values for a field.
- * \param fields The collection of fields.
- * \param index The index of fields to query.
- * \returns The list of values stored in the field.
- */
-Strings fields_get_values(Fields fields, int index)
-{
- assert(fields);
- assert(index >= 0 && index < fields->count);
- return fields->values[index];
-}
-
-
-/**
- * Sets the value of a string (single value) field.
- * \param fields The collection of fields.
- * \param index The index of the field to set.
- * \param value The new value of the field.
- */
-void fields_set_value(Fields fields, int index, const char* value)
-{
- Strings values;
-
- assert(fields);
- assert(index >= 0 && index < fields->count);
- assert(value);
-
- values = fields->values[index];
- if (strings_size(values) == 0)
- {
- strings_add(values, value);
- }
- else
- {
- strings_set(values, 0, value);
- }
-}
-
-
-/**
- * Sets the list of values associated with a field. The field will subsequently
- * "own" the list, and take responsibility to destroying it with the field set.
- * \param fields The collection of fields.
- * \param index The index of the field to set.
- * \param values The list of new values for the field.
- */
-void fields_set_values(Fields fields, int index, Strings values)
-{
- assert(fields);
- assert(index >= 0 && index < fields->count);
- assert(values);
-
- if (fields->values[index] != NULL)
- {
- strings_destroy(fields->values[index]);
- }
-
- fields->values[index] = values;
-}
+/**
+ * \file fields.c
+ * \brief Project object fields enumeration and handling.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include "premake.h"
+#include "fields.h"
+#include "base/strings.h"
+
+
+DEFINE_CLASS(Fields)
+{
+ Strings* values;
+ int count;
+};
+
+
+/**
+ * Create a new, empty collection of fields.
+ * \param info Metadata about the field collection.
+ * \returns A new collection of fields.
+ */
+Fields fields_create(struct FieldInfo* info)
+{
+ int i;
+ Fields fields;
+
+ assert(info);
+
+ fields = ALLOC_CLASS(Fields);
+
+ /* figure out how many fields are in the collection */
+ for (i = 0; info[i].name != NULL; ++i);
+ fields->count = i;
+
+ /* initialize the values */
+ fields->values = (Strings*)malloc(sizeof(Strings) * fields->count);
+ for (i = 0; i < fields->count; ++i)
+ {
+ fields->values[i] = strings_create();
+ }
+
+ return fields;
+}
+
+
+/**
+ * Destroy a collection of fields and release the associated memory.
+ * \param fields The collection of fields to destroy.
+ */
+void fields_destroy(Fields fields)
+{
+ int i;
+
+ assert(fields);
+
+ for (i = 0; i < fields->count; ++i)
+ {
+ strings_destroy(fields->values[i]);
+ }
+ free(fields->values);
+ free(fields);
+}
+
+
+/**
+ * Add a new value to the end of an existing list.
+ * \param fields The collection of fields.
+ * \param index The index of the list to contain the new value.
+ * \param value The value to add.
+ */
+void fields_add_value(Fields fields, int index, const char* value)
+{
+ assert(fields);
+ assert(index >= 0 && index < fields->count);
+ strings_add(fields->values[index], value);
+}
+
+
+/**
+ * Retrieve the value of a string (single value) field.
+ * \param fields The collection of fields.
+ * \param index The index of the field to query.
+ * \returns The field value if set, or NULL.
+ */
+const char* fields_get_value(Fields fields, int index)
+{
+ Strings values;
+ assert(fields);
+ assert(index >= 0 && index < fields->count);
+
+ values = fields->values[index];
+ if (strings_size(values) > 0)
+ {
+ return strings_item(values, 0);
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+
+/**
+ * Retrieve the list of values for a field.
+ * \param fields The collection of fields.
+ * \param index The index of fields to query.
+ * \returns The list of values stored in the field.
+ */
+Strings fields_get_values(Fields fields, int index)
+{
+ assert(fields);
+ assert(index >= 0 && index < fields->count);
+ return fields->values[index];
+}
+
+
+/**
+ * Sets the value of a string (single value) field.
+ * \param fields The collection of fields.
+ * \param index The index of the field to set.
+ * \param value The new value of the field.
+ */
+void fields_set_value(Fields fields, int index, const char* value)
+{
+ Strings values;
+
+ assert(fields);
+ assert(index >= 0 && index < fields->count);
+ assert(value);
+
+ values = fields->values[index];
+ if (strings_size(values) == 0)
+ {
+ strings_add(values, value);
+ }
+ else
+ {
+ strings_set(values, 0, value);
+ }
+}
+
+
+/**
+ * Sets the list of values associated with a field. The field will subsequently
+ * "own" the list, and take responsibility to destroying it with the field set.
+ * \param fields The collection of fields.
+ * \param index The index of the field to set.
+ * \param values The list of new values for the field.
+ */
+void fields_set_values(Fields fields, int index, Strings values)
+{
+ assert(fields);
+ assert(index >= 0 && index < fields->count);
+ assert(values);
+
+ if (fields->values[index] != NULL)
+ {
+ strings_destroy(fields->values[index]);
+ }
+
+ fields->values[index] = values;
+}
diff --git a/src/project/fields.h b/src/project/fields.h
index 645d5fa..1f4f416 100644
--- a/src/project/fields.h
+++ b/src/project/fields.h
@@ -1,58 +1,58 @@
-/**
- * \file fields.h
- * \brief Project object fields enumeration and handling.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- *
- * \addtogroup project
- * @{
- */
-#if !defined(PREMAKE_FIELDS_H)
-#define PREMAKE_FIELDS_H
-
-#include "base/strings.h"
-
-
-/**
- * Field types.
- */
-enum FieldKind
-{
- StringField,
- ListField,
- FilesField
-};
-
-
-/**
- * Field validation function signature.
- * \param value The value to validate.
- * \returns True if the value is considered valid.
- */
-typedef int (*FieldValidator)(const char* value);
-
-
-/**
- * Metadata about a project object field.
- */
-struct FieldInfo
-{
- const char* name; /**< The name of the field. */
- enum FieldKind kind; /**< StringField, ListField, etc. */
- FieldValidator validator; /**< The field validation function */
-};
-
-
-DECLARE_CLASS(Fields)
-
-
-Fields fields_create(struct FieldInfo* info);
-void fields_destroy(Fields fields);
-
-void fields_add_value(Fields fields, int index, const char* value);
-const char* fields_get_value(Fields fields, int index);
-Strings fields_get_values(Fields fields, int index);
-void fields_set_value(Fields fields, int index, const char* value);
-void fields_set_values(Fields fields, int index, Strings values);
-
-#endif
-/* @} */
+/**
+ * \file fields.h
+ * \brief Project object fields enumeration and handling.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ *
+ * \addtogroup project
+ * @{
+ */
+#if !defined(PREMAKE_FIELDS_H)
+#define PREMAKE_FIELDS_H
+
+#include "base/strings.h"
+
+
+/**
+ * Field types.
+ */
+enum FieldKind
+{
+ StringField,
+ ListField,
+ FilesField
+};
+
+
+/**
+ * Field validation function signature.
+ * \param value The value to validate.
+ * \returns True if the value is considered valid.
+ */
+typedef int (*FieldValidator)(const char* value);
+
+
+/**
+ * Metadata about a project object field.
+ */
+struct FieldInfo
+{
+ const char* name; /**< The name of the field. */
+ enum FieldKind kind; /**< StringField, ListField, etc. */
+ FieldValidator validator; /**< The field validation function */
+};
+
+
+DECLARE_CLASS(Fields)
+
+
+Fields fields_create(struct FieldInfo* info);
+void fields_destroy(Fields fields);
+
+void fields_add_value(Fields fields, int index, const char* value);
+const char* fields_get_value(Fields fields, int index);
+Strings fields_get_values(Fields fields, int index);
+void fields_set_value(Fields fields, int index, const char* value);
+void fields_set_values(Fields fields, int index, Strings values);
+
+#endif
+/* @} */
diff --git a/src/project/project.c b/src/project/project.c
index 1f8aae2..f8c1d6a 100644
--- a/src/project/project.c
+++ b/src/project/project.c
@@ -1,358 +1,358 @@
-/**
- * \file project.c
- * \brief The project class.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include "premake.h"
-#include "project/project.h"
-#include "project/solution.h"
-#include "base/buffers.h"
-#include "base/cstr.h"
-#include "base/guid.h"
-#include "base/path.h"
-#include "base/strings.h"
-#include "platform/platform.h"
-
-
-struct FieldInfo ProjectFieldInfo[] =
-{
- { "basedir", StringField, NULL },
- { "files", FilesField, NULL },
- { "guid", StringField, guid_is_valid },
- { "language", StringField, NULL },
- { "location", StringField, NULL },
- { "name", StringField, NULL },
- { 0, 0, NULL }
-};
-
-
-DEFINE_CLASS(Project)
-{
- Solution solution;
- Fields fields;
- const char* config_filter;
-};
-
-
-/**
- * Create and initialize a new project object.
- * \returns A new project object.
- */
-Project project_create()
-{
- Project prj = ALLOC_CLASS(Project);
- prj->solution = NULL;
- prj->fields = fields_create(ProjectFieldInfo);
- prj->config_filter = NULL;
- return prj;
-}
-
-
-/**
- * Destroy a project object and release the associated memory.
- * \param prj The project object to destroy.
- */
-void project_destroy(Project prj)
-{
- assert(prj);
- fields_destroy(prj->fields);
- free(prj);
-}
-
-
-/**
- * Get the base directory for the project; any properties containing relative
- * paths are relative to this location.
- * \param prj The project object to query.
- * \returns The base directory, or NULL if no directory has been set.
- */
-const char* project_get_base_dir(Project prj)
-{
- return project_get_value(prj, ProjectBaseDirectory);
-}
-
-
-/**
- * Retrieve the current configuration filter. All subsequent requests for configuration
- * values will return settings from this configuration only.
- * \param prj The project object to query.
- * \returns The current configuration filter, or NULL if no filter has been set.
- */
-const char* project_get_configuration_filter(Project prj)
-{
- assert(prj);
- return prj->config_filter;
-}
-
-
-/**
- * Retrieve the fields object for this solution; used to unload values from the script.
- */
-Fields project_get_fields(Project prj)
-{
- assert(prj);
- return prj->fields;
-}
-
-
-/**
- * Get the path to the project output file, using the provided file extension.
- * \param prj The project object to query.
- * \param basename The base filename; if NULL the project name will be used.
- * \param ext The file extension to be used on the filename; may be NULL.
- * \returns The path to the project file.
- */
-const char* project_get_filename(Project prj, const char* basename, const char* ext)
-{
- const char* base_dir;
- const char* location;
- const char* directory;
- const char* result;
-
- assert(prj);
-
- if (!basename)
- {
- basename = project_get_name(prj);
- }
-
-
- if (!ext)
- {
- ext = "";
- }
-
- base_dir = project_get_base_dir(prj);
- location = project_get_location(prj);
- directory = path_join(base_dir, location);
-
- result = path_assemble(directory, basename, ext);
- return result;
-}
-
-
-/**
- * Retrieve the list of source files associated with a project.
- */
-Strings project_get_files(Project prj)
-{
- assert(prj);
- return fields_get_values(prj->fields, ProjectFiles);
-}
-
-
-/**
- * Retrieve the GUID associated with a project.
- */
-const char* project_get_guid(Project prj)
-{
- assert(prj);
- return project_get_value(prj, ProjectGuid);
-}
-
-
-/**
- * Get the programming language used by the project.
- * \param prj The project object to query.
- * \returns The language used by the project, or NULL if no language has been set.
- */
-const char* project_get_language(Project prj)
-{
- const char* result = project_get_value(prj, ProjectLanguage);
- if (result == NULL && prj->solution != NULL)
- {
- result = solution_get_language(prj->solution);
- }
- return result;
-}
-
-
-/**
- * Retrieve the output location (the relative path from the base directory to the
- * target output directory) for this project.
- * \param prj The project object to modify.
- * \returns The project output location, or NULL if no location has been set.
- */
-const char* project_get_location(Project prj)
-{
- return project_get_value(prj, ProjectLocation);
-}
-
-
-/**
- * Get the name of the project.
- * \returns The name, if set, NULL otherwise.
- */
-const char* project_get_name(Project prj)
-{
- return project_get_value(prj, ProjectName);
-}
-
-
-/**
- * Retrieve the output filename for this project, taking into account platform-specific
- * naming conventions. For instance, for a project named "MyProject" this function would
- * return "MyProject.exe" on Windows. No path information is included, use the function
- * project_get_outdir() for that.
- */
-const char* project_get_outfile(Project prj)
-{
- char* buffer = buffers_next();
- strcpy(buffer, project_get_name(prj));
- if (platform_get() == Windows)
- {
- strcat(buffer, ".exe");
- }
- return buffer;
-}
-
-
-/**
- * Retrieve the solution associated with this project (internal).
- * \param prj The project to query.
- * \returns The associated solution, or NULL if no association has been made.
- */
-Solution project_get_solution(Project prj)
-{
- return prj->solution;
-}
-
-
-/**
- * Retrieve a string (single value) fields from a project, using the field indices.
- * \param prj The project object to query.
- * \param field The index of the field to query.
- * \returns The value of the field if set, of NULL.
- */
-const char* project_get_value(Project prj, enum ProjectField field)
-{
- assert(prj);
- return fields_get_value(prj->fields, field);
-}
-
-
-/**
- * Returns true if the specified language is recognized. Current valid language strings
- * are 'c', 'c++', and 'c#'.
- * \param language The language string.
- * \returns True if the language string is recognized.
- */
-int project_is_valid_language(const char* language)
-{
- return (cstr_eq(language, "c") ||
- cstr_eq(language, "c++") ||
- cstr_eq(language, "c#"));
-}
-
-
-/**
- * Set the base directory of the project.
- * \param prj The project object to modify.
- * \param base_dir The new base directory.
- */
-void project_set_base_dir(Project prj, const char* base_dir)
-{
- project_set_value(prj, ProjectBaseDirectory, base_dir);
-}
-
-
-/**
- * Set the current configuration filter. All subsequent requests for configuration
- * values will return settings from this configuration only.
- * \param prj The project object to query.
- * \param cfg_name The name of the configuration on which to filter.
- */
-void project_set_configuration_filter(Project prj, const char* cfg_name)
-{
- assert(prj);
- prj->config_filter = cfg_name;
-}
-
-
-/**
- * Set the GUID associated with a project. The GUID is required by the Visual
- * Studio generators, and must be unique per project.
- * \param prj The project to modify.
- * \param guid The new project GUID.
- */
-void project_set_guid(Project prj, const char* guid)
-{
- project_set_value(prj, ProjectGuid, guid);
-}
-
-
-/**
- * Set the programming language used by a project.
- * \param prj The project to modify.
- * \param language The programming language used by the project.
- */
-void project_set_language(Project prj, const char* language)
-{
- project_set_value(prj, ProjectLanguage, language);
-}
-
-
-/**
- * Set the output location (the relative path from the base directory to the
- * target output directory) for this project.
- * \param prj The project object to modify.
- * \param location The new output location.
- */
-void project_set_location(Project prj, const char* location)
-{
- project_set_value(prj, ProjectLocation, location);
-}
-
-
-/**
- * Set the name of the project.
- * \param prj The project object.
- * \param name The new for the project.
- */
-void project_set_name(Project prj, const char* name)
-{
- project_set_value(prj, ProjectName, name);
-}
-
-
-/**
- * Associate a solution with this project (internal).
- * \param prj The project to modify.
- * \param sln The solution to associate with this project.
- */
-void project_set_solution(Project prj, Solution sln)
-{
- assert(prj);
- prj->solution = sln;
-}
-
-
-/**
- * Set a string (single value) field on a project, using the field indices.
- * \param prj The project object.
- * \param field The field to set.
- * \param value The new value for the field.
- */
-void project_set_value(Project prj, enum ProjectField field, const char* value)
-{
- assert(prj);
- fields_set_value(prj->fields, field, value);
-}
-
-
-/**
- * Sets the list of values associated with a field. The field will subsequently
- * "own" the list, and take responsibility to destroying it with the field set.
- * \param prj The project object.
- * \param field The index of the field to set.
- * \param values The list of new values for the field.
- */
-void project_set_values(Project prj, enum ProjectField field, Strings values)
-{
- assert(prj);
- fields_set_values(prj->fields, field, values);
-}
+/**
+ * \file project.c
+ * \brief The project class.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include "premake.h"
+#include "project/project.h"
+#include "project/solution.h"
+#include "base/buffers.h"
+#include "base/cstr.h"
+#include "base/guid.h"
+#include "base/path.h"
+#include "base/strings.h"
+#include "platform/platform.h"
+
+
+struct FieldInfo ProjectFieldInfo[] =
+{
+ { "basedir", StringField, NULL },
+ { "files", FilesField, NULL },
+ { "guid", StringField, guid_is_valid },
+ { "language", StringField, NULL },
+ { "location", StringField, NULL },
+ { "name", StringField, NULL },
+ { 0, 0, NULL }
+};
+
+
+DEFINE_CLASS(Project)
+{
+ Solution solution;
+ Fields fields;
+ const char* config_filter;
+};
+
+
+/**
+ * Create and initialize a new project object.
+ * \returns A new project object.
+ */
+Project project_create()
+{
+ Project prj = ALLOC_CLASS(Project);
+ prj->solution = NULL;
+ prj->fields = fields_create(ProjectFieldInfo);
+ prj->config_filter = NULL;
+ return prj;
+}
+
+
+/**
+ * Destroy a project object and release the associated memory.
+ * \param prj The project object to destroy.
+ */
+void project_destroy(Project prj)
+{
+ assert(prj);
+ fields_destroy(prj->fields);
+ free(prj);
+}
+
+
+/**
+ * Get the base directory for the project; any properties containing relative
+ * paths are relative to this location.
+ * \param prj The project object to query.
+ * \returns The base directory, or NULL if no directory has been set.
+ */
+const char* project_get_base_dir(Project prj)
+{
+ return project_get_value(prj, ProjectBaseDirectory);
+}
+
+
+/**
+ * Retrieve the current configuration filter. All subsequent requests for configuration
+ * values will return settings from this configuration only.
+ * \param prj The project object to query.
+ * \returns The current configuration filter, or NULL if no filter has been set.
+ */
+const char* project_get_configuration_filter(Project prj)
+{
+ assert(prj);
+ return prj->config_filter;
+}
+
+
+/**
+ * Retrieve the fields object for this solution; used to unload values from the script.
+ */
+Fields project_get_fields(Project prj)
+{
+ assert(prj);
+ return prj->fields;
+}
+
+
+/**
+ * Get the path to the project output file, using the provided file extension.
+ * \param prj The project object to query.
+ * \param basename The base filename; if NULL the project name will be used.
+ * \param ext The file extension to be used on the filename; may be NULL.
+ * \returns The path to the project file.
+ */
+const char* project_get_filename(Project prj, const char* basename, const char* ext)
+{
+ const char* base_dir;
+ const char* location;
+ const char* directory;
+ const char* result;
+
+ assert(prj);
+
+ if (!basename)
+ {
+ basename = project_get_name(prj);
+ }
+
+
+ if (!ext)
+ {
+ ext = "";
+ }
+
+ base_dir = project_get_base_dir(prj);
+ location = project_get_location(prj);
+ directory = path_join(base_dir, location);
+
+ result = path_assemble(directory, basename, ext);
+ return result;
+}
+
+
+/**
+ * Retrieve the list of source files associated with a project.
+ */
+Strings project_get_files(Project prj)
+{
+ assert(prj);
+ return fields_get_values(prj->fields, ProjectFiles);
+}
+
+
+/**
+ * Retrieve the GUID associated with a project.
+ */
+const char* project_get_guid(Project prj)
+{
+ assert(prj);
+ return project_get_value(prj, ProjectGuid);
+}
+
+
+/**
+ * Get the programming language used by the project.
+ * \param prj The project object to query.
+ * \returns The language used by the project, or NULL if no language has been set.
+ */
+const char* project_get_language(Project prj)
+{
+ const char* result = project_get_value(prj, ProjectLanguage);
+ if (result == NULL && prj->solution != NULL)
+ {
+ result = solution_get_language(prj->solution);
+ }
+ return result;
+}
+
+
+/**
+ * Retrieve the output location (the relative path from the base directory to the
+ * target output directory) for this project.
+ * \param prj The project object to modify.
+ * \returns The project output location, or NULL if no location has been set.
+ */
+const char* project_get_location(Project prj)
+{
+ return project_get_value(prj, ProjectLocation);
+}
+
+
+/**
+ * Get the name of the project.
+ * \returns The name, if set, NULL otherwise.
+ */
+const char* project_get_name(Project prj)
+{
+ return project_get_value(prj, ProjectName);
+}
+
+
+/**
+ * Retrieve the output filename for this project, taking into account platform-specific
+ * naming conventions. For instance, for a project named "MyProject" this function would
+ * return "MyProject.exe" on Windows. No path information is included, use the function
+ * project_get_outdir() for that.
+ */
+const char* project_get_outfile(Project prj)
+{
+ char* buffer = buffers_next();
+ strcpy(buffer, project_get_name(prj));
+ if (platform_get() == Windows)
+ {
+ strcat(buffer, ".exe");
+ }
+ return buffer;
+}
+
+
+/**
+ * Retrieve the solution associated with this project (internal).
+ * \param prj The project to query.
+ * \returns The associated solution, or NULL if no association has been made.
+ */
+Solution project_get_solution(Project prj)
+{
+ return prj->solution;
+}
+
+
+/**
+ * Retrieve a string (single value) fields from a project, using the field indices.
+ * \param prj The project object to query.
+ * \param field The index of the field to query.
+ * \returns The value of the field if set, of NULL.
+ */
+const char* project_get_value(Project prj, enum ProjectField field)
+{
+ assert(prj);
+ return fields_get_value(prj->fields, field);
+}
+
+
+/**
+ * Returns true if the specified language is recognized. Current valid language strings
+ * are 'c', 'c++', and 'c#'.
+ * \param language The language string.
+ * \returns True if the language string is recognized.
+ */
+int project_is_valid_language(const char* language)
+{
+ return (cstr_eq(language, "c") ||
+ cstr_eq(language, "c++") ||
+ cstr_eq(language, "c#"));
+}
+
+
+/**
+ * Set the base directory of the project.
+ * \param prj The project object to modify.
+ * \param base_dir The new base directory.
+ */
+void project_set_base_dir(Project prj, const char* base_dir)
+{
+ project_set_value(prj, ProjectBaseDirectory, base_dir);
+}
+
+
+/**
+ * Set the current configuration filter. All subsequent requests for configuration
+ * values will return settings from this configuration only.
+ * \param prj The project object to query.
+ * \param cfg_name The name of the configuration on which to filter.
+ */
+void project_set_configuration_filter(Project prj, const char* cfg_name)
+{
+ assert(prj);
+ prj->config_filter = cfg_name;
+}
+
+
+/**
+ * Set the GUID associated with a project. The GUID is required by the Visual
+ * Studio generators, and must be unique per project.
+ * \param prj The project to modify.
+ * \param guid The new project GUID.
+ */
+void project_set_guid(Project prj, const char* guid)
+{
+ project_set_value(prj, ProjectGuid, guid);
+}
+
+
+/**
+ * Set the programming language used by a project.
+ * \param prj The project to modify.
+ * \param language The programming language used by the project.
+ */
+void project_set_language(Project prj, const char* language)
+{
+ project_set_value(prj, ProjectLanguage, language);
+}
+
+
+/**
+ * Set the output location (the relative path from the base directory to the
+ * target output directory) for this project.
+ * \param prj The project object to modify.
+ * \param location The new output location.
+ */
+void project_set_location(Project prj, const char* location)
+{
+ project_set_value(prj, ProjectLocation, location);
+}
+
+
+/**
+ * Set the name of the project.
+ * \param prj The project object.
+ * \param name The new for the project.
+ */
+void project_set_name(Project prj, const char* name)
+{
+ project_set_value(prj, ProjectName, name);
+}
+
+
+/**
+ * Associate a solution with this project (internal).
+ * \param prj The project to modify.
+ * \param sln The solution to associate with this project.
+ */
+void project_set_solution(Project prj, Solution sln)
+{
+ assert(prj);
+ prj->solution = sln;
+}
+
+
+/**
+ * Set a string (single value) field on a project, using the field indices.
+ * \param prj The project object.
+ * \param field The field to set.
+ * \param value The new value for the field.
+ */
+void project_set_value(Project prj, enum ProjectField field, const char* value)
+{
+ assert(prj);
+ fields_set_value(prj->fields, field, value);
+}
+
+
+/**
+ * Sets the list of values associated with a field. The field will subsequently
+ * "own" the list, and take responsibility to destroying it with the field set.
+ * \param prj The project object.
+ * \param field The index of the field to set.
+ * \param values The list of new values for the field.
+ */
+void project_set_values(Project prj, enum ProjectField field, Strings values)
+{
+ assert(prj);
+ fields_set_values(prj->fields, field, values);
+}
diff --git a/src/project/project.h b/src/project/project.h
index fa75dce..e8a96c1 100644
--- a/src/project/project.h
+++ b/src/project/project.h
@@ -1,64 +1,64 @@
-/**
- * \file project.h
- * \brief Project objects API.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- *
- * \defgroup project Project Objects
- *
- * Project objects: solutions, projects, and configurations.
- *
- * @{
- */
-#if !defined(PREMAKE_PROJECT_H)
-#define PREMAKE_PROJECT_H
-
-#include "fields.h"
-
-
-/**
- * Project field index.
- * \note If you modify this list, you must also update SolutionFieldInfo[].
- */
-enum ProjectField
-{
- ProjectBaseDirectory,
- ProjectFiles,
- ProjectGuid,
- ProjectLanguage,
- ProjectLocation,
- ProjectName,
- NumProjectFields
-};
-
-extern struct FieldInfo ProjectFieldInfo[];
-
-
-DECLARE_CLASS(Project)
-
-Project project_create(void);
-void project_destroy(Project prj);
-
-const char* project_get_base_dir(Project prj);
-const char* project_get_configuration_filter(Project prj);
-Fields project_get_fields(Project prj);
-const char* project_get_filename(Project prj, const char* basename, const char* ext);
-Strings project_get_files(Project prj);
-const char* project_get_guid(Project prj);
-const char* project_get_language(Project prj);
-const char* project_get_location(Project prj);
-const char* project_get_name(Project prj);
-const char* project_get_outfile(Project prj);
-const char* project_get_value(Project prj, enum ProjectField field);
-int project_is_valid_language(const char* language);
-void project_set_base_dir(Project prj, const char* base_dir);
-void project_set_configuration_filter(Project prj, const char* cfg_name);
-void project_set_guid(Project prj, const char* guid);
-void project_set_language(Project prj, const char* language);
-void project_set_location(Project prj, const char* location);
-void project_set_name(Project prj, const char* name);
-void project_set_value(Project prj, enum ProjectField field, const char* value);
-void project_set_values(Project prj, enum ProjectField field, Strings values);
-int project_tests(void);
-
-#endif
-/** @} */
+/**
+ * \file project.h
+ * \brief Project objects API.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ *
+ * \defgroup project Project Objects
+ *
+ * Project objects: solutions, projects, and configurations.
+ *
+ * @{
+ */
+#if !defined(PREMAKE_PROJECT_H)
+#define PREMAKE_PROJECT_H
+
+#include "fields.h"
+
+
+/**
+ * Project field index.
+ * \note If you modify this list, you must also update SolutionFieldInfo[].
+ */
+enum ProjectField
+{
+ ProjectBaseDirectory,
+ ProjectFiles,
+ ProjectGuid,
+ ProjectLanguage,
+ ProjectLocation,
+ ProjectName,
+ NumProjectFields
+};
+
+extern struct FieldInfo ProjectFieldInfo[];
+
+
+DECLARE_CLASS(Project)
+
+Project project_create(void);
+void project_destroy(Project prj);
+
+const char* project_get_base_dir(Project prj);
+const char* project_get_configuration_filter(Project prj);
+Fields project_get_fields(Project prj);
+const char* project_get_filename(Project prj, const char* basename, const char* ext);
+Strings project_get_files(Project prj);
+const char* project_get_guid(Project prj);
+const char* project_get_language(Project prj);
+const char* project_get_location(Project prj);
+const char* project_get_name(Project prj);
+const char* project_get_outfile(Project prj);
+const char* project_get_value(Project prj, enum ProjectField field);
+int project_is_valid_language(const char* language);
+void project_set_base_dir(Project prj, const char* base_dir);
+void project_set_configuration_filter(Project prj, const char* cfg_name);
+void project_set_guid(Project prj, const char* guid);
+void project_set_language(Project prj, const char* language);
+void project_set_location(Project prj, const char* location);
+void project_set_name(Project prj, const char* name);
+void project_set_value(Project prj, enum ProjectField field, const char* value);
+void project_set_values(Project prj, enum ProjectField field, Strings values);
+int project_tests(void);
+
+#endif
+/** @} */
diff --git a/src/project/solution.c b/src/project/solution.c
index c2e616a..c67a31c 100644
--- a/src/project/solution.c
+++ b/src/project/solution.c
@@ -1,330 +1,330 @@
-/**
- * \file solution.c
- * \brief The Solution class, representing the top-level container for projects.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include "premake.h"
-#include "project/solution.h"
-#include "project/project_internal.h"
-#include "base/array.h"
-#include "base/path.h"
-#include "base/strings.h"
-
-#include "base/string.h" /* <-- remove this? */
-
-
-struct FieldInfo SolutionFieldInfo[] =
-{
- { "basedir", StringField, NULL },
- { "configurations", ListField, NULL },
- { "language", StringField, project_is_valid_language },
- { "location", StringField, NULL },
- { "name", StringField, NULL },
- { 0, 0, NULL }
-};
-
-
-DEFINE_CLASS(Solution)
-{
- Fields fields;
- Array projects;
-};
-
-
-/**
- * Create and initialize a new solution object.
- * \returns A new solution object.
- */
-Solution solution_create()
-{
- Solution sln = ALLOC_CLASS(Solution);
- sln->fields = fields_create(SolutionFieldInfo);
- sln->projects = array_create();
- return sln;
-}
-
-
-/**
- * Destroy a solution object and release the associated memory.
- * \param sln The solution object to destroy.
- */
-void solution_destroy(Solution sln)
-{
- int i, n;
-
- assert(sln);
- fields_destroy(sln->fields);
-
- n = solution_num_projects(sln);
- for (i = 0; i < n; ++i)
- {
- Project prj = solution_get_project(sln, i);
- project_destroy(prj);
- }
- array_destroy(sln->projects);
-
- free(sln);
-}
-
-
-/**
- * Add a configuration name to a solution.
- * \param sln The solution to contain the project.
- * \param config_name The name of the configuration add.
- */
-void solution_add_config_name(Solution sln, const char* config_name)
-{
- assert(sln);
- assert(config_name);
- fields_add_value(sln->fields, SolutionConfigurations, config_name);
-}
-
-
-/**
- * Add a project to a solution.
- * \param sln The solution to contain the project.
- * \param prj The project to add.
- */
-void solution_add_project(Solution sln, Project prj)
-{
- assert(sln);
- assert(prj);
- array_add(sln->projects, prj);
- project_set_solution(prj, sln);
-}
-
-
-/**
- * Get the base directory for the solution; any properties containing relative
- * paths are relative to this location.
- * \param sln The solution object to query.
- * \returns The base directory, or NULL if no directory has been set.
- */
-const char* solution_get_base_dir(Solution sln)
-{
- return solution_get_value(sln, SolutionBaseDirectory);
-}
-
-
-/**
- * Get the configuration name at a given index.
- * \param sln The solution to query.
- * \param index The configuration index to query.
- * \returns The configuration name at the given index.
- */
-const char* solution_get_config_name(Solution sln, int index)
-{
- Strings names;
- const char* name;
- assert(sln);
- names = fields_get_values(sln->fields, SolutionConfigurations);
- name = strings_item(names, index);
- return name;
-}
-
-
-/**
- * Get the list of configuration names.
- * \param sln The solution to query.
- * \returns The configuration name at the given index.
- */
-Strings solution_get_config_names(Solution sln)
-{
- assert(sln);
- return fields_get_values(sln->fields, SolutionConfigurations);
-}
-
-
-/**
- * Retrieve the fields object for this solution; used to unload values from the script.
- */
-Fields solution_get_fields(Solution sln)
-{
- assert(sln);
- return sln->fields;
-}
-
-
-/**
- * Get the path to the solution output file, using the provided file extension.
- * \param sln The solution object to query.
- * \param basename The base filename; if NULL the solution name will be used.
- * \param ext The file extension to be used on the filename; may be NULL.
- * \returns The path to the solution file.
- */
-const char* solution_get_filename(Solution sln, const char* basename, const char* ext)
-{
- const char* base_dir;
- const char* location;
- const char* directory;
- const char* result;
-
- assert(sln);
-
- if (!basename)
- {
- basename = solution_get_name(sln);
- }
-
- if (!ext)
- {
- ext = "";
- }
-
- base_dir = solution_get_base_dir(sln);
- location = solution_get_location(sln);
- directory = path_join(base_dir, location);
-
- result = path_assemble(directory, basename, ext);
- return result;
-}
-
-
-/**
- * Get the programming language set globally for the solution.
- * \param sln The solution object to modify.
- * \returns The language set for the solution, or NULL if no language has been set.
- */
-const char* solution_get_language(Solution sln)
-{
- return solution_get_value(sln, SolutionLanguage);
-}
-
-
-/**
- * Retrieve the output location (the relative path from the base directory to the
- * target output directory) for this solution.
- * \param sln The solution object to modify.
- * \returns The solution output location, or NULL if no location has been set.
- */
-const char* solution_get_location(Solution sln)
-{
- return solution_get_value(sln, SolutionLocation);
-}
-
-
-/**
- * Get the name of the solution.
- * \returns The name, if set, NULL otherwise.
- */
-const char* solution_get_name(Solution sln)
-{
- return solution_get_value(sln, SolutionName);
-}
-
-
-/**
- * Retrieve a project from the solution.
- * \param sln The solution to query.
- * \param index The index of the project to retreive.
- * \returns The project at the given index within the solution.
- */
-Project solution_get_project(Solution sln, int index)
-{
- Project prj;
-
- assert(sln);
-
- prj = (Project)array_item(sln->projects, index);
- return prj;
-}
-
-
-/**
- * Retrieve a string (single value) fields from a solution, using the field indices.
- * \param sln The solution object to query.
- * \param field The index of the field to query.
- * \returns The value of the field if set, of NULL.
- */
-const char* solution_get_value(Solution sln, enum SolutionField field)
-{
- assert(sln);
- return fields_get_value(sln->fields, field);
-}
-
-
-/**
- * Return the number of configurations contained by this solution.
- * \param sln The solution to query.
- * \returns The number of configurations contained by the solution.
- */
-int solution_num_configs(Solution sln)
-{
- Strings names;
- assert(sln);
- names = fields_get_values(sln->fields, SolutionConfigurations);
- return strings_size(names);
-}
-
-
-/**
- * Return the number of projects contained by this solution.
- * \param sln The solution to query.
- * \returns The number of projects contained by the solution.
- */
-int solution_num_projects(Solution sln)
-{
- assert(sln);
- return array_size(sln->projects);
-}
-
-
-/**
- * Set the base directory of the solution.
- * \param sln The solution object to modify.
- * \param base_dir The new base directory.
- */
-void solution_set_base_dir(Solution sln, const char* base_dir)
-{
- solution_set_value(sln, SolutionBaseDirectory, base_dir);
-}
-
-
-/**
- * Set the global programming language for the solution.
- * \param sln The solution to modify.
- * \param language The programming language to set globally for the solution.
- */
-void solution_set_language(Solution sln, const char* language)
-{
- solution_set_value(sln, SolutionLanguage, language);
-}
-
-
-/*
- * Set the output location (the relative path from the base directory to the
- * target output directory) for this solution.
- * \param sln The solution object to modify.
- * \param location The new output location.
- */
-void solution_set_location(Solution sln, const char* location)
-{
- solution_set_value(sln, SolutionLocation, location);
-}
-
-
-/**
- * Set the name of the solution.
- * \param sln The solution object.
- * \param name The new for the solution.
- */
-void solution_set_name(Solution sln, const char* name)
-{
- solution_set_value(sln, SolutionName, name);
-}
-
-
-/**
- * Set a string (single value) field on a solution, using the field indices.
- * \param sln The solution object.
- * \param field The field to set.
- * \param value The new value for the field.
- */
-void solution_set_value(Solution sln, enum SolutionField field, const char* value)
-{
- assert(sln);
- fields_set_value(sln->fields, field, value);
-}
+/**
+ * \file solution.c
+ * \brief The Solution class, representing the top-level container for projects.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include "premake.h"
+#include "project/solution.h"
+#include "project/project_internal.h"
+#include "base/array.h"
+#include "base/path.h"
+#include "base/strings.h"
+
+#include "base/string.h" /* <-- remove this? */
+
+
+struct FieldInfo SolutionFieldInfo[] =
+{
+ { "basedir", StringField, NULL },
+ { "configurations", ListField, NULL },
+ { "language", StringField, project_is_valid_language },
+ { "location", StringField, NULL },
+ { "name", StringField, NULL },
+ { 0, 0, NULL }
+};
+
+
+DEFINE_CLASS(Solution)
+{
+ Fields fields;
+ Array projects;
+};
+
+
+/**
+ * Create and initialize a new solution object.
+ * \returns A new solution object.
+ */
+Solution solution_create()
+{
+ Solution sln = ALLOC_CLASS(Solution);
+ sln->fields = fields_create(SolutionFieldInfo);
+ sln->projects = array_create();
+ return sln;
+}
+
+
+/**
+ * Destroy a solution object and release the associated memory.
+ * \param sln The solution object to destroy.
+ */
+void solution_destroy(Solution sln)
+{
+ int i, n;
+
+ assert(sln);
+ fields_destroy(sln->fields);
+
+ n = solution_num_projects(sln);
+ for (i = 0; i < n; ++i)
+ {
+ Project prj = solution_get_project(sln, i);
+ project_destroy(prj);
+ }
+ array_destroy(sln->projects);
+
+ free(sln);
+}
+
+
+/**
+ * Add a configuration name to a solution.
+ * \param sln The solution to contain the project.
+ * \param config_name The name of the configuration add.
+ */
+void solution_add_config_name(Solution sln, const char* config_name)
+{
+ assert(sln);
+ assert(config_name);
+ fields_add_value(sln->fields, SolutionConfigurations, config_name);
+}
+
+
+/**
+ * Add a project to a solution.
+ * \param sln The solution to contain the project.
+ * \param prj The project to add.
+ */
+void solution_add_project(Solution sln, Project prj)
+{
+ assert(sln);
+ assert(prj);
+ array_add(sln->projects, prj);
+ project_set_solution(prj, sln);
+}
+
+
+/**
+ * Get the base directory for the solution; any properties containing relative
+ * paths are relative to this location.
+ * \param sln The solution object to query.
+ * \returns The base directory, or NULL if no directory has been set.
+ */
+const char* solution_get_base_dir(Solution sln)
+{
+ return solution_get_value(sln, SolutionBaseDirectory);
+}
+
+
+/**
+ * Get the configuration name at a given index.
+ * \param sln The solution to query.
+ * \param index The configuration index to query.
+ * \returns The configuration name at the given index.
+ */
+const char* solution_get_config_name(Solution sln, int index)
+{
+ Strings names;
+ const char* name;
+ assert(sln);
+ names = fields_get_values(sln->fields, SolutionConfigurations);
+ name = strings_item(names, index);
+ return name;
+}
+
+
+/**
+ * Get the list of configuration names.
+ * \param sln The solution to query.
+ * \returns The configuration name at the given index.
+ */
+Strings solution_get_config_names(Solution sln)
+{
+ assert(sln);
+ return fields_get_values(sln->fields, SolutionConfigurations);
+}
+
+
+/**
+ * Retrieve the fields object for this solution; used to unload values from the script.
+ */
+Fields solution_get_fields(Solution sln)
+{
+ assert(sln);
+ return sln->fields;
+}
+
+
+/**
+ * Get the path to the solution output file, using the provided file extension.
+ * \param sln The solution object to query.
+ * \param basename The base filename; if NULL the solution name will be used.
+ * \param ext The file extension to be used on the filename; may be NULL.
+ * \returns The path to the solution file.
+ */
+const char* solution_get_filename(Solution sln, const char* basename, const char* ext)
+{
+ const char* base_dir;
+ const char* location;
+ const char* directory;
+ const char* result;
+
+ assert(sln);
+
+ if (!basename)
+ {
+ basename = solution_get_name(sln);
+ }
+
+ if (!ext)
+ {
+ ext = "";
+ }
+
+ base_dir = solution_get_base_dir(sln);
+ location = solution_get_location(sln);
+ directory = path_join(base_dir, location);
+
+ result = path_assemble(directory, basename, ext);
+ return result;
+}
+
+
+/**
+ * Get the programming language set globally for the solution.
+ * \param sln The solution object to modify.
+ * \returns The language set for the solution, or NULL if no language has been set.
+ */
+const char* solution_get_language(Solution sln)
+{
+ return solution_get_value(sln, SolutionLanguage);
+}
+
+
+/**
+ * Retrieve the output location (the relative path from the base directory to the
+ * target output directory) for this solution.
+ * \param sln The solution object to modify.
+ * \returns The solution output location, or NULL if no location has been set.
+ */
+const char* solution_get_location(Solution sln)
+{
+ return solution_get_value(sln, SolutionLocation);
+}
+
+
+/**
+ * Get the name of the solution.
+ * \returns The name, if set, NULL otherwise.
+ */
+const char* solution_get_name(Solution sln)
+{
+ return solution_get_value(sln, SolutionName);
+}
+
+
+/**
+ * Retrieve a project from the solution.
+ * \param sln The solution to query.
+ * \param index The index of the project to retreive.
+ * \returns The project at the given index within the solution.
+ */
+Project solution_get_project(Solution sln, int index)
+{
+ Project prj;
+
+ assert(sln);
+
+ prj = (Project)array_item(sln->projects, index);
+ return prj;
+}
+
+
+/**
+ * Retrieve a string (single value) fields from a solution, using the field indices.
+ * \param sln The solution object to query.
+ * \param field The index of the field to query.
+ * \returns The value of the field if set, of NULL.
+ */
+const char* solution_get_value(Solution sln, enum SolutionField field)
+{
+ assert(sln);
+ return fields_get_value(sln->fields, field);
+}
+
+
+/**
+ * Return the number of configurations contained by this solution.
+ * \param sln The solution to query.
+ * \returns The number of configurations contained by the solution.
+ */
+int solution_num_configs(Solution sln)
+{
+ Strings names;
+ assert(sln);
+ names = fields_get_values(sln->fields, SolutionConfigurations);
+ return strings_size(names);
+}
+
+
+/**
+ * Return the number of projects contained by this solution.
+ * \param sln The solution to query.
+ * \returns The number of projects contained by the solution.
+ */
+int solution_num_projects(Solution sln)
+{
+ assert(sln);
+ return array_size(sln->projects);
+}
+
+
+/**
+ * Set the base directory of the solution.
+ * \param sln The solution object to modify.
+ * \param base_dir The new base directory.
+ */
+void solution_set_base_dir(Solution sln, const char* base_dir)
+{
+ solution_set_value(sln, SolutionBaseDirectory, base_dir);
+}
+
+
+/**
+ * Set the global programming language for the solution.
+ * \param sln The solution to modify.
+ * \param language The programming language to set globally for the solution.
+ */
+void solution_set_language(Solution sln, const char* language)
+{
+ solution_set_value(sln, SolutionLanguage, language);
+}
+
+
+/*
+ * Set the output location (the relative path from the base directory to the
+ * target output directory) for this solution.
+ * \param sln The solution object to modify.
+ * \param location The new output location.
+ */
+void solution_set_location(Solution sln, const char* location)
+{
+ solution_set_value(sln, SolutionLocation, location);
+}
+
+
+/**
+ * Set the name of the solution.
+ * \param sln The solution object.
+ * \param name The new for the solution.
+ */
+void solution_set_name(Solution sln, const char* name)
+{
+ solution_set_value(sln, SolutionName, name);
+}
+
+
+/**
+ * Set a string (single value) field on a solution, using the field indices.
+ * \param sln The solution object.
+ * \param field The field to set.
+ * \param value The new value for the field.
+ */
+void solution_set_value(Solution sln, enum SolutionField field, const char* value)
+{
+ assert(sln);
+ fields_set_value(sln->fields, field, value);
+}
diff --git a/src/project/solution.h b/src/project/solution.h
index 7ee7dff..47e674e 100644
--- a/src/project/solution.h
+++ b/src/project/solution.h
@@ -1,61 +1,61 @@
-/**
- * \file solution.h
- * \brief The Solution class, representing the top-level container for projects.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- *
- * \addtogroup project
- * @{
- */
-#if !defined(PREMAKE_SOLUTION_H)
-#define PREMAKE_SOLUTION_H
-
-#include "fields.h"
-#include "project.h"
-#include "base/strings.h"
-
-
-/**
- * Solution field index.
- * \note If you modify this list, you must also update SolutionFieldInfo[].
- */
-enum SolutionField
-{
- SolutionBaseDirectory,
- SolutionConfigurations,
- SolutionLanguage,
- SolutionLocation,
- SolutionName,
- NumSolutionFields
-};
-
-extern struct FieldInfo SolutionFieldInfo[];
-
-
-DECLARE_CLASS(Solution)
-
-Solution solution_create(void);
-void solution_destroy(Solution sln);
-
-void solution_add_config_name(Solution sln, const char* config_name);
-void solution_add_project(Solution sln, Project prj);
-const char* solution_get_base_dir(Solution sln);
-const char* solution_get_config_name(Solution sln, int index);
-Strings solution_get_config_names(Solution sln);
-Fields solution_get_fields(Solution sln);
-const char* solution_get_filename(Solution sln, const char* basename, const char* ext);
-const char* solution_get_language(Solution sln);
-const char* solution_get_location(Solution sln);
-const char* solution_get_name(Solution sln);
-Project solution_get_project(Solution sln, int index);
-const char* solution_get_value(Solution sln, enum SolutionField field);
-int solution_num_configs(Solution sln);
-int solution_num_projects(Solution sln);
-void solution_set_base_dir(Solution sln, const char* base_dir);
-void solution_set_language(Solution sln, const char* language);
-void solution_set_location(Solution sln, const char* location);
-void solution_set_name(Solution sln, const char* name);
-void solution_set_value(Solution sln, enum SolutionField field, const char* value);
-
-
-#endif
-/** @} */
+/**
+ * \file solution.h
+ * \brief The Solution class, representing the top-level container for projects.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ *
+ * \addtogroup project
+ * @{
+ */
+#if !defined(PREMAKE_SOLUTION_H)
+#define PREMAKE_SOLUTION_H
+
+#include "fields.h"
+#include "project.h"
+#include "base/strings.h"
+
+
+/**
+ * Solution field index.
+ * \note If you modify this list, you must also update SolutionFieldInfo[].
+ */
+enum SolutionField
+{
+ SolutionBaseDirectory,
+ SolutionConfigurations,
+ SolutionLanguage,
+ SolutionLocation,
+ SolutionName,
+ NumSolutionFields
+};
+
+extern struct FieldInfo SolutionFieldInfo[];
+
+
+DECLARE_CLASS(Solution)
+
+Solution solution_create(void);
+void solution_destroy(Solution sln);
+
+void solution_add_config_name(Solution sln, const char* config_name);
+void solution_add_project(Solution sln, Project prj);
+const char* solution_get_base_dir(Solution sln);
+const char* solution_get_config_name(Solution sln, int index);
+Strings solution_get_config_names(Solution sln);
+Fields solution_get_fields(Solution sln);
+const char* solution_get_filename(Solution sln, const char* basename, const char* ext);
+const char* solution_get_language(Solution sln);
+const char* solution_get_location(Solution sln);
+const char* solution_get_name(Solution sln);
+Project solution_get_project(Solution sln, int index);
+const char* solution_get_value(Solution sln, enum SolutionField field);
+int solution_num_configs(Solution sln);
+int solution_num_projects(Solution sln);
+void solution_set_base_dir(Solution sln, const char* base_dir);
+void solution_set_language(Solution sln, const char* language);
+void solution_set_location(Solution sln, const char* location);
+void solution_set_name(Solution sln, const char* name);
+void solution_set_value(Solution sln, enum SolutionField field, const char* value);
+
+
+#endif
+/** @} */
diff --git a/src/project/tests/fields_tests.cpp b/src/project/tests/fields_tests.cpp
index ef05136..8d50ba2 100644
--- a/src/project/tests/fields_tests.cpp
+++ b/src/project/tests/fields_tests.cpp
@@ -1,64 +1,64 @@
-/**
- * \file fields_tests.cpp
- * \brief Automated tests for the Fields class.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "project/fields.h"
-}
-
-enum TestFields
-{
- TestStringValue,
- TestListValue
-};
-
-static FieldInfo TestFieldInfo[] =
-{
- { "stringval", StringField },
- { "listval", ListField },
- { 0, StringField }
-};
-
-
-struct FxFields
-{
- Fields fields;
-
- FxFields()
- {
- fields = fields_create(TestFieldInfo);
- }
-
- ~FxFields()
- {
- fields_destroy(fields);
- }
-};
-
-
-SUITE(fields)
-{
- TEST_FIXTURE(FxFields, GetValue_ReturnsNull_OnUnsetString)
- {
- const char* result = fields_get_value(fields, TestStringValue);
- CHECK(result == NULL);
- }
-
- TEST_FIXTURE(FxFields, SetValue_CanRoundtrip)
- {
- fields_set_value(fields, TestStringValue, "String Value");
- const char* result = fields_get_value(fields, TestStringValue);
- CHECK_EQUAL("String Value", result);
- }
-
- TEST_FIXTURE(FxFields, SetValues_CanRoundtrip)
- {
- Strings values = strings_create();
- fields_set_values(fields, TestListValue, values);
- CHECK(values == fields_get_values(fields, TestListValue));
- }
-}
+/**
+ * \file fields_tests.cpp
+ * \brief Automated tests for the Fields class.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "project/fields.h"
+}
+
+enum TestFields
+{
+ TestStringValue,
+ TestListValue
+};
+
+static FieldInfo TestFieldInfo[] =
+{
+ { "stringval", StringField },
+ { "listval", ListField },
+ { 0, StringField }
+};
+
+
+struct FxFields
+{
+ Fields fields;
+
+ FxFields()
+ {
+ fields = fields_create(TestFieldInfo);
+ }
+
+ ~FxFields()
+ {
+ fields_destroy(fields);
+ }
+};
+
+
+SUITE(fields)
+{
+ TEST_FIXTURE(FxFields, GetValue_ReturnsNull_OnUnsetString)
+ {
+ const char* result = fields_get_value(fields, TestStringValue);
+ CHECK(result == NULL);
+ }
+
+ TEST_FIXTURE(FxFields, SetValue_CanRoundtrip)
+ {
+ fields_set_value(fields, TestStringValue, "String Value");
+ const char* result = fields_get_value(fields, TestStringValue);
+ CHECK_EQUAL("String Value", result);
+ }
+
+ TEST_FIXTURE(FxFields, SetValues_CanRoundtrip)
+ {
+ Strings values = strings_create();
+ fields_set_values(fields, TestListValue, values);
+ CHECK(values == fields_get_values(fields, TestListValue));
+ }
+}
diff --git a/src/project/tests/project_tests.cpp b/src/project/tests/project_tests.cpp
index 9e178c8..691bc5b 100644
--- a/src/project/tests/project_tests.cpp
+++ b/src/project/tests/project_tests.cpp
@@ -1,234 +1,234 @@
-/**
- * \file project_tests.cpp
- * \brief Automated tests for the project objects API.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "project/solution.h"
-#include "project/project.h"
-#include "project/project_internal.h"
-#include "platform/platform.h"
-}
-
-
-/**
- * \brief Run the project API automated tests.
- * \returns OKAY if all tests completed successfully.
- */
-int project_tests()
-{
- int status = tests_run_suite("fields");
- if (status == OKAY) status = tests_run_suite("project");
- return status;
-}
-
-
-struct FxProject
-{
- Solution sln;
- Project prj;
-
- FxProject()
- {
- sln = solution_create();
- prj = project_create();
- }
-
- ~FxProject()
- {
- project_destroy(prj);
- solution_destroy(sln);
- }
-};
-
-
-SUITE(project)
-{
- TEST_FIXTURE(FxProject, Create_ReturnsObject_OnSuccess)
- {
- CHECK(prj != NULL);
- }
-
-
- /**********************************************************************
- * Name tests
- **********************************************************************/
-
- TEST_FIXTURE(FxProject, GetName_ReturnsNull_OnStartup)
- {
- const char* name = project_get_name(prj);
- CHECK(name == NULL);
- }
-
- TEST_FIXTURE(FxProject, SetName_CanRoundtrip)
- {
- project_set_name(prj, "MyProject");
- const char* name = project_get_name(prj);
- CHECK_EQUAL("MyProject", name);
- }
-
-
- /**********************************************************************
- * Base directory tests
- **********************************************************************/
-
- TEST_FIXTURE(FxProject, GetBaseDir_ReturnsNull_OnStartup)
- {
- const char* result = project_get_base_dir(prj);
- CHECK(result == NULL);
- }
-
- TEST_FIXTURE(FxProject, SetBaseDir_CanRoundtrip)
- {
- project_set_base_dir(prj, "BaseDir");
- const char* result = project_get_base_dir(prj);
- CHECK_EQUAL("BaseDir", result);
- }
-
-
- /**********************************************************************
- * Configuration filter tests
- **********************************************************************/
-
- TEST_FIXTURE(FxProject, ConfigurationFilter_ReturnsNull_OnStartup)
- {
- const char* result = project_get_configuration_filter(prj);
- CHECK(result == NULL);
- }
-
- TEST_FIXTURE(FxProject, ConfigurationFilter_CanRoundtrip)
- {
- project_set_configuration_filter(prj, "Debug");
- const char* result = project_get_configuration_filter(prj);
- CHECK_EQUAL("Debug", result);
- }
-
-
- /**********************************************************************
- * GUID tests
- **********************************************************************/
-
- TEST_FIXTURE(FxProject, GetGuid_ReturnsNull_OnStartup)
- {
- const char* result = project_get_guid(prj);
- CHECK(result == NULL);
- }
-
- TEST_FIXTURE(FxProject, SetGuid_CanRoundtrip)
- {
- project_set_guid(prj, "AE2461B7-236F-4278-81D3-F0D476F9A4C0");
- const char* result = project_get_guid(prj);
- CHECK_EQUAL("AE2461B7-236F-4278-81D3-F0D476F9A4C0", result);
- }
-
-
- /**********************************************************************
- * Language tests
- **********************************************************************/
-
- TEST_FIXTURE(FxProject, GetLanguage_ReturnsNull_OnStartup)
- {
- const char* result = project_get_language(prj);
- CHECK(result == NULL);
- }
-
- TEST_FIXTURE(FxProject, SetLanguage_CanRoundtrip)
- {
- project_set_language(prj, "c++");
- const char* result = project_get_language(prj);
- CHECK_EQUAL("c++", result);
- }
-
- TEST_FIXTURE(FxProject, GetLanguage_ReturnsSolutionLanguage_OnNoProjectLanguage)
- {
- project_set_solution(prj, sln);
- solution_set_language(sln, "c#");
- const char* result = project_get_language(prj);
- CHECK_EQUAL("c#", result);
- }
-
-
- /**********************************************************************
- * Location tests
- **********************************************************************/
-
- TEST_FIXTURE(FxProject, GetLocation_ReturnsNull_OnStartup)
- {
- const char* result = project_get_location(prj);
- CHECK(result == NULL);
- }
-
- TEST_FIXTURE(FxProject, SetLocation_CanRoundtrip)
- {
- project_set_location(prj, "Location");
- const char* result = project_get_location(prj);
- CHECK_EQUAL("Location", result);
- }
-
-
- /**********************************************************************
- * Filename tests
- **********************************************************************/
-
- TEST_FIXTURE(FxProject, GetFilename_ReturnsFullPath_OnNoLocation)
- {
- project_set_name(prj, "MyProject");
- project_set_base_dir(prj, "/BaseDir");
- const char* filename = project_get_filename(prj, NULL, ".xyz");
- CHECK_EQUAL("/BaseDir/MyProject.xyz", filename);
- }
-
- TEST_FIXTURE(FxProject, GetFilename_ReturnsFullPath_OnLocation)
- {
- project_set_name(prj, "MyProject");
- project_set_base_dir(prj, "/BaseDir");
- project_set_location(prj, "Location");
- const char* filename = project_get_filename(prj, NULL, ".xyz");
- CHECK_EQUAL("/BaseDir/Location/MyProject.xyz", filename);
- }
-
-
-
- /**********************************************************************
- * Output file tests
- **********************************************************************/
-
- TEST_FIXTURE(FxProject, GetOutFile_ReturnsProjectName_OnNoTargetAndNotWindows)
- {
- platform_set(MacOSX);
- project_set_name(prj, "MyProject");
- const char* result = project_get_outfile(prj);
- CHECK_EQUAL("MyProject", result);
- }
-
- TEST_FIXTURE(FxProject, GetOutFile_AddsExe_OnNoTargetAndWindows)
- {
- platform_set(Windows);
- project_set_name(prj, "MyProject");
- const char* result = project_get_outfile(prj);
- CHECK_EQUAL("MyProject.exe", result);
- }
-
-
- /**********************************************************************
- * Solution tests
- **********************************************************************/
-
- TEST_FIXTURE(FxProject, GetSolution_ReturnsNull_OnStartup)
- {
- Solution result = project_get_solution(prj);
- CHECK(result == NULL);
- }
-
- TEST_FIXTURE(FxProject, SetSolution_CanRoundtrip)
- {
- project_set_solution(prj, sln);
- CHECK(sln == project_get_solution(prj));
- }
-
-}
-
-
+/**
+ * \file project_tests.cpp
+ * \brief Automated tests for the project objects API.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "project/solution.h"
+#include "project/project.h"
+#include "project/project_internal.h"
+#include "platform/platform.h"
+}
+
+
+/**
+ * \brief Run the project API automated tests.
+ * \returns OKAY if all tests completed successfully.
+ */
+int project_tests()
+{
+ int status = tests_run_suite("fields");
+ if (status == OKAY) status = tests_run_suite("project");
+ return status;
+}
+
+
+struct FxProject
+{
+ Solution sln;
+ Project prj;
+
+ FxProject()
+ {
+ sln = solution_create();
+ prj = project_create();
+ }
+
+ ~FxProject()
+ {
+ project_destroy(prj);
+ solution_destroy(sln);
+ }
+};
+
+
+SUITE(project)
+{
+ TEST_FIXTURE(FxProject, Create_ReturnsObject_OnSuccess)
+ {
+ CHECK(prj != NULL);
+ }
+
+
+ /**********************************************************************
+ * Name tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxProject, GetName_ReturnsNull_OnStartup)
+ {
+ const char* name = project_get_name(prj);
+ CHECK(name == NULL);
+ }
+
+ TEST_FIXTURE(FxProject, SetName_CanRoundtrip)
+ {
+ project_set_name(prj, "MyProject");
+ const char* name = project_get_name(prj);
+ CHECK_EQUAL("MyProject", name);
+ }
+
+
+ /**********************************************************************
+ * Base directory tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxProject, GetBaseDir_ReturnsNull_OnStartup)
+ {
+ const char* result = project_get_base_dir(prj);
+ CHECK(result == NULL);
+ }
+
+ TEST_FIXTURE(FxProject, SetBaseDir_CanRoundtrip)
+ {
+ project_set_base_dir(prj, "BaseDir");
+ const char* result = project_get_base_dir(prj);
+ CHECK_EQUAL("BaseDir", result);
+ }
+
+
+ /**********************************************************************
+ * Configuration filter tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxProject, ConfigurationFilter_ReturnsNull_OnStartup)
+ {
+ const char* result = project_get_configuration_filter(prj);
+ CHECK(result == NULL);
+ }
+
+ TEST_FIXTURE(FxProject, ConfigurationFilter_CanRoundtrip)
+ {
+ project_set_configuration_filter(prj, "Debug");
+ const char* result = project_get_configuration_filter(prj);
+ CHECK_EQUAL("Debug", result);
+ }
+
+
+ /**********************************************************************
+ * GUID tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxProject, GetGuid_ReturnsNull_OnStartup)
+ {
+ const char* result = project_get_guid(prj);
+ CHECK(result == NULL);
+ }
+
+ TEST_FIXTURE(FxProject, SetGuid_CanRoundtrip)
+ {
+ project_set_guid(prj, "AE2461B7-236F-4278-81D3-F0D476F9A4C0");
+ const char* result = project_get_guid(prj);
+ CHECK_EQUAL("AE2461B7-236F-4278-81D3-F0D476F9A4C0", result);
+ }
+
+
+ /**********************************************************************
+ * Language tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxProject, GetLanguage_ReturnsNull_OnStartup)
+ {
+ const char* result = project_get_language(prj);
+ CHECK(result == NULL);
+ }
+
+ TEST_FIXTURE(FxProject, SetLanguage_CanRoundtrip)
+ {
+ project_set_language(prj, "c++");
+ const char* result = project_get_language(prj);
+ CHECK_EQUAL("c++", result);
+ }
+
+ TEST_FIXTURE(FxProject, GetLanguage_ReturnsSolutionLanguage_OnNoProjectLanguage)
+ {
+ project_set_solution(prj, sln);
+ solution_set_language(sln, "c#");
+ const char* result = project_get_language(prj);
+ CHECK_EQUAL("c#", result);
+ }
+
+
+ /**********************************************************************
+ * Location tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxProject, GetLocation_ReturnsNull_OnStartup)
+ {
+ const char* result = project_get_location(prj);
+ CHECK(result == NULL);
+ }
+
+ TEST_FIXTURE(FxProject, SetLocation_CanRoundtrip)
+ {
+ project_set_location(prj, "Location");
+ const char* result = project_get_location(prj);
+ CHECK_EQUAL("Location", result);
+ }
+
+
+ /**********************************************************************
+ * Filename tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxProject, GetFilename_ReturnsFullPath_OnNoLocation)
+ {
+ project_set_name(prj, "MyProject");
+ project_set_base_dir(prj, "/BaseDir");
+ const char* filename = project_get_filename(prj, NULL, ".xyz");
+ CHECK_EQUAL("/BaseDir/MyProject.xyz", filename);
+ }
+
+ TEST_FIXTURE(FxProject, GetFilename_ReturnsFullPath_OnLocation)
+ {
+ project_set_name(prj, "MyProject");
+ project_set_base_dir(prj, "/BaseDir");
+ project_set_location(prj, "Location");
+ const char* filename = project_get_filename(prj, NULL, ".xyz");
+ CHECK_EQUAL("/BaseDir/Location/MyProject.xyz", filename);
+ }
+
+
+
+ /**********************************************************************
+ * Output file tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxProject, GetOutFile_ReturnsProjectName_OnNoTargetAndNotWindows)
+ {
+ platform_set(MacOSX);
+ project_set_name(prj, "MyProject");
+ const char* result = project_get_outfile(prj);
+ CHECK_EQUAL("MyProject", result);
+ }
+
+ TEST_FIXTURE(FxProject, GetOutFile_AddsExe_OnNoTargetAndWindows)
+ {
+ platform_set(Windows);
+ project_set_name(prj, "MyProject");
+ const char* result = project_get_outfile(prj);
+ CHECK_EQUAL("MyProject.exe", result);
+ }
+
+
+ /**********************************************************************
+ * Solution tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxProject, GetSolution_ReturnsNull_OnStartup)
+ {
+ Solution result = project_get_solution(prj);
+ CHECK(result == NULL);
+ }
+
+ TEST_FIXTURE(FxProject, SetSolution_CanRoundtrip)
+ {
+ project_set_solution(prj, sln);
+ CHECK(sln == project_get_solution(prj));
+ }
+
+}
+
+
diff --git a/src/project/tests/solution_tests.cpp b/src/project/tests/solution_tests.cpp
index 12510d6..e7023c9 100644
--- a/src/project/tests/solution_tests.cpp
+++ b/src/project/tests/solution_tests.cpp
@@ -1,206 +1,206 @@
-/**
- * \file solution_tests.cpp
- * \brief Automated tests for the Solution class.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "project/solution.h"
-#include "project/project.h"
-#include "project/project_internal.h"
-#include "base/strings.h"
-}
-
-
-struct FxSolution
-{
- Solution sln;
-
- FxSolution()
- {
- sln = solution_create();
- }
-
- ~FxSolution()
- {
- if (sln)
- solution_destroy(sln);
- }
-};
-
-
-SUITE(project)
-{
- TEST_FIXTURE(FxSolution, Create_ReturnsObject_OnSuccess)
- {
- CHECK(sln != NULL);
- }
-
-
- /**********************************************************************
- * Name tests
- **********************************************************************/
-
- TEST_FIXTURE(FxSolution, GetName_ReturnsNull_OnStartup)
- {
- const char* name = solution_get_name(sln);
- CHECK(name == NULL);
- }
-
- TEST_FIXTURE(FxSolution, SetName_CanRoundtrip)
- {
- solution_set_name(sln, "MySolution");
- const char* name = solution_get_name(sln);
- CHECK_EQUAL("MySolution", name);
- }
-
-
- /**********************************************************************
- * Base directory tests
- **********************************************************************/
-
- TEST_FIXTURE(FxSolution, GetBaseDir_ReturnsNull_OnStartup)
- {
- const char* result = solution_get_base_dir(sln);
- CHECK(result == NULL);
- }
-
- TEST_FIXTURE(FxSolution, SetBaseDir_CanRoundtrip)
- {
- solution_set_base_dir(sln, "BaseDir");
- const char* result = solution_get_base_dir(sln);
- CHECK_EQUAL("BaseDir", result);
- }
-
-
- /**********************************************************************
- * Configuration containment tests
- **********************************************************************/
-
- TEST_FIXTURE(FxSolution, NumConfigs_IsZero_OnStartup)
- {
- int result = solution_num_configs(sln);
- CHECK(result == 0);
- }
-
- TEST_FIXTURE(FxSolution, AddConfig_IncrementsNumConfigs)
- {
- solution_add_config_name(sln, "Debug");
- int result = solution_num_configs(sln);
- CHECK(result == 1);
- }
-
- TEST_FIXTURE(FxSolution, AddConfig_CanRoundtrip)
- {
- solution_add_config_name(sln, "Debug");
- const char* result = solution_get_config_name(sln, 0);
- CHECK_EQUAL("Debug", result);
- }
-
- TEST_FIXTURE(FxSolution, GetConfigs_ReturnsEmptyList_OnStartup)
- {
- Strings result = solution_get_config_names(sln);
- CHECK(strings_size(result) == 0);
- }
-
- TEST_FIXTURE(FxSolution, GetConfigs_ReturnsList_OnItemsAdded)
- {
- solution_add_config_name(sln, "Debug");
- Strings result = solution_get_config_names(sln);
- CHECK_EQUAL("Debug", strings_item(result, 0));
- }
-
-
- /**********************************************************************
- * Language tests
- **********************************************************************/
-
- TEST_FIXTURE(FxSolution, GetLanguage_ReturnsNull_OnStartup)
- {
- const char* result = solution_get_language(sln);
- CHECK(result == NULL);
- }
-
- TEST_FIXTURE(FxSolution, SetLanguage_CanRoundtrip)
- {
- solution_set_language(sln, "c++");
- const char* result = solution_get_language(sln);
- CHECK_EQUAL("c++", result);
- }
-
-
- /**********************************************************************
- * Location tests
- **********************************************************************/
-
- TEST_FIXTURE(FxSolution, GetLocation_ReturnsNull_OnStartup)
- {
- const char* result = solution_get_location(sln);
- CHECK(result == NULL);
- }
-
- TEST_FIXTURE(FxSolution, SetLocation_CanRoundtrip)
- {
- solution_set_location(sln, "Location");
- const char* result = solution_get_location(sln);
- CHECK_EQUAL("Location", result);
- }
-
-
- /**********************************************************************
- * Filename tests
- **********************************************************************/
-
- TEST_FIXTURE(FxSolution, GetFilename_ReturnsFullPath_OnNoLocation)
- {
- solution_set_name(sln, "MySolution");
- solution_set_base_dir(sln, "/BaseDir");
- const char* filename = solution_get_filename(sln, NULL, ".xyz");
- CHECK_EQUAL("/BaseDir/MySolution.xyz", filename);
- }
-
- TEST_FIXTURE(FxSolution, GetFilename_ReturnsFullPath_OnLocation)
- {
- solution_set_name(sln, "MySolution");
- solution_set_base_dir(sln, "/BaseDir");
- solution_set_location(sln, "Location");
- const char* filename = solution_get_filename(sln, NULL, ".xyz");
- CHECK_EQUAL("/BaseDir/Location/MySolution.xyz", filename);
- }
-
-
- /**********************************************************************
- * Project containment tests
- **********************************************************************/
-
- TEST_FIXTURE(FxSolution, NumProjects_IsZero_OnStartup)
- {
- int result = solution_num_projects(sln);
- CHECK(result == 0);
- }
-
- TEST_FIXTURE(FxSolution, AddProject_IncrementsNumProjects)
- {
- Project prj = project_create();
- solution_add_project(sln, prj);
- int result = solution_num_projects(sln);
- CHECK(result == 1);
- }
-
- TEST_FIXTURE(FxSolution, AddProject_CanRoundtrip)
- {
- Project prj = project_create();
- solution_add_project(sln, prj);
- Project result = solution_get_project(sln, 0);
- CHECK(prj == result);
- }
-
- TEST_FIXTURE(FxSolution, AddProject_SetsProjectSolution)
- {
- Project prj = project_create();
- solution_add_project(sln, prj);
- CHECK(sln == project_get_solution(prj));
- }
-}
+/**
+ * \file solution_tests.cpp
+ * \brief Automated tests for the Solution class.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "project/solution.h"
+#include "project/project.h"
+#include "project/project_internal.h"
+#include "base/strings.h"
+}
+
+
+struct FxSolution
+{
+ Solution sln;
+
+ FxSolution()
+ {
+ sln = solution_create();
+ }
+
+ ~FxSolution()
+ {
+ if (sln)
+ solution_destroy(sln);
+ }
+};
+
+
+SUITE(project)
+{
+ TEST_FIXTURE(FxSolution, Create_ReturnsObject_OnSuccess)
+ {
+ CHECK(sln != NULL);
+ }
+
+
+ /**********************************************************************
+ * Name tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxSolution, GetName_ReturnsNull_OnStartup)
+ {
+ const char* name = solution_get_name(sln);
+ CHECK(name == NULL);
+ }
+
+ TEST_FIXTURE(FxSolution, SetName_CanRoundtrip)
+ {
+ solution_set_name(sln, "MySolution");
+ const char* name = solution_get_name(sln);
+ CHECK_EQUAL("MySolution", name);
+ }
+
+
+ /**********************************************************************
+ * Base directory tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxSolution, GetBaseDir_ReturnsNull_OnStartup)
+ {
+ const char* result = solution_get_base_dir(sln);
+ CHECK(result == NULL);
+ }
+
+ TEST_FIXTURE(FxSolution, SetBaseDir_CanRoundtrip)
+ {
+ solution_set_base_dir(sln, "BaseDir");
+ const char* result = solution_get_base_dir(sln);
+ CHECK_EQUAL("BaseDir", result);
+ }
+
+
+ /**********************************************************************
+ * Configuration containment tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxSolution, NumConfigs_IsZero_OnStartup)
+ {
+ int result = solution_num_configs(sln);
+ CHECK(result == 0);
+ }
+
+ TEST_FIXTURE(FxSolution, AddConfig_IncrementsNumConfigs)
+ {
+ solution_add_config_name(sln, "Debug");
+ int result = solution_num_configs(sln);
+ CHECK(result == 1);
+ }
+
+ TEST_FIXTURE(FxSolution, AddConfig_CanRoundtrip)
+ {
+ solution_add_config_name(sln, "Debug");
+ const char* result = solution_get_config_name(sln, 0);
+ CHECK_EQUAL("Debug", result);
+ }
+
+ TEST_FIXTURE(FxSolution, GetConfigs_ReturnsEmptyList_OnStartup)
+ {
+ Strings result = solution_get_config_names(sln);
+ CHECK(strings_size(result) == 0);
+ }
+
+ TEST_FIXTURE(FxSolution, GetConfigs_ReturnsList_OnItemsAdded)
+ {
+ solution_add_config_name(sln, "Debug");
+ Strings result = solution_get_config_names(sln);
+ CHECK_EQUAL("Debug", strings_item(result, 0));
+ }
+
+
+ /**********************************************************************
+ * Language tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxSolution, GetLanguage_ReturnsNull_OnStartup)
+ {
+ const char* result = solution_get_language(sln);
+ CHECK(result == NULL);
+ }
+
+ TEST_FIXTURE(FxSolution, SetLanguage_CanRoundtrip)
+ {
+ solution_set_language(sln, "c++");
+ const char* result = solution_get_language(sln);
+ CHECK_EQUAL("c++", result);
+ }
+
+
+ /**********************************************************************
+ * Location tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxSolution, GetLocation_ReturnsNull_OnStartup)
+ {
+ const char* result = solution_get_location(sln);
+ CHECK(result == NULL);
+ }
+
+ TEST_FIXTURE(FxSolution, SetLocation_CanRoundtrip)
+ {
+ solution_set_location(sln, "Location");
+ const char* result = solution_get_location(sln);
+ CHECK_EQUAL("Location", result);
+ }
+
+
+ /**********************************************************************
+ * Filename tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxSolution, GetFilename_ReturnsFullPath_OnNoLocation)
+ {
+ solution_set_name(sln, "MySolution");
+ solution_set_base_dir(sln, "/BaseDir");
+ const char* filename = solution_get_filename(sln, NULL, ".xyz");
+ CHECK_EQUAL("/BaseDir/MySolution.xyz", filename);
+ }
+
+ TEST_FIXTURE(FxSolution, GetFilename_ReturnsFullPath_OnLocation)
+ {
+ solution_set_name(sln, "MySolution");
+ solution_set_base_dir(sln, "/BaseDir");
+ solution_set_location(sln, "Location");
+ const char* filename = solution_get_filename(sln, NULL, ".xyz");
+ CHECK_EQUAL("/BaseDir/Location/MySolution.xyz", filename);
+ }
+
+
+ /**********************************************************************
+ * Project containment tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxSolution, NumProjects_IsZero_OnStartup)
+ {
+ int result = solution_num_projects(sln);
+ CHECK(result == 0);
+ }
+
+ TEST_FIXTURE(FxSolution, AddProject_IncrementsNumProjects)
+ {
+ Project prj = project_create();
+ solution_add_project(sln, prj);
+ int result = solution_num_projects(sln);
+ CHECK(result == 1);
+ }
+
+ TEST_FIXTURE(FxSolution, AddProject_CanRoundtrip)
+ {
+ Project prj = project_create();
+ solution_add_project(sln, prj);
+ Project result = solution_get_project(sln, 0);
+ CHECK(prj == result);
+ }
+
+ TEST_FIXTURE(FxSolution, AddProject_SetsProjectSolution)
+ {
+ Project prj = project_create();
+ solution_add_project(sln, prj);
+ CHECK(sln == project_get_solution(prj));
+ }
+}
diff --git a/src/script/fn_accessor.c b/src/script/fn_accessor.c
index 840731e..858c51f 100644
--- a/src/script/fn_accessor.c
+++ b/src/script/fn_accessor.c
@@ -1,229 +1,226 @@
-/**
- * \file fn_accessor.c
- * \brief A generic getter/setter for project fields.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_internal.h"
-#include "base/cstr.h"
-#include "base/error.h"
-
-
-static int fn_accessor(lua_State* L);
-static int fn_accessor_object_has_field(struct FieldInfo* fields, const char* field_name);
-static int fn_accessor_register(lua_State* L, struct FieldInfo* fields);
-static int fn_accessor_register_field(lua_State* L, struct FieldInfo* field);
-static int fn_accessor_set_string_value(lua_State* L, struct FieldInfo* field);
-static int fn_accessor_set_list_value(lua_State* L, struct FieldInfo* field);
-static void fn_accessor_append_value(lua_State* L, struct FieldInfo* field, int tbl, int idx);
-
-
-/**
- * Using the field information lists for each of the project objects (solution, project,
- * and configuration) register accessor functions in the script environment. Examples of
- * accessor functions include location(), language(), kind(), and so on; function that
- * get and set the project object properties.
- * \returns OKAY if successful.
- */
-int fn_accessor_register_all(lua_State* L)
-{
- int z = OKAY;
- if (z == OKAY) z = fn_accessor_register(L, SolutionFieldInfo);
- if (z == OKAY) z = fn_accessor_register(L, ProjectFieldInfo);
- return z;
-}
-
-
-/**
- * Register the accessor functions for a particular set of fields.
- * \returns OKAY if successful.
- */
-static int fn_accessor_register(lua_State* L, struct FieldInfo* fields)
-{
- int i, z = OKAY;
-
- for (i = 0; z == OKAY && fields[i].name != NULL; ++i)
- {
- z = fn_accessor_register_field(L, &fields[i]);
- }
-
- return z;
-}
-
-
-/**
- * Register a single accessor function.
- * \returns OKAY if successful.
- */
-static int fn_accessor_register_field(lua_State* L, struct FieldInfo* field)
-{
- int container_type, z;
-
- /* has this accessor already been registered? This will happen if two object
- * types (ie. solution and project) define the same property. If so, skip it */
- lua_getglobal(L, field->name);
- z = lua_isnil(L, -1);
- lua_pop(L, 1);
- if (!z) return OKAY;
-
- /* figure out what object types this accessor applies to; may be more than one */
- container_type = 0;
- if (fn_accessor_object_has_field(SolutionFieldInfo, field->name)) container_type |= SolutionObject;
- if (fn_accessor_object_has_field(ProjectFieldInfo, field->name)) container_type |= ProjectObject;
-
- /* register the accessor function */
- lua_pushnumber(L, container_type);
- lua_pushlightuserdata(L, field);
- lua_pushcclosure(L, fn_accessor, 2);
- lua_setglobal(L, field->name);
- return OKAY;
-}
-
-
-/**
- * Determine if a field list contains a field with a particular name.
- * \returns True if the field is contained by the list.
- */
-static int fn_accessor_object_has_field(struct FieldInfo* fields, const char* field_name)
-{
- int i;
- for (i = 0; fields[i].name != NULL; ++i)
- {
- if (cstr_eq(fields[i].name, field_name))
- return 1;
- }
- return 0;
-}
-
-
-/**
- * The accessor script function; all of the individually registered accessors
- * (location(), language(), etc.) point to here, and this is where all of the
- * work gets done to get or set an object property or list.
- * \returns The current value of the field.
- */
-static int fn_accessor(lua_State* L)
-{
- struct FieldInfo* field;
- int container_type;
-
- /* get the required container object */
- container_type = lua_tointeger(L, lua_upvalueindex(1));
- if (!script_internal_get_active_object(L, container_type, REQUIRED))
- {
- return 0;
- }
-
- /* get information about the field being accessed */
- field = (struct FieldInfo*)lua_touserdata(L, lua_upvalueindex(2));
-
- /* if a value is provided, set the field */
- if (lua_gettop(L) > 1)
- {
- if (field->kind == StringField)
- {
- fn_accessor_set_string_value(L, field);
- }
- else
- {
- fn_accessor_set_list_value(L, field);
- }
- }
-
- /* return the current value of the field */
- lua_getfield(L, -1, field->name);
- return 1;
-}
-
-
-/**
- * Sets a string field to the value on the bottom of the Lua stack.
- * \returns OKAY if successful.
- */
-static int fn_accessor_set_string_value(lua_State* L, struct FieldInfo* field)
-{
- /* can't set lists to simple fields */
- if (lua_istable(L, 1))
- {
- luaL_error(L, "the field '%s' does not support lists of values", field->name);
- return !OKAY;
- }
-
- /* if a validator function is present, call it */
- if (field->validator != NULL)
- {
- const char* value = luaL_checkstring(L, 1);
- if (!field->validator(value))
- {
- luaL_error(L, "invalid value '%s'", value);
- return !OKAY;
- }
- }
-
- /* set the field */
- lua_pushvalue(L, 1);
- lua_setfield(L, -2, field->name);
- return OKAY;
-}
-
-
-/**
- * Appends the value or list at the bottom of the Lua stack to the specified list field.
- * \returns OKAY if successful.
- */
-static int fn_accessor_set_list_value(lua_State* L, struct FieldInfo* field)
-{
- /* get the current value of the field */
- lua_getfield(L, -1, field->name);
-
- /* move the values into the field */
- fn_accessor_append_value(L, field, lua_gettop(L), 1);
-
- /* remove the field value from the stack */
- lua_pop(L, 1);
- return OKAY;
-}
-
-
-/**
- * Append a value to table. If the value is itself a table, it is "flattened" into the
- * destination table by iterating over each of its items and adding each in turn to the
- * target table.
- * \param L The current Lua state.
- * \param field A description of the field being populated.
- * \param tbl The table to contain the values.
- * \param idx The value to add to the table.
- */
-static void fn_accessor_append_value(lua_State* L, struct FieldInfo* field, int tbl, int idx)
-{
- int i, n;
- if (lua_istable(L, idx))
- {
- n = luaL_getn(L, idx);
- for (i = 1; i <= n; ++i)
- {
- lua_rawgeti(L, idx, i);
- fn_accessor_append_value(L, field, tbl, lua_gettop(L));
- }
- lua_pop(L, 1);
- }
- else
- {
- /* if this field contains files, check for and expand wildcards by calling match() */
- const char* value = lua_tostring(L, -1);
- if (field->kind == FilesField && cstr_contains(value, "*"))
- {
- lua_getglobal(L, "match");
- lua_pushvalue(L, -2);
- lua_call(L, 1, 1);
- fn_accessor_append_value(L, field, tbl, lua_gettop(L));
- lua_pop(L, 1);
- }
- else
- {
- n = luaL_getn(L, tbl);
- lua_rawseti(L, tbl, n + 1);
- }
- }
-}
+/**
+ * \file fn_accessor.c
+ * \brief A generic getter/setter for project fields.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_internal.h"
+#include "base/cstr.h"
+#include "base/error.h"
+
+
+static int fn_accessor_object_has_field(struct FieldInfo* fields, const char* field_name);
+static int fn_accessor_register(lua_State* L, struct FieldInfo* fields);
+static int fn_accessor_register_field(lua_State* L, struct FieldInfo* field);
+static void fn_accessor_append_value(lua_State* L, struct FieldInfo* field, int tbl, int idx);
+
+
+/**
+ * Using the field information lists for each of the project objects (solution, project,
+ * and configuration) register accessor functions in the script environment. Examples of
+ * accessor functions include location(), language(), kind(), and so on; function that
+ * get and set the project object properties.
+ * \returns OKAY if successful.
+ */
+int fn_accessor_register_all(lua_State* L)
+{
+ int z = OKAY;
+ if (z == OKAY) z = fn_accessor_register(L, SolutionFieldInfo);
+ if (z == OKAY) z = fn_accessor_register(L, ProjectFieldInfo);
+ return z;
+}
+
+
+/**
+ * Register the accessor functions for a particular set of fields.
+ * \returns OKAY if successful.
+ */
+static int fn_accessor_register(lua_State* L, struct FieldInfo* fields)
+{
+ int i, z = OKAY;
+
+ for (i = 0; z == OKAY && fields[i].name != NULL; ++i)
+ {
+ z = fn_accessor_register_field(L, &fields[i]);
+ }
+
+ return z;
+}
+
+
+/**
+ * Register a single accessor function.
+ * \returns OKAY if successful.
+ */
+static int fn_accessor_register_field(lua_State* L, struct FieldInfo* field)
+{
+ int container_type, z;
+
+ /* has this accessor already been registered? This will happen if two object
+ * types (ie. solution and project) define the same property. If so, skip it */
+ lua_getglobal(L, field->name);
+ z = lua_isnil(L, -1);
+ lua_pop(L, 1);
+ if (!z) return OKAY;
+
+ /* figure out what object types this accessor applies to; may be more than one */
+ container_type = 0;
+ if (fn_accessor_object_has_field(SolutionFieldInfo, field->name)) container_type |= SolutionObject;
+ if (fn_accessor_object_has_field(ProjectFieldInfo, field->name)) container_type |= ProjectObject;
+
+ /* register the accessor function */
+ lua_pushnumber(L, container_type);
+ lua_pushlightuserdata(L, field);
+ lua_pushcclosure(L, fn_accessor, 2);
+ lua_setglobal(L, field->name);
+ return OKAY;
+}
+
+
+/**
+ * Determine if a field list contains a field with a particular name.
+ * \returns True if the field is contained by the list.
+ */
+static int fn_accessor_object_has_field(struct FieldInfo* fields, const char* field_name)
+{
+ int i;
+ for (i = 0; fields[i].name != NULL; ++i)
+ {
+ if (cstr_eq(fields[i].name, field_name))
+ return 1;
+ }
+ return 0;
+}
+
+
+/**
+ * The accessor script function; all of the individually registered accessors
+ * (location(), language(), etc.) point to here, and this is where all of the
+ * work gets done to get or set an object property or list.
+ * \returns The current value of the field.
+ */
+int fn_accessor(lua_State* L)
+{
+ struct FieldInfo* field;
+ int container_type;
+
+ /* get the required container object */
+ container_type = lua_tointeger(L, lua_upvalueindex(1));
+ if (!script_internal_get_active_object(L, container_type, REQUIRED))
+ {
+ return 0;
+ }
+
+ /* get information about the field being accessed */
+ field = (struct FieldInfo*)lua_touserdata(L, lua_upvalueindex(2));
+
+ /* if a value is provided, set the field */
+ if (lua_gettop(L) > 1)
+ {
+ if (field->kind == StringField)
+ {
+ fn_accessor_set_string_value(L, field);
+ }
+ else
+ {
+ fn_accessor_set_list_value(L, field);
+ }
+ }
+
+ /* return the current value of the field */
+ lua_getfield(L, -1, field->name);
+ return 1;
+}
+
+
+/**
+ * Sets a string field to the value on the bottom of the Lua stack.
+ * \returns OKAY if successful.
+ */
+int fn_accessor_set_string_value(lua_State* L, struct FieldInfo* field)
+{
+ /* can't set lists to simple fields */
+ if (lua_istable(L, 1))
+ {
+ luaL_error(L, "the field '%s' does not support lists of values", field->name);
+ return !OKAY;
+ }
+
+ /* if a validator function is present, call it */
+ if (field->validator != NULL)
+ {
+ const char* value = luaL_checkstring(L, 1);
+ if (!field->validator(value))
+ {
+ luaL_error(L, "invalid value '%s'", value);
+ return !OKAY;
+ }
+ }
+
+ /* set the field */
+ lua_pushvalue(L, 1);
+ lua_setfield(L, -2, field->name);
+ return OKAY;
+}
+
+
+/**
+ * Appends the value or list at the bottom of the Lua stack to the specified list field.
+ * \returns OKAY if successful.
+ */
+int fn_accessor_set_list_value(lua_State* L, struct FieldInfo* field)
+{
+ /* get the current value of the field */
+ lua_getfield(L, -1, field->name);
+
+ /* move the values into the field */
+ fn_accessor_append_value(L, field, lua_gettop(L), 1);
+
+ /* remove the field value from the stack */
+ lua_pop(L, 1);
+ return OKAY;
+}
+
+
+/**
+ * Append a value to table. If the value is itself a table, it is "flattened" into the
+ * destination table by iterating over each of its items and adding each in turn to the
+ * target table.
+ * \param L The current Lua state.
+ * \param field A description of the field being populated.
+ * \param tbl The table to contain the values.
+ * \param idx The value to add to the table.
+ */
+static void fn_accessor_append_value(lua_State* L, struct FieldInfo* field, int tbl, int idx)
+{
+ int i, n;
+ if (lua_istable(L, idx))
+ {
+ n = luaL_getn(L, idx);
+ for (i = 1; i <= n; ++i)
+ {
+ lua_rawgeti(L, idx, i);
+ fn_accessor_append_value(L, field, tbl, lua_gettop(L));
+ }
+ lua_pop(L, 1);
+ }
+ else
+ {
+ /* if this field contains files, check for and expand wildcards by calling match() */
+ const char* value = lua_tostring(L, -1);
+ if (field->kind == FilesField && cstr_contains(value, "*"))
+ {
+ lua_getglobal(L, "match");
+ lua_pushvalue(L, -2);
+ lua_call(L, 1, 1);
+ fn_accessor_append_value(L, field, tbl, lua_gettop(L));
+ lua_pop(L, 1);
+ }
+ else
+ {
+ n = luaL_getn(L, tbl);
+ lua_rawseti(L, tbl, n + 1);
+ }
+ }
+}
diff --git a/src/script/fn_configurations.c b/src/script/fn_configurations.c
new file mode 100644
index 0000000..249805f
--- /dev/null
+++ b/src/script/fn_configurations.c
@@ -0,0 +1,43 @@
+/**
+ * \file fn_configurations.c
+ * \brief Specify the build configurations.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_internal.h"
+
+
+/**
+ * Specify the build configurations for a solution.
+ */
+int fn_configurations(lua_State* L)
+{
+ struct FieldInfo* field;
+
+ if (!script_internal_get_active_object(L, SolutionObject, REQUIRED))
+ {
+ return 0;
+ }
+
+ /* configurations may not be modified once projects are defined */
+ lua_getfield(L, -1, PROJECTS_KEY);
+ if (luaL_getn(L, -1) > 0)
+ {
+ luaL_error(L, "configurations may not be modified after projects are defined");
+ }
+ lua_pop(L, 1);
+
+ /* get information about the field being accessed */
+ field = (struct FieldInfo*)lua_touserdata(L, lua_upvalueindex(2));
+
+ /* if a value is provided, set the field */
+ if (lua_gettop(L) > 1)
+ {
+ fn_accessor_set_list_value(L, &SolutionFieldInfo[SolutionConfigurations]);
+ }
+
+ /* return the current value of the field */
+ lua_getfield(L, -1, SolutionFieldInfo[SolutionConfigurations].name);
+ return 1;
+}
diff --git a/src/script/fn_dofile.c b/src/script/fn_dofile.c
index f10f324..4d0ffc0 100644
--- a/src/script/fn_dofile.c
+++ b/src/script/fn_dofile.c
@@ -1,76 +1,76 @@
-/**
- * \file fn_dofile.c
- * \brief A custom implementation of dofile().
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_internal.h"
-#include "base/dir.h"
-#include "base/path.h"
-#include "base/string.h"
-
-
-/**
- * Replacement implementation for Lua's dofile() function; manages Premake specific
- * features like the _FILE variable, and makes sure the directory containing the
- * running script is kept current.
- */
-int fn_dofile(lua_State* L)
-{
- const char *filename;
- const char* full_path;
- const char* script_dir;
- String old_file;
- String old_working_dir;
- int top, result;
-
- filename = luaL_checkstring(L, 1);
-
- /* remember the previous file that was being run; will restore after script runs */
- lua_getglobal(L, FILE_KEY);
- old_file = string_create(lua_tostring(L, -1));
- lua_pop(L, 1);
-
- /* remember the current working directory; will restore after script runs */
- old_working_dir = string_create(dir_get_current());
-
- /* set the _FILE global to the full path of the script being run */
- full_path = path_absolute(filename);
- lua_pushstring(L, full_path);
- lua_setglobal(L, FILE_KEY);
-
- /* make the script directory the current directory */
- script_dir = path_directory(full_path);
- dir_set_current(script_dir);
-
- /* I'll need this to figure the number of return values later */
- top = lua_gettop(L);
-
- /* use absolute path to run script so full path will be shown in error messages */
- full_path = path_translate(full_path, NULL);
- result = luaL_loadfile(L, full_path);
- if (result == OKAY)
- {
- lua_call(L, 0, LUA_MULTRET);
- }
-
- /* restore the previous working directory */
- dir_set_current(string_cstr(old_working_dir));
-
- /* restore the previous file value */
- lua_pushstring(L, string_cstr(old_file));
- lua_setglobal(L, FILE_KEY);
-
- /* clean up */
- string_destroy(old_working_dir);
- string_destroy(old_file);
-
- if (result != OKAY)
- {
- lua_error(L);
- }
-
- /* return the number of values returned by the script */
- return lua_gettop(L) - top;
-}
+/**
+ * \file fn_dofile.c
+ * \brief A custom implementation of dofile().
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_internal.h"
+#include "base/dir.h"
+#include "base/path.h"
+#include "base/string.h"
+
+
+/**
+ * Replacement implementation for Lua's dofile() function; manages Premake specific
+ * features like the _FILE variable, and makes sure the directory containing the
+ * running script is kept current.
+ */
+int fn_dofile(lua_State* L)
+{
+ const char *filename;
+ const char* full_path;
+ const char* script_dir;
+ String old_file;
+ String old_working_dir;
+ int top, result;
+
+ filename = luaL_checkstring(L, 1);
+
+ /* remember the previous file that was being run; will restore after script runs */
+ lua_getglobal(L, FILE_KEY);
+ old_file = string_create(lua_tostring(L, -1));
+ lua_pop(L, 1);
+
+ /* remember the current working directory; will restore after script runs */
+ old_working_dir = string_create(dir_get_current());
+
+ /* set the _FILE global to the full path of the script being run */
+ full_path = path_absolute(filename);
+ lua_pushstring(L, full_path);
+ lua_setglobal(L, FILE_KEY);
+
+ /* make the script directory the current directory */
+ script_dir = path_directory(full_path);
+ dir_set_current(script_dir);
+
+ /* I'll need this to figure the number of return values later */
+ top = lua_gettop(L);
+
+ /* use absolute path to run script so full path will be shown in error messages */
+ full_path = path_translate(full_path, NULL);
+ result = luaL_loadfile(L, full_path);
+ if (result == OKAY)
+ {
+ lua_call(L, 0, LUA_MULTRET);
+ }
+
+ /* restore the previous working directory */
+ dir_set_current(string_cstr(old_working_dir));
+
+ /* restore the previous file value */
+ lua_pushstring(L, string_cstr(old_file));
+ lua_setglobal(L, FILE_KEY);
+
+ /* clean up */
+ string_destroy(old_working_dir);
+ string_destroy(old_file);
+
+ if (result != OKAY)
+ {
+ lua_error(L);
+ }
+
+ /* return the number of values returned by the script */
+ return lua_gettop(L) - top;
+}
diff --git a/src/script/fn_error.c b/src/script/fn_error.c
index a63d5b9..0b00add 100644
--- a/src/script/fn_error.c
+++ b/src/script/fn_error.c
@@ -1,21 +1,21 @@
-/**
- * \file fn_error.c
- * \brief Script error handler.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_internal.h"
-#include "base/error.h"
-
-
-/**
- * Handler for errors reported out the script; copies the error message to
- * Premake's global error state.
- */
-int fn_error(lua_State* L)
-{
- const char* message = lua_tostring(L, 1);
- error_set(message);
- return 0;
-}
+/**
+ * \file fn_error.c
+ * \brief Script error handler.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_internal.h"
+#include "base/error.h"
+
+
+/**
+ * Handler for errors reported out the script; copies the error message to
+ * Premake's global error state.
+ */
+int fn_error(lua_State* L)
+{
+ const char* message = lua_tostring(L, 1);
+ error_set(message);
+ return 0;
+}
diff --git a/src/script/fn_getcwd.c b/src/script/fn_getcwd.c
index 9d2fa67..47d1a20 100644
--- a/src/script/fn_getcwd.c
+++ b/src/script/fn_getcwd.c
@@ -1,20 +1,20 @@
-/**
- * \file fn_getcwd.c
- * \brief os.getcwd() returns the current working directory.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_internal.h"
-#include "base/dir.h"
-
-
-/**
- * Implementation of os.getcwd(): returns the current working directory.
- */
-int fn_getcwd(lua_State* L)
-{
- const char* cwd = dir_get_current();
- lua_pushstring(L, cwd);
- return 1;
-}
+/**
+ * \file fn_getcwd.c
+ * \brief os.getcwd() returns the current working directory.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_internal.h"
+#include "base/dir.h"
+
+
+/**
+ * Implementation of os.getcwd(): returns the current working directory.
+ */
+int fn_getcwd(lua_State* L)
+{
+ const char* cwd = dir_get_current();
+ lua_pushstring(L, cwd);
+ return 1;
+}
diff --git a/src/script/fn_include.c b/src/script/fn_include.c
index 7208881..f2abc1e 100644
--- a/src/script/fn_include.c
+++ b/src/script/fn_include.c
@@ -1,26 +1,26 @@
-/**
- * \file fn_include.c
- * \brief Include an directory in the script, running the contained "premake4.lua".
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_internal.h"
-#include "base/path.h"
-
-
-/**
- * Include a directory into the current script, calling the enclosed "premake4.lua".
- * This is a shortcut for `dofile("some_directory/premake4.lua")`.
- */
-int fn_include(lua_State* L)
-{
- /* append default file name to the passed in path */
- const char* directory = luaL_checkstring(L, 1);
- const char* path = path_join(directory, DEFAULT_SCRIPT_NAME);
-
- /* then pass it to dofile() */
- lua_pop(L, 1);
- lua_pushstring(L, path);
- return fn_dofile(L);
-}
+/**
+ * \file fn_include.c
+ * \brief Include an directory in the script, running the contained "premake4.lua".
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_internal.h"
+#include "base/path.h"
+
+
+/**
+ * Include a directory into the current script, calling the enclosed "premake4.lua".
+ * This is a shortcut for `dofile("some_directory/premake4.lua")`.
+ */
+int fn_include(lua_State* L)
+{
+ /* append default file name to the passed in path */
+ const char* directory = luaL_checkstring(L, 1);
+ const char* path = path_join(directory, DEFAULT_SCRIPT_NAME);
+
+ /* then pass it to dofile() */
+ lua_pop(L, 1);
+ lua_pushstring(L, path);
+ return fn_dofile(L);
+}
diff --git a/src/script/fn_project.c b/src/script/fn_project.c
index 851154e..c690555 100644
--- a/src/script/fn_project.c
+++ b/src/script/fn_project.c
@@ -1,72 +1,81 @@
-/**
- * \file fn_project.c
- * \brief Create or select a project object.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_internal.h"
-#include "base/guid.h"
-
-
-/**
- * Create a new project object, or select an existing one.
- */
-int fn_project(lua_State* L)
-{
- const char* name;
-
- /* if there are no parameters, return the active project */
- if (lua_gettop(L) == 0)
- {
- script_internal_get_active_object(L, ProjectObject, OPTIONAL);
- return 1;
- }
-
- /* get the active solution, which will contain this project */
- if (!script_internal_get_active_object(L, SolutionObject, REQUIRED))
- {
- return 0;
- }
-
- name = luaL_checkstring(L, 1);
-
- /* get the projects list from the solution */
- lua_getfield(L, -1, PROJECTS_KEY);
-
- /* check to see if a project with this name already exists */
- lua_getfield(L, -1, name);
- if (lua_isnil(L, -1))
- {
- /* project does not exists, create it */
- lua_newtable(L);
-
- /* set the name */
- lua_pushvalue(L, 1);
- lua_setfield(L, -2, ProjectFieldInfo[ProjectName].name);
-
- /* set the base directory */
- lua_pushstring(L, script_internal_script_dir(L));
- lua_setfield(L, -2, ProjectFieldInfo[ProjectBaseDirectory].name);
-
- /* set a default GUID */
- lua_pushstring(L, guid_create());
- lua_setfield(L, -2, ProjectFieldInfo[ProjectGuid].name);
-
- /* use the list of fields to populate the object properties and accessor functions */
- script_internal_populate_object(L, ProjectFieldInfo);
-
- /* add it to solution's list of projects, keyed by name */
- lua_pushvalue(L, -1);
- lua_setfield(L, -4, name);
-
- /* also add with integer key */
- lua_pushvalue(L, -1);
- lua_rawseti(L, -4, luaL_getn(L, -4) + 1);
- }
-
- /* activate and return the solution object */
- script_internal_set_active_object(L, ProjectObject);
- return 1;
-}
-
+/**
+ * \file fn_project.c
+ * \brief Create or select a project object.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_internal.h"
+#include "base/guid.h"
+
+
+/**
+ * Create a new project object, or select an existing one.
+ */
+int fn_project(lua_State* L)
+{
+ const char* name;
+
+ /* if there are no parameters, return the active project */
+ if (lua_gettop(L) == 0)
+ {
+ script_internal_get_active_object(L, ProjectObject, OPTIONAL);
+ return 1;
+ }
+
+ /* get the active solution, which will contain this project */
+ if (!script_internal_get_active_object(L, SolutionObject, REQUIRED))
+ {
+ return 0;
+ }
+
+ name = luaL_checkstring(L, 1);
+
+ /* get the projects list from the solution */
+ lua_getfield(L, -1, PROJECTS_KEY);
+
+ /* check to see if a project with this name already exists */
+ lua_getfield(L, -1, name);
+ if (lua_isnil(L, -1))
+ {
+ /* this is a new project; check to be sure the configurations have been set */
+ lua_getfield(L, -3, SolutionFieldInfo[SolutionConfigurations].name);
+ if (luaL_getn(L, -1) == 0)
+ {
+ luaL_error(L, "no configurations defined");
+ return 0;
+ }
+ lua_pop(L, 1);
+
+ /* project does not exists, create it */
+ lua_newtable(L);
+
+ /* set the name */
+ lua_pushvalue(L, 1);
+ lua_setfield(L, -2, ProjectFieldInfo[ProjectName].name);
+
+ /* set the base directory */
+ lua_pushstring(L, script_internal_script_dir(L));
+ lua_setfield(L, -2, ProjectFieldInfo[ProjectBaseDirectory].name);
+
+ /* set a default GUID */
+ lua_pushstring(L, guid_create());
+ lua_setfield(L, -2, ProjectFieldInfo[ProjectGuid].name);
+
+ /* use the list of fields to populate the object properties and accessor functions */
+ script_internal_populate_object(L, ProjectFieldInfo);
+
+ /* add it to solution's list of projects, keyed by name */
+ lua_pushvalue(L, -1);
+ lua_setfield(L, -4, name);
+
+ /* also add with integer key */
+ lua_pushvalue(L, -1);
+ lua_rawseti(L, -4, luaL_getn(L, -4) + 1);
+ }
+
+ /* activate and return the solution object */
+ script_internal_set_active_object(L, ProjectObject);
+ return 1;
+}
+
diff --git a/src/script/fn_solution.c b/src/script/fn_solution.c
index 1aaa22c..3d81069 100644
--- a/src/script/fn_solution.c
+++ b/src/script/fn_solution.c
@@ -1,62 +1,62 @@
-/**
- * \file fn_solution.c
- * \brief Create or select a solution object.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_internal.h"
-
-
-/**
- * Create a new solution object, or select an existing one.
- */
-int fn_solution(lua_State* L)
-{
- const char* name;
-
- /* if there are no parameters, return the active solution */
- if (lua_gettop(L) == 0)
- {
- script_internal_get_active_object(L, SolutionObject, OPTIONAL);
- return 1;
- }
-
- name = luaL_checkstring(L, 1);
-
- /* check to see if a solution with this name already exists */
- lua_getglobal(L, SOLUTIONS_KEY);
- lua_getfield(L, -1, name);
- if (lua_isnil(L, -1))
- {
- /* solution does not exists, create it */
- lua_newtable(L);
-
- /* set the name */
- lua_pushstring(L, name);
- lua_setfield(L, -2, SolutionFieldInfo[SolutionName].name);
-
- /* set the base directory */
- lua_pushstring(L, script_internal_script_dir(L));
- lua_setfield(L, -2, SolutionFieldInfo[SolutionBaseDirectory].name);
-
- /* create an empty list of projects */
- lua_newtable(L);
- lua_setfield(L, -2, PROJECTS_KEY);
-
- /* use the list of fields to populate the object properties and accessor functions */
- script_internal_populate_object(L, SolutionFieldInfo);
-
- /* add it to the master list of solutions, keyed by name */
- lua_pushvalue(L, -1);
- lua_setfield(L, -4, name);
-
- /* also add with integer key */
- lua_pushvalue(L, -1);
- lua_rawseti(L, -4, luaL_getn(L, -4) + 1);
- }
-
- /* activate and return the solution object */
- script_internal_set_active_object(L, SolutionObject);
- return 1;
-}
+/**
+ * \file fn_solution.c
+ * \brief Create or select a solution object.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_internal.h"
+
+
+/**
+ * Create a new solution object, or select an existing one.
+ */
+int fn_solution(lua_State* L)
+{
+ const char* name;
+
+ /* if there are no parameters, return the active solution */
+ if (lua_gettop(L) == 0)
+ {
+ script_internal_get_active_object(L, SolutionObject, OPTIONAL);
+ return 1;
+ }
+
+ name = luaL_checkstring(L, 1);
+
+ /* check to see if a solution with this name already exists */
+ lua_getglobal(L, SOLUTIONS_KEY);
+ lua_getfield(L, -1, name);
+ if (lua_isnil(L, -1))
+ {
+ /* solution does not exists, create it */
+ lua_newtable(L);
+
+ /* set the name */
+ lua_pushstring(L, name);
+ lua_setfield(L, -2, SolutionFieldInfo[SolutionName].name);
+
+ /* set the base directory */
+ lua_pushstring(L, script_internal_script_dir(L));
+ lua_setfield(L, -2, SolutionFieldInfo[SolutionBaseDirectory].name);
+
+ /* create an empty list of projects */
+ lua_newtable(L);
+ lua_setfield(L, -2, PROJECTS_KEY);
+
+ /* use the list of fields to populate the object properties and accessor functions */
+ script_internal_populate_object(L, SolutionFieldInfo);
+
+ /* add it to the master list of solutions, keyed by name */
+ lua_pushvalue(L, -1);
+ lua_setfield(L, -4, name);
+
+ /* also add with integer key */
+ lua_pushvalue(L, -1);
+ lua_rawseti(L, -4, luaL_getn(L, -4) + 1);
+ }
+
+ /* activate and return the solution object */
+ script_internal_set_active_object(L, SolutionObject);
+ return 1;
+}
diff --git a/src/script/lua-5.1.2/PREMAKE_CHANGES.txt b/src/script/lua-5.1.2/PREMAKE_CHANGES.txt
index 840d716..ca2f322 100644
--- a/src/script/lua-5.1.2/PREMAKE_CHANGES.txt
+++ b/src/script/lua-5.1.2/PREMAKE_CHANGES.txt
@@ -1,2 +1,2 @@
-I added #pragmas to the end of luaconf.h in order to suppress
-some (harmless) VS.NET warning messages.
+I added #pragmas to the end of luaconf.h in order to suppress
+some (harmless) VS.NET warning messages.
diff --git a/src/script/script.c b/src/script/script.c
index d2eb915..cf6f70a 100644
--- a/src/script/script.c
+++ b/src/script/script.c
@@ -1,264 +1,265 @@
-/**
- * \file script.c
- * \brief The project scripting engine.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include "premake.h"
-#include "script_internal.h"
-#include "base/cstr.h"
-#include "base/error.h"
-
-
-/** Functions to add to the global namespace */
-static const luaL_Reg global_funcs[] = {
- { "dofile", fn_dofile },
- { "include", fn_include },
- { "match", fn_match },
- { "project", fn_project },
- { "solution", fn_solution },
- { NULL, NULL }
-};
-
-/** Functions to add to Lua's "os" namespace */
-static const luaL_Reg os_funcs[] = {
- { "getcwd", fn_getcwd },
- { NULL, NULL }
-};
-
-
-DEFINE_CLASS(Script)
-{
- lua_State* L;
-};
-
-
-/**
- * Create a new instance of the project scripting engine.
- * \returns A new engine object, or NULL if an error occurred.
- */
-Script script_create(void)
-{
- Script script;
-
- /* create a new Lua scripting environment */
- lua_State* L = lua_open();
- if (L == NULL)
- {
- error_set("failed to start Lua scripting engine");
- return NULL;
- }
-
- /* register all the standard Lua libraries */
- luaL_openlibs(L);
-
- /* register the Premake non-configuration related functions */
- luaL_register(L, "_G", global_funcs);
- luaL_register(L, "os", os_funcs);
-
- /* create an empty list of solutions in the script environment */
- lua_newtable(L);
- lua_setglobal(L, SOLUTIONS_KEY);
-
- /* register the project object accessor functions */
- fn_accessor_register_all(L);
-
- script = ALLOC_CLASS(Script);
- script->L = L;
- return script;
-}
-
-
-/**
- * Destroy an instance of the project scripting engine, including any contained
- * scripting project objects.
- * \param script The script engine instance to destroy.
- */
-void script_destroy(Script script)
-{
- assert(script);
- lua_close(script->L);
- free(script);
-}
-
-
-/**
- * Get the current value of the _ACTION global variable.
- * \param script The project scripting engine instance.
- * \returns The action name if set, or NULL if not.
- */
-const char* script_get_action(Script script)
-{
- const char* result;
- assert(script);
- lua_getglobal(script->L, ACTION_KEY);
- result = lua_tostring(script->L, -1);
- lua_pop(script->L, 1);
- return result;
-}
-
-
-/**
- * Retrieve the Lua scripting environment object from the project scripting engine.
- * \param script The script engine instance.
- * \returns The Lua scripting environment associated with the script engine instance.
- */
-lua_State* script_get_lua(Script script)
-{
- assert(script);
- return script->L;
-}
-
-
-/**
- * Internal shared implementation for script_run_file() and script_run_string().
- * \param L The Lua scripting environment.
- * \param param The filename, or the code string, to be run.
- * \param is_file True if param is a file, false if it is a code string.
- * \returns If the script returns a value, it is converted to a string and returned.
- * If the script does not return a value, NULL is returned. If an error
- * occurs in the script, the error message is returned.
- */
-static const char* script_run(lua_State* L, const char* param, int is_file)
-{
- const char* result;
- int top, status;
-
- /* set an error handler */
- lua_pushcfunction(L, fn_error);
-
- /* remember stack top, to figure out how many values were returned by the script */
- top = lua_gettop(L);
-
- if (is_file)
- {
- /* call Lua's dofile() function to do the work. I've implemented a
- * custom version in fn_dofile.c; routing the call there keeps all
- * of the logic in one place. */
- lua_getglobal(L, "dofile");
- lua_pushstring(L, param);
- status = lua_pcall(L, 1, LUA_MULTRET, -3);
- }
- else
- {
- status = luaL_loadstring(L, param);
- if (status == OKAY)
- {
- /* fake a file name for the _FILE global */
- lua_pushstring(L, "(string)/(string)");
- lua_setglobal(L, FILE_KEY);
-
- status = lua_pcall(L, 0, LUA_MULTRET, -2);
- }
- }
-
- if (status == OKAY)
- {
- /* if results were returned, pass them back to the caller */
- if (lua_gettop(L) > top)
- {
- if (lua_isboolean(L, top + 1))
- {
- int value = lua_toboolean(L, top + 1);
- result = (value) ? "true" : "false";
- }
- else
- {
- result = lua_tostring(L, top + 1);
- }
- }
- else
- {
- result = NULL;
- }
- }
- else
- {
- result = error_get();
- }
-
- return result;
-}
-
-
-/**
- * Execute a project script stored in a file.
- * \param script The project scripting engine instance.
- * \param filename The name of the file containing the script code to be executed.
- * \returns If the script returns a value, it is converted to a string and returned.
- * If the script does not return a value, NULL is returned. If an error
- * occurs in the script, the error message is returned.
- */
-const char* script_run_file(Script script, const char* filename)
-{
- assert(script);
- assert(filename);
- return script_run(script->L, filename, 1);
-}
-
-
-/**
- * Execute a project script stored in a string.
- * \param script The project scripting engine instance.
- * \param code The string containing the script code to be executed.
- * \returns If the script returns a value, it is converted to a string and returned.
- * If the script does not return a value, NULL is returned. If an error
- * occurs in the script, the error message is returned.
- */
-const char* script_run_string(Script script, const char* code)
-{
- const char* result;
-
- assert(script);
- assert(code);
-
- result = script_run(script->L, code, 0);
-
- /* if an error was returned, clean up the message to make it easier to test */
- if (cstr_starts_with(result, "[string "))
- {
- result = strstr(result, ":1:") + 4;
- }
-
- return result;
-}
-
-
-/**
- * Set the value of the _ACTION global variable.
- * \param script The project scripting engine instance.
- * \param action The name of the action to be performed.
- */
-void script_set_action(Script script, const char* action)
-{
- assert(script);
- lua_pushstring(script->L, action);
- lua_setglobal(script->L, ACTION_KEY);
-}
-
-
-/**
- * Copy project information out of the scripting environment and into C objects that
- * can be more easily manipulated by the action code.
- * \param script The project scripting engine instance.
- * \param slns An array to hold the list of unloaded solutions.
- * \returns OKAY if successful.
- */
-int script_unload(Script script, Array slns)
-{
- struct UnloadFuncs funcs;
- int result;
-
- assert(script);
- assert(slns);
-
- funcs.unload_solution = unload_solution;
- funcs.unload_project = unload_project;
- result = unload_all(script->L, slns, &funcs);
- return result;
-}
-
-
+/**
+ * \file script.c
+ * \brief The project scripting engine.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include "premake.h"
+#include "script_internal.h"
+#include "base/cstr.h"
+#include "base/error.h"
+
+
+/** Functions to add to the global namespace */
+static const luaL_Reg global_funcs[] = {
+ { "configurations", fn_configurations },
+ { "dofile", fn_dofile },
+ { "include", fn_include },
+ { "match", fn_match },
+ { "project", fn_project },
+ { "solution", fn_solution },
+ { NULL, NULL }
+};
+
+/** Functions to add to Lua's "os" namespace */
+static const luaL_Reg os_funcs[] = {
+ { "getcwd", fn_getcwd },
+ { NULL, NULL }
+};
+
+
+DEFINE_CLASS(Script)
+{
+ lua_State* L;
+};
+
+
+/**
+ * Create a new instance of the project scripting engine.
+ * \returns A new engine object, or NULL if an error occurred.
+ */
+Script script_create(void)
+{
+ Script script;
+
+ /* create a new Lua scripting environment */
+ lua_State* L = lua_open();
+ if (L == NULL)
+ {
+ error_set("failed to start Lua scripting engine");
+ return NULL;
+ }
+
+ /* register all the standard Lua libraries */
+ luaL_openlibs(L);
+
+ /* create an empty list of solutions in the script environment */
+ lua_newtable(L);
+ lua_setglobal(L, SOLUTIONS_KEY);
+
+ /* register the project object accessor functions */
+ fn_accessor_register_all(L);
+
+ /* register the Premake non-configuration related functions */
+ luaL_register(L, "_G", global_funcs);
+ luaL_register(L, "os", os_funcs);
+
+ script = ALLOC_CLASS(Script);
+ script->L = L;
+ return script;
+}
+
+
+/**
+ * Destroy an instance of the project scripting engine, including any contained
+ * scripting project objects.
+ * \param script The script engine instance to destroy.
+ */
+void script_destroy(Script script)
+{
+ assert(script);
+ lua_close(script->L);
+ free(script);
+}
+
+
+/**
+ * Get the current value of the _ACTION global variable.
+ * \param script The project scripting engine instance.
+ * \returns The action name if set, or NULL if not.
+ */
+const char* script_get_action(Script script)
+{
+ const char* result;
+ assert(script);
+ lua_getglobal(script->L, ACTION_KEY);
+ result = lua_tostring(script->L, -1);
+ lua_pop(script->L, 1);
+ return result;
+}
+
+
+/**
+ * Retrieve the Lua scripting environment object from the project scripting engine.
+ * \param script The script engine instance.
+ * \returns The Lua scripting environment associated with the script engine instance.
+ */
+lua_State* script_get_lua(Script script)
+{
+ assert(script);
+ return script->L;
+}
+
+
+/**
+ * Internal shared implementation for script_run_file() and script_run_string().
+ * \param L The Lua scripting environment.
+ * \param param The filename, or the code string, to be run.
+ * \param is_file True if param is a file, false if it is a code string.
+ * \returns If the script returns a value, it is converted to a string and returned.
+ * If the script does not return a value, NULL is returned. If an error
+ * occurs in the script, the error message is returned.
+ */
+static const char* script_run(lua_State* L, const char* param, int is_file)
+{
+ const char* result;
+ int top, status;
+
+ /* set an error handler */
+ lua_pushcfunction(L, fn_error);
+
+ /* remember stack top, to figure out how many values were returned by the script */
+ top = lua_gettop(L);
+
+ if (is_file)
+ {
+ /* call Lua's dofile() function to do the work. I've implemented a
+ * custom version in fn_dofile.c; routing the call there keeps all
+ * of the logic in one place. */
+ lua_getglobal(L, "dofile");
+ lua_pushstring(L, param);
+ status = lua_pcall(L, 1, LUA_MULTRET, -3);
+ }
+ else
+ {
+ status = luaL_loadstring(L, param);
+ if (status == OKAY)
+ {
+ /* fake a file name for the _FILE global */
+ lua_pushstring(L, "(string)/(string)");
+ lua_setglobal(L, FILE_KEY);
+
+ status = lua_pcall(L, 0, LUA_MULTRET, -2);
+ }
+ }
+
+ if (status == OKAY)
+ {
+ /* if results were returned, pass them back to the caller */
+ if (lua_gettop(L) > top)
+ {
+ if (lua_isboolean(L, top + 1))
+ {
+ int value = lua_toboolean(L, top + 1);
+ result = (value) ? "true" : "false";
+ }
+ else
+ {
+ result = lua_tostring(L, top + 1);
+ }
+ }
+ else
+ {
+ result = NULL;
+ }
+ }
+ else
+ {
+ result = error_get();
+ }
+
+ return result;
+}
+
+
+/**
+ * Execute a project script stored in a file.
+ * \param script The project scripting engine instance.
+ * \param filename The name of the file containing the script code to be executed.
+ * \returns If the script returns a value, it is converted to a string and returned.
+ * If the script does not return a value, NULL is returned. If an error
+ * occurs in the script, the error message is returned.
+ */
+const char* script_run_file(Script script, const char* filename)
+{
+ assert(script);
+ assert(filename);
+ return script_run(script->L, filename, 1);
+}
+
+
+/**
+ * Execute a project script stored in a string.
+ * \param script The project scripting engine instance.
+ * \param code The string containing the script code to be executed.
+ * \returns If the script returns a value, it is converted to a string and returned.
+ * If the script does not return a value, NULL is returned. If an error
+ * occurs in the script, the error message is returned.
+ */
+const char* script_run_string(Script script, const char* code)
+{
+ const char* result;
+
+ assert(script);
+ assert(code);
+
+ result = script_run(script->L, code, 0);
+
+ /* if an error was returned, clean up the message to make it easier to test */
+ if (cstr_starts_with(result, "[string "))
+ {
+ result = strstr(result, ":1:") + 4;
+ }
+
+ return result;
+}
+
+
+/**
+ * Set the value of the _ACTION global variable.
+ * \param script The project scripting engine instance.
+ * \param action The name of the action to be performed.
+ */
+void script_set_action(Script script, const char* action)
+{
+ assert(script);
+ lua_pushstring(script->L, action);
+ lua_setglobal(script->L, ACTION_KEY);
+}
+
+
+/**
+ * Copy project information out of the scripting environment and into C objects that
+ * can be more easily manipulated by the action code.
+ * \param script The project scripting engine instance.
+ * \param slns An array to hold the list of unloaded solutions.
+ * \returns OKAY if successful.
+ */
+int script_unload(Script script, Array slns)
+{
+ struct UnloadFuncs funcs;
+ int result;
+
+ assert(script);
+ assert(slns);
+
+ funcs.unload_solution = unload_solution;
+ funcs.unload_project = unload_project;
+ result = unload_all(script->L, slns, &funcs);
+ return result;
+}
+
+
diff --git a/src/script/script.h b/src/script/script.h
index f9c9a6c..ace069b 100644
--- a/src/script/script.h
+++ b/src/script/script.h
@@ -1,29 +1,29 @@
-/**
- * \file script.h
- * \brief The project scripting engine.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- *
- * \defgroup script Scripting Engine
- *
- * The project scripting engine.
- *
- * @{
- */
-#if !defined(PREMAKE_SCRIPT_H)
-#define PREMAKE_SCRIPT_H
-
-#include "base/array.h"
-
-DECLARE_CLASS(Script)
-
-Script script_create(void);
-void script_destroy(Script script);
-const char* script_get_action(Script script);
-const char* script_run_file(Script script, const char* filename);
-const char* script_run_string(Script script, const char* code);
-void script_set_action(Script script, const char* action);
-int script_tests(void);
-int script_unload(Script script, Array slns);
-
-#endif
-/** @} */
+/**
+ * \file script.h
+ * \brief The project scripting engine.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ *
+ * \defgroup script Scripting Engine
+ *
+ * The project scripting engine.
+ *
+ * @{
+ */
+#if !defined(PREMAKE_SCRIPT_H)
+#define PREMAKE_SCRIPT_H
+
+#include "base/array.h"
+
+DECLARE_CLASS(Script)
+
+Script script_create(void);
+void script_destroy(Script script);
+const char* script_get_action(Script script);
+const char* script_run_file(Script script, const char* filename);
+const char* script_run_string(Script script, const char* code);
+void script_set_action(Script script, const char* action);
+int script_tests(void);
+int script_unload(Script script, Array slns);
+
+#endif
+/** @} */
diff --git a/src/script/script_internal.c b/src/script/script_internal.c
index 03fc912..3410fce 100644
--- a/src/script/script_internal.c
+++ b/src/script/script_internal.c
@@ -1,168 +1,168 @@
-/**
- * \file script_internal.h
- * \brief Project scripting engine internal API.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <string.h>
-#include "premake.h"
-#include "script_internal.h"
-#include "base/buffers.h"
-#include "base/path.h"
-
-
-/**
- * Pushes the active value for the given object type to the top of the stack.
- * This function is used to retrieve the current solution, project, etc.
- * \param L The Lua state.
- * \param type One or more of the script object type enumerations.
- * A bitmask may be supplied if more than one object type
- * can be valid. If so, the objects will be returned in
- * following order: configuration, project, then solution.
- * \param is_required If true, will set error if no active object is found.
- * \returns The active object, pushed onto the stack. May be nil if there is
- * no currently active object. If is_required is true, returns true
- * if an active object was found, false otherwise.
- */
-int script_internal_get_active_object(lua_State* L, enum ObjectType type, int is_required)
-{
- int top;
-
- lua_getregistry(L);
- top = lua_gettop(L);
-
- if (lua_gettop(L) == top && (type & ConfigObject))
- {
- lua_getfield(L, -1, CONFIGURATION_KEY);
- if (lua_isnil(L, -1))
- lua_pop(L, 1);
- }
-
- if (lua_gettop(L) == top && (type & ProjectObject))
- {
- lua_getfield(L, -1, PROJECT_KEY);
- if (lua_isnil(L, -1))
- lua_pop(L, 1);
- }
-
- if (lua_gettop(L) == top && (type & SolutionObject))
- {
- lua_getfield(L, -1, SOLUTION_KEY);
- if (lua_isnil(L, -1))
- lua_pop(L, 1);
- }
-
- /* if an active object was found, return it */
- if (lua_gettop(L) > top)
- {
- /* remove the registry table first */
- lua_remove(L, -2);
- return 1;
- }
-
- /* if no active object was found, and none is required, return nil */
- else if (!is_required)
- {
- /* remove the registry table first */
- lua_pop(L, 1);
- lua_pushnil(L);
- return 1;
- }
-
- /* else set an error */
- else
- {
- /* build an error message */
- char* buffer = buffers_next();
- strcpy(buffer, "no active ");
- switch (type)
- {
- case SolutionObject:
- strcat(buffer, "solution");
- break;
- case ProjectObject:
- strcat(buffer, "project");
- break;
- case ConfigObject:
- strcat(buffer, "configuration");
- break;
- case SolutionObject | ProjectObject:
- strcat(buffer, "solution or project");
- break;
- case SolutionObject | ProjectObject | ConfigObject:
- strcat(buffer, "solution, project, or configuration");
- break;
- default:
- strcat(buffer, "object");
- }
- luaL_error(L, buffer);
- return 0;
- }
-}
-
-
-/**
- * Remembers the object at the top of the stack as active for the given object type.
- * This function is used to indicate the current solution, project, etc.
- * \param L The Lua state.
- * \param type One of the script object type enumerations.
- */
-void script_internal_set_active_object(lua_State* L, enum ObjectType type)
-{
- lua_getregistry(L);
- lua_pushvalue(L, -2);
-
- if (type == SolutionObject)
- {
- lua_setfield(L, -2, SOLUTION_KEY);
- }
- else if (type == ProjectObject)
- {
- lua_setfield(L, -2, PROJECT_KEY);
- }
- else
- {
- lua_setfield(L, -2, CONFIGURATION_KEY);
- }
-
- lua_pop(L, 1);
-}
-
-
-/**
- * Returns the directory containing the currently executing script file. Used to
- * locate external resources (files, etc.) specified relative to the current script.
- * \param L The Lua script environment.
- * \returns The directory containing the currently executing script file.
- */
-const char* script_internal_script_dir(lua_State* L)
-{
- const char* result;
- lua_getglobal(L, FILE_KEY);
- result = lua_tostring(L, -1);
- result = path_directory(result);
- lua_pop(L, 1);
- return result;
-}
-
-
-/**
- * Uses a list of fields to populate a project object (solution, project, or
- * configuration) with a matching set of properties and accessor functions.
- * \param L The Lua state.
- * \param fields The list of object fields.
- */
-void script_internal_populate_object(lua_State* L, struct FieldInfo* fields)
-{
- struct FieldInfo* field;
-
- /* set all list-type configuration values to empty tables */
- for (field = fields; field->name != NULL; ++field)
- {
- if (field->kind != StringField)
- {
- lua_newtable(L);
- lua_setfield(L, -2, field->name);
- }
- }
-}
+/**
+ * \file script_internal.h
+ * \brief Project scripting engine internal API.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <string.h>
+#include "premake.h"
+#include "script_internal.h"
+#include "base/buffers.h"
+#include "base/path.h"
+
+
+/**
+ * Pushes the active value for the given object type to the top of the stack.
+ * This function is used to retrieve the current solution, project, etc.
+ * \param L The Lua state.
+ * \param type One or more of the script object type enumerations.
+ * A bitmask may be supplied if more than one object type
+ * can be valid. If so, the objects will be returned in
+ * following order: configuration, project, then solution.
+ * \param is_required If true, will set error if no active object is found.
+ * \returns The active object, pushed onto the stack. May be nil if there is
+ * no currently active object. If is_required is true, returns true
+ * if an active object was found, false otherwise.
+ */
+int script_internal_get_active_object(lua_State* L, enum ObjectType type, int is_required)
+{
+ int top;
+
+ lua_getregistry(L);
+ top = lua_gettop(L);
+
+ if (lua_gettop(L) == top && (type & ConfigObject))
+ {
+ lua_getfield(L, -1, CONFIGURATION_KEY);
+ if (lua_isnil(L, -1))
+ lua_pop(L, 1);
+ }
+
+ if (lua_gettop(L) == top && (type & ProjectObject))
+ {
+ lua_getfield(L, -1, PROJECT_KEY);
+ if (lua_isnil(L, -1))
+ lua_pop(L, 1);
+ }
+
+ if (lua_gettop(L) == top && (type & SolutionObject))
+ {
+ lua_getfield(L, -1, SOLUTION_KEY);
+ if (lua_isnil(L, -1))
+ lua_pop(L, 1);
+ }
+
+ /* if an active object was found, return it */
+ if (lua_gettop(L) > top)
+ {
+ /* remove the registry table first */
+ lua_remove(L, -2);
+ return 1;
+ }
+
+ /* if no active object was found, and none is required, return nil */
+ else if (!is_required)
+ {
+ /* remove the registry table first */
+ lua_pop(L, 1);
+ lua_pushnil(L);
+ return 1;
+ }
+
+ /* else set an error */
+ else
+ {
+ /* build an error message */
+ char* buffer = buffers_next();
+ strcpy(buffer, "no active ");
+ switch (type)
+ {
+ case SolutionObject:
+ strcat(buffer, "solution");
+ break;
+ case ProjectObject:
+ strcat(buffer, "project");
+ break;
+ case ConfigObject:
+ strcat(buffer, "configuration");
+ break;
+ case SolutionObject | ProjectObject:
+ strcat(buffer, "solution or project");
+ break;
+ case SolutionObject | ProjectObject | ConfigObject:
+ strcat(buffer, "solution, project, or configuration");
+ break;
+ default:
+ strcat(buffer, "object");
+ }
+ luaL_error(L, buffer);
+ return 0;
+ }
+}
+
+
+/**
+ * Remembers the object at the top of the stack as active for the given object type.
+ * This function is used to indicate the current solution, project, etc.
+ * \param L The Lua state.
+ * \param type One of the script object type enumerations.
+ */
+void script_internal_set_active_object(lua_State* L, enum ObjectType type)
+{
+ lua_getregistry(L);
+ lua_pushvalue(L, -2);
+
+ if (type == SolutionObject)
+ {
+ lua_setfield(L, -2, SOLUTION_KEY);
+ }
+ else if (type == ProjectObject)
+ {
+ lua_setfield(L, -2, PROJECT_KEY);
+ }
+ else
+ {
+ lua_setfield(L, -2, CONFIGURATION_KEY);
+ }
+
+ lua_pop(L, 1);
+}
+
+
+/**
+ * Returns the directory containing the currently executing script file. Used to
+ * locate external resources (files, etc.) specified relative to the current script.
+ * \param L The Lua script environment.
+ * \returns The directory containing the currently executing script file.
+ */
+const char* script_internal_script_dir(lua_State* L)
+{
+ const char* result;
+ lua_getglobal(L, FILE_KEY);
+ result = lua_tostring(L, -1);
+ result = path_directory(result);
+ lua_pop(L, 1);
+ return result;
+}
+
+
+/**
+ * Uses a list of fields to populate a project object (solution, project, or
+ * configuration) with a matching set of properties and accessor functions.
+ * \param L The Lua state.
+ * \param fields The list of object fields.
+ */
+void script_internal_populate_object(lua_State* L, struct FieldInfo* fields)
+{
+ struct FieldInfo* field;
+
+ /* set all list-type configuration values to empty tables */
+ for (field = fields; field->name != NULL; ++field)
+ {
+ if (field->kind != StringField)
+ {
+ lua_newtable(L);
+ lua_setfield(L, -2, field->name);
+ }
+ }
+}
diff --git a/src/script/script_internal.h b/src/script/script_internal.h
index 8290b56..27380c3 100644
--- a/src/script/script_internal.h
+++ b/src/script/script_internal.h
@@ -1,72 +1,76 @@
-/**
- * \file script_internal.h
- * \brief Project scripting engine internal API.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-#if !defined(PREMAKE_SCRIPT_INTERNAL_H)
-#define PREMAKE_SCRIPT_INTERNAL_H
-
-#include "script.h"
-#include "session/session.h"
-
-#define lua_c
-#include "lua.h"
-#include "lauxlib.h"
-#include "lualib.h"
-
-
-/* string constants for script variables and functions */
-#define ACTION_KEY "_ACTION"
-#define CONFIGURATION_KEY "configuration"
-#define FILE_KEY "_FILE"
-#define PROJECT_KEY "project"
-#define PROJECTS_KEY "projects"
-#define SOLUTION_KEY "solution"
-#define SOLUTIONS_KEY "_SOLUTIONS"
-
-
-/** Used to specify type of object for engine_get/set_active_object */
-enum ObjectType
-{
- SolutionObject = 0x01,
- ProjectObject = 0x02,
- ConfigObject = 0x04
-};
-
-#define OPTIONAL (0)
-#define REQUIRED (1)
-
-lua_State* script_get_lua(Script script);
-
-/* internal state management */
-int script_internal_get_active_object(lua_State* L, enum ObjectType type, int is_required);
-void script_internal_set_active_object(lua_State* L, enum ObjectType type);
-const char* script_internal_script_dir(lua_State* L);
-void script_internal_populate_object(lua_State* L, struct FieldInfo* fields);
-
-/* Generic project object field getter/setter API */
-int fn_accessor_register_all(lua_State* L);
-
-/* script function handlers */
-int fn_dofile(lua_State* L);
-int fn_error(lua_State* L);
-int fn_getcwd(lua_State* L);
-int fn_include(lua_State* L);
-int fn_match(lua_State* L);
-int fn_project(lua_State* L);
-int fn_solution(lua_State* L);
-
-/* Project object unloading API. The unload functions "interface" provides an
- * opportunity to mock the actual implementation for automated testing */
-struct UnloadFuncs
-{
- int (*unload_solution)(lua_State* L, Solution sln);
- int (*unload_project)(lua_State* L, Project prj);
-};
-
-int unload_all(lua_State* L, Array slns, struct UnloadFuncs* funcs);
-int unload_solution(lua_State* L, Solution sln);
-int unload_project(lua_State* L, Project prj);
-
-
-#endif
+/**
+ * \file script_internal.h
+ * \brief Project scripting engine internal API.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+#if !defined(PREMAKE_SCRIPT_INTERNAL_H)
+#define PREMAKE_SCRIPT_INTERNAL_H
+
+#include "script.h"
+#include "session/session.h"
+
+#define lua_c
+#include "lua.h"
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+/* string constants for script variables and functions */
+#define ACTION_KEY "_ACTION"
+#define CONFIGURATION_KEY "configuration"
+#define FILE_KEY "_FILE"
+#define PROJECT_KEY "project"
+#define PROJECTS_KEY "projects"
+#define SOLUTION_KEY "solution"
+#define SOLUTIONS_KEY "_SOLUTIONS"
+
+
+/** Used to specify type of object for engine_get/set_active_object */
+enum ObjectType
+{
+ SolutionObject = 0x01,
+ ProjectObject = 0x02,
+ ConfigObject = 0x04
+};
+
+#define OPTIONAL (0)
+#define REQUIRED (1)
+
+lua_State* script_get_lua(Script script);
+
+/* internal state management */
+int script_internal_get_active_object(lua_State* L, enum ObjectType type, int is_required);
+void script_internal_set_active_object(lua_State* L, enum ObjectType type);
+const char* script_internal_script_dir(lua_State* L);
+void script_internal_populate_object(lua_State* L, struct FieldInfo* fields);
+
+/* Generic project object field getter/setter API */
+int fn_accessor_register_all(lua_State* L);
+int fn_accessor_set_string_value(lua_State* L, struct FieldInfo* field);
+int fn_accessor_set_list_value(lua_State* L, struct FieldInfo* field);
+
+/* script function handlers */
+int fn_accessor(lua_State* L);
+int fn_configurations(lua_State* L);
+int fn_dofile(lua_State* L);
+int fn_error(lua_State* L);
+int fn_getcwd(lua_State* L);
+int fn_include(lua_State* L);
+int fn_match(lua_State* L);
+int fn_project(lua_State* L);
+int fn_solution(lua_State* L);
+
+/* Project object unloading API. The unload functions "interface" provides an
+ * opportunity to mock the actual implementation for automated testing */
+struct UnloadFuncs
+{
+ int (*unload_solution)(lua_State* L, Solution sln);
+ int (*unload_project)(lua_State* L, Project prj);
+};
+
+int unload_all(lua_State* L, Array slns, struct UnloadFuncs* funcs);
+int unload_solution(lua_State* L, Solution sln);
+int unload_project(lua_State* L, Project prj);
+
+
+#endif
diff --git a/src/script/tests/fn_accessor_tests.cpp b/src/script/tests/fn_accessor_tests.cpp
index 8cf0438..ce44512 100644
--- a/src/script/tests/fn_accessor_tests.cpp
+++ b/src/script/tests/fn_accessor_tests.cpp
@@ -1,113 +1,113 @@
-/**
- * \file fn_accessor_tests.cpp
- * \brief Automated tests for the generic value getter/setter function.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_tests.h"
-
-
-SUITE(script)
-{
- /**************************************************************************
- * String field tests
- **************************************************************************/
-
- TEST_FIXTURE(FxAccessor, Accessor_ReturnsNil_OnEmptyStringValue)
- {
- const char* result = script_run_string(script,
- "return (location() == nil)");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxAccessor, Accessor_RaisesError_OnListValueAndStringField)
- {
- const char* result = script_run_string(script,
- "location {}");
- CHECK_EQUAL("the field 'location' does not support lists of values", result);
- }
-
- TEST_FIXTURE(FxAccessor, Accessor_SetsField_OnStringField)
- {
- const char* result = script_run_string(script,
- "location 'MyLocation';"
- "return prj.location" );
- CHECK_EQUAL("MyLocation", result);
- }
-
- TEST_FIXTURE(FxAccessor, Accessor_GetsField_OnStringField)
- {
- const char* result = script_run_string(script,
- "prj.location = 'MyLocation';"
- "return location()" );
- CHECK_EQUAL("MyLocation", result);
- }
-
-
- /**************************************************************************
- * List field tests
- **************************************************************************/
-
- TEST_FIXTURE(FxAccessor, Accessor_ReturnsEmptyTable_OnEmptyListValue)
- {
- const char* result = script_run_string(script,
- "return (#files() == 0)");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxAccessor, Accessor_Appends_OnStringValue)
- {
- const char* result = script_run_string(script,
- "files { 'Hello.c' };"
- "return (prj.files[1] == 'Hello.c')" );
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxAccessor, Accessor_Appends_OnListValue)
- {
- const char* result = script_run_string(script,
- "files { 'Hello.c', 'Goodbye.c' };"
- "return (prj.files[1] == 'Hello.c' and prj.files[2] == 'Goodbye.c')" );
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxAccessor, Accessor_Appends_OnTwoCalls)
- {
- const char* result = script_run_string(script,
- "files { 'Hello.c' };"
- "files { 'Goodbye.c' };"
- "return (prj.files[1] == 'Hello.c' and prj.files[2] == 'Goodbye.c')" );
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxAccessor, Accessor_ReturnsList_OnNoArgs)
- {
- const char* result = script_run_string(script,
- "files { 'Hello.c', 'Goodbye.c' };"
- "lst = files();"
- "return (lst[1] == 'Hello.c' and lst[2] == 'Goodbye.c')" );
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxAccessor, Accessor_FlattensTables_OnNestedLists)
- {
- const char* result = script_run_string(script,
- "files { {'Hello.c'}, {'Goodbye.c'} };"
- "return (prj.files[1] == 'Hello.c' and prj.files[2] == 'Goodbye.c')" );
- CHECK_EQUAL("true", result);
- }
-
-
- /**************************************************************************
- * Files field tests
- **************************************************************************/
-
- TEST_FIXTURE(FxAccessor, Accessor_ExpandsWildcards)
- {
- const char* result = script_run_string(script,
- "files { 'testing/test_files/*.lua' };"
- "return (#prj.files > 0)");
- CHECK_EQUAL("true", result);
- }
-}
+/**
+ * \file fn_accessor_tests.cpp
+ * \brief Automated tests for the generic value getter/setter function.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_tests.h"
+
+
+SUITE(script)
+{
+ /**************************************************************************
+ * String field tests
+ **************************************************************************/
+
+ TEST_FIXTURE(FxAccessor, Accessor_ReturnsNil_OnEmptyStringValue)
+ {
+ const char* result = script_run_string(script,
+ "return (location() == nil)");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxAccessor, Accessor_RaisesError_OnListValueAndStringField)
+ {
+ const char* result = script_run_string(script,
+ "location {}");
+ CHECK_EQUAL("the field 'location' does not support lists of values", result);
+ }
+
+ TEST_FIXTURE(FxAccessor, Accessor_SetsField_OnStringField)
+ {
+ const char* result = script_run_string(script,
+ "location 'MyLocation';"
+ "return prj.location" );
+ CHECK_EQUAL("MyLocation", result);
+ }
+
+ TEST_FIXTURE(FxAccessor, Accessor_GetsField_OnStringField)
+ {
+ const char* result = script_run_string(script,
+ "prj.location = 'MyLocation';"
+ "return location()" );
+ CHECK_EQUAL("MyLocation", result);
+ }
+
+
+ /**************************************************************************
+ * List field tests
+ **************************************************************************/
+
+ TEST_FIXTURE(FxAccessor, Accessor_ReturnsEmptyTable_OnEmptyListValue)
+ {
+ const char* result = script_run_string(script,
+ "return (#files() == 0)");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxAccessor, Accessor_Appends_OnStringValue)
+ {
+ const char* result = script_run_string(script,
+ "files { 'Hello.c' };"
+ "return (prj.files[1] == 'Hello.c')" );
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxAccessor, Accessor_Appends_OnListValue)
+ {
+ const char* result = script_run_string(script,
+ "files { 'Hello.c', 'Goodbye.c' };"
+ "return (prj.files[1] == 'Hello.c' and prj.files[2] == 'Goodbye.c')" );
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxAccessor, Accessor_Appends_OnTwoCalls)
+ {
+ const char* result = script_run_string(script,
+ "files { 'Hello.c' };"
+ "files { 'Goodbye.c' };"
+ "return (prj.files[1] == 'Hello.c' and prj.files[2] == 'Goodbye.c')" );
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxAccessor, Accessor_ReturnsList_OnNoArgs)
+ {
+ const char* result = script_run_string(script,
+ "files { 'Hello.c', 'Goodbye.c' };"
+ "lst = files();"
+ "return (lst[1] == 'Hello.c' and lst[2] == 'Goodbye.c')" );
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxAccessor, Accessor_FlattensTables_OnNestedLists)
+ {
+ const char* result = script_run_string(script,
+ "files { {'Hello.c'}, {'Goodbye.c'} };"
+ "return (prj.files[1] == 'Hello.c' and prj.files[2] == 'Goodbye.c')" );
+ CHECK_EQUAL("true", result);
+ }
+
+
+ /**************************************************************************
+ * Files field tests
+ **************************************************************************/
+
+ TEST_FIXTURE(FxAccessor, Accessor_ExpandsWildcards)
+ {
+ const char* result = script_run_string(script,
+ "files { 'testing/test_files/*.lua' };"
+ "return (#prj.files > 0)");
+ CHECK_EQUAL("true", result);
+ }
+}
diff --git a/src/script/tests/fn_configurations_tests.cpp b/src/script/tests/fn_configurations_tests.cpp
index be4f702..b34501f 100644
--- a/src/script/tests/fn_configurations_tests.cpp
+++ b/src/script/tests/fn_configurations_tests.cpp
@@ -9,14 +9,14 @@
SUITE(script)
{
- TEST_FIXTURE(FxAccessor, Configurations_Exists_OnStartup)
+ TEST_FIXTURE(FxScript, Configurations_Exists_OnStartup)
{
const char* result = script_run_string(script,
"return (configurations ~= nil)");
CHECK_EQUAL("true", result);
}
- TEST_FIXTURE(FxAccessor, Configurations_Error_OnNoActiveSolution)
+ TEST_FIXTURE(FxScript, Configurations_Error_OnNoActiveSolution)
{
Script script = script_create();
const char* result = script_run_string(script, "configurations {'Debug'}");
@@ -24,11 +24,23 @@ SUITE(script)
script_destroy(script);
}
- TEST_FIXTURE(FxAccessor, Configurations_CanRoundtrip)
+ TEST_FIXTURE(FxScript, Configurations_CanRoundtrip)
{
const char* result = script_run_string(script,
- "configurations {'Debug'};"
+ "solution 'MySolution';"
+ " configurations {'Debug','Release'};"
"return configurations()[1]");
CHECK_EQUAL("Debug", result);
}
+
+ TEST_FIXTURE(FxScript, Configurations_RaisesError_OnProjectDefined)
+ {
+ const char* result = script_run_string(script,
+ "solution 'MySolution';"
+ " configurations {'Debug','Release'};"
+ "project 'MyProject';"
+ " configurations {'DebugDLL','ReleaseDLL'}");
+ CHECK_EQUAL("configurations may not be modified after projects are defined", result);
+ }
+
}
diff --git a/src/script/tests/fn_dofile_tests.cpp b/src/script/tests/fn_dofile_tests.cpp
index 62bf691..3e814a3 100644
--- a/src/script/tests/fn_dofile_tests.cpp
+++ b/src/script/tests/fn_dofile_tests.cpp
@@ -1,73 +1,73 @@
-/**
- * \file fn_dofile_tests.cpp
- * \brief Automated test for the dofile() function.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_tests.h"
-extern "C" {
-#include "base/cstr.h"
-#include "base/dir.h"
-}
-
-
-SUITE(script)
-{
- TEST_FIXTURE(FxScript, DoFile_Exists_OnStartup)
- {
- const char* result = script_run_string(script,
- "return (dofile ~= nil)");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxScript, DoFile_ReturnsValue_OnValidFile)
- {
- const char* result = script_run_string(script,
- "return dofile('testing/test_files/true.lua')");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxScript, DoFile_SetsError_OnFileNotFound)
- {
- script_run_string(script,
- "dofile('nosuchfile.lua')");
- CHECK(cstr_ends_with(error_get(), "No such file or directory"));
- }
-
- TEST_FIXTURE(FxScript, DoFile_SetsCwd_BeforeScript)
- {
- const char* result = script_run_string(script,
- "return dofile('testing/test_files/getcwd.lua')");
- CHECK(cstr_ends_with(result, "testing/test_files"));
- }
-
- TEST_FIXTURE(FxScript, DoFile_SetsCwd_BeforeNestedScript)
- {
- const char* result = script_run_string(script,
- "return dofile('testing/test_files/dofile.lua')");
- CHECK(cstr_ends_with(result, "testing/test_files/nested"));
- }
-
- TEST_FIXTURE(FxScript, DoFile_RestoresCwd_AfterNestedScript)
- {
- const char* result = script_run_string(script,
- "return dofile('testing/test_files/dofile_getcwd.lua')");
- CHECK(cstr_ends_with(result, "testing/test_files"));
- }
-
- TEST_FIXTURE(FxScript, DoFile_RestoresCwd_OnFileNotFound)
- {
- script_run_string(script,
- "dofile('testing/test_files/nosuchfile.lua')");
- const char* cwd = dir_get_current();
- CHECK(cstr_ends_with(cwd, "/src"));
- }
-
- TEST_FIXTURE(FxScript, DoFile_SetsFileGlobal)
- {
- const char* result = script_run_string(script,
- "return dofile('testing/test_files/_FILE.lua')");
- CHECK(cstr_ends_with(result, "testing/test_files/_FILE.lua"));
- }
-}
+/**
+ * \file fn_dofile_tests.cpp
+ * \brief Automated test for the dofile() function.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_tests.h"
+extern "C" {
+#include "base/cstr.h"
+#include "base/dir.h"
+}
+
+
+SUITE(script)
+{
+ TEST_FIXTURE(FxScript, DoFile_Exists_OnStartup)
+ {
+ const char* result = script_run_string(script,
+ "return (dofile ~= nil)");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxScript, DoFile_ReturnsValue_OnValidFile)
+ {
+ const char* result = script_run_string(script,
+ "return dofile('testing/test_files/true.lua')");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxScript, DoFile_SetsError_OnFileNotFound)
+ {
+ script_run_string(script,
+ "dofile('nosuchfile.lua')");
+ CHECK(cstr_ends_with(error_get(), "No such file or directory"));
+ }
+
+ TEST_FIXTURE(FxScript, DoFile_SetsCwd_BeforeScript)
+ {
+ const char* result = script_run_string(script,
+ "return dofile('testing/test_files/getcwd.lua')");
+ CHECK(cstr_ends_with(result, "testing/test_files"));
+ }
+
+ TEST_FIXTURE(FxScript, DoFile_SetsCwd_BeforeNestedScript)
+ {
+ const char* result = script_run_string(script,
+ "return dofile('testing/test_files/dofile.lua')");
+ CHECK(cstr_ends_with(result, "testing/test_files/nested"));
+ }
+
+ TEST_FIXTURE(FxScript, DoFile_RestoresCwd_AfterNestedScript)
+ {
+ const char* result = script_run_string(script,
+ "return dofile('testing/test_files/dofile_getcwd.lua')");
+ CHECK(cstr_ends_with(result, "testing/test_files"));
+ }
+
+ TEST_FIXTURE(FxScript, DoFile_RestoresCwd_OnFileNotFound)
+ {
+ script_run_string(script,
+ "dofile('testing/test_files/nosuchfile.lua')");
+ const char* cwd = dir_get_current();
+ CHECK(cstr_ends_with(cwd, "/src"));
+ }
+
+ TEST_FIXTURE(FxScript, DoFile_SetsFileGlobal)
+ {
+ const char* result = script_run_string(script,
+ "return dofile('testing/test_files/_FILE.lua')");
+ CHECK(cstr_ends_with(result, "testing/test_files/_FILE.lua"));
+ }
+}
diff --git a/src/script/tests/fn_error_tests.cpp b/src/script/tests/fn_error_tests.cpp
index 8710efd..c6b8fea 100644
--- a/src/script/tests/fn_error_tests.cpp
+++ b/src/script/tests/fn_error_tests.cpp
@@ -1,25 +1,25 @@
-/**
- * \file fn_error_tests.cpp
- * \brief Automated test for the error() function.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_tests.h"
-
-SUITE(script)
-{
- TEST_FIXTURE(FxScript, Error_Exists_OnStartup)
- {
- const char* result = script_run_string(script,
- "return (error ~= nil)");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxScript, Error_SetsSessionError_OnCall)
- {
- script_run_string(script,
- "error('an error message')");
- CHECK_EQUAL("[string \"error('an error message')\"]:1: an error message", error_get());
- }
-}
+/**
+ * \file fn_error_tests.cpp
+ * \brief Automated test for the error() function.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_tests.h"
+
+SUITE(script)
+{
+ TEST_FIXTURE(FxScript, Error_Exists_OnStartup)
+ {
+ const char* result = script_run_string(script,
+ "return (error ~= nil)");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxScript, Error_SetsSessionError_OnCall)
+ {
+ script_run_string(script,
+ "error('an error message')");
+ CHECK_EQUAL("[string \"error('an error message')\"]:1: an error message", error_get());
+ }
+}
diff --git a/src/script/tests/fn_files_tests.cpp b/src/script/tests/fn_files_tests.cpp
index 3ae5e1a..0fad2b4 100644
--- a/src/script/tests/fn_files_tests.cpp
+++ b/src/script/tests/fn_files_tests.cpp
@@ -1,35 +1,35 @@
-/**
- * \file fn_files_tests.cpp
- * \brief Automated tests for the files() function.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_tests.h"
-
-
-SUITE(script)
-{
- TEST_FIXTURE(FxAccessor, Files_Exists_OnStartup)
- {
- const char* result = script_run_string(script,
- "return (files ~= nil)");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxAccessor, Files_Error_OnNoActiveProject)
- {
- Script script = script_create();
- const char* result = script_run_string(script, "files {'hello.c'}");
- CHECK_EQUAL("no active project", result);
- script_destroy(script);
- }
-
- TEST_FIXTURE(FxAccessor, Files_CanRoundtrip)
- {
- const char* result = script_run_string(script,
- "files {'hello.c'};"
- "return files()[1]");
- CHECK_EQUAL("hello.c", result);
- }
-}
+/**
+ * \file fn_files_tests.cpp
+ * \brief Automated tests for the files() function.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_tests.h"
+
+
+SUITE(script)
+{
+ TEST_FIXTURE(FxAccessor, Files_Exists_OnStartup)
+ {
+ const char* result = script_run_string(script,
+ "return (files ~= nil)");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxAccessor, Files_Error_OnNoActiveProject)
+ {
+ Script script = script_create();
+ const char* result = script_run_string(script, "files {'hello.c'}");
+ CHECK_EQUAL("no active project", result);
+ script_destroy(script);
+ }
+
+ TEST_FIXTURE(FxAccessor, Files_CanRoundtrip)
+ {
+ const char* result = script_run_string(script,
+ "files {'hello.c'};"
+ "return files()[1]");
+ CHECK_EQUAL("hello.c", result);
+ }
+}
diff --git a/src/script/tests/fn_getcwd_tests.cpp b/src/script/tests/fn_getcwd_tests.cpp
index 4903c81..94ea7ce 100644
--- a/src/script/tests/fn_getcwd_tests.cpp
+++ b/src/script/tests/fn_getcwd_tests.cpp
@@ -1,29 +1,29 @@
-/**
- * \file fn_getcwd_tests.cpp
- * \brief Automated test for the getcwd() function.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_tests.h"
-extern "C" {
-#include "base/cstr.h"
-}
-
-
-SUITE(script)
-{
- TEST_FIXTURE(FxScript, GetCwd_Exists_OnStartup)
- {
- const char* result = script_run_string(script,
- "return (os.getcwd ~= nil)");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxScript, GetCwd_ReturnsCwd)
- {
- const char* result = script_run_string(script,
- "return os.getcwd()");
- CHECK(cstr_ends_with(result, "/src"));
- }
-}
+/**
+ * \file fn_getcwd_tests.cpp
+ * \brief Automated test for the getcwd() function.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_tests.h"
+extern "C" {
+#include "base/cstr.h"
+}
+
+
+SUITE(script)
+{
+ TEST_FIXTURE(FxScript, GetCwd_Exists_OnStartup)
+ {
+ const char* result = script_run_string(script,
+ "return (os.getcwd ~= nil)");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxScript, GetCwd_ReturnsCwd)
+ {
+ const char* result = script_run_string(script,
+ "return os.getcwd()");
+ CHECK(cstr_ends_with(result, "/src"));
+ }
+}
diff --git a/src/script/tests/fn_guid_tests.cpp b/src/script/tests/fn_guid_tests.cpp
index d98cfd6..3650674 100644
--- a/src/script/tests/fn_guid_tests.cpp
+++ b/src/script/tests/fn_guid_tests.cpp
@@ -1,45 +1,45 @@
-/**
- * \file fn_guid_tests.cpp
- * \brief Automated tests for the guid() function.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_tests.h"
-extern "C" {
-#include "base/guid.h"
-}
-
-
-SUITE(script)
-{
- TEST_FIXTURE(FxAccessor, Guid_Exists_OnStartup)
- {
- const char* result = script_run_string(script,
- "return (guid ~= nil)");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxAccessor, Guid_Error_OnNoActiveProject)
- {
- Script script = script_create();
- const char* result = script_run_string(script, "guid()");
- CHECK_EQUAL("no active project", result);
- script_destroy(script);
- }
-
- TEST_FIXTURE(FxAccessor, Guid_CanRoundtrip)
- {
- const char* result = script_run_string(script,
- "guid '0C202E43-B9AF-4972-822B-5A42F0BF008C';"
- "return guid()");
- CHECK_EQUAL("0C202E43-B9AF-4972-822B-5A42F0BF008C", result);
- }
-
- TEST_FIXTURE(FxAccessor, Guid_RaisesError_OnInvalidGuid)
- {
- const char* result = script_run_string(script,
- "guid '0C202E43-XXXX-4972-822B-5A42F0BF008C'");
- CHECK_EQUAL("invalid value '0C202E43-XXXX-4972-822B-5A42F0BF008C'", result);
- }
-}
+/**
+ * \file fn_guid_tests.cpp
+ * \brief Automated tests for the guid() function.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_tests.h"
+extern "C" {
+#include "base/guid.h"
+}
+
+
+SUITE(script)
+{
+ TEST_FIXTURE(FxAccessor, Guid_Exists_OnStartup)
+ {
+ const char* result = script_run_string(script,
+ "return (guid ~= nil)");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxAccessor, Guid_Error_OnNoActiveProject)
+ {
+ Script script = script_create();
+ const char* result = script_run_string(script, "guid()");
+ CHECK_EQUAL("no active project", result);
+ script_destroy(script);
+ }
+
+ TEST_FIXTURE(FxAccessor, Guid_CanRoundtrip)
+ {
+ const char* result = script_run_string(script,
+ "guid '0C202E43-B9AF-4972-822B-5A42F0BF008C';"
+ "return guid()");
+ CHECK_EQUAL("0C202E43-B9AF-4972-822B-5A42F0BF008C", result);
+ }
+
+ TEST_FIXTURE(FxAccessor, Guid_RaisesError_OnInvalidGuid)
+ {
+ const char* result = script_run_string(script,
+ "guid '0C202E43-XXXX-4972-822B-5A42F0BF008C'");
+ CHECK_EQUAL("invalid value '0C202E43-XXXX-4972-822B-5A42F0BF008C'", result);
+ }
+}
diff --git a/src/script/tests/fn_include_tests.cpp b/src/script/tests/fn_include_tests.cpp
index 1c81132..16be83a 100644
--- a/src/script/tests/fn_include_tests.cpp
+++ b/src/script/tests/fn_include_tests.cpp
@@ -1,36 +1,36 @@
-/**
- * \file fn_include_tests.cpp
- * \brief Automated test for the include() function.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_tests.h"
-extern "C" {
-#include "base/cstr.h"
-}
-
-
-SUITE(script)
-{
- TEST_FIXTURE(FxScript, Include_Exists_OnStartup)
- {
- const char* result = script_run_string(script,
- "return (include ~= nil)");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxScript, Include_ReturnsValue_OnPremake4Found)
- {
- const char* result = script_run_string(script,
- "return include('testing/test_files')");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxScript, Include_SetsError_OnFileNotFound)
- {
- script_run_string(script,
- "include('testing')");
- CHECK(cstr_ends_with(error_get(), "No such file or directory"));
- }
-}
+/**
+ * \file fn_include_tests.cpp
+ * \brief Automated test for the include() function.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_tests.h"
+extern "C" {
+#include "base/cstr.h"
+}
+
+
+SUITE(script)
+{
+ TEST_FIXTURE(FxScript, Include_Exists_OnStartup)
+ {
+ const char* result = script_run_string(script,
+ "return (include ~= nil)");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxScript, Include_ReturnsValue_OnPremake4Found)
+ {
+ const char* result = script_run_string(script,
+ "return include('testing/test_files')");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxScript, Include_SetsError_OnFileNotFound)
+ {
+ script_run_string(script,
+ "include('testing')");
+ CHECK(cstr_ends_with(error_get(), "No such file or directory"));
+ }
+}
diff --git a/src/script/tests/fn_language_tests.cpp b/src/script/tests/fn_language_tests.cpp
index c018598..a2791da 100644
--- a/src/script/tests/fn_language_tests.cpp
+++ b/src/script/tests/fn_language_tests.cpp
@@ -1,42 +1,42 @@
-/**
- * \file fn_language_tests.cpp
- * \brief Automated tests for the language() function.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_tests.h"
-
-
-SUITE(script)
-{
- TEST_FIXTURE(FxAccessor, Language_Exists_OnStartup)
- {
- const char* result = script_run_string(script,
- "return (language ~= nil)");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxAccessor, Guid_Error_OnNoActiveObject)
- {
- Script script = script_create();
- const char* result = script_run_string(script, "language()");
- CHECK_EQUAL("no active solution or project", result);
- script_destroy(script);
- }
-
- TEST_FIXTURE(FxAccessor, Language_CanRoundtrip)
- {
- const char* result = script_run_string(script,
- "language 'c++';"
- "return language()");
- CHECK_EQUAL("c++", result);
- }
-
- TEST_FIXTURE(FxAccessor, Language_RaisesError_OnInvalidLanguage)
- {
- const char* result = script_run_string(script,
- "language 'nosuch'");
- CHECK_EQUAL("invalid value 'nosuch'", result);
- }
-}
+/**
+ * \file fn_language_tests.cpp
+ * \brief Automated tests for the language() function.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_tests.h"
+
+
+SUITE(script)
+{
+ TEST_FIXTURE(FxAccessor, Language_Exists_OnStartup)
+ {
+ const char* result = script_run_string(script,
+ "return (language ~= nil)");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxAccessor, Guid_Error_OnNoActiveObject)
+ {
+ Script script = script_create();
+ const char* result = script_run_string(script, "language()");
+ CHECK_EQUAL("no active solution or project", result);
+ script_destroy(script);
+ }
+
+ TEST_FIXTURE(FxAccessor, Language_CanRoundtrip)
+ {
+ const char* result = script_run_string(script,
+ "language 'c++';"
+ "return language()");
+ CHECK_EQUAL("c++", result);
+ }
+
+ TEST_FIXTURE(FxAccessor, Language_RaisesError_OnInvalidLanguage)
+ {
+ const char* result = script_run_string(script,
+ "language 'nosuch'");
+ CHECK_EQUAL("invalid value 'nosuch'", result);
+ }
+}
diff --git a/src/script/tests/fn_project_tests.cpp b/src/script/tests/fn_project_tests.cpp
index e52ddd3..1c27149 100644
--- a/src/script/tests/fn_project_tests.cpp
+++ b/src/script/tests/fn_project_tests.cpp
@@ -1,117 +1,126 @@
-/**
- * \file fn_project_tests.cpp
- * \brief Automated tests for the project() function.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_tests.h"
-
-
-struct FnProject : FxScript
-{
- FnProject()
- {
- script_run_string(script,
- "sln = solution('MySolution');"
- "prj = project('MyProject')");
- }
-};
-
-
-SUITE(script)
-{
- /**************************************************************************
- * Initial state tests
- **************************************************************************/
-
- TEST_FIXTURE(FxScript, Project_Exists_OnStartup)
- {
- const char* result = script_run_string(script,
- "return (project ~= nil)");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxScript, Project_ReturnsNil_OnNoActiveProject)
- {
- const char* result = script_run_string(script,
- "return (project() == nil)");
- CHECK_EQUAL("true", result);
- }
-
- /**************************************************************************
- * Object creation tests
- **************************************************************************/
-
- TEST_FIXTURE(FxScript, Project_Fails_OnNoActiveSolution)
- {
- const char* result = script_run_string(script, "project('MyProject')");
- CHECK_EQUAL("no active solution", result);
- }
-
- TEST_FIXTURE(FnProject, Project_ReturnsNewObject_OnNewName)
- {
- const char* result = script_run_string(script,
- "return (prj ~= nil)");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FnProject, Project_ReturnsObject_OnActiveProject)
- {
- const char* result = script_run_string(script,
- "return (prj == project())");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FnProject, Project_AddsToKeyList_OnNewName)
- {
- const char* result = script_run_string(script,
- "return (prj == sln.projects['MyProject']);");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FnProject, Project_AddsToIndexList_OnNewName)
- {
- const char* result = script_run_string(script,
- "return (prj == sln.projects[1]);");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FnProject, Project_IncrementsTableSize_OnNewName)
- {
- const char* result = script_run_string(script,
- "return #sln.projects");
- CHECK_EQUAL("1", result);
- }
-
- TEST_FIXTURE(FnProject, Project_ReturnsSameObject_OnExistingName)
- {
- const char* result = script_run_string(script,
- "prj1 = project('SecondProject');"
- "return (prj == project('MyProject'))");
- CHECK_EQUAL("true", result);
- }
-
-
- /**************************************************************************
- * Initial object state tests
- **************************************************************************/
-
- TEST_FIXTURE(FnProject, Project_SetsName)
- {
- const char* result = script_run_string(script, "return prj.name");
- CHECK_EQUAL("MyProject", result);
- }
-
- TEST_FIXTURE(FnProject, Project_SetsBaseDir)
- {
- const char* result = script_run_string(script, "return prj.basedir");
- CHECK_EQUAL("(string)", result);
- }
-
- TEST_FIXTURE(FnProject, Project_SetsGuid)
- {
- const char* result = script_run_string(script, "return prj.guid");
- CHECK(result != NULL && strlen(result) == 36);
- }
-}
+/**
+ * \file fn_project_tests.cpp
+ * \brief Automated tests for the project() function.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_tests.h"
+
+
+struct FnProject : FxScript
+{
+ FnProject()
+ {
+ script_run_string(script,
+ "sln = solution('MySolution');"
+ " configurations {'Debug','Release'};"
+ "prj = project('MyProject')");
+ }
+};
+
+
+SUITE(script)
+{
+ /**************************************************************************
+ * Initial state tests
+ **************************************************************************/
+
+ TEST_FIXTURE(FxScript, Project_Exists_OnStartup)
+ {
+ const char* result = script_run_string(script,
+ "return (project ~= nil)");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxScript, Project_ReturnsNil_OnNoActiveProject)
+ {
+ const char* result = script_run_string(script,
+ "return (project() == nil)");
+ CHECK_EQUAL("true", result);
+ }
+
+ /**************************************************************************
+ * Object creation tests
+ **************************************************************************/
+
+ TEST_FIXTURE(FxScript, Project_Fails_OnNoActiveSolution)
+ {
+ const char* result = script_run_string(script, "project('MyProject')");
+ CHECK_EQUAL("no active solution", result);
+ }
+
+ TEST_FIXTURE(FnProject, Project_ReturnsNewObject_OnNewName)
+ {
+ const char* result = script_run_string(script,
+ "return (prj ~= nil)");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FnProject, Project_ReturnsObject_OnActiveProject)
+ {
+ const char* result = script_run_string(script,
+ "return (prj == project())");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FnProject, Project_AddsToKeyList_OnNewName)
+ {
+ const char* result = script_run_string(script,
+ "return (prj == sln.projects['MyProject']);");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FnProject, Project_AddsToIndexList_OnNewName)
+ {
+ const char* result = script_run_string(script,
+ "return (prj == sln.projects[1]);");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FnProject, Project_IncrementsTableSize_OnNewName)
+ {
+ const char* result = script_run_string(script,
+ "return #sln.projects");
+ CHECK_EQUAL("1", result);
+ }
+
+ TEST_FIXTURE(FnProject, Project_ReturnsSameObject_OnExistingName)
+ {
+ const char* result = script_run_string(script,
+ "prj1 = project('SecondProject');"
+ "return (prj == project('MyProject'))");
+ CHECK_EQUAL("true", result);
+ }
+/*
+ TEST_FIXTURE(FxScript, Project_RaisesError_OnNoConfigurations)
+ {
+ const char* result = script_run_string(script,
+ "sln = solution('MySolution');"
+ "prj = project('MyProject')");
+ CHECK_EQUAL("no configurations defined", result);
+ }
+*/
+
+ /**************************************************************************
+ * Initial object state tests
+ **************************************************************************/
+
+ TEST_FIXTURE(FnProject, Project_SetsName)
+ {
+ const char* result = script_run_string(script, "return prj.name");
+ CHECK_EQUAL("MyProject", result);
+ }
+
+ TEST_FIXTURE(FnProject, Project_SetsBaseDir)
+ {
+ const char* result = script_run_string(script, "return prj.basedir");
+ CHECK_EQUAL("(string)", result);
+ }
+
+ TEST_FIXTURE(FnProject, Project_SetsGuid)
+ {
+ const char* result = script_run_string(script, "return prj.guid");
+ CHECK(result != NULL && strlen(result) == 36);
+ }
+}
diff --git a/src/script/tests/fn_solution_tests.cpp b/src/script/tests/fn_solution_tests.cpp
index ff00a26..a26ea41 100644
--- a/src/script/tests/fn_solution_tests.cpp
+++ b/src/script/tests/fn_solution_tests.cpp
@@ -1,120 +1,120 @@
-/**
- * \file fn_solution_tests.cpp
- * \brief Automated tests for the solution() function.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "script_tests.h"
-
-
-struct FnSolution : FxScript
-{
- FnSolution()
- {
- script_run_string(script, "sln = solution('MySolution');");
- }
-};
-
-
-SUITE(script)
-{
- /**************************************************************************
- * Initial state tests
- **************************************************************************/
-
- TEST_FIXTURE(FxScript, Solution_Exists_OnStartup)
- {
- const char* result = script_run_string(script,
- "return (solution ~= nil)");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxScript, Solution_ReturnsNil_OnNoActiveSolution)
- {
- const char* result = script_run_string(script,
- "return (solution() == nil)");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxScript, Solutions_Exists_OnStartup)
- {
- const char* result = script_run_string(script,
- "return #_SOLUTIONS");
- CHECK_EQUAL("0", result);
- }
-
-
- /**************************************************************************
- * Object creation tests
- **************************************************************************/
-
- TEST_FIXTURE(FnSolution, Solution_ReturnsNewObject_OnNewName)
- {
- const char* result = script_run_string(script,
- "return (sln ~= nil)");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FnSolution, Solution_ReturnsObject_OnActiveSolution)
- {
- const char* result = script_run_string(script,
- "return (sln == solution())");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FnSolution, Solution_AddsToKeyList_OnNewName)
- {
- const char* result = script_run_string(script,
- "return (sln == _SOLUTIONS['MySolution']);");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FnSolution, Solution_AddsToIndexList_OnNewName)
- {
- const char* result = script_run_string(script,
- "return (sln == _SOLUTIONS[1]);");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FnSolution, Solution_IncrementsTableSize_OnNewName)
- {
- const char* result = script_run_string(script,
- "return #_SOLUTIONS;");
- CHECK_EQUAL("1", result);
- }
-
- TEST_FIXTURE(FnSolution, Solution_ReturnsSameObject_OnExistingName)
- {
- const char* result = script_run_string(script,
- "sln1 = solution('SecondSolution');"
- "return (sln == solution('MySolution'))");
- CHECK_EQUAL("true", result);
- }
-
-
- /**************************************************************************
- * Initial object state tests
- **************************************************************************/
-
- TEST_FIXTURE(FnSolution, Solution_SetsName)
- {
- const char* result = script_run_string(script,
- "return sln.name");
- CHECK_EQUAL("MySolution", result);
- }
-
- TEST_FIXTURE(FnSolution, Solution_SetsBaseDir)
- {
- const char* result = script_run_string(script,
- "return sln.basedir");
- CHECK_EQUAL("(string)", result);
- }
-
- TEST_FIXTURE(FnSolution, Solution_HasEmptyProjectsList)
- {
- const char* result = script_run_string(script,
- "return #sln.projects");
- CHECK_EQUAL("0", result);
- }
-}
+/**
+ * \file fn_solution_tests.cpp
+ * \brief Automated tests for the solution() function.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "script_tests.h"
+
+
+struct FnSolution : FxScript
+{
+ FnSolution()
+ {
+ script_run_string(script, "sln = solution('MySolution');");
+ }
+};
+
+
+SUITE(script)
+{
+ /**************************************************************************
+ * Initial state tests
+ **************************************************************************/
+
+ TEST_FIXTURE(FxScript, Solution_Exists_OnStartup)
+ {
+ const char* result = script_run_string(script,
+ "return (solution ~= nil)");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxScript, Solution_ReturnsNil_OnNoActiveSolution)
+ {
+ const char* result = script_run_string(script,
+ "return (solution() == nil)");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxScript, Solutions_Exists_OnStartup)
+ {
+ const char* result = script_run_string(script,
+ "return #_SOLUTIONS");
+ CHECK_EQUAL("0", result);
+ }
+
+
+ /**************************************************************************
+ * Object creation tests
+ **************************************************************************/
+
+ TEST_FIXTURE(FnSolution, Solution_ReturnsNewObject_OnNewName)
+ {
+ const char* result = script_run_string(script,
+ "return (sln ~= nil)");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FnSolution, Solution_ReturnsObject_OnActiveSolution)
+ {
+ const char* result = script_run_string(script,
+ "return (sln == solution())");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FnSolution, Solution_AddsToKeyList_OnNewName)
+ {
+ const char* result = script_run_string(script,
+ "return (sln == _SOLUTIONS['MySolution']);");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FnSolution, Solution_AddsToIndexList_OnNewName)
+ {
+ const char* result = script_run_string(script,
+ "return (sln == _SOLUTIONS[1]);");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FnSolution, Solution_IncrementsTableSize_OnNewName)
+ {
+ const char* result = script_run_string(script,
+ "return #_SOLUTIONS;");
+ CHECK_EQUAL("1", result);
+ }
+
+ TEST_FIXTURE(FnSolution, Solution_ReturnsSameObject_OnExistingName)
+ {
+ const char* result = script_run_string(script,
+ "sln1 = solution('SecondSolution');"
+ "return (sln == solution('MySolution'))");
+ CHECK_EQUAL("true", result);
+ }
+
+
+ /**************************************************************************
+ * Initial object state tests
+ **************************************************************************/
+
+ TEST_FIXTURE(FnSolution, Solution_SetsName)
+ {
+ const char* result = script_run_string(script,
+ "return sln.name");
+ CHECK_EQUAL("MySolution", result);
+ }
+
+ TEST_FIXTURE(FnSolution, Solution_SetsBaseDir)
+ {
+ const char* result = script_run_string(script,
+ "return sln.basedir");
+ CHECK_EQUAL("(string)", result);
+ }
+
+ TEST_FIXTURE(FnSolution, Solution_HasEmptyProjectsList)
+ {
+ const char* result = script_run_string(script,
+ "return #sln.projects");
+ CHECK_EQUAL("0", result);
+ }
+}
diff --git a/src/script/tests/script_tests.cpp b/src/script/tests/script_tests.cpp
index e175906..9a8d792 100644
--- a/src/script/tests/script_tests.cpp
+++ b/src/script/tests/script_tests.cpp
@@ -1,52 +1,52 @@
-/**
- * \file script_tests.cpp
- * \brief Automated test for the project scripting engine.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "script/script.h"
-#include "base/error.h"
-}
-
-
-/**
- * Run the suite of project scripting engine automated tests.
- * \returns OKAY if all tests completed successfully.
- */
-int script_tests()
-{
- int z = OKAY;
- if (z == OKAY) z = tests_run_suite("script");
- if (z == OKAY) z = tests_run_suite("unload");
- return z;
-}
-
-
-struct FxScript
-{
- Script script;
-
- FxScript()
- {
- script = script_create();
- }
-
- ~FxScript()
- {
- script_destroy(script);
- error_clear();
- }
-};
-
-
-SUITE(script)
-{
- TEST_FIXTURE(FxScript, ScriptCreate_ReturnsObject)
- {
- CHECK(script != NULL);
- }
-}
-
+/**
+ * \file script_tests.cpp
+ * \brief Automated test for the project scripting engine.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "script/script.h"
+#include "base/error.h"
+}
+
+
+/**
+ * Run the suite of project scripting engine automated tests.
+ * \returns OKAY if all tests completed successfully.
+ */
+int script_tests()
+{
+ int z = OKAY;
+ if (z == OKAY) z = tests_run_suite("script");
+ if (z == OKAY) z = tests_run_suite("unload");
+ return z;
+}
+
+
+struct FxScript
+{
+ Script script;
+
+ FxScript()
+ {
+ script = script_create();
+ }
+
+ ~FxScript()
+ {
+ script_destroy(script);
+ error_clear();
+ }
+};
+
+
+SUITE(script)
+{
+ TEST_FIXTURE(FxScript, ScriptCreate_ReturnsObject)
+ {
+ CHECK(script != NULL);
+ }
+}
+
diff --git a/src/script/tests/script_tests.h b/src/script/tests/script_tests.h
index 6790e58..5791ccc 100644
--- a/src/script/tests/script_tests.h
+++ b/src/script/tests/script_tests.h
@@ -1,39 +1,40 @@
-/**
- * \file script_tests.h
- * \brief Common fixtures for script function tests.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "testing/testing.h"
-extern "C" {
-#include "script/script.h"
-#include "base/error.h"
-}
-
-
-struct FxScript
-{
- Script script;
-
- FxScript()
- {
- script = script_create();
- }
-
- ~FxScript()
- {
- script_destroy(script);
- error_clear();
- }
-};
-
-
-struct FxAccessor : FxScript
-{
- FxAccessor()
- {
- script_run_string(script,
- "sln = solution 'MySolution';"
- "prj = project 'MyProject';");
- }
-};
+/**
+ * \file script_tests.h
+ * \brief Common fixtures for script function tests.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "testing/testing.h"
+extern "C" {
+#include "script/script.h"
+#include "base/error.h"
+}
+
+
+struct FxScript
+{
+ Script script;
+
+ FxScript()
+ {
+ script = script_create();
+ }
+
+ ~FxScript()
+ {
+ script_destroy(script);
+ error_clear();
+ }
+};
+
+
+struct FxAccessor : FxScript
+{
+ FxAccessor()
+ {
+ script_run_string(script,
+ "sln = solution 'MySolution';"
+ " configurations {'Debug','Release'};"
+ "prj = project 'MyProject';");
+ }
+};
diff --git a/src/script/tests/unload_project_tests.cpp b/src/script/tests/unload_project_tests.cpp
index f35c14f..1bc8833 100644
--- a/src/script/tests/unload_project_tests.cpp
+++ b/src/script/tests/unload_project_tests.cpp
@@ -1,85 +1,86 @@
-/**
- * \file unload_project_tests.cpp
- * \brief Automated tests for project object unloading from the script environment.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "script/script_internal.h"
-}
-
-
-struct FxUnloadProject
-{
- Script script;
- lua_State* L;
- Project prj;
-
- FxUnloadProject()
- {
- script = script_create();
- L = script_get_lua(script);
-
- prj = project_create();
-
- script_run_string(script,
- "solution('MySolution');"
- "prj = project('MyProject');"
- " guid '0C202E43-B9AF-4972-822B-5A42F0BF008C';"
- " language 'c++';"
- " files { 'Hello.cpp', 'Goodbye.cpp' };"
- "return prj");
- }
-
- ~FxUnloadProject()
- {
- project_destroy(prj);
- script_destroy(script);
- }
-};
-
-
-SUITE(unload)
-{
- TEST_FIXTURE(FxUnloadProject, UnloadProject_SetsName)
- {
- unload_project(L, prj);
- const char* result = project_get_name(prj);
- CHECK_EQUAL("MyProject", result);
- }
-
- TEST_FIXTURE(FxUnloadProject, UnloadProject_SetsBaseDir)
- {
- unload_project(L, prj);
- const char* result = project_get_base_dir(prj);
- CHECK_EQUAL("(string)", result);
- }
-
- TEST_FIXTURE(FxUnloadProject, UnloadProject_UnloadsFiles)
- {
- unload_project(L, prj);
- Strings files = project_get_files(prj);
- CHECK(strings_size(files) == 2);
- if (strings_size(files) == 2) {
- CHECK_EQUAL("Hello.cpp", strings_item(files, 0));
- CHECK_EQUAL("Goodbye.cpp", strings_item(files, 1));
- }
- }
-
- TEST_FIXTURE(FxUnloadProject, UnloadProject_SetsGuid)
- {
- unload_project(L, prj);
- const char* result = project_get_guid(prj);
- CHECK_EQUAL("0C202E43-B9AF-4972-822B-5A42F0BF008C", result);
- }
-
- TEST_FIXTURE(FxUnloadProject, UnloadProject_SetsLanguage)
- {
- unload_project(L, prj);
- const char* result = project_get_language(prj);
- CHECK_EQUAL("c++", result);
- }
-}
-
+/**
+ * \file unload_project_tests.cpp
+ * \brief Automated tests for project object unloading from the script environment.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "script/script_internal.h"
+}
+
+
+struct FxUnloadProject
+{
+ Script script;
+ lua_State* L;
+ Project prj;
+
+ FxUnloadProject()
+ {
+ script = script_create();
+ L = script_get_lua(script);
+
+ prj = project_create();
+
+ script_run_string(script,
+ "solution('MySolution');"
+ " configurations {'Debug','Release'};"
+ "prj = project('MyProject');"
+ " guid '0C202E43-B9AF-4972-822B-5A42F0BF008C';"
+ " language 'c++';"
+ " files { 'Hello.cpp', 'Goodbye.cpp' };"
+ "return prj");
+ }
+
+ ~FxUnloadProject()
+ {
+ project_destroy(prj);
+ script_destroy(script);
+ }
+};
+
+
+SUITE(unload)
+{
+ TEST_FIXTURE(FxUnloadProject, UnloadProject_SetsName)
+ {
+ unload_project(L, prj);
+ const char* result = project_get_name(prj);
+ CHECK_EQUAL("MyProject", result);
+ }
+
+ TEST_FIXTURE(FxUnloadProject, UnloadProject_SetsBaseDir)
+ {
+ unload_project(L, prj);
+ const char* result = project_get_base_dir(prj);
+ CHECK_EQUAL("(string)", result);
+ }
+
+ TEST_FIXTURE(FxUnloadProject, UnloadProject_UnloadsFiles)
+ {
+ unload_project(L, prj);
+ Strings files = project_get_files(prj);
+ CHECK(strings_size(files) == 2);
+ if (strings_size(files) == 2) {
+ CHECK_EQUAL("Hello.cpp", strings_item(files, 0));
+ CHECK_EQUAL("Goodbye.cpp", strings_item(files, 1));
+ }
+ }
+
+ TEST_FIXTURE(FxUnloadProject, UnloadProject_SetsGuid)
+ {
+ unload_project(L, prj);
+ const char* result = project_get_guid(prj);
+ CHECK_EQUAL("0C202E43-B9AF-4972-822B-5A42F0BF008C", result);
+ }
+
+ TEST_FIXTURE(FxUnloadProject, UnloadProject_SetsLanguage)
+ {
+ unload_project(L, prj);
+ const char* result = project_get_language(prj);
+ CHECK_EQUAL("c++", result);
+ }
+}
+
diff --git a/src/script/tests/unload_solution_tests.cpp b/src/script/tests/unload_solution_tests.cpp
index 06610b3..3d60f56 100644
--- a/src/script/tests/unload_solution_tests.cpp
+++ b/src/script/tests/unload_solution_tests.cpp
@@ -1,65 +1,65 @@
-/**
- * \file unload_solution_tests.cpp
- * \brief Automated tests for solution object unloading from the script environment.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "script/script_internal.h"
-}
-
-
-struct FxUnloadSolution
-{
- Script script;
- lua_State* L;
- Solution sln;
-
- FxUnloadSolution()
- {
- script = script_create();
- L = script_get_lua(script);
-
- sln = solution_create();
-
- script_run_string(script,
- "sln = solution('MySolution');"
- " configurations { 'Debug', 'Release' };"
- "return sln");
- }
-
- ~FxUnloadSolution()
- {
- solution_destroy(sln);
- script_destroy(script);
- }
-};
-
-
-SUITE(unload)
-{
- TEST_FIXTURE(FxUnloadSolution, UnloadSolution_SetsName)
- {
- unload_solution(L, sln);
- const char* result = solution_get_name(sln);
- CHECK_EQUAL("MySolution", result);
- }
-
- TEST_FIXTURE(FxUnloadSolution, UnloadSolution_SetsBaseDir)
- {
- unload_solution(L, sln);
- const char* result = solution_get_base_dir(sln);
- CHECK_EQUAL("(string)", result);
- }
-
- TEST_FIXTURE(FxUnloadSolution, UnloadSolution_SetsConfigurations)
- {
- unload_solution(L, sln);
- CHECK(solution_num_configs(sln) == 2);
- CHECK_EQUAL("Debug", solution_get_config_name(sln, 0));
- CHECK_EQUAL("Release", solution_get_config_name(sln, 1));
- }
-}
-
+/**
+ * \file unload_solution_tests.cpp
+ * \brief Automated tests for solution object unloading from the script environment.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "script/script_internal.h"
+}
+
+
+struct FxUnloadSolution
+{
+ Script script;
+ lua_State* L;
+ Solution sln;
+
+ FxUnloadSolution()
+ {
+ script = script_create();
+ L = script_get_lua(script);
+
+ sln = solution_create();
+
+ script_run_string(script,
+ "sln = solution('MySolution');"
+ " configurations { 'Debug', 'Release' };"
+ "return sln");
+ }
+
+ ~FxUnloadSolution()
+ {
+ solution_destroy(sln);
+ script_destroy(script);
+ }
+};
+
+
+SUITE(unload)
+{
+ TEST_FIXTURE(FxUnloadSolution, UnloadSolution_SetsName)
+ {
+ unload_solution(L, sln);
+ const char* result = solution_get_name(sln);
+ CHECK_EQUAL("MySolution", result);
+ }
+
+ TEST_FIXTURE(FxUnloadSolution, UnloadSolution_SetsBaseDir)
+ {
+ unload_solution(L, sln);
+ const char* result = solution_get_base_dir(sln);
+ CHECK_EQUAL("(string)", result);
+ }
+
+ TEST_FIXTURE(FxUnloadSolution, UnloadSolution_SetsConfigurations)
+ {
+ unload_solution(L, sln);
+ CHECK(solution_num_configs(sln) == 2);
+ CHECK_EQUAL("Debug", solution_get_config_name(sln, 0));
+ CHECK_EQUAL("Release", solution_get_config_name(sln, 1));
+ }
+}
+
diff --git a/src/script/tests/unload_tests.cpp b/src/script/tests/unload_tests.cpp
index 22d9493..cb8b3bc 100644
--- a/src/script/tests/unload_tests.cpp
+++ b/src/script/tests/unload_tests.cpp
@@ -1,174 +1,175 @@
-/**
- * \file unload_tests.cpp
- * \brief Automated tests for project object enumeration from the script environment.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "script/script_internal.h"
-}
-
-/* mock interface to object loaders */
-
-static int num_solution_calls;
-static int num_project_calls;
-
-static int stub_solution_func(lua_State* L, Solution sln)
-{
- UNUSED(L); UNUSED(sln);
- num_solution_calls++;
- return OKAY;
-}
-
-static int stub_solution_fail_func(lua_State* L, Solution sln)
-{
- UNUSED(L); UNUSED(sln);
- num_solution_calls++;
- return !OKAY;
-}
-
-static int stub_project_func(lua_State* L, Project prj)
-{
- UNUSED(L); UNUSED(prj);
- num_project_calls++;
- return OKAY;
-}
-
-static int stub_project_fail_func(lua_State* L, Project prj)
-{
- UNUSED(L); UNUSED(prj);
- num_project_calls++;
- return !OKAY;
-}
-
-
-struct FxUnload
-{
- Script script;
- lua_State* L;
- Array slns;
- UnloadFuncs funcs;
-
- FxUnload()
- {
- script = script_create();
- L = script_get_lua(script);
-
- slns = array_create();
-
- funcs.unload_solution = stub_solution_func;
- funcs.unload_project = stub_project_func;
- num_solution_calls = 0;
- num_project_calls = 0;
- }
-
- ~FxUnload()
- {
- array_destroy(slns);
- script_destroy(script);
- }
-};
-
-
-struct FxUnload2 : FxUnload
-{
- FxUnload2()
- {
- script_run_string(script,
- "solution 'MySolution';"
- " project 'MyProject';"
- " project 'MyProject2';"
- "solution 'MySolution2';");
- }
-};
-
-
-SUITE(unload)
-{
- TEST_FIXTURE(FxUnload, Unload_ReturnsOkay_OnEmptySession)
- {
- int result = unload_all(L, slns, &funcs);
- CHECK(result == OKAY);
- }
-
- TEST_FIXTURE(FxUnload, Unload_ReturnsEmptySession_OnEmptySession)
- {
- unload_all(L, slns, &funcs);
- int n = array_size(slns);
- CHECK(n == 0);
- }
-
- TEST_FIXTURE(FxUnload2, Unload_ReturnsOkay_OnNonEmptySession)
- {
- int result = unload_all(L, slns, &funcs);
- CHECK(result == OKAY);
- }
-
-
- /**********************************************************************
- * Solution enumeration tests
- **********************************************************************/
-
- TEST_FIXTURE(FxUnload2, Unload_AddsSolutions_OnNonEmptySession)
- {
- unload_all(L, slns, &funcs);
- int n = array_size(slns);
- CHECK(n == 2);
- }
-
- TEST_FIXTURE(FxUnload2, Unload_CallsSolutionFunc_OnEachSolution)
- {
- unload_all(L, slns, &funcs);
- CHECK(num_solution_calls == 2);
- }
-
- TEST_FIXTURE(FxUnload2, Unload_ReturnsNotOkay_OnSolutionFailure)
- {
- funcs.unload_solution = stub_solution_fail_func;
- int result = unload_all(L, slns, &funcs);
- CHECK(result != OKAY);
- }
-
- TEST_FIXTURE(FxUnload2, Unload_AbortsSolutionLoop_OnNotOkay)
- {
- funcs.unload_solution = stub_solution_fail_func;
- unload_all(L, slns, &funcs);
- CHECK(num_solution_calls == 1);
- }
-
-
- /**********************************************************************
- * Project enumeration tests
- **********************************************************************/
-
- TEST_FIXTURE(FxUnload2, Unload_AddsProjects_OnNonEmptySession)
- {
- unload_all(L, slns, &funcs);
- Solution sln = (Solution)array_item(slns, 0);
- int n = solution_num_projects(sln);
- CHECK(n == 2);
- }
-
- TEST_FIXTURE(FxUnload2, Unload_CallsProjectFunc_OnEachProject)
- {
- unload_all(L, slns, &funcs);
- CHECK(num_project_calls == 2);
- }
-
- TEST_FIXTURE(FxUnload2, Unload_ReturnsNotOkay_OnProjectFailure)
- {
- funcs.unload_project = stub_project_fail_func;
- int result = unload_all(L, slns, &funcs);
- CHECK(result != OKAY);
- }
-
- TEST_FIXTURE(FxUnload2, Unload_AbortsProjectLoop_OnNotOkay)
- {
- funcs.unload_project = stub_project_fail_func;
- unload_all(L, slns, &funcs);
- CHECK(num_project_calls == 1);
- }
-
-}
+/**
+ * \file unload_tests.cpp
+ * \brief Automated tests for project object enumeration from the script environment.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "script/script_internal.h"
+}
+
+/* mock interface to object loaders */
+
+static int num_solution_calls;
+static int num_project_calls;
+
+static int stub_solution_func(lua_State* L, Solution sln)
+{
+ UNUSED(L); UNUSED(sln);
+ num_solution_calls++;
+ return OKAY;
+}
+
+static int stub_solution_fail_func(lua_State* L, Solution sln)
+{
+ UNUSED(L); UNUSED(sln);
+ num_solution_calls++;
+ return !OKAY;
+}
+
+static int stub_project_func(lua_State* L, Project prj)
+{
+ UNUSED(L); UNUSED(prj);
+ num_project_calls++;
+ return OKAY;
+}
+
+static int stub_project_fail_func(lua_State* L, Project prj)
+{
+ UNUSED(L); UNUSED(prj);
+ num_project_calls++;
+ return !OKAY;
+}
+
+
+struct FxUnload
+{
+ Script script;
+ lua_State* L;
+ Array slns;
+ UnloadFuncs funcs;
+
+ FxUnload()
+ {
+ script = script_create();
+ L = script_get_lua(script);
+
+ slns = array_create();
+
+ funcs.unload_solution = stub_solution_func;
+ funcs.unload_project = stub_project_func;
+ num_solution_calls = 0;
+ num_project_calls = 0;
+ }
+
+ ~FxUnload()
+ {
+ array_destroy(slns);
+ script_destroy(script);
+ }
+};
+
+
+struct FxUnload2 : FxUnload
+{
+ FxUnload2()
+ {
+ script_run_string(script,
+ "solution 'MySolution';"
+ " configurations{'Debug','Release'};"
+ " project 'MyProject';"
+ " project 'MyProject2';"
+ "solution 'MySolution2';");
+ }
+};
+
+
+SUITE(unload)
+{
+ TEST_FIXTURE(FxUnload, Unload_ReturnsOkay_OnEmptySession)
+ {
+ int result = unload_all(L, slns, &funcs);
+ CHECK(result == OKAY);
+ }
+
+ TEST_FIXTURE(FxUnload, Unload_ReturnsEmptySession_OnEmptySession)
+ {
+ unload_all(L, slns, &funcs);
+ int n = array_size(slns);
+ CHECK(n == 0);
+ }
+
+ TEST_FIXTURE(FxUnload2, Unload_ReturnsOkay_OnNonEmptySession)
+ {
+ int result = unload_all(L, slns, &funcs);
+ CHECK(result == OKAY);
+ }
+
+
+ /**********************************************************************
+ * Solution enumeration tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxUnload2, Unload_AddsSolutions_OnNonEmptySession)
+ {
+ unload_all(L, slns, &funcs);
+ int n = array_size(slns);
+ CHECK(n == 2);
+ }
+
+ TEST_FIXTURE(FxUnload2, Unload_CallsSolutionFunc_OnEachSolution)
+ {
+ unload_all(L, slns, &funcs);
+ CHECK(num_solution_calls == 2);
+ }
+
+ TEST_FIXTURE(FxUnload2, Unload_ReturnsNotOkay_OnSolutionFailure)
+ {
+ funcs.unload_solution = stub_solution_fail_func;
+ int result = unload_all(L, slns, &funcs);
+ CHECK(result != OKAY);
+ }
+
+ TEST_FIXTURE(FxUnload2, Unload_AbortsSolutionLoop_OnNotOkay)
+ {
+ funcs.unload_solution = stub_solution_fail_func;
+ unload_all(L, slns, &funcs);
+ CHECK(num_solution_calls == 1);
+ }
+
+
+ /**********************************************************************
+ * Project enumeration tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxUnload2, Unload_AddsProjects_OnNonEmptySession)
+ {
+ unload_all(L, slns, &funcs);
+ Solution sln = (Solution)array_item(slns, 0);
+ int n = solution_num_projects(sln);
+ CHECK(n == 2);
+ }
+
+ TEST_FIXTURE(FxUnload2, Unload_CallsProjectFunc_OnEachProject)
+ {
+ unload_all(L, slns, &funcs);
+ CHECK(num_project_calls == 2);
+ }
+
+ TEST_FIXTURE(FxUnload2, Unload_ReturnsNotOkay_OnProjectFailure)
+ {
+ funcs.unload_project = stub_project_fail_func;
+ int result = unload_all(L, slns, &funcs);
+ CHECK(result != OKAY);
+ }
+
+ TEST_FIXTURE(FxUnload2, Unload_AbortsProjectLoop_OnNotOkay)
+ {
+ funcs.unload_project = stub_project_fail_func;
+ unload_all(L, slns, &funcs);
+ CHECK(num_project_calls == 1);
+ }
+
+}
diff --git a/src/script/unload.c b/src/script/unload.c
index 0f1ad74..9fda9cb 100644
--- a/src/script/unload.c
+++ b/src/script/unload.c
@@ -1,156 +1,156 @@
-/**
- * \file unload.c
- * \brief Unload project objects from the scripting environment.
- * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include "premake.h"
-#include "script/script_internal.h"
-
-
-static int unload_solution_projects(lua_State* L, struct UnloadFuncs* funcs, Solution sln);
-
-
-/**
- * Copy project information out of the scripting environment and into C objects that
- * can be more easily manipulated by the action code.
- * \param L The Lua scripting engine state.
- * \param slns An array to contain the list of unloaded solutions.
- * \param funcs The unloading "interface", providing an opportunity to mock for automated testing.
- * \returns OKAY if successful.
- */
-int unload_all(lua_State* L, Array slns, struct UnloadFuncs* funcs)
-{
- int si, sn, z = OKAY;
-
- assert(L);
- assert(slns);
- assert(funcs);
- assert(funcs->unload_solution);
-
- /* iterate over the list of solutions */
- lua_getglobal(L, SOLUTIONS_KEY);
- sn = luaL_getn(L, -1);
- for (si = 1; z == OKAY && si <= sn; ++si)
- {
- Solution sln = solution_create();
- array_add(slns, sln);
- lua_rawgeti(L, -1, si);
-
- /* hardcoded a standard set of configurations for now */
- solution_add_config_name(sln, "Debug");
- solution_add_config_name(sln, "Release");
-
- /* extract the project fields */
- z = funcs->unload_solution(L, sln);
- if (z == OKAY)
- {
- z = unload_solution_projects(L, funcs, sln);
- }
-
- /* remove solution object from stack */
- lua_pop(L, 1);
- }
-
- /* remove list of solutions from stack */
- lua_pop(L, 1);
- return z;
-}
-
-
-static int unload_solution_projects(lua_State* L, struct UnloadFuncs* funcs, Solution sln)
-{
- int pi, pn, z = OKAY;
-
- /* iterate over list of projects from the solution */
- lua_getfield(L, -1, PROJECTS_KEY);
- pn = luaL_getn(L, -1);
- for (pi = 1; z == OKAY && pi <= pn; ++pi)
- {
- Project prj = project_create();
- solution_add_project(sln, prj);
-
- /* unload the project fields */
- lua_rawgeti(L, -1, pi);
- z = funcs->unload_project(L, prj);
-
- /* remove project object from stack */
- lua_pop(L, 1);
- }
-
- /* remove list of projects from stack */
- lua_pop(L, 1);
- return z;
-}
-
-
-int unload_fields(lua_State* L, Fields fields, struct FieldInfo* info)
-{
- const char* value;
- int fi;
-
- for (fi = 0; info[fi].name != NULL; ++fi)
- {
- Strings values = strings_create();
-
- lua_getfield(L, -1, info[fi].name);
- if (lua_istable(L, -1))
- {
- int i, n;
- n = luaL_getn(L, -1);
- for (i = 1; i <= n; ++i)
- {
- lua_rawgeti(L, -1, i);
- value = lua_tostring(L, -1);
- if (value != NULL)
- {
- strings_add(values, value);
- }
- lua_pop(L, 1);
- }
- }
- else
- {
- value = lua_tostring(L, -1);
- if (value != NULL)
- {
- strings_add(values, value);
- }
- }
-
- /* remove the field value from the top of the stack */
- lua_pop(L, 1);
-
- /* store the field values */
- fields_set_values(fields, fi, values);
- }
-
- return OKAY;
-}
-
-
-/**
- * Unload information from the scripting environment for a particular solution.
- * \param L The Lua scripting engine state.
- * \param sln The solution object to be populated.
- * \returns OKAY if successful.
- */
-int unload_solution(lua_State* L, Solution sln)
-{
- return unload_fields(L, solution_get_fields(sln), SolutionFieldInfo);
-}
-
-
-/**
- * Unload information from the scripting environment for a particular project.
- * \param L The Lua scripting engine state.
- * \param prj The project object to be populated.
- * \returns OKAY if successful.
- */
-int unload_project(lua_State* L, Project prj)
-{
- return unload_fields(L, project_get_fields(prj), ProjectFieldInfo);
-}
-
-
+/**
+ * \file unload.c
+ * \brief Unload project objects from the scripting environment.
+ * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include "premake.h"
+#include "script/script_internal.h"
+
+
+static int unload_solution_projects(lua_State* L, struct UnloadFuncs* funcs, Solution sln);
+
+
+/**
+ * Copy project information out of the scripting environment and into C objects that
+ * can be more easily manipulated by the action code.
+ * \param L The Lua scripting engine state.
+ * \param slns An array to contain the list of unloaded solutions.
+ * \param funcs The unloading "interface", providing an opportunity to mock for automated testing.
+ * \returns OKAY if successful.
+ */
+int unload_all(lua_State* L, Array slns, struct UnloadFuncs* funcs)
+{
+ int si, sn, z = OKAY;
+
+ assert(L);
+ assert(slns);
+ assert(funcs);
+ assert(funcs->unload_solution);
+
+ /* iterate over the list of solutions */
+ lua_getglobal(L, SOLUTIONS_KEY);
+ sn = luaL_getn(L, -1);
+ for (si = 1; z == OKAY && si <= sn; ++si)
+ {
+ Solution sln = solution_create();
+ array_add(slns, sln);
+ lua_rawgeti(L, -1, si);
+
+ /* hardcoded a standard set of configurations for now */
+ solution_add_config_name(sln, "Debug");
+ solution_add_config_name(sln, "Release");
+
+ /* extract the project fields */
+ z = funcs->unload_solution(L, sln);
+ if (z == OKAY)
+ {
+ z = unload_solution_projects(L, funcs, sln);
+ }
+
+ /* remove solution object from stack */
+ lua_pop(L, 1);
+ }
+
+ /* remove list of solutions from stack */
+ lua_pop(L, 1);
+ return z;
+}
+
+
+static int unload_solution_projects(lua_State* L, struct UnloadFuncs* funcs, Solution sln)
+{
+ int pi, pn, z = OKAY;
+
+ /* iterate over list of projects from the solution */
+ lua_getfield(L, -1, PROJECTS_KEY);
+ pn = luaL_getn(L, -1);
+ for (pi = 1; z == OKAY && pi <= pn; ++pi)
+ {
+ Project prj = project_create();
+ solution_add_project(sln, prj);
+
+ /* unload the project fields */
+ lua_rawgeti(L, -1, pi);
+ z = funcs->unload_project(L, prj);
+
+ /* remove project object from stack */
+ lua_pop(L, 1);
+ }
+
+ /* remove list of projects from stack */
+ lua_pop(L, 1);
+ return z;
+}
+
+
+int unload_fields(lua_State* L, Fields fields, struct FieldInfo* info)
+{
+ const char* value;
+ int fi;
+
+ for (fi = 0; info[fi].name != NULL; ++fi)
+ {
+ Strings values = strings_create();
+
+ lua_getfield(L, -1, info[fi].name);
+ if (lua_istable(L, -1))
+ {
+ int i, n;
+ n = luaL_getn(L, -1);
+ for (i = 1; i <= n; ++i)
+ {
+ lua_rawgeti(L, -1, i);
+ value = lua_tostring(L, -1);
+ if (value != NULL)
+ {
+ strings_add(values, value);
+ }
+ lua_pop(L, 1);
+ }
+ }
+ else
+ {
+ value = lua_tostring(L, -1);
+ if (value != NULL)
+ {
+ strings_add(values, value);
+ }
+ }
+
+ /* remove the field value from the top of the stack */
+ lua_pop(L, 1);
+
+ /* store the field values */
+ fields_set_values(fields, fi, values);
+ }
+
+ return OKAY;
+}
+
+
+/**
+ * Unload information from the scripting environment for a particular solution.
+ * \param L The Lua scripting engine state.
+ * \param sln The solution object to be populated.
+ * \returns OKAY if successful.
+ */
+int unload_solution(lua_State* L, Solution sln)
+{
+ return unload_fields(L, solution_get_fields(sln), SolutionFieldInfo);
+}
+
+
+/**
+ * Unload information from the scripting environment for a particular project.
+ * \param L The Lua scripting engine state.
+ * \param prj The project object to be populated.
+ * \returns OKAY if successful.
+ */
+int unload_project(lua_State* L, Project prj)
+{
+ return unload_fields(L, project_get_fields(prj), ProjectFieldInfo);
+}
+
+
diff --git a/src/session/session.c b/src/session/session.c
index 75b551c..6414188 100644
--- a/src/session/session.c
+++ b/src/session/session.c
@@ -1,363 +1,363 @@
-/**
- * \file session.c
- * \brief Context for a program execution session.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include <assert.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "premake.h"
-#include "session.h"
-#include "script/script.h"
-#include "base/array.h"
-#include "base/cstr.h"
-#include "base/error.h"
-
-
-DEFINE_CLASS(Session)
-{
- Script script;
- Array solutions;
- Stream active_stream;
-};
-
-
-/**
- * Create a new session object.
- * \returns A new session object, or NULL if the scripting engine fails to start.
- */
-Session session_create(void)
-{
- Session sess;
-
- /* create an instance of the project scripting engine */
- Script script = script_create();
- if (script == NULL)
- {
- return NULL;
- }
-
- /* create and return the session object */
- sess = ALLOC_CLASS(Session);
- sess->script = script;
- sess->solutions = array_create();
- sess->active_stream = NULL;
- return sess;
-}
-
-
-/**
- * Destroy a session object and release the associated memory.
- * \param sess The session object to destroy.
- */
-void session_destroy(Session sess)
-{
- int i, n;
-
- assert(sess);
-
- n = session_num_solutions(sess);
- for (i = 0; i < n; ++i)
- {
- Solution sln = session_get_solution(sess, i);
- solution_destroy(sln);
- }
-
- script_destroy(sess->script);
- array_destroy(sess->solutions);
- free(sess);
-}
-
-
-/**
- * Adds a new solution to the list of solutions contained by the session.
- * \param sess The session object.
- * \param sln The new solution to add.
- */
-void session_add_solution(Session sess, Solution sln)
-{
- assert(sess);
- assert(sln);
- array_add(sess->solutions, sln);
-}
-
-
-/**
- * A bit of black magic: this function acts as a special token for the project handler
- * function list to indicate where configurations should appear. For more details, see
- * the implementation of session_enumerate_objects().
- * \param sess The session object.
- * \param prj The target project.
- * \param strm The currently active output stream.
- * \returns OKAY.
- */
-int session_enumerate_configurations(Session sess, Project prj, Stream strm)
-{
- UNUSED(sess);
- UNUSED(prj);
- UNUSED(strm);
- return OKAY;
-}
-
-
-/**
- * Iterate the project objects contained by the session and hand them off to handler callbacks.
- * \param sess The session object.
- * \param sln_funcs A list of per-solution object callbacks.
- * \param prj_funcs A list of per-project object callbacks.
- * \param cfg_funcs A list of per-configuration callbacks.
- * \returns OKAY if successful.
- */
-int session_enumerate_objects(Session sess, SessionSolutionCallback* sln_funcs, SessionProjectCallback* prj_funcs, SessionProjectCallback* cfg_funcs)
-{
- int si, sn;
- int result = OKAY;
-
- assert(sess);
- assert(sln_funcs);
- assert(prj_funcs);
- assert(cfg_funcs);
-
- /* enumerate solutions */
- sn = session_num_solutions(sess);
- for (si = 0; si < sn; ++si)
- {
- /* call all solution functions */
- int fi, pi, pn;
- Solution sln = session_get_solution(sess, si);
- for (fi = 0; result == OKAY && sln_funcs[fi] != NULL; ++fi)
- {
- result = sln_funcs[fi](sess, sln, sess->active_stream);
- }
-
- /* enumerate projects */
- pn = solution_num_projects(sln);
- for (pi = 0; pi < pn; ++pi)
- {
- Project prj = solution_get_project(sln, pi);
- for (fi = 0; result == OKAY && prj_funcs[fi]; ++fi)
- {
- /* A bit of black magic here - I use the "session_enumerate_configurations"
- * token to indicate where the list of configurations should appear in the
- * project file. */
- if (prj_funcs[fi] == session_enumerate_configurations)
- {
- int ci, cn;
- cn = solution_num_configs(sln);
- for (ci = 0; result == OKAY && ci < cn; ++ci)
- {
- int cfi;
- const char* cfg_name = solution_get_config_name(sln, ci);
- project_set_configuration_filter(prj, cfg_name);
-
- /* enumerate configurations */
- for (cfi = 0; result == OKAY && cfg_funcs[cfi]; ++cfi)
- {
- result = cfg_funcs[cfi](sess, prj, sess->active_stream);
- }
- }
- }
- else
- {
- result = prj_funcs[fi](sess, prj, sess->active_stream);
- }
- }
- }
- }
-
- if (sess->active_stream)
- {
- stream_destroy(sess->active_stream);
- sess->active_stream = NULL;
- }
-
- return result;
-}
-
-
-/**
- * Get the action name to be performed by this execution run.
- * \param sess The session object.
- * \returns The action name if set, or NULL.
- */
-const char* session_get_action(Session sess)
-{
- assert(sess);
- return script_get_action(sess->script);
-}
-
-
-/**
- * Retrieve the currently active output stream.
- * \param sess The session object.
- * \return The currently active stream, or NULL if no stream is active.
- */
-Stream session_get_active_stream(Session sess)
-{
- assert(sess);
- return sess->active_stream;
-}
-
-
-/**
- * Retrieve the contained solution at the given index in the solution list.
- * \param sess The session object.
- * \param index The index of the solution to return.
- * \returns The solution object at the given index.
- */
-Solution session_get_solution(Session sess, int index)
-{
- assert(sess);
- assert(index >= 0 && array_size(sess->solutions) > 0 && index < array_size(sess->solutions));
- return (Solution)array_item(sess->solutions, index);
-}
-
-
-/**
- * Return the number of solutions contained by the session.
- * \param sess The session object.
- */
-int session_num_solutions(Session sess)
-{
- assert(sess);
- return array_size(sess->solutions);
-}
-
-
-/**
- * Execute a script stored in a file.
- * \param sess The session object.
- * \param filename The name of the file containing the script code to be executed.
- * \returns If the script returns a value, it is converted to a string and returned.
- * If the script does not return a value, NULL is returned. If an error
- * occurs in the script, the error message is returned.
- */
-const char* session_run_file(Session sess, const char* filename)
-{
- assert(sess);
- return script_run_file(sess->script, filename);
-}
-
-
-/**
- * Execute a bit of script stored in a string.
- * \param sess The session object.
- * \param code The string containing the script code to be executed.
- * \returns If the script returns a value, it is converted to a string and returned.
- * If the script does not return a value, NULL is returned. If an error
- * occurs in the script, the error message is returned.
- */
-const char* session_run_string(Session sess, const char* code)
-{
- assert(sess);
- return script_run_string(sess->script, code);
-}
-
-
-/**
- * Set the action name to be performed on this execution pass. The action name will
- * be placed in the _ACTION script environment global.
- * \param sess The current execution session context.
- * \param action The name of the action to be performed.
- */
-void session_set_action(Session sess, const char* action)
-{
- assert(sess);
- script_set_action(sess->script, action);
-}
-
-
-/**
- * Set the active output stream, which will be passed to subsequent callbacks during
- * object processing by session_enumerate_objects(). If there is an existing active
- * stream it will be released before setting the new stream.
- * \param sess The current execution session context.
- * \param strm The new active stream.
- */
-void session_set_active_stream(Session sess, Stream strm)
-{
- assert(sess);
- assert(strm);
- if (sess->active_stream)
- {
- stream_destroy(sess->active_stream);
- }
- sess->active_stream = strm;
-}
-
-
-/**
- * Copy project information out of the scripting environment and into C objects that
- * can be more easily manipulated by the action code.
- * \param sess The session object which contains the scripted project objects.
- * \returns OKAY if successful.
- */
-int session_unload(Session sess)
-{
- assert(sess);
- return script_unload(sess->script, sess->solutions);
-}
-
-
-/**
- * Make sure that all required objects and values have been defined by the project script.
- * \param sess The session to validate.
- * \param features The features (language, kind, etc.) supported by the current action.
- * \returns OKAY if the session is valid.
- */
-int session_validate(Session sess, SessionFeatures* features)
-{
- int si, sn;
-
- assert(sess);
- assert(features);
-
- sn = session_num_solutions(sess);
- for (si = 0; si < sn; ++si)
- {
- int pi, pn;
- Solution sln = session_get_solution(sess, si);
-
- /* every solution must have at least one project */
- pn = solution_num_projects(sln);
- if (pn == 0)
- {
- error_set("no projects defined for solution '%s'", solution_get_name(sln));
- return !OKAY;
- }
-
- for (pi = 0; pi < pn; ++pi)
- {
- int i;
-
- Project prj = solution_get_project(sln, pi);
- const char* prj_name = project_get_name(prj);
- const char* prj_lang = project_get_language(prj);
-
- /* every project must have a language defined */
- if (prj_lang == NULL)
- {
- error_set("no language defined for project '%s'", prj_name);
- return !OKAY;
- }
-
- /* action must support the language */
- for (i = 0; features->languages[i] != NULL; ++i)
- {
- if (cstr_eq(prj_lang, features->languages[i]))
- break;
- }
-
- if (features->languages[i] == NULL)
- {
- error_set("%s language projects are not supported by this action", prj_lang);
- return !OKAY;
- }
- }
- }
-
- return OKAY;
-}
+/**
+ * \file session.c
+ * \brief Context for a program execution session.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include <assert.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "premake.h"
+#include "session.h"
+#include "script/script.h"
+#include "base/array.h"
+#include "base/cstr.h"
+#include "base/error.h"
+
+
+DEFINE_CLASS(Session)
+{
+ Script script;
+ Array solutions;
+ Stream active_stream;
+};
+
+
+/**
+ * Create a new session object.
+ * \returns A new session object, or NULL if the scripting engine fails to start.
+ */
+Session session_create(void)
+{
+ Session sess;
+
+ /* create an instance of the project scripting engine */
+ Script script = script_create();
+ if (script == NULL)
+ {
+ return NULL;
+ }
+
+ /* create and return the session object */
+ sess = ALLOC_CLASS(Session);
+ sess->script = script;
+ sess->solutions = array_create();
+ sess->active_stream = NULL;
+ return sess;
+}
+
+
+/**
+ * Destroy a session object and release the associated memory.
+ * \param sess The session object to destroy.
+ */
+void session_destroy(Session sess)
+{
+ int i, n;
+
+ assert(sess);
+
+ n = session_num_solutions(sess);
+ for (i = 0; i < n; ++i)
+ {
+ Solution sln = session_get_solution(sess, i);
+ solution_destroy(sln);
+ }
+
+ script_destroy(sess->script);
+ array_destroy(sess->solutions);
+ free(sess);
+}
+
+
+/**
+ * Adds a new solution to the list of solutions contained by the session.
+ * \param sess The session object.
+ * \param sln The new solution to add.
+ */
+void session_add_solution(Session sess, Solution sln)
+{
+ assert(sess);
+ assert(sln);
+ array_add(sess->solutions, sln);
+}
+
+
+/**
+ * A bit of black magic: this function acts as a special token for the project handler
+ * function list to indicate where configurations should appear. For more details, see
+ * the implementation of session_enumerate_objects().
+ * \param sess The session object.
+ * \param prj The target project.
+ * \param strm The currently active output stream.
+ * \returns OKAY.
+ */
+int session_enumerate_configurations(Session sess, Project prj, Stream strm)
+{
+ UNUSED(sess);
+ UNUSED(prj);
+ UNUSED(strm);
+ return OKAY;
+}
+
+
+/**
+ * Iterate the project objects contained by the session and hand them off to handler callbacks.
+ * \param sess The session object.
+ * \param sln_funcs A list of per-solution object callbacks.
+ * \param prj_funcs A list of per-project object callbacks.
+ * \param cfg_funcs A list of per-configuration callbacks.
+ * \returns OKAY if successful.
+ */
+int session_enumerate_objects(Session sess, SessionSolutionCallback* sln_funcs, SessionProjectCallback* prj_funcs, SessionProjectCallback* cfg_funcs)
+{
+ int si, sn;
+ int result = OKAY;
+
+ assert(sess);
+ assert(sln_funcs);
+ assert(prj_funcs);
+ assert(cfg_funcs);
+
+ /* enumerate solutions */
+ sn = session_num_solutions(sess);
+ for (si = 0; si < sn; ++si)
+ {
+ /* call all solution functions */
+ int fi, pi, pn;
+ Solution sln = session_get_solution(sess, si);
+ for (fi = 0; result == OKAY && sln_funcs[fi] != NULL; ++fi)
+ {
+ result = sln_funcs[fi](sess, sln, sess->active_stream);
+ }
+
+ /* enumerate projects */
+ pn = solution_num_projects(sln);
+ for (pi = 0; pi < pn; ++pi)
+ {
+ Project prj = solution_get_project(sln, pi);
+ for (fi = 0; result == OKAY && prj_funcs[fi]; ++fi)
+ {
+ /* A bit of black magic here - I use the "session_enumerate_configurations"
+ * token to indicate where the list of configurations should appear in the
+ * project file. */
+ if (prj_funcs[fi] == session_enumerate_configurations)
+ {
+ int ci, cn;
+ cn = solution_num_configs(sln);
+ for (ci = 0; result == OKAY && ci < cn; ++ci)
+ {
+ int cfi;
+ const char* cfg_name = solution_get_config_name(sln, ci);
+ project_set_configuration_filter(prj, cfg_name);
+
+ /* enumerate configurations */
+ for (cfi = 0; result == OKAY && cfg_funcs[cfi]; ++cfi)
+ {
+ result = cfg_funcs[cfi](sess, prj, sess->active_stream);
+ }
+ }
+ }
+ else
+ {
+ result = prj_funcs[fi](sess, prj, sess->active_stream);
+ }
+ }
+ }
+ }
+
+ if (sess->active_stream)
+ {
+ stream_destroy(sess->active_stream);
+ sess->active_stream = NULL;
+ }
+
+ return result;
+}
+
+
+/**
+ * Get the action name to be performed by this execution run.
+ * \param sess The session object.
+ * \returns The action name if set, or NULL.
+ */
+const char* session_get_action(Session sess)
+{
+ assert(sess);
+ return script_get_action(sess->script);
+}
+
+
+/**
+ * Retrieve the currently active output stream.
+ * \param sess The session object.
+ * \return The currently active stream, or NULL if no stream is active.
+ */
+Stream session_get_active_stream(Session sess)
+{
+ assert(sess);
+ return sess->active_stream;
+}
+
+
+/**
+ * Retrieve the contained solution at the given index in the solution list.
+ * \param sess The session object.
+ * \param index The index of the solution to return.
+ * \returns The solution object at the given index.
+ */
+Solution session_get_solution(Session sess, int index)
+{
+ assert(sess);
+ assert(index >= 0 && array_size(sess->solutions) > 0 && index < array_size(sess->solutions));
+ return (Solution)array_item(sess->solutions, index);
+}
+
+
+/**
+ * Return the number of solutions contained by the session.
+ * \param sess The session object.
+ */
+int session_num_solutions(Session sess)
+{
+ assert(sess);
+ return array_size(sess->solutions);
+}
+
+
+/**
+ * Execute a script stored in a file.
+ * \param sess The session object.
+ * \param filename The name of the file containing the script code to be executed.
+ * \returns If the script returns a value, it is converted to a string and returned.
+ * If the script does not return a value, NULL is returned. If an error
+ * occurs in the script, the error message is returned.
+ */
+const char* session_run_file(Session sess, const char* filename)
+{
+ assert(sess);
+ return script_run_file(sess->script, filename);
+}
+
+
+/**
+ * Execute a bit of script stored in a string.
+ * \param sess The session object.
+ * \param code The string containing the script code to be executed.
+ * \returns If the script returns a value, it is converted to a string and returned.
+ * If the script does not return a value, NULL is returned. If an error
+ * occurs in the script, the error message is returned.
+ */
+const char* session_run_string(Session sess, const char* code)
+{
+ assert(sess);
+ return script_run_string(sess->script, code);
+}
+
+
+/**
+ * Set the action name to be performed on this execution pass. The action name will
+ * be placed in the _ACTION script environment global.
+ * \param sess The current execution session context.
+ * \param action The name of the action to be performed.
+ */
+void session_set_action(Session sess, const char* action)
+{
+ assert(sess);
+ script_set_action(sess->script, action);
+}
+
+
+/**
+ * Set the active output stream, which will be passed to subsequent callbacks during
+ * object processing by session_enumerate_objects(). If there is an existing active
+ * stream it will be released before setting the new stream.
+ * \param sess The current execution session context.
+ * \param strm The new active stream.
+ */
+void session_set_active_stream(Session sess, Stream strm)
+{
+ assert(sess);
+ assert(strm);
+ if (sess->active_stream)
+ {
+ stream_destroy(sess->active_stream);
+ }
+ sess->active_stream = strm;
+}
+
+
+/**
+ * Copy project information out of the scripting environment and into C objects that
+ * can be more easily manipulated by the action code.
+ * \param sess The session object which contains the scripted project objects.
+ * \returns OKAY if successful.
+ */
+int session_unload(Session sess)
+{
+ assert(sess);
+ return script_unload(sess->script, sess->solutions);
+}
+
+
+/**
+ * Make sure that all required objects and values have been defined by the project script.
+ * \param sess The session to validate.
+ * \param features The features (language, kind, etc.) supported by the current action.
+ * \returns OKAY if the session is valid.
+ */
+int session_validate(Session sess, SessionFeatures* features)
+{
+ int si, sn;
+
+ assert(sess);
+ assert(features);
+
+ sn = session_num_solutions(sess);
+ for (si = 0; si < sn; ++si)
+ {
+ int pi, pn;
+ Solution sln = session_get_solution(sess, si);
+
+ /* every solution must have at least one project */
+ pn = solution_num_projects(sln);
+ if (pn == 0)
+ {
+ error_set("no projects defined for solution '%s'", solution_get_name(sln));
+ return !OKAY;
+ }
+
+ for (pi = 0; pi < pn; ++pi)
+ {
+ int i;
+
+ Project prj = solution_get_project(sln, pi);
+ const char* prj_name = project_get_name(prj);
+ const char* prj_lang = project_get_language(prj);
+
+ /* every project must have a language defined */
+ if (prj_lang == NULL)
+ {
+ error_set("no language defined for project '%s'", prj_name);
+ return !OKAY;
+ }
+
+ /* action must support the language */
+ for (i = 0; features->languages[i] != NULL; ++i)
+ {
+ if (cstr_eq(prj_lang, features->languages[i]))
+ break;
+ }
+
+ if (features->languages[i] == NULL)
+ {
+ error_set("%s language projects are not supported by this action", prj_lang);
+ return !OKAY;
+ }
+ }
+ }
+
+ return OKAY;
+}
diff --git a/src/session/session.h b/src/session/session.h
index d8bf62e..ea595c1 100644
--- a/src/session/session.h
+++ b/src/session/session.h
@@ -1,97 +1,97 @@
-/**
- * \file session.h
- * \brief Context for a program execution session.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- *
- * \defgroup session Session
- *
- * Premake is essentially a long chain of sequential actions; the Session object
- * tracks the application state through this chain, and provides the context
- * necessary for actions to do their work. It's a glorified global, essentially.
- *
- * @{
- */
-#if !defined(PREMAKE_SESSION_H)
-#define PREMAKE_SESSION_H
-
-#include "base/stream.h"
-#include "project/solution.h"
-#include "project/project.h"
-
-DECLARE_CLASS(Session)
-
-
-/**
- * Callback signature for Premake action handlers, which will get triggered
- * if user specifies that action on the command line for processing.
- * \param sess The current execution session context.
- * \returns OKAY If successful.
- */
-typedef int (*SessionActionCallback)(Session sess);
-
-
-/**
- * Per-solution object callback signature for session_enumerate_objects(). The
- * solution callback will be called once for each solution in the session.
- * \param sess The execution session context.
- * \param sln The current solution.
- * \param strm The currently active stream; set with session_set_active_stream(). May be NULL.
- * \returns OKAY if successful.
- */
-typedef int (*SessionSolutionCallback)(Session sess, Solution sln, Stream strm);
-
-
-/**
- * Per-project object callback signature for session_enumerate_objects(). The
- * project callback will be called once for each solution in the session.
- * \param sess The execution session context.
- * \param prj The current project.
- * \param strm The currently active stream; set with session_set_active_stream(). May be NULL.
- * \returns OKAY if successful.
- */
-typedef int (*SessionProjectCallback)(Session sess, Project prj, Stream strm);
-
-
-/**
- * Describe a Premake action, including the handler function and the metadata
- * required to list it in the user help.
- */
-typedef struct struct_SessionAction
-{
- const char* name;
- const char* description;
- SessionActionCallback callback;
-} SessionAction;
-
-
-/**
- * Describe the features (languages, project kinds, etc.) supported by an action. Used by
- * session_validate() to ensure that action handler functions only get called with data
- * that they can handle.
- */
-typedef struct struct_SessionFeatures
-{
- const char* languages[64];
-} SessionFeatures;
-
-
-Session session_create(void);
-void session_destroy(Session sess);
-void session_add_solution(Session sess, Solution sln);
-int session_enumerate_configurations(Session sess, Project prj, Stream strm);
-int session_enumerate_objects(Session sess, SessionSolutionCallback* sln_funcs, SessionProjectCallback* prj_funcs, SessionProjectCallback* cfg_funcs);
-const char* session_get_action(Session sess);
-Stream session_get_active_stream(Session sess);
-Solution session_get_solution(Session sess, int index);
-int session_num_solutions(Session sess);
-const char* session_run_file(Session sess, const char* filename);
-const char* session_run_string(Session sess, const char* code);
-void session_set_action(Session sess, const char* action);
-void session_set_active_stream(Session sess, Stream strm);
-int session_tests(void);
-int session_unload(Session sess);
-int session_validate(Session sess, SessionFeatures* features);
-
-#endif
-/** @} */
-
+/**
+ * \file session.h
+ * \brief Context for a program execution session.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ *
+ * \defgroup session Session
+ *
+ * Premake is essentially a long chain of sequential actions; the Session object
+ * tracks the application state through this chain, and provides the context
+ * necessary for actions to do their work. It's a glorified global, essentially.
+ *
+ * @{
+ */
+#if !defined(PREMAKE_SESSION_H)
+#define PREMAKE_SESSION_H
+
+#include "base/stream.h"
+#include "project/solution.h"
+#include "project/project.h"
+
+DECLARE_CLASS(Session)
+
+
+/**
+ * Callback signature for Premake action handlers, which will get triggered
+ * if user specifies that action on the command line for processing.
+ * \param sess The current execution session context.
+ * \returns OKAY If successful.
+ */
+typedef int (*SessionActionCallback)(Session sess);
+
+
+/**
+ * Per-solution object callback signature for session_enumerate_objects(). The
+ * solution callback will be called once for each solution in the session.
+ * \param sess The execution session context.
+ * \param sln The current solution.
+ * \param strm The currently active stream; set with session_set_active_stream(). May be NULL.
+ * \returns OKAY if successful.
+ */
+typedef int (*SessionSolutionCallback)(Session sess, Solution sln, Stream strm);
+
+
+/**
+ * Per-project object callback signature for session_enumerate_objects(). The
+ * project callback will be called once for each solution in the session.
+ * \param sess The execution session context.
+ * \param prj The current project.
+ * \param strm The currently active stream; set with session_set_active_stream(). May be NULL.
+ * \returns OKAY if successful.
+ */
+typedef int (*SessionProjectCallback)(Session sess, Project prj, Stream strm);
+
+
+/**
+ * Describe a Premake action, including the handler function and the metadata
+ * required to list it in the user help.
+ */
+typedef struct struct_SessionAction
+{
+ const char* name;
+ const char* description;
+ SessionActionCallback callback;
+} SessionAction;
+
+
+/**
+ * Describe the features (languages, project kinds, etc.) supported by an action. Used by
+ * session_validate() to ensure that action handler functions only get called with data
+ * that they can handle.
+ */
+typedef struct struct_SessionFeatures
+{
+ const char* languages[64];
+} SessionFeatures;
+
+
+Session session_create(void);
+void session_destroy(Session sess);
+void session_add_solution(Session sess, Solution sln);
+int session_enumerate_configurations(Session sess, Project prj, Stream strm);
+int session_enumerate_objects(Session sess, SessionSolutionCallback* sln_funcs, SessionProjectCallback* prj_funcs, SessionProjectCallback* cfg_funcs);
+const char* session_get_action(Session sess);
+Stream session_get_active_stream(Session sess);
+Solution session_get_solution(Session sess, int index);
+int session_num_solutions(Session sess);
+const char* session_run_file(Session sess, const char* filename);
+const char* session_run_string(Session sess, const char* code);
+void session_set_action(Session sess, const char* action);
+void session_set_active_stream(Session sess, Stream strm);
+int session_tests(void);
+int session_unload(Session sess);
+int session_validate(Session sess, SessionFeatures* features);
+
+#endif
+/** @} */
+
diff --git a/src/session/tests/session_tests.cpp b/src/session/tests/session_tests.cpp
index ab6a7d9..f1181cd 100644
--- a/src/session/tests/session_tests.cpp
+++ b/src/session/tests/session_tests.cpp
@@ -1,397 +1,397 @@
-/**
- * \file session_tests.cpp
- * \brief Automated test for the Session class.
- * \author Copyright (c) 2008 Jason Perkins and the Premake project
- */
-
-#include "premake.h"
-#include "testing/testing.h"
-extern "C" {
-#include "session/session.h"
-#include "script/script.h"
-#include "base/base.h"
-#include "base/error.h"
-}
-
-
-/**
- * \brief Run the engine automated tests.
- * \returns OKAY if all tests completed successfully.
- * \note Also runs the tests for all dependencies (everything but the host executable).
- */
-int session_tests()
-{
- int z = base_tests();
- if (z == OKAY) z = project_tests();
- if (z == OKAY) z = script_tests();
- if (z == OKAY) z = tests_run_suite("session");
- return z;
-}
-
-
-/**************************************************************************
- * Support functions for Session object testing
- **************************************************************************/
-
-#define FAIL_SLN_PARAM (1)
-#define FAIL_PRJ_PARAM (2)
-
-static SessionFeatures features = {
- { "c", "c++", NULL },
-};
-
-
-static int num_solution_calls;
-static int num_project_calls;
-static int num_config_calls;
-static const char* last_config_filter;
-
-
-static int test_solution_okay(Session sess, Solution sln, Stream strm)
-{
- UNUSED(sess); UNUSED(sln); UNUSED(strm);
- num_solution_calls++;
- return OKAY;
-}
-
-static int test_solution_fail(Session sess, Solution sln, Stream strm)
-{
- UNUSED(sess); UNUSED(sln); UNUSED(strm);
- return !OKAY;
-}
-
-static int test_project_okay(Session sess, Project prj, Stream strm)
-{
- UNUSED(sess); UNUSED(prj); UNUSED(strm);
- num_project_calls++;
- return OKAY;
-}
-
-static int test_project_fail(Session sess, Project prj, Stream strm)
-{
- UNUSED(sess); UNUSED(prj); UNUSED(strm);
- return !OKAY;
-}
-
-static int test_config_okay(Session sess, Project prj, Stream strm)
-{
- UNUSED(sess); UNUSED(strm);
- num_config_calls++;
- last_config_filter = project_get_configuration_filter(prj);
- return OKAY;
-}
-
-
-struct FxSession
-{
- Session sess;
- Solution sln;
- Project prj;
-
- FxSession()
- {
- sess = session_create();
- num_solution_calls = 0;
- num_project_calls = 0;
- num_config_calls = 0;
- last_config_filter = NULL;
- }
-
- ~FxSession()
- {
- session_destroy(sess);
- error_clear();
- }
-
- Solution AddSolution()
- {
- sln = solution_create();
- session_add_solution(sess, sln);
- solution_set_name(sln, "MySolution");
- return sln;
- }
-
- Project AddProject()
- {
- prj = project_create();
- solution_add_project(sln, prj);
- project_set_name(prj, "MyProject");
- return prj;
- }
-};
-
-
-SUITE(session)
-{
- /**********************************************************************
- * Initial state checks
- **********************************************************************/
-
- TEST_FIXTURE(FxSession, Create_ReturnsObject_OnSuccess)
- {
- CHECK(sess != NULL);
- }
-
-
- /**********************************************************************
- * Script execution tests
- **********************************************************************/
-
- TEST_FIXTURE(FxSession, RunString_ReturnsValue_OnString)
- {
- const char* result = session_run_string(sess, "return 'string value'");
- CHECK_EQUAL("string value", result);
- }
-
- TEST_FIXTURE(FxSession, RunString_ReturnsValue_OnInteger)
- {
- const char* result = session_run_string(sess, "return 18");
- CHECK_EQUAL("18", result);
- }
-
- TEST_FIXTURE(FxSession, RunString_ReturnsValue_OnBoolean)
- {
- const char* result = session_run_string(sess, "return true");
- CHECK_EQUAL("true", result);
- }
-
- TEST_FIXTURE(FxSession, RunFile_ReturnsValue_OnValidFile)
- {
- const char* result = session_run_file(sess, "testing/test_files/true.lua");
- CHECK_EQUAL("true", result);
- }
-
-
- /**********************************************************************
- * Action handling tests
- **********************************************************************/
-
- TEST_FIXTURE(FxSession, SetAction_SetScriptVar)
- {
- session_set_action(sess, "MyAction");
- const char* result = session_run_string(sess, "return _ACTION");
- CHECK_EQUAL("MyAction", result);
- }
-
- TEST_FIXTURE(FxSession, GetAction_ReturnsNull_OnNoAction)
- {
- const char* result = session_get_action(sess);
- CHECK(result == NULL);
- }
-
- TEST_FIXTURE(FxSession, GetAction_GetsFromScriptVar)
- {
- session_run_string(sess, "_ACTION = 'SomeAction'");
- const char* result = session_get_action(sess);
- CHECK_EQUAL("SomeAction", result);
- }
-
-
- /**********************************************************************
- * Solution containment tests
- **********************************************************************/
-
- TEST_FIXTURE(FxSession, NumSolutions_ReturnsZero_OnCreate)
- {
- int n = session_num_solutions(sess);
- CHECK(n == 0);
- }
-
- TEST_FIXTURE(FxSession, NumSolutions_ReturnsOne_OnAddSolution)
- {
- AddSolution();
- int n = session_num_solutions(sess);
- CHECK(n == 1);
- }
-
- TEST_FIXTURE(FxSession, GetSolution_ReturnsSolution_OnAddSolution)
- {
- Solution sln = AddSolution();
- CHECK(sln == session_get_solution(sess, 0));
- }
-
-
- /**********************************************************************
- * Object enumeration tests
- **********************************************************************/
-
- TEST_FIXTURE(FxSession, Enumerate_ReturnsOkay_OnSuccess)
- {
- SessionSolutionCallback sln_funcs[] = { NULL };
- SessionProjectCallback prj_funcs[] = { NULL };
- SessionProjectCallback cfg_funcs[] = { NULL };
- int result = session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
- CHECK(result == OKAY);
- }
-
- TEST_FIXTURE(FxSession, Enumerate_CallsAllSolutionFuncs_OnSolution)
- {
- SessionSolutionCallback sln_funcs[] = { test_solution_okay, test_solution_okay, NULL };
- SessionProjectCallback prj_funcs[] = { NULL };
- SessionProjectCallback cfg_funcs[] = { NULL };
- AddSolution();
- session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
- CHECK(num_solution_calls == 2);
- }
-
- TEST_FIXTURE(FxSession, Enumerate_CallsSolutionFunc_OnEachSolution)
- {
- SessionSolutionCallback sln_funcs[] = { test_solution_okay, NULL };
- SessionProjectCallback prj_funcs[] = { NULL };
- SessionProjectCallback cfg_funcs[] = { NULL };
- AddSolution();
- AddSolution();
- session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
- CHECK(num_solution_calls == 2);
- }
-
- TEST_FIXTURE(FxSession, Enumerate_ReturnsNotOkay_OnSolutionError)
- {
- SessionSolutionCallback sln_funcs[] = { test_solution_fail, NULL };
- SessionProjectCallback prj_funcs[] = { NULL };
- SessionProjectCallback cfg_funcs[] = { NULL };
- AddSolution();
- int result = session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
- CHECK(result != OKAY);
- }
-
- TEST_FIXTURE(FxSession, Enumerate_StopsProcessing_OnSolutionError)
- {
- SessionSolutionCallback sln_funcs[] = { test_solution_fail, test_solution_okay, NULL };
- SessionProjectCallback prj_funcs[] = { NULL };
- SessionProjectCallback cfg_funcs[] = { NULL };
- AddSolution();
- AddSolution();
- session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
- CHECK(num_solution_calls == 0);
- }
-
- TEST_FIXTURE(FxSession, Enumerate_CallsAllProjectFuncs_OnProject)
- {
- SessionSolutionCallback sln_funcs[] = { NULL };
- SessionProjectCallback prj_funcs[] = { test_project_okay, test_project_okay, NULL };
- SessionProjectCallback cfg_funcs[] = { NULL };
- AddSolution();
- AddProject();
- session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
- CHECK(num_project_calls == 2);
- }
-
- TEST_FIXTURE(FxSession, Enumerate_CallsProjectFunc_OnEachProject)
- {
- SessionSolutionCallback sln_funcs[] = { NULL };
- SessionProjectCallback prj_funcs[] = { test_project_okay, NULL };
- SessionProjectCallback cfg_funcs[] = { NULL };
- AddSolution();
- AddProject();
- AddProject();
- session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
- CHECK(num_project_calls == 2);
- }
-
- TEST_FIXTURE(FxSession, Enumerate_ReturnsNotOkay_OnProjectError)
- {
- SessionSolutionCallback sln_funcs[] = { NULL };
- SessionProjectCallback prj_funcs[] = { test_project_fail, NULL };
- SessionProjectCallback cfg_funcs[] = { NULL };
- AddSolution();
- AddProject();
- int result = session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
- CHECK(result != OKAY);
- }
-
- TEST_FIXTURE(FxSession, Enumerate_StopsProcessing_OnProjectError)
- {
- SessionSolutionCallback sln_funcs[] = { NULL };
- SessionProjectCallback prj_funcs[] = { test_project_fail, test_project_okay, NULL };
- SessionProjectCallback cfg_funcs[] = { NULL };
- AddSolution();
- AddProject();
- AddProject();
- session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
- CHECK(num_project_calls == 0);
- }
-
- TEST_FIXTURE(FxSession, Enumerate_CallsAllConfigFuncs_OnConfig)
- {
- SessionSolutionCallback sln_funcs[] = { NULL };
- SessionProjectCallback prj_funcs[] = { session_enumerate_configurations, NULL };
- SessionProjectCallback cfg_funcs[] = { test_config_okay, test_config_okay, NULL };
- AddSolution();
- AddProject();
- solution_add_config_name(sln, "Debug");
- session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
- CHECK(num_config_calls == 2);
- }
-
- TEST_FIXTURE(FxSession, Enumerate_SetsConfigFilter_OnConfig)
- {
- SessionSolutionCallback sln_funcs[] = { NULL };
- SessionProjectCallback prj_funcs[] = { session_enumerate_configurations, NULL };
- SessionProjectCallback cfg_funcs[] = { test_config_okay, test_config_okay, NULL };
- AddSolution();
- AddProject();
- solution_add_config_name(sln, "Debug");
- session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
- CHECK_EQUAL("Debug", last_config_filter);
- }
-
-
- /**********************************************************************
- * Unload tests - most unload testing is done elsewhere
- **********************************************************************/
-
- TEST_FIXTURE(FxSession, Unload_ReturnsOkay_OnNoProjectInfo)
- {
- int result = session_unload(sess);
- CHECK(result == OKAY);
- }
-
-
- /**********************************************************************
- * Session validation tests
- **********************************************************************/
-
- TEST_FIXTURE(FxSession, Validate_ReturnsOkay_OnNoSolutions)
- {
- int result = session_validate(sess, &features);
- CHECK(result == OKAY);
- }
-
- TEST_FIXTURE(FxSession, Validate_ReturnsOkay_OnAllsWell)
- {
- AddSolution();
- AddProject();
- project_set_language(prj, "c++");
- int result = session_validate(sess, &features);
- CHECK(result == OKAY);
- }
-
- TEST_FIXTURE(FxSession, Validate_NotOkay_OnEmptySolution)
- {
- AddSolution();
- int result = session_validate(sess, &features);
- CHECK(result != OKAY);
- CHECK_EQUAL("no projects defined for solution 'MySolution'", error_get());
- }
-
- TEST_FIXTURE(FxSession, Validate_NotOkay_OnNullLanguage)
- {
- AddSolution();
- AddProject();
- int result = session_validate(sess, &features);
- CHECK(result != OKAY);
- CHECK_EQUAL("no language defined for project 'MyProject'", error_get());
- }
-
- TEST_FIXTURE(FxSession, Validate_NotOkay_OnUnsupportedLanguage)
- {
- AddSolution();
- AddProject();
- project_set_language(prj, "nonesuch");
- int result = session_validate(sess, &features);
- CHECK(result != OKAY);
- CHECK_EQUAL("nonesuch language projects are not supported by this action", error_get());
- }
-}
-
+/**
+ * \file session_tests.cpp
+ * \brief Automated test for the Session class.
+ * \author Copyright (c) 2008 Jason Perkins and the Premake project
+ */
+
+#include "premake.h"
+#include "testing/testing.h"
+extern "C" {
+#include "session/session.h"
+#include "script/script.h"
+#include "base/base.h"
+#include "base/error.h"
+}
+
+
+/**
+ * \brief Run the engine automated tests.
+ * \returns OKAY if all tests completed successfully.
+ * \note Also runs the tests for all dependencies (everything but the host executable).
+ */
+int session_tests()
+{
+ int z = base_tests();
+ if (z == OKAY) z = project_tests();
+ if (z == OKAY) z = script_tests();
+ if (z == OKAY) z = tests_run_suite("session");
+ return z;
+}
+
+
+/**************************************************************************
+ * Support functions for Session object testing
+ **************************************************************************/
+
+#define FAIL_SLN_PARAM (1)
+#define FAIL_PRJ_PARAM (2)
+
+static SessionFeatures features = {
+ { "c", "c++", NULL },
+};
+
+
+static int num_solution_calls;
+static int num_project_calls;
+static int num_config_calls;
+static const char* last_config_filter;
+
+
+static int test_solution_okay(Session sess, Solution sln, Stream strm)
+{
+ UNUSED(sess); UNUSED(sln); UNUSED(strm);
+ num_solution_calls++;
+ return OKAY;
+}
+
+static int test_solution_fail(Session sess, Solution sln, Stream strm)
+{
+ UNUSED(sess); UNUSED(sln); UNUSED(strm);
+ return !OKAY;
+}
+
+static int test_project_okay(Session sess, Project prj, Stream strm)
+{
+ UNUSED(sess); UNUSED(prj); UNUSED(strm);
+ num_project_calls++;
+ return OKAY;
+}
+
+static int test_project_fail(Session sess, Project prj, Stream strm)
+{
+ UNUSED(sess); UNUSED(prj); UNUSED(strm);
+ return !OKAY;
+}
+
+static int test_config_okay(Session sess, Project prj, Stream strm)
+{
+ UNUSED(sess); UNUSED(strm);
+ num_config_calls++;
+ last_config_filter = project_get_configuration_filter(prj);
+ return OKAY;
+}
+
+
+struct FxSession
+{
+ Session sess;
+ Solution sln;
+ Project prj;
+
+ FxSession()
+ {
+ sess = session_create();
+ num_solution_calls = 0;
+ num_project_calls = 0;
+ num_config_calls = 0;
+ last_config_filter = NULL;
+ }
+
+ ~FxSession()
+ {
+ session_destroy(sess);
+ error_clear();
+ }
+
+ Solution AddSolution()
+ {
+ sln = solution_create();
+ session_add_solution(sess, sln);
+ solution_set_name(sln, "MySolution");
+ return sln;
+ }
+
+ Project AddProject()
+ {
+ prj = project_create();
+ solution_add_project(sln, prj);
+ project_set_name(prj, "MyProject");
+ return prj;
+ }
+};
+
+
+SUITE(session)
+{
+ /**********************************************************************
+ * Initial state checks
+ **********************************************************************/
+
+ TEST_FIXTURE(FxSession, Create_ReturnsObject_OnSuccess)
+ {
+ CHECK(sess != NULL);
+ }
+
+
+ /**********************************************************************
+ * Script execution tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxSession, RunString_ReturnsValue_OnString)
+ {
+ const char* result = session_run_string(sess, "return 'string value'");
+ CHECK_EQUAL("string value", result);
+ }
+
+ TEST_FIXTURE(FxSession, RunString_ReturnsValue_OnInteger)
+ {
+ const char* result = session_run_string(sess, "return 18");
+ CHECK_EQUAL("18", result);
+ }
+
+ TEST_FIXTURE(FxSession, RunString_ReturnsValue_OnBoolean)
+ {
+ const char* result = session_run_string(sess, "return true");
+ CHECK_EQUAL("true", result);
+ }
+
+ TEST_FIXTURE(FxSession, RunFile_ReturnsValue_OnValidFile)
+ {
+ const char* result = session_run_file(sess, "testing/test_files/true.lua");
+ CHECK_EQUAL("true", result);
+ }
+
+
+ /**********************************************************************
+ * Action handling tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxSession, SetAction_SetScriptVar)
+ {
+ session_set_action(sess, "MyAction");
+ const char* result = session_run_string(sess, "return _ACTION");
+ CHECK_EQUAL("MyAction", result);
+ }
+
+ TEST_FIXTURE(FxSession, GetAction_ReturnsNull_OnNoAction)
+ {
+ const char* result = session_get_action(sess);
+ CHECK(result == NULL);
+ }
+
+ TEST_FIXTURE(FxSession, GetAction_GetsFromScriptVar)
+ {
+ session_run_string(sess, "_ACTION = 'SomeAction'");
+ const char* result = session_get_action(sess);
+ CHECK_EQUAL("SomeAction", result);
+ }
+
+
+ /**********************************************************************
+ * Solution containment tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxSession, NumSolutions_ReturnsZero_OnCreate)
+ {
+ int n = session_num_solutions(sess);
+ CHECK(n == 0);
+ }
+
+ TEST_FIXTURE(FxSession, NumSolutions_ReturnsOne_OnAddSolution)
+ {
+ AddSolution();
+ int n = session_num_solutions(sess);
+ CHECK(n == 1);
+ }
+
+ TEST_FIXTURE(FxSession, GetSolution_ReturnsSolution_OnAddSolution)
+ {
+ Solution sln = AddSolution();
+ CHECK(sln == session_get_solution(sess, 0));
+ }
+
+
+ /**********************************************************************
+ * Object enumeration tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxSession, Enumerate_ReturnsOkay_OnSuccess)
+ {
+ SessionSolutionCallback sln_funcs[] = { NULL };
+ SessionProjectCallback prj_funcs[] = { NULL };
+ SessionProjectCallback cfg_funcs[] = { NULL };
+ int result = session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
+ CHECK(result == OKAY);
+ }
+
+ TEST_FIXTURE(FxSession, Enumerate_CallsAllSolutionFuncs_OnSolution)
+ {
+ SessionSolutionCallback sln_funcs[] = { test_solution_okay, test_solution_okay, NULL };
+ SessionProjectCallback prj_funcs[] = { NULL };
+ SessionProjectCallback cfg_funcs[] = { NULL };
+ AddSolution();
+ session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
+ CHECK(num_solution_calls == 2);
+ }
+
+ TEST_FIXTURE(FxSession, Enumerate_CallsSolutionFunc_OnEachSolution)
+ {
+ SessionSolutionCallback sln_funcs[] = { test_solution_okay, NULL };
+ SessionProjectCallback prj_funcs[] = { NULL };
+ SessionProjectCallback cfg_funcs[] = { NULL };
+ AddSolution();
+ AddSolution();
+ session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
+ CHECK(num_solution_calls == 2);
+ }
+
+ TEST_FIXTURE(FxSession, Enumerate_ReturnsNotOkay_OnSolutionError)
+ {
+ SessionSolutionCallback sln_funcs[] = { test_solution_fail, NULL };
+ SessionProjectCallback prj_funcs[] = { NULL };
+ SessionProjectCallback cfg_funcs[] = { NULL };
+ AddSolution();
+ int result = session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
+ CHECK(result != OKAY);
+ }
+
+ TEST_FIXTURE(FxSession, Enumerate_StopsProcessing_OnSolutionError)
+ {
+ SessionSolutionCallback sln_funcs[] = { test_solution_fail, test_solution_okay, NULL };
+ SessionProjectCallback prj_funcs[] = { NULL };
+ SessionProjectCallback cfg_funcs[] = { NULL };
+ AddSolution();
+ AddSolution();
+ session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
+ CHECK(num_solution_calls == 0);
+ }
+
+ TEST_FIXTURE(FxSession, Enumerate_CallsAllProjectFuncs_OnProject)
+ {
+ SessionSolutionCallback sln_funcs[] = { NULL };
+ SessionProjectCallback prj_funcs[] = { test_project_okay, test_project_okay, NULL };
+ SessionProjectCallback cfg_funcs[] = { NULL };
+ AddSolution();
+ AddProject();
+ session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
+ CHECK(num_project_calls == 2);
+ }
+
+ TEST_FIXTURE(FxSession, Enumerate_CallsProjectFunc_OnEachProject)
+ {
+ SessionSolutionCallback sln_funcs[] = { NULL };
+ SessionProjectCallback prj_funcs[] = { test_project_okay, NULL };
+ SessionProjectCallback cfg_funcs[] = { NULL };
+ AddSolution();
+ AddProject();
+ AddProject();
+ session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
+ CHECK(num_project_calls == 2);
+ }
+
+ TEST_FIXTURE(FxSession, Enumerate_ReturnsNotOkay_OnProjectError)
+ {
+ SessionSolutionCallback sln_funcs[] = { NULL };
+ SessionProjectCallback prj_funcs[] = { test_project_fail, NULL };
+ SessionProjectCallback cfg_funcs[] = { NULL };
+ AddSolution();
+ AddProject();
+ int result = session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
+ CHECK(result != OKAY);
+ }
+
+ TEST_FIXTURE(FxSession, Enumerate_StopsProcessing_OnProjectError)
+ {
+ SessionSolutionCallback sln_funcs[] = { NULL };
+ SessionProjectCallback prj_funcs[] = { test_project_fail, test_project_okay, NULL };
+ SessionProjectCallback cfg_funcs[] = { NULL };
+ AddSolution();
+ AddProject();
+ AddProject();
+ session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
+ CHECK(num_project_calls == 0);
+ }
+
+ TEST_FIXTURE(FxSession, Enumerate_CallsAllConfigFuncs_OnConfig)
+ {
+ SessionSolutionCallback sln_funcs[] = { NULL };
+ SessionProjectCallback prj_funcs[] = { session_enumerate_configurations, NULL };
+ SessionProjectCallback cfg_funcs[] = { test_config_okay, test_config_okay, NULL };
+ AddSolution();
+ AddProject();
+ solution_add_config_name(sln, "Debug");
+ session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
+ CHECK(num_config_calls == 2);
+ }
+
+ TEST_FIXTURE(FxSession, Enumerate_SetsConfigFilter_OnConfig)
+ {
+ SessionSolutionCallback sln_funcs[] = { NULL };
+ SessionProjectCallback prj_funcs[] = { session_enumerate_configurations, NULL };
+ SessionProjectCallback cfg_funcs[] = { test_config_okay, test_config_okay, NULL };
+ AddSolution();
+ AddProject();
+ solution_add_config_name(sln, "Debug");
+ session_enumerate_objects(sess, sln_funcs, prj_funcs, cfg_funcs);
+ CHECK_EQUAL("Debug", last_config_filter);
+ }
+
+
+ /**********************************************************************
+ * Unload tests - most unload testing is done elsewhere
+ **********************************************************************/
+
+ TEST_FIXTURE(FxSession, Unload_ReturnsOkay_OnNoProjectInfo)
+ {
+ int result = session_unload(sess);
+ CHECK(result == OKAY);
+ }
+
+
+ /**********************************************************************
+ * Session validation tests
+ **********************************************************************/
+
+ TEST_FIXTURE(FxSession, Validate_ReturnsOkay_OnNoSolutions)
+ {
+ int result = session_validate(sess, &features);
+ CHECK(result == OKAY);
+ }
+
+ TEST_FIXTURE(FxSession, Validate_ReturnsOkay_OnAllsWell)
+ {
+ AddSolution();
+ AddProject();
+ project_set_language(prj, "c++");
+ int result = session_validate(sess, &features);
+ CHECK(result == OKAY);
+ }
+
+ TEST_FIXTURE(FxSession, Validate_NotOkay_OnEmptySolution)
+ {
+ AddSolution();
+ int result = session_validate(sess, &features);
+ CHECK(result != OKAY);
+ CHECK_EQUAL("no projects defined for solution 'MySolution'", error_get());
+ }
+
+ TEST_FIXTURE(FxSession, Validate_NotOkay_OnNullLanguage)
+ {
+ AddSolution();
+ AddProject();
+ int result = session_validate(sess, &features);
+ CHECK(result != OKAY);
+ CHECK_EQUAL("no language defined for project 'MyProject'", error_get());
+ }
+
+ TEST_FIXTURE(FxSession, Validate_NotOkay_OnUnsupportedLanguage)
+ {
+ AddSolution();
+ AddProject();
+ project_set_language(prj, "nonesuch");
+ int result = session_validate(sess, &features);
+ CHECK(result != OKAY);
+ CHECK_EQUAL("nonesuch language projects are not supported by this action", error_get());
+ }
+}
+
diff --git a/src/testing/UnitTest++/PREMAKE_CHANGES.txt b/src/testing/UnitTest++/PREMAKE_CHANGES.txt
index a61a4b0..bd25432 100644
--- a/src/testing/UnitTest++/PREMAKE_CHANGES.txt
+++ b/src/testing/UnitTest++/PREMAKE_CHANGES.txt
@@ -1,3 +1,3 @@
-Modified CheckStringsEqual() in checks.cpp to allow for actual==NULL (the
-previous behavior was to explode violently).
-
+Modified CheckStringsEqual() in checks.cpp to allow for actual==NULL (the
+previous behavior was to explode violently).
+
diff --git a/src/testing/test_files/_FILE.lua b/src/testing/test_files/_FILE.lua
index 7fae568..54ee3e5 100644
--- a/src/testing/test_files/_FILE.lua
+++ b/src/testing/test_files/_FILE.lua
@@ -1,2 +1,2 @@
--- Return the _FILE global, to ensure that it has been set properly
-return _FILE
+-- Return the _FILE global, to ensure that it has been set properly
+return _FILE
diff --git a/src/testing/test_files/dofile.lua b/src/testing/test_files/dofile.lua
index fef47c8..dac2cde 100644
--- a/src/testing/test_files/dofile.lua
+++ b/src/testing/test_files/dofile.lua
@@ -1,2 +1,2 @@
--- call another script in a different directory, and see what the current directory is when it runs
-return dofile("nested/getcwd.lua")
+-- call another script in a different directory, and see what the current directory is when it runs
+return dofile("nested/getcwd.lua")
diff --git a/src/testing/test_files/dofile_getcwd.lua b/src/testing/test_files/dofile_getcwd.lua
index 0f6f13e..defe46d 100644
--- a/src/testing/test_files/dofile_getcwd.lua
+++ b/src/testing/test_files/dofile_getcwd.lua
@@ -1,4 +1,4 @@
--- run a script in a subdir, and check the current directory when it returns
--- makes sure that current directory gets restored when a nested script completes
-dofile("nested/getcwd.lua")
-return os.getcwd()
+-- run a script in a subdir, and check the current directory when it returns
+-- makes sure that current directory gets restored when a nested script completes
+dofile("nested/getcwd.lua")
+return os.getcwd()
diff --git a/src/testing/test_files/error.lua b/src/testing/test_files/error.lua
index 5d118fe..64f079c 100644
--- a/src/testing/test_files/error.lua
+++ b/src/testing/test_files/error.lua
@@ -1 +1 @@
-error("This script has failed")
+error("This script has failed")
diff --git a/src/testing/test_files/getcwd.lua b/src/testing/test_files/getcwd.lua
index 51c1373..08556c4 100644
--- a/src/testing/test_files/getcwd.lua
+++ b/src/testing/test_files/getcwd.lua
@@ -1 +1 @@
-return os.getcwd()
+return os.getcwd()
diff --git a/src/testing/test_files/nested/getcwd.lua b/src/testing/test_files/nested/getcwd.lua
index 51c1373..08556c4 100644
--- a/src/testing/test_files/nested/getcwd.lua
+++ b/src/testing/test_files/nested/getcwd.lua
@@ -1 +1 @@
-return os.getcwd()
+return os.getcwd()
diff --git a/src/testing/test_files/premake4.lua b/src/testing/test_files/premake4.lua
index 530e6c4..5cf4ea6 100644
--- a/src/testing/test_files/premake4.lua
+++ b/src/testing/test_files/premake4.lua
@@ -1,3 +1,3 @@
--- Used to make sure functions will look for premake4.lua by default
-script_has_run = true
-return true
+-- Used to make sure functions will look for premake4.lua by default
+script_has_run = true
+return true
diff --git a/src/testing/test_files/true.lua b/src/testing/test_files/true.lua
index 3694469..12c4f08 100644
--- a/src/testing/test_files/true.lua
+++ b/src/testing/test_files/true.lua
@@ -1,2 +1,2 @@
--- Just return a simple value, used to ensure that dofile() works as expected
-return true
+-- Just return a simple value, used to ensure that dofile() works as expected
+return true
diff --git a/src/testing/testing.cpp b/src/testing/testing.cpp
index 1e89d42..2857432 100644
--- a/src/testing/testing.cpp
+++ b/src/testing/testing.cpp
@@ -1,22 +1,22 @@
-/**
- * \file testing.cpp
- * \brief Automated testing framework.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include <cstdio>
-#include "testing.h"
-#include "UnitTest++/src/TestReporterStdout.h"
-
-
-/**
- * Run a particular suite of tests.
- * \param suite The name of the suite to run.
- * \returns OKAY if all tests passed successfully.
- */
-int tests_run_suite(const char* suite)
-{
- UnitTest::TestReporterStdout reporter;
- std::printf("Testing %s...\n", suite);
- return UnitTest::RunAllTests(reporter, UnitTest::Test::GetTestList(), suite);
-}
+/**
+ * \file testing.cpp
+ * \brief Automated testing framework.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include <cstdio>
+#include "testing.h"
+#include "UnitTest++/src/TestReporterStdout.h"
+
+
+/**
+ * Run a particular suite of tests.
+ * \param suite The name of the suite to run.
+ * \returns OKAY if all tests passed successfully.
+ */
+int tests_run_suite(const char* suite)
+{
+ UnitTest::TestReporterStdout reporter;
+ std::printf("Testing %s...\n", suite);
+ return UnitTest::RunAllTests(reporter, UnitTest::Test::GetTestList(), suite);
+}
diff --git a/src/testing/testing.h b/src/testing/testing.h
index 4f8b122..e68c688 100644
--- a/src/testing/testing.h
+++ b/src/testing/testing.h
@@ -1,9 +1,9 @@
-/**
- * \file testing.h
- * \brief Automated testing framework.
- * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
- */
-
-#include "UnitTest++/src/UnitTest++.h"
-
-int tests_run_suite(const char* suite);
+/**
+ * \file testing.h
+ * \brief Automated testing framework.
+ * \author Copyright (c) 2007-2008 Jason Perkins and the Premake project
+ */
+
+#include "UnitTest++/src/UnitTest++.h"
+
+int tests_run_suite(const char* suite);