100 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/sh
 | |
| 
 | |
| # Break the shell process if there are any errors
 | |
| set -e
 | |
| 
 | |
| # Import common variables and functions
 | |
| . ../../common.sh
 | |
| 
 | |
| 
 | |
| # By convention, the overlay bundles have "source" folder, where the source
 | |
| # code is downloaded. If the source is downloaded from internet, this allows
 | |
| # the download to proceed if the process has been interrupted. In our simple
 | |
| # use case we will copy the file "hello.c" and in this way we will simulate
 | |
| # (kind of) that it has been downloaded.
 | |
| #
 | |
| # The main overlay source folder is "minimal/src/source/overlay" and the bundle
 | |
| # source artifact will be "minimal/src/source/overlay/hello.c".
 | |
| cp $SRC_DIR/hello.c \
 | |
|   $OVERLAY_SOURCE_DIR
 | |
| 
 | |
| # The next step is to prepare the source code that we have downloaded in the
 | |
| # previous step. Usually this means to extract it. By convention, each overlay
 | |
| # bundle has its own root folder where all the build magic happens. In our 
 | |
| # simple use case we will "extract" the source code by copying it from the
 | |
| # source folder to the main bundle folder.
 | |
| #
 | |
| # The main overlay folder is "minimal/src/work/overlay" and the bundle overlay
 | |
| # folder will be "minimal/src/work/overlay/mll_hello".
 | |
| mkdir $OVERLAY_WORK_DIR/$BUNDLE_NAME
 | |
| cp $OVERLAY_SOURCE_DIR/hello.c \
 | |
|   $OVERLAY_WORK_DIR/$BUNDLE_NAME
 | |
| 
 | |
| # Each overlay bundle also has a special directory where all build artifacts
 | |
| # are put in a structure which represents the final OS folder structure. This
 | |
| # folder is "minimal/src/work/overlay/mll_hello/mll_hello_installed".
 | |
| 
 | |
| # First we create the "destination" folder.
 | |
| mkdir $DEST_DIR
 | |
| 
 | |
| # We want our "hello" executable to reside in the "/bin" folder, so we create
 | |
| # subfolder "bin" in "$DEST_DIR".
 | |
| mkdir $DEST_DIR/bin
 | |
| 
 | |
| # We want our "autorun" script file "90_hello.sh" to reside in "/etc/autorun",
 | |
| # so we create the corresponding folders in "$DEST_DIR".
 | |
| mkdir -p $DEST_DIR/etc/autorun
 | |
| 
 | |
| # Now we copy the "autorun" script file "90_hello.sh" in "$DEST_DIR/etc/autorun"
 | |
| # and we make sure the script is executable.
 | |
| cp $SRC_DIR/90_hello.sh $DEST_DIR/etc/autorun
 | |
| chmod +x $DEST_DIR/etc/autorun/90_hello.sh
 | |
| 
 | |
| # Now we can compile "$OVERLAY_WORK_DIR/$BUNDLE_NAME/hello.c" and place it in
 | |
| # "$DEST_DIR/bin" as executable binary "hello".
 | |
| gcc -o $DEST_DIR/bin/hello $OVERLAY_WORK_DIR/$BUNDLE_NAME/hello.c
 | |
| 
 | |
| # Optionally, we can reduce the size of the generated overlay bundle artifacts.
 | |
| # We use the special function "reduce_size" and we pass as argument the file or
 | |
| # folder where our generated artifacts are located.
 | |
| reduce_size $DEST_DIR/bin/hello
 | |
| 
 | |
| # No matter what you do with your bundles, no matter how you compile and/or
 | |
| # prepare them, in the end all your bundle artifacts must be present in the
 | |
| # "$OVERLAY_ROOTFS" folder. This special folder represents the final directory
 | |
| # structure where all overlay bundles put their final artifacts. In our simple
 | |
| # use case we have already prepared appropriate folder structure in "$DEST_DIR",
 | |
| # so we will simply copy it in "$OVERLAY_ROOTFS".
 | |
| #
 | |
| # The overlay root filesystem folder is "minimal/src/work/overlay_rootfs".
 | |
| 
 | |
| # We use the special function "install_to_overlay" which works in three modes:
 | |
| #
 | |
| # Mode 1 - install everything from "$DEST_DIR" in "OVERLAY_ROOTFS":
 | |
| #
 | |
| #  install_to_overlay (no arguments provided)
 | |
| #
 | |
| # Mode 2 - install specific file/folder from "$DEST_DIR", e.g. "$DEST_DIR/bin"
 | |
| # directly in "$OVERLAY_ROOTFS":
 | |
| #
 | |
| #  install_to_overlay bin
 | |
| #
 | |
| # Mode 3 - install specific file/folder from "$DEST_DIR", e.g. "$DEST_DIR/bin"
 | |
| # as specific file/folder in "$OVERLAY_ROOTFS", e.g. "$OVERLAY_ROOTFS/bin"
 | |
| #
 | |
| #  install_to_overlay bin bin
 | |
| #
 | |
| # All of the above examples have the same final effect. In our simple use case
 | |
| # we use the first mode (i.e. we provide no arguments).
 | |
| install_to_overlay
 | |
| 
 | |
| # In the end we print message that our bundle has been installed and we return
 | |
| # to the overlay source folder.
 | |
| echo "Bundle '$BUNDLE_NAME' has been installed."
 | |
| 
 | |
| cd $SRC_DIR
 | |
| 
 | |
| # That's it. Add the overlay bundle in the main ".config" file, rebuild MLL
 | |
| # (i.e. run "repackage.sh") and when the OS starts, type "hello".
 | |
| 
 |