@@ -703,6 +703,9 @@ class CliMain final: public SchemaFileImpl::ErrorReporter {
703
703
.addSubCommand (" test" , KJ_BIND_METHOD (*this , getTest), " run unit tests" )
704
704
.addSubCommand (" pyodide-lock" , KJ_BIND_METHOD (*this , getPyodideLock),
705
705
" outputs the package lock file used by Pyodide" )
706
+ .addSubCommand (" make-pyodide-baseline-snapshot" ,
707
+ KJ_BIND_METHOD (*this , getMakePyodideBaselineSnapshot),
708
+ " Make a Pyodide baseline memory snapshot" )
706
709
.build ();
707
710
// TODO(someday):
708
711
// "validate": Loads the config and parses all the code to report errors, but then exits
@@ -899,6 +902,18 @@ class CliMain final: public SchemaFileImpl::ErrorReporter {
899
902
.build ();
900
903
}
901
904
905
+ kj::MainFunc getMakePyodideBaselineSnapshot () {
906
+ server->allowExperimental ();
907
+ server->setPythonCreateBaselineSnapshot ();
908
+ auto builder =
909
+ kj::MainBuilder (context, getVersionString (), " Make a Pyodide baseline memory snapshot" , " " );
910
+ setPyodideDiskCacheDir (" ." );
911
+ return builder.expectArg (" <python-version>" , CLI_METHOD (parsePythonCompatFlag))
912
+ .expectArg (" <output-directory>" , CLI_METHOD (setPackageDiskCacheDir))
913
+ .callAfterParsing (CLI_METHOD (test))
914
+ .build ();
915
+ }
916
+
902
917
void addImportPath (kj::StringPtr pathStr) {
903
918
auto path = fs->getCurrentPath ().evalNative (pathStr);
904
919
if (fs->getRoot ().tryOpenSubdir (path) != kj::none) {
@@ -1023,6 +1038,24 @@ class CliMain final: public SchemaFileImpl::ErrorReporter {
1023
1038
server->setPyodideDiskCacheRoot (kj::mv (dir));
1024
1039
}
1025
1040
1041
+ void parsePythonCompatFlag (kj::StringPtr compatFlagStr) {
1042
+ auto builder = kj::heap<capnp::MallocMessageBuilder>();
1043
+ auto configBuilder = builder->initRoot <config::Config>();
1044
+ auto service = configBuilder.initServices (1 )[0 ];
1045
+ service.setName (" main" );
1046
+ auto worker = service.initWorker ();
1047
+ worker.setCompatibilityDate (" 2023-12-18" );
1048
+ auto flags = worker.initCompatibilityFlags (2 );
1049
+ flags.set (0 , compatFlagStr);
1050
+ flags.set (1 , " python_workers" );
1051
+ auto mod = worker.initModules (1 )[0 ];
1052
+ mod.setName (" main.py" );
1053
+ mod.setPythonModule (" def test():\n pass" );
1054
+ config = configBuilder.asReader ();
1055
+ configOwner = kj::mv (builder);
1056
+ util::Autogate::initAutogate (getConfig ().getAutogates ());
1057
+ }
1058
+
1026
1059
void watch () {
1027
1060
#if _WIN32
1028
1061
auto & w = watcher.emplace (io.win32EventPort );
0 commit comments