| #!/bin/bash |
| # Exit on error |
| set -e |
| |
| # Create a temporary directory for all build artifacts |
| BUILD_DIR=$(mktemp -d -t dart_dyn_mod_build_XXXXXX) |
| echo "Created temporary build directory: $BUILD_DIR" |
| |
| # Create a temporary directory for application data (system temp) |
| APP_DATA_DIR=$(mktemp -d -t dart_dyn_mod_app_XXXXXX) |
| echo "Created temporary app data directory: $APP_DATA_DIR" |
| |
| # Ensure cleanup on exit (even on error) |
| cleanup() { |
| rm -rf "$BUILD_DIR" |
| rm -rf "$APP_DATA_DIR" |
| echo "Cleaned up temporary directories." |
| } |
| trap cleanup EXIT |
| |
| echo "Building Dart SDK artifacts with dynamic modules support" |
| ./tools/build.py -m release --dart-dynamic-modules \ |
| runtime runtime_precompiled utils/gen_kernel |
| |
| # Define paths |
| SDK_OUT="out/ReleaseX64" |
| GEN_KERNEL="$SDK_OUT/gen/gen_kernel_aot.dart.snapshot" |
| GEN_SNAPSHOT="$SDK_OUT/gen_snapshot_product" |
| DART2BYTECODE="$SDK_OUT/gen/dart2bytecode.dart.snapshot" |
| AOT_RUNTIME="$SDK_OUT/dartaotruntime_product" |
| VM_PLATFORM="$SDK_OUT/vm_platform.dill" |
| |
| EXAMPLE_DIR="pkg/dynamic_modules/example" |
| HOST_DIR="$EXAMPLE_DIR/host" |
| MODULES_DIR="$EXAMPLE_DIR/modules" |
| COMMON_DIR="$EXAMPLE_DIR/common" |
| INTERFACE_YAML="$EXAMPLE_DIR/dynamic_interface.yaml" |
| |
| echo "Compiling host application (non-AOT)..." |
| $AOT_RUNTIME $GEN_KERNEL \ |
| --target vm \ |
| --packages .dart_tool/package_config.json \ |
| -Ddart.vm.profile=false \ |
| -Ddart.vm.product=true \ |
| -Ddynamic.modules.test.mode=aot \ |
| --no-aot \ |
| --no-embed-sources \ |
| --platform $VM_PLATFORM \ |
| --output $BUILD_DIR/main_no_aot.dill \ |
| --dynamic-interface $INTERFACE_YAML \ |
| $HOST_DIR/main.dart |
| |
| echo "Compiling host application (AOT)..." |
| $AOT_RUNTIME $GEN_KERNEL \ |
| --target vm \ |
| --packages .dart_tool/package_config.json \ |
| -Ddart.vm.profile=false \ |
| -Ddart.vm.product=true \ |
| -Ddynamic.modules.test.mode=aot \ |
| --aot \ |
| --no-embed-sources \ |
| --platform $VM_PLATFORM \ |
| --output $BUILD_DIR/main_aot.dill \ |
| --dynamic-interface $INTERFACE_YAML \ |
| $HOST_DIR/main.dart |
| |
| echo "Generating host AOT snapshot..." |
| $GEN_SNAPSHOT \ |
| --snapshot-kind=app-aot-elf \ |
| --elf=$BUILD_DIR/main.snapshot \ |
| $BUILD_DIR/main_aot.dill |
| |
| echo "Compiling dynamic modules..." |
| for module in basic exponent trigonometry; do |
| echo " Compiling module: $module" |
| $AOT_RUNTIME $DART2BYTECODE \ |
| --platform $VM_PLATFORM \ |
| --target vm \ |
| --packages .dart_tool/package_config.json \ |
| -Ddart.vm.profile=false \ |
| -Ddart.vm.product=true \ |
| -Ddynamic.modules.test.mode=aot \ |
| --import-dill $BUILD_DIR/main_no_aot.dill \ |
| --validate $INTERFACE_YAML \ |
| --bytecode-options=source-positions \ |
| --allow-dynamic-calls-in-dynamic-modules \ |
| --extra-selectors-allowed-in-dynamic-calls=m5,m6,m7,m10,m11,m15,m16,call \ |
| --output $APP_DATA_DIR/$module.bytecode \ |
| --prefix-library-uris import/prefix \ |
| $MODULES_DIR/$module.dart |
| done |
| |
| echo "Launching application..." |
| echo "To exit, type 'exit'." |
| echo "To load basic operations, type: load basic" |
| echo "To load exponent operations, type: load exponent" |
| echo "To load trigonometry operations, type: load trigonometry" |
| echo "To use addition: + 1 2 3" |
| echo "To use subtraction (after load basic): - 10 3" |
| echo "To use exponent (after load exponent): ^ 2 3" |
| echo "To use trigonometry (after load trigonometry): sin 1.57079" |
| |
| $AOT_RUNTIME $BUILD_DIR/main.snapshot "$APP_DATA_DIR" |