I found it hard to find info on the Pharo Bootstrap, so I went looking to understand the it by identifying very first creation on disk of the
smallest�� "seed".image�� file that will later become the final build artifact.�� I'm sharing here to have a record I can refer to later, and maybe others find interesting.
Looking at the log from the latest build...
Searching on "BUILD_NUMBER=" indicates the first major CI step is...
+ BUILD_NUMBER=822 BOOTSTRAP_ARCH=32 bash ./bootstrap/scripts/2-download.sh�� [1]
which downloads 24MB "
bootstrapImage.zip" [2]
which I presume is an almost full image to run the bootstrap process.
The next major CI step is...
+ BUILD_NUMBER=822 BOOTSTRAP_ARCH=32 bash ./bootstrap/scripts/3-prepare.sh�� [3]
which uses the downloaded "Pharo.image" to (I presume) produce the seed "bootstrap.image" file.����
(This is not indicated explicitly in the logs, but step 4 copies that file
with a shell command, so my presumption. It would be nice for this to be explicitly logged"
prepare.sh executes two commands...
which seems to modify the downloaded "Pharo.image",��
not create bootstrap.image
./pharo Pharo.image ..../bootstrap/scripts/
bootstrap.st --ARCH=32 --BUILD_NUMBER=822 --quit�� ��[5]
which does... "PBBootstrap fromCommandLine bootstrap"�� [6] [7]
which does...
�� �� PBBootstrap>>#bootstrap��
�� �� �� �� PBStepStartedSignal log: 'Starting�� Process.'.
�� �� �� �� self prepareBootstrap.
�� �� �� �� [self createImage ] on:AssertionFailure do: [ :e | e resume ].
�� �� �� �� self initializeImage.
�� �� �� �� PBStepFinishedSignal log: 'Process ended.'
and digging a bit...
�� �� PBBootstrap>>#createImage
�� �� �� �� | builder |
�� �� �� �� builder := PBImageBuilderSpur50 forArchitecture: architecture.
�� �� �� �� builder definitionFetcher: versionFetcher.
�� �� �� �� builder buildNumber: buildNumber.
�� �� �� �� builder imageFileReference: imageReference.
�� �� �� �� builder systemDefinition: ringEnvironment.
�� �� �� �� builder espellBackend instanceVariableMapping: (PBInstanceVariableMapping onEnvironment: ringEnvironment ).
�� �� �� �� builder bootstrap
�� �� PBImageBuilderSpur50-class>>#forArchitecture: architecture
�� �� �� �� | candidates |
�� �� �� �� candidates := self subclasses select: [ :sc | sc name endsWith: architecture, 'bit' ].
�� �� �� �� candidates��
�� �� �� �� �� �� ifEmpty: [ self error: 'No candidates for architecture: ', architecture ].
�� �� �� �� candidates size > 1
�� �� �� �� �� �� ifTrue: [ self error: 'More than one candidate for architecture: ', architecture ].
�� �� �� �� ^ candidates anyOne new
�� �� PBImageBuilderSpur50 >>#initialize
�� �� �� �� super initialize.
�� �� �� �� statistics := PBBootstrapStatistics new.
�� �� �� �� logger := PBBootstrapLogger new.
�� �� �� �� imageFileReference := 'bootstrap.image' asFileReference.
�� �� �� �� "the default espell backend for the bootstrap"
�� �� �� �� self initializeBackend.�� ��
�� �� �� �� self instantiateClassLoader.��
ahh, there is the reference to "bootstrap.image"
So just to round out a high level overview, the last two messages sent are defined as...
�� �� PBImageBuilderSpur5032bit>>#initializeBackend
�� �� �� �� espellBackend := EPSimulatorBackend for32Bit forBootstrap�� ����
which I won't dig further but the class seems available at��[8]
and Espell is described briefly at [9] (but what is a "MOP"? the term is not defined there)
�� �� PBImageBuilderSpur50>>#instantiateClassLoader
�� �� �� �� classLoader := PBSpurClassLoader new.������
which is defined at [10], and��there is an interesting example at [11].
So now I guess that bootstrap.image has been generated?
Just curious, what is the size of this file right now, before the next step?
Perhaps an `ls -l` could echo this to the build log.
The penultimate major CI step seems to then start adding packages to bootstrap.image...
+ BUILD_NUMBER=822 BOOTSTRAP_ARCH=32 bash ./bootstrap/scripts/4-build.sh����
located at [12] and searching on "${VM}" is enlightening.
Its help information says...
Pharo Build Script
�� ==================
�� This script assumes the existence of a new uninitialized image. Then it proceeds to its initialization and \"growing\".
�� * Step 1:
�� �� - Initialize the image
�� �� - output: core.image
�� * Step 2:
�� �� - Bootstrap Monticello local repositories
�� �� - output: monticello_bootstrap.image and changes file
�� * Step 3:
�� �� - Load Monticello remote repositories
�� �� - output: monticello.image and changes file
�� * Step 4:
�� �� - Load Metacello
�� �� - output: metacello.image and changes file
�� * Step 5:
�� �� - Load the rest of the image using BaselineOfIDE
�� �� - output: Pharo.image and changes file
Unfortunately those steps are labelled in the script,
but the first action shown in the log is...
�� �� cp bootstrap.image Pharo7.0-compiler-32bit-9912d7c.image��
Initializing Bootstraped Image
�� �� pharo --headless Pharo7.0-compiler-32bit-9912d7c.image
The final major CI step
was a fair way past what I was interested in right now.
...
+ BUILD_NUMBER=822 bash ../bootstrap/scripts/prepare_for_upload.sh
cheers -ben