From 36dd1ada0f685a04881773ba047efefea3fc2bac Mon Sep 17 00:00:00 2001 From: Peter Jackson Date: Mon, 29 Aug 2011 13:09:37 +0100 Subject: [PATCH] Mainline changes to make a standard nt build environment based on nt6.1 (Windows7) and its SDK. The w3i3m9 pseudo platform has been removed and w3i3mv adjusted for this framework. Copied from Perforce Change: 175966 ServerID: perforce.ravenbrook.com --- mps/code/commpre.nmk | 17 +-- mps/code/mpstd.h | 39 ++---- mps/manual/build-notes/index.html | 47 +++++++- mps/readme.txt | 192 +++++++++++++++--------------- mps/tool/test-runner.py | 46 ++++--- 5 files changed, 188 insertions(+), 153 deletions(-) diff --git a/mps/code/commpre.nmk b/mps/code/commpre.nmk index 66a3cf2965c..05bfb422671 100644 --- a/mps/code/commpre.nmk +++ b/mps/code/commpre.nmk @@ -128,7 +128,9 @@ CFLAGSCOMMONPRE = /nologo /W4 /WX $(PFMDEFS) $(CFLAGSTARGETPRE) CFLAGSCOMMONPOST = $(CFLAGSTARGETPOST) # Flags for use in the variety combinations -CFLAGSHOT = /Ox /DNDEBUG +CFLAGSHOT = /O2 /DNDEBUG +# (above /O2 (maximise speed) used to be set to /Ox +# (maximise optimisations) in for tool versions before VS 9) # We used to have /GZ here (stack probe). # Note that GZ is specific to version 12 of the cl tool. drj 2003-11-04 # It is ignored on earlier versions of the cl tool. @@ -158,7 +160,8 @@ CFTI = /DCONFIG_VAR_TI $(CRTFLAGSC) $(CFLAGSCOOL) $(CFLAGSINTERNAL) # %%VARIETY: define a macro containing the flags for the new variety LINKER = link LINKFLAGSCOMMON = /nologo -LINKFLAGSINTERNAL = /DEBUG:full +LINKFLAGSINTERNAL = +# ( Internal flags used to be set to /DEBUG:full ) LINKFLAGSEXTERNAL = /RELEASE LFWE = $(LINKFLAGSWHITE) $(LINKFLAGSEXTERNAL) @@ -202,18 +205,18 @@ LIBFLAGSTI = # Copyright (C) 2001-2002 Ravenbrook Limited . # All rights reserved. This is an open source license. Contact # Ravenbrook for commercial licensing options. -# +# # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: -# +# # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. -# +# # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. -# +# # 3. Redistributions in any form must be accompanied by information on how # to obtain complete source code for this software and any accompanying # software that uses this software. The source code must either be @@ -224,7 +227,7 @@ LIBFLAGSTI = # include source code for modules or files that typically accompany the # major components of the operating system on which the executable file # runs. -# +# # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS # IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR diff --git a/mps/code/mpstd.h b/mps/code/mpstd.h index fb721e8bdda..c7360ed942c 100644 --- a/mps/code/mpstd.h +++ b/mps/code/mpstd.h @@ -26,27 +26,27 @@ * * Sometimes the platform is *already* known by the buildsystem: * - the Global Graphics buildsystem always sets CONFIG_PF_*. - * - the Ravenbrook buildsystem knows the platform and may (but + * - the Ravenbrook buildsystem knows the platform and may (but * typically does not) set CONFIG_PF_*. * * Regardless of this, mpstd.h still attempts to detect the platform. - * (This is intentional). However if both CONFIG_PF_* and + * (This is intentional). However if both CONFIG_PF_* and * CONFIG_PF_STRING are set, then mpstd.h performs a third function: - * 3. checking that the detected platform corresponds to that + * 3. checking that the detected platform corresponds to that * specified by CONFIG_PF_*. * - * Sometimes no MPS buildsystem is in use, so the platform *must* - * be detected. For example, when client software #includes mps.h, - * we want it to just work out of the box with whatever compiler is - * being used. In other words we do not require the client to define + * Sometimes no MPS buildsystem is in use, so the platform *must* + * be detected. For example, when client software #includes mps.h, + * we want it to just work out of the box with whatever compiler is + * being used. In other words we do not require the client to define * CONFIG_PF_*. - * (This is the case that justifes mpstd.h doing platform detection - * by looking at preprocessor symbols; otherwise we'd simply use + * (This is the case that justifes mpstd.h doing platform detection + * by looking at preprocessor symbols; otherwise we'd simply use * CONFIG_PF_*). * * mpstd.h fails if it cannot detect the platform (even if CONFIG_PF_* - * is specified). This is intentional. mpstd.h does *not* allow - * CONFIG_PF_* to override the platform as detected from preprocessor + * is specified). This is intentional. mpstd.h does *not* allow + * CONFIG_PF_* to override the platform as detected from preprocessor * symbols. This is intentional. * * References: @@ -127,23 +127,6 @@ #define MPS_WORD_SHIFT 5 #define MPS_PF_ALIGN 4 -/* w3i3m9 clone-platform, differs from w3i3mv only in MPS_PF_STRING - * and compiler options. - */ - -#elif defined(_MSC_VER) && (_MSC_VER >= 1500) && defined(_WIN32) && defined(_M_IX86) -#if defined(CONFIG_PF_STRING) && ! defined(CONFIG_PF_W3I3M9) -#error "specified CONFIG_PF_... inconsistent with detected w3i3m9" -#endif -#define MPS_PF_W3I3MV -#define MPS_PF_STRING "w3i3m9" -#define MPS_OS_W3 -#define MPS_ARCH_I3 -#define MPS_BUILD_MV -#define MPS_T_WORD unsigned long -#define MPS_WORD_WIDTH 32 -#define MPS_WORD_SHIFT 5 -#define MPS_PF_ALIGN 8 /* Visual C++ 2.0, Books Online, C/C++ Book, Preprocessor Reference, * Chapter 1: The Preprocessor, Macros, Predefined Macros. diff --git a/mps/manual/build-notes/index.html b/mps/manual/build-notes/index.html index cedf1fb05aa..6b21c56257e 100644 --- a/mps/manual/build-notes/index.html +++ b/mps/manual/build-notes/index.html @@ -45,7 +45,7 @@ -The only reason for this to be separate from the w3i3mv platform is +The only reason for this to be separate from the w3i3mv platform was to enable builds with version 6.0 and version 9.0 compilers to be -kept separate, to enable performance comparisons. The w3i3m9 -clone may merge back into w3i3mv in the future.
+kept separate, to enable performance comparisons. +
See <ravenbrook.com/project/mps/issue/job001944/>

- +

+2011-08
+The w3i3m9 platform has been withdrawn from the mainline and w3i3mv +is once again the master NT platform. +

The Windows linker can accept a .def file to allow re-export of MPS functions from a client executable that includes the MPS, such that @@ -302,6 +334,9 @@ See

2011-08-18 PNJ
Converted to HTML so the hyperlinks work, ready for further enhancements.
+
2011-08-28 PNJ
+
w3i3m9 platform withdrawn. Mainline now focussed on NT6.1 and its +SDK as its Windows build platform.

C. Copyright and License

diff --git a/mps/readme.txt b/mps/readme.txt index 944cfb24748..4264ab99013 100644 --- a/mps/readme.txt +++ b/mps/readme.txt @@ -52,6 +52,12 @@ This document is not confidential. record of changes. In a release of the MPS-Kit, this section becomes the summary of what is new for that release.) +2011-08 + Master change to standardise on an NT build environment of + NT6.1 (Windows 7) and it its SDK version 7.1. Previous versions + of Windows that are still supported by Microsoft can be accomodated + through this framework if required. + [ After a release, bracket the previous section, and start a new section like this: @@ -70,14 +76,14 @@ Changes from release 1.109.0: Functional changes to MPS code: -Improvement: return virtual memory (address space) from -mps_arena_class_vm to the operating system, when complete chunks are -unused after a garbage collection. Whether, and how much, virtual -memory is returned depends on many factors. Small chunks may be more -likely to be returnable than big chunks. The mps_arena_vm_growth() -function controls the size of chunks by which VM arena may grow. The -default, if this function is never called, is for new chunks to be the -same size as the original arena created by mps_arena_create(), if +Improvement: return virtual memory (address space) from +mps_arena_class_vm to the operating system, when complete chunks are +unused after a garbage collection. Whether, and how much, virtual +memory is returned depends on many factors. Small chunks may be more +likely to be returnable than big chunks. The mps_arena_vm_growth() +function controls the size of chunks by which VM arena may grow. The +default, if this function is never called, is for new chunks to be the +same size as the original arena created by mps_arena_create(), if possible. @@ -89,22 +95,22 @@ Functional changes to MPS code: Defects discovered in mps_message_type_gc_start lifecycle: - - enabling mps_message_type_gc_start and then failing to promptly - mps_message_get the resulting messages could corrupt the MPS + - enabling mps_message_type_gc_start and then failing to promptly + mps_message_get the resulting messages could corrupt the MPS message queue; - - a corrupted message queue could cause an assert, incorrect - behaviour, or an infinite loop, when getting or discarding + - a corrupted message queue could cause an assert, incorrect + behaviour, or an infinite loop, when getting or discarding messages, or when calling mps_arena_destroy; - - also, the _gc_start message could change while the client read it, + - also, the _gc_start message could change while the client read it, and the message for a new GC start could be silently skipped. Fixed: redesign _gc_start message lifecycle: - - if mps_message_type_gc_start is enabled, a separate GC start - message is issued for each collection, as long as there is + - if mps_message_type_gc_start is enabled, a separate GC start + message is issued for each collection, as long as there is sufficient memory to create the message; - - these messages will be queued indefinitely until the client gets + - these messages will be queued indefinitely until the client gets and discards them; - - therefore: a client that enables mps_message_type_gc_start must - call mps_message_get() and mps_message_discard() to get and + - therefore: a client that enables mps_message_type_gc_start must + call mps_message_get() and mps_message_discard() to get and discard these messages; - warning: failure to do so will eventually exhaust memory. @@ -112,28 +118,28 @@ Fixed: redesign _gc_start message lifecycle: New features to inform client of activity and timing of collections: mps_message_clock(): - - for a _gc_start or _gc message, returns the time at which the + - for a _gc_start or _gc message, returns the time at which the MPS posted it; see Reference Manual for documentation; mps_alert_collection_set(): - - set a client-supplied function which the MPS will synchronously + - set a client-supplied function which the MPS will synchronously call when a collection begins or ends; - - there are restrictions on what the client-supplied function is - permitted to do; please ask Ravenbrook if you require further + - there are restrictions on what the client-supplied function is + permitted to do; please ask Ravenbrook if you require further details. -Improvement: reduce the risk of ambiguous retention, when the client +Improvement: reduce the risk of ambiguous retention, when the client allocates large objects in mps_class_amc and mps_class_amcz. Defect discovered: - collections run too slow if client allocates big objects. Fix: - - improved collection scheduling, when client allocates large + - improved collection scheduling, when client allocates large objects. -New features for client to determine pool or format, given object +New features for client to determine pool or format, given object address: mps_addr_pool() mps_addr_fmt() @@ -143,14 +149,14 @@ Other changes: -MPS may now be built with Microsoft's Visual C++ 9.0 compiler. +MPS may now be built with Microsoft's Visual C++ 9.0 compiler. See manual/build-notes. -Configura releases include a .def file to allow re-export of MPS -functions from a client executable that includes the MPS, such that +Configura releases include a .def file to allow re-export of MPS +functions from a client executable that includes the MPS, such that other client DLLs can link to and call those MPS functions. See also manual/build-notes. ] @@ -162,60 +168,60 @@ Functional changes to MPS code: Defect discovered: - - when using an auto_header format (mps_fmt_create_auto_header) - with AMC pools (mps_class_amc), the MPS leaks a small amount of + - when using an auto_header format (mps_fmt_create_auto_header) + with AMC pools (mps_class_amc), the MPS leaks a small amount of memory on each collection. Impact: - - the leak is likely to be a few bytes per collection, and at most - one byte per page (typically 2^12 bytes) of the address-space + - the leak is likely to be a few bytes per collection, and at most + one byte per page (typically 2^12 bytes) of the address-space currently in use for objects in AMC pools; - - the leak is of temporary memory that the MPS uses to process - ambiguous references (typically references on the stack and in - registers), so a larger stack when a collection starts will + - the leak is of temporary memory that the MPS uses to process + ambiguous references (typically references on the stack and in + registers), so a larger stack when a collection starts will tend to cause a larger leak; - - the leaked bytes are widely-spaced single bytes which therefore + - the leaked bytes are widely-spaced single bytes which therefore also cause fragmentation; - - the leaked bytes are not reclaimed until the client calls + - the leaked bytes are not reclaimed until the client calls mps_arena_destroy(). Fixed: correctly release all of this temporary memory. Defect discovered: - AMC pools (mps_class_amc) temporarily retain the memory that was - used for a dead object, if there is an ambiguous reference (such - as a value on the stack) that happens to point at the interior of + used for a dead object, if there is an ambiguous reference (such + as a value on the stack) that happens to point at the interior of the (dead) object. Impact: - - if the (dead) object was small- or medium-sized, this temporary + - if the (dead) object was small- or medium-sized, this temporary retention is unlikely to cause a problem; - if the (dead) object was very large, then this retention is more likely, and will retain a large amount of memory; - - if many large objects are allocated, this retention can cause + - if many large objects are allocated, this retention can cause memory to be exhausted when it should not be. Fix: - - it is usually possible for AMC pools to free the memory - immediately (that is, during the collection that identifies the + - it is usually possible for AMC pools to free the memory + immediately (that is, during the collection that identifies the object as being dead), and AMC pools now do so; Future work: - - occasionally, there are adjacently located objects that are + - occasionally, there are adjacently located objects that are ambiguously referenced and are not dead; - - in this case it is not possible to free the memory immediately, - and so temporary retention still occurs (this is not expected to + - in this case it is not possible to free the memory immediately, + and so temporary retention still occurs (this is not expected to be very common). - - however, the MPS could prevent this by avoiding locating small + - however, the MPS could prevent this by avoiding locating small objects adjacent to very large objects, see: Further changes to arena growth (see notes below for version 1.108.1). -When the arena cannot grow by the desired increment, the MPS -attempts successively smaller increments, but with a more fine-grained -search than in version 1.108.1, thereby achieveing an increment that -more closely matches the largest available chunk of remaining +When the arena cannot grow by the desired increment, the MPS +attempts successively smaller increments, but with a more fine-grained +search than in version 1.108.1, thereby achieveing an increment that +more closely matches the largest available chunk of remaining address-space. New interface function mps_arena_vm_growth(). This function allows -the client more control over how a VM arena (mps_arena_class_vm) -grows. The interface is under development and is likely to change; +the client more control over how a VM arena (mps_arena_class_vm) +grows. The interface is under development and is likely to change; please contact us if you would like further details. ] @@ -226,22 +232,22 @@ Functional changes to MPS code: Limitation: - - if a VM arena (of mps_arena_class_vm) needed to be extended, - and the attempt to extend it was refused by the OS (usually - because the requested address-space was not available), MPS + - if a VM arena (of mps_arena_class_vm) needed to be extended, + and the attempt to extend it was refused by the OS (usually + because the requested address-space was not available), MPS would not try a smaller extension. -Fixed: MPS now tries to extend the arena by successively smaller +Fixed: MPS now tries to extend the arena by successively smaller amounts, until the extension succeeds. Defect discovered: - - internal memory-protection state in AMC pools (mps_class_amc) - was incorrect for a brief period of time during a collection, + - internal memory-protection state in AMC pools (mps_class_amc) + was incorrect for a brief period of time during a collection, which could (theoretically) have caused an assert and failure. However: - - during this brief period, the MPS protection cache masks the - defect. As a result, we believe this defect is unlikely to be - observed in practice (and we have no evidence that it has + - during this brief period, the MPS protection cache masks the + defect. As a result, we believe this defect is unlikely to be + observed in practice (and we have no evidence that it has ever occurred in practice). Fixed: maintain memory-protection state correctly in AMC pools. @@ -250,14 +256,14 @@ Other changes: - in the Mac OS X (PowerPC) build, remove outdated compiler flags. -The MPS diagnostic system -- which produces diagnostic output for the -purpose of helping MPS programmers and client-code programmers -- is +The MPS diagnostic system -- which produces diagnostic output for the +purpose of helping MPS programmers and client-code programmers -- is undergoing improvement. Some early documentation is at There is a new build variety "di" that emits diagnostics. -Note: for further details of this release (including a 'live' report -of defects found after these release-notes were written), and details +Note: for further details of this release (including a 'live' report +of defects found after these release-notes were written), and details of earlier and later releases, please see: ] @@ -269,40 +275,40 @@ Functional changes to MPS code: Defect discovered: - - an assert could, rarely, be incorrectly triggered when a pool + - an assert could, rarely, be incorrectly triggered when a pool of mps_class_amc is in a constrained memory condition. -Fixed: in this rare case, calculate a certain value correctly, - such that the assert which checks it is not incorrectly +Fixed: in this rare case, calculate a certain value correctly, + such that the assert which checks it is not incorrectly triggered. Defect discovered: - - finalization messages could suffer an unnecessary delay, of - several full collections (in the worst case), if there were + - finalization messages could suffer an unnecessary delay, of + several full collections (in the worst case), if there were more than 1024 finalization-registered objects; -Fixed: the number of finalization-registered objects should - no longer cause such a delay, so more finalization messages +Fixed: the number of finalization-registered objects should + no longer cause such a delay, so more finalization messages are likely to be produced by a single collection. - - on Mac OS X (PowerPC and Intel), MPS now has memory-protection + - on Mac OS X (PowerPC and Intel), MPS now has memory-protection code, so collections are much faster. - - on Mac OS X (Intel), MPS now has stack-scanner code, so the - stack may be declared an ambiguous root. (Note: there was + - on Mac OS X (Intel), MPS now has stack-scanner code, so the + stack may be declared an ambiguous root. (Note: there was already a stack-scanner for Mac OS X PowerPC). - - on Mac OS X (PowerPC and Intel), MPS now has locking code, so - multiple client threads may use the MPS. (But note: the thread - module has not been implemented for Mac OS X, so threads may + - on Mac OS X (PowerPC and Intel), MPS now has locking code, so + multiple client threads may use the MPS. (But note: the thread + module has not been implemented for Mac OS X, so threads may not yet have their stacks as roots, I think. See: ). - + Defect discovered: - - a macro used only in asserts was incorrect; this could have made + - a macro used only in asserts was incorrect; this could have made some checks ineffective. Fixed: corrected the macro. @@ -315,7 +321,7 @@ Other changes: - now builds on Linux. - - on Mac OS X (Intel) default "all" build works (fix broken + - on Mac OS X (Intel) default "all" build works (fix broken compile of amsss stress test). ] @@ -327,15 +333,15 @@ Functional changes to MPS code: Defect discovered: - if there was a pool of pool-class LO (leaf-only objects, - see mps_class_lo), the mps_arena_formatted_objects_walk() + see mps_class_lo), the mps_arena_formatted_objects_walk() call would fail. Fixed: mps_arena_formatted_objects_walk() will now work. - - when MPS starts a garbage collection, it now tells + - when MPS starts a garbage collection, it now tells the client by posting a message of the new type - mps_message_type_gc_start(). The message includes - a textual explanation (for the client programmer) + mps_message_type_gc_start(). The message includes + a textual explanation (for the client programmer) of why this collection was triggered. @@ -346,7 +352,7 @@ Fixed: mps_arena_formatted_objects_walk() will now work. Other changes: - - the default "all" build now builds mps library and plinth, on + - the default "all" build now builds mps library and plinth, on all platforms. @@ -364,7 +370,7 @@ No functional changes to MPS implementation code. Fixed - the "mps.a" library does not (now) contain plinth files; - therefore, if your MPS client code needs the example plinth - ("mpsplan.a"), you must link with it explicitly to obtain + ("mpsplan.a"), you must link with it explicitly to obtain _mps_lib_assert_fail, _mps_clock, etc; - the default "all" build now succeeds on Unix-like platforms (in 1.106.1 the "all" build only worked on Mac OS X). @@ -381,7 +387,7 @@ Fixed example/hello-world/index.txt ] -For more information about the status and progress of the MPS project, +For more information about the status and progress of the MPS project, consult the project home-page: . @@ -403,7 +409,7 @@ The top-level file "index.html" in the sources indexes many other files, and is a good place to start. You should read the user manuals and the high level design documents. -A quick start to writing code that uses the MPS is the "hello-world" +A quick start to writing code that uses the MPS is the "hello-world" example: example/hello-world/index.txt @@ -606,9 +612,9 @@ B. DOCUMENT HISTORY C. COPYRIGHT AND LICENSE -Copyright (C) 2001-2002, 2006-2007, 2008, 2010 Ravenbrook Limited. -All rights reserved. . -This is an open source license. +Copyright (C) 2001-2002, 2006-2007, 2008, 2010 Ravenbrook Limited. +All rights reserved. . +This is an open source license. Contact Ravenbrook for commercial licensing options. Redistribution and use in source and binary forms, with or without diff --git a/mps/tool/test-runner.py b/mps/tool/test-runner.py index 939501fbe43..014abe096e4 100755 --- a/mps/tool/test-runner.py +++ b/mps/tool/test-runner.py @@ -1,21 +1,24 @@ #!/usr/bin/python -#How to test a release before shipping it to Configura +# How to test a release before shipping it to Configura -#You have a candidate release. This document tells you how to test it before shipping it -- quick tests. -#Readership: all. Confidential: no. Status: rough notes. -#Background: knowing the history of MPS development for Configura is an advantage. -#Peer documents: +# You have a candidate release. This document tells you how to test it +# before shipping it -- quick tests. +# Readership: all. Confidential: no. Status: rough notes. +# Background: knowing the history of MPS development for Configura is +# an advantage. +# Peer documents: # . # . -#What do we test? -#Not much -- this procedure is for a quick test before shipping, principally to make sure that the build isn't crock in some way. +# What do we test? +# Not much -- this procedure is for a quick test before shipping, +# principally to make sure that the build isn't crock in some way. -#How to run the test: -#You need python (eg. 2.3). Cd to where you would type w3build.bat. -#Type ..\tool\test-runner.py -#Each test should report "Conclusion: Failed to find any defects." -#Also check full log placed in file a1.txt. +# How to run the test: +# You need python (eg. 2.3). Cd to where you would type w3build.bat. +# Type ..\tool\test-runner.py +# Each test should report "Conclusion: Failed to find any defects." +# Also check full log placed in file a1.txt. import os @@ -50,6 +53,7 @@ def mpsplatformcode() : # under Rosetta, so I'm not confident it's right). arch = {'Power Macintosh':'pp', 'i386':'i3', + 'x86':'i3', }[platform.machine()] except : # Windows specific hack. On Python 2.4 and 2.5 platform.machine @@ -64,7 +68,7 @@ def mpsplatformcode() : # Here, we simplify and get it right for Windows and Macs. try : compiler = {'xc':'gc', - 'w3':'m9', + 'w3':'mv', }[os] except : pass @@ -76,10 +80,14 @@ def mpsplatformcode() : mpsplatform = mpsplatformcode() +print "mpsplatform = ", mpsplatform + +exit + make = '' if mpsplatform[4:6] == 'gc' : make = "make -r -f %s.gmk VARIETY=%%s %%s >> %%s" % mpsplatform -elif mpsplatform[4:6] == 'm9' : +elif mpsplatform[4:6] == 'mv' : make = "nmake /f %s.nmk VARIETY=%%s %%s.exe >>%%s" % mpsplatform run = '' @@ -133,18 +141,18 @@ os.system("echo DONE") * Copyright (C) 2005 Ravenbrook Limited . * All rights reserved. This is an open source license. Contact * Ravenbrook for commercial licensing options. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: - * + * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. - * + * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * 3. Redistributions in any form must be accompanied by information on how * to obtain complete source code for this software and any accompanying * software that uses this software. The source code must either be @@ -155,7 +163,7 @@ os.system("echo DONE") * include source code for modules or files that typically accompany the * major components of the operating system on which the executable file * runs. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR