Nice reverse engineering!

MOP is Meta Object Protocol (serach in reference [9]).

Maybe you miss a reference to the definition of BaselineOfPharoBootstrap
https://github.com/pharo-project/pharo/blob/development/bootstrap/src/Pharo30Bootstrap.package/PBBootstrap.class/instance/allPackagesForHermes.st
https://github.com/pharo-project/pharo/blob/development/bootstrap/src/Pharo30Bootstrap.package/PBBootstrap.class/instance/ensureBaselineOfPharoBootstrap.st

And the simulator too (the special interpreter).

2018-05-02 20:53 GMT+02:00 Ben Coman <btc@openinworld.com>:
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...
https://ci.inria.fr/pharo-ci-jenkins2/job/Test%20pending%20pull%20request%20and%20branch%20Pipeline/job/development/822/consoleFull

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...

./pharo Pharo.image ..../bootstrap/scripts/prepare_image.st --save --quit�� [4]
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].


[3]��https://github.com/pharo-project/pharo/blob/development/bootstrap/scripts/3-prepare.sh
[4] https://github.com/pharo-project/pharo/blob/development/bootstrap/scripts/prepare_image.st
[5]��https://github.com/pharo-project/pharo/blob/development/bootstrap/scripts/bootstrap.st
[6]��https://github.com/pharo-project/pharo/blob/development/bootstrap/src/Pharo30Bootstrap.package/PBBootstrap.class/class/fromCommandLine.st
[7]��https://github.com/pharo-project/pharo/blob/development/bootstrap/src/Pharo30Bootstrap.package/PBBootstrap.class/instance/bootstrap.st
[8]��https://github.com/guillep/espell/blob/master/src/EspellSimulator.package/EPSimulatorBackend.class/class/for32Bit.st
[9]��https://rmod.inria.fr/archives/papers/Poli15a-Onward-Bootstrapping.pdf
[10]��https://github.com/pharo-project/pharo/tree/development/bootstrap/src/Pharo30Bootstrap.package/PBSpurClassLoader.class
[11]��https://github.com/pharo-project/pharo/blob/development/bootstrap/src/Pharo30Bootstrap.package/PBImageBuilderSpur50.class/class/example5617.st


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

[12]��https://github.com/pharo-project/pharo/blob/development/bootstrap/scripts/4-build.sh



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