
==========================================
1. Compile Enviroment
==========================================
    My build envrioment is CentOS 7.8 x86_64. So here I first explain how to create the build environment from scratch.
    Because Ventoy is based on many open source projects, so the environment is important. I suggest you test it on a virtual machine firstly.

1.1 Install CentOS 7.8
    I use CentOS-7-x86_64-Everything-2003.iso and select Minimal install
    
1.2 Install Packages    
    yum install \
        libXpm net-tools bzip2 wget vim gcc gcc-c++ samba dos2unix glibc-devel glibc.i686 glibc-devel.i686 \
        mpfr.i686 mpfr-devel.i686 zlib.i686 rsync autogen autoconf automake libtool gettext* bison binutils \
        flex device-mapper-devel SDL libpciaccess libusb freetype freetype-devel gnu-free-* qemu-* virt-* \
        libvirt* vte* NetworkManager-bluetooth brlapi fuse-devel dejavu* gnu-efi* pesign shim \
        iscsi-initiator-utils grub2-tools zip nasm acpica-tools glibc-static zlib-static xorriso
    


==========================================
2. Download Source Code
==========================================
2.1 Download Ventoy source code from github and decompress it. 
    Next I assume that you have unzipped the code into the /home directory (check /home/Ventoy-master/README.md file for the directory layout).
    
2.2 Download third-part source code and tool
    
    https://www.fefe.de/dietlibc/dietlibc-0.34.tar.xz                    ===>  /home/Ventoy-master/DOC/dietlibc-0.34.tar.xz
    https://musl.libc.org/releases/musl-1.2.1.tar.gz                     ===>  /home/Ventoy-master/DOC/musl-1.2.1.tar.gz
    https://ftp.gnu.org/gnu/grub/grub-2.04.tar.xz                        ===>  /home/Ventoy-master/GRUB2/grub-2.04.tar.xz
    https://codeload.github.com/tianocore/edk2/zip/edk2-stable201911     ===>  /home/Ventoy-master/EDK2/edk2-edk2-stable201911.zip
    https://codeload.github.com/relan/exfat/zip/v1.3.0                   ===>  /home/Ventoy-master/ExFAT/exfat-1.3.0.zip
    https://codeload.github.com/libfuse/libfuse/zip/fuse-2.9.9           ===>  /home/Ventoy-master/ExFAT/libfuse-fuse-2.9.9.zip
    https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/aarch64-linux-gnu/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz           ===>  /opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
    https://toolchains.bootlin.com/downloads/releases/toolchains/aarch64/tarballs/aarch64--uclibc--stable-2020.08-1.tar.bz2 ===> /opt/aarch64--uclibc--stable-2020.08-1.tar.bz2

    http://www.tinycorelinux.net/11.x/x86_64/release/distribution_files/vmlinuz64 ===> /home/Ventoy-master/LiveCD/ISO/EFI/boot/vmlinuz64
    http://www.tinycorelinux.net/11.x/x86_64/release/distribution_files/corepure64.gz ===> /home/Ventoy-master/LiveCD/ISO/EFI/boot/corepure64.gz
    http://www.tinycorelinux.net/11.x/x86_64/release/distribution_files/modules64.gz ===> /home/Ventoy-master/LiveCD/ISO/EFI/boot/modules64.gz
    http://distro.ibiblio.org/tinycorelinux/11.x/x86_64/tcz/glib2.tcz /home/Ventoy-master/LiveCD/VTOY/ventoy/tcz/glib2.tcz
    http://distro.ibiblio.org/tinycorelinux/11.x/x86_64/tcz/libffi.tcz /home/Ventoy-master/LiveCD/VTOY/ventoy/tcz/libffi.tcz
    http://distro.ibiblio.org/tinycorelinux/11.x/x86_64/tcz/liblvm2.tcz /home/Ventoy-master/LiveCD/VTOY/ventoy/tcz/liblvm2.tcz
    http://distro.ibiblio.org/tinycorelinux/11.x/x86_64/tcz/ncursesw.tcz /home/Ventoy-master/LiveCD/VTOY/ventoy/tcz/ncursesw.tcz
    http://distro.ibiblio.org/tinycorelinux/11.x/x86_64/tcz/parted.tcz /home/Ventoy-master/LiveCD/VTOY/ventoy/tcz/parted.tcz
    http://distro.ibiblio.org/tinycorelinux/11.x/x86_64/tcz/readline.tcz /home/Ventoy-master/LiveCD/VTOY/ventoy/tcz/readline.tcz
    http://distro.ibiblio.org/tinycorelinux/11.x/x86_64/tcz/udev-lib.tcz /home/Ventoy-master/LiveCD/VTOY/ventoy/tcz/udev-lib.tcz

2.3 Prepare third-part tools
    cd /home/Ventoy-master/DOC/
    tar xf musl-1.2.1.tar.gz
    cd musl-1.2.1
    ./configure && make install

    tar xf /opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz  -C /opt
    tar xf /opt/aarch64--uclibc--stable-2020.08-1.tar.bz2  -C /opt

2.4 Set PATH envrioment
    export PATH=$PATH:/opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin:/opt/aarch64--uclibc--stable-2020.08-1/bin
    better to add this line to /root/.bashrc and relogin as root


==========================================
3. All in one script
==========================================
    I have made a all_in_one.sh, you can run this script to build and pack ventoy.
    If you want to compile a certain part separately, you can continue to refer to the later chapters of this text.
    
    cd /home/Ventoy-master/INSTALL
    sh all_in_one.sh

    It should be noted that:
    1. Only grub2/EDK2/IPXE will be recompiled in all_in_one.sh. Other part contains the binaries and are few modified, so will no be recompiled everytime.
       You can rebuild these parts separately if you want.
       
    2. some part of Ventoy has 32bit&64bit version (like 4.9 4.10 4.11 follows)
       all_in_one.sh only build 64bit version of them, if you want to rebuild the 32bit verison. You should create a 32bit CentOS environment and build them.
       Fortunately these parts are few modified, you only need to build once or you can directly use the binary I have built.

    Besides, after a fully compile and pack, you can only build the part you modified (for example grub2) and run ventoy_pack.sh to generate the package.

==========================================
4. Build every part of Ventoy
==========================================
4.1 == Build grub2 ==
    cd /home/Ventoy-master/GRUB2
    sh buildgrub.sh
      
4.2 == Build ipxe.krn ==
    cd /home/Ventoy-master/IPXE
    sh buildipxe.sh
      
4.3 == Build Ventoy2Disk.exe ==
    Ventoy2Disk.exe is the installer in Windows platform. And it must be built in Windows with Microsoft Visual Studio (2013+).   
    Open /home/Ventoy-master/Ventoy2Disk/Ventoy2Disk.sln with Visual Studio and build it.
   
4.4 == Build vtoyjump64.exe/vtoyjump32.exe ==
    vtoyjump64.exe/vtoyjump32.exe is used to mount iso file in windows PE. You should install Microsoft Visual Studio (2013+) to build it.
    Open /home/Ventoy-master/vtoyjump/vtoyjump.sln with Visual Studio and build it (64&32).
   
4.5 == Build dmsetup ==
    Please refer to DMSETUP/build.txt
   
4.6 == Build ventoy_x64.efi ==
    cd /home/Ventoy-master/EDK2
    sh buildedk.sh
   
4.7 == Build VtoyTool ==
    cd /home/Ventoy-master/VtoyTool
    sh build.sh

4.8 == Build vtoyfat ==    
    cd /home/Ventoy-master/vtoyfat/fat_io_lib
    sh buildlib.sh
    cd /home/Ventoy-master/vtoyfat
    sh build.sh

4.9 == Build exfat-util ==
    cd /home/Ventoy-master/ExFAT
    sh buidlibfuse.sh
    sh buidexfat.sh
    
    After that, copy EXFAT/shared/mkexfatfs         ===> /home/Ventoy-master/INSTALL/tool/mkexfatfs_64
    After that, copy EXFAT/shared/mount.exfat-fuse  ===> /home/Ventoy-master/INSTALL/tool/mount.exfat-fuse_64

    Use the same build step to build exfat-util 32bit in a 32bit CentOS system and get mkexfatfs_32 and mount.exfat-fuse_32

4.10 == Build vtoy_fuse_iso_64/vtoy_fuse_iso_32 ==
    cd /home/Ventoy-master/FUSEISO
    sh build_libfuse.sh
    sh build.sh
    
    Use the same build step to build in a 32bit CentOS system and get vtoy_fuse_iso_32
   
4.11 == Build unsquashfs_64/unsquashfs_32 ==
    cd /home/Ventoy-master/SQUASHFS/SRC
    sh build_lz4.sh
    sh build_lzma.sh
    sh build_lzo.sh
    sh build_zstd.sh
    
    cd /home/Ventoy-master/SQUASHFS/squashfs-tools-4.4/squashfs-tools
    sh build.sh
    
    Use the same build step to build in a 32bit CentOS system and get unsquashfs_32
   
4.12 == Build vblade_64/vblade_32 ==
    cd /home/Ventoy-master/VBLADE/vblade-master
    sh build.sh
   
4.13 == Build zstdcat ==
    Please refer to ZSTD/build.txt

4.14 == Build vtoy_gen_uuid ==
    cd /home/Ventoy-master/GenUUID
    sh build.sh
    
4.15 == Build xzminidec32 ==
   cd /home/Ventoy-master/Ventoy2Disk/Ventoy2Disk/xz-embedded-20130513/userspace
   make -f ventoy_makefile
   strip --strip-all xzminidec

4.16 == Build xzminidec64 ==
   cd /home/Ventoy-master/Ventoy2Disk/Ventoy2Disk/xz-embedded-20130513/userspace
   make -f ventoy_makefile64
   strip --strip-all xzminidec

4.17 == Build iso9660_x64.efi ==
   This efi driver is from https://github.com/pbatard/efifs
   Follow all the build instructions in this project. I modified 3 files (the original and modified source are at /home/Ventoy-master/EDK2/efiffs)

4.18 IMG/cpio/ventoy/busybox/64h
  https://www.uclibc.org/downloads/binaries/0.9.30.1/mini-native-x86_64.tar.bz2
  https://busybox.net/downloads/busybox-1.32.0.tar.bz2
  use BUSYBOX/x86_64_ash.config and uclibc to build busybox-1.32

4.19 == Build lunzip32/lunzip64 ==
  http://mirror.yongbok.net/nongnu/lzip/lunzip/lunzip-1.11.tar.gz
  PATH=$PATH:/opt/diet/bin
  ./configure --disable-nls CC='diet gcc -nostdinc'
  make
  strip --strip-all lunzip
  
  #aarch64
  ./configure --disable-nls CC='aarch64-buildroot-linux-uclibc-gcc -static'
  make
  aarch64-buildroot-linux-uclibc-strip --strip-all lunzip



==========================================
5. Binaries
==========================================
  There some binaries in Ventoy install package. These files are downloaded from other open source project's website, such as busybox.
  Here is the list of the binaries, their SHA-256 and the download urls:   

5.1 IMG/cpio/ventoy/tool/lz4cat
  https://create.stephan-brumme.com/smallz4   smallz4cat-x32-v1.4
  SHA-256: 13d293ddeedb469f51da41167f79b2cbdb904e681716f6e6191b233dbb162438
   
5.2 IMG/cpio/ventoy/tool/ar
  https://busybox.net/downloads/binaries/1.30.0-i686   busybox_AR
  SHA-256: f29b7d81a983c0c85d22496f4a833c18f2528a1b666eb7d47c93084c1ed66ae0  
  
5.3 IMG/cpio/ventoy/tool/inotifyd
  https://busybox.net/downloads/binaries/1.30.0-i686   busybox_INOTIFYD
  SHA-256: 3532162a8695e91a1ed9ddea28b2cb22259a90e93d5d9c4a517b6c36842c686f  

5.4 IMG/cpio/ventoy/busybox/ash
  https://busybox.net/downloads/binaries/1.27.1-i686   busybox_ASH
  SHA-256: 44a6274bca580c2758ffc173fc76d18bb855b1fe8dcf70efd9ee75cbd57dee97  

5.5 IMG/cpio/ventoy/busybox/tmpxz
  https://busybox.net/downloads/binaries/1.27.1-i686   busybox_XZ
  SHA-256: f6cdb6293680424c29b89bde0685ca27f455166c9b302cd6082ef90681456291  

5.6 INSTALL/tool/i386/xzcat
  https://busybox.net/downloads/binaries/1.30.0-i686/   busybox_XZCAT
  SHA-256: 7399db642c2beaf52a16ab5264ffc55cfd1ff5699a524f63e5d48edf84e20f44  
  
5.7 INSTALL/tool/i386/hexdump
  https://busybox.net/downloads/binaries/1.30.0-i686/   busybox_HEXDUMP
  SHA-256: cde08b6a2cf5ad914f05203e18e3f7c2ed6060a63604e3d75536f19b55e8e0af  

5.8 imdisk
  download http://www.ltr-data.se/files/imdiskinst.exe and extract it by 7zip.
  
  INSTALL/ventoy/imdisk/64/imdisk.sys --> sys/amd64/imdisk.sys  SHA-256: 6702202220268787e361f5a82dae53362c8e6c6dcd240bb01b44dd77ae0788da
  INSTALL/ventoy/imdisk/64/imdisk.exe --> cli/amd64/imdisk.exe  SHA-256: 9759175380af836869443e5f21ce2e33022125d154bc6b3d1c04dc36b190de04
  INSTALL/ventoy/imdisk/64/imdisk.cpl --> cpl/amd64/imdisk.cpl  SHA-256: aea2ebbea2b073c947263744962af8a3eab025ff4c9d825c543e380e738a4c99
  
  INSTALL/ventoy/imdisk/32/imdisk.sys --> sys/i386/imdisk.sys  SHA-256: a94caec2f71a924d6a914c093ad4b905d7cfdea3f515ed48aaa8c3950b2dc191
  INSTALL/ventoy/imdisk/32/imdisk.exe --> cli/i386/imdisk.exe  SHA-256: 33b53858e2139704cf603b115a3e5e1dfd4daeaaed4d3e03c633f2df3b55dbaa
  INSTALL/ventoy/imdisk/32/imdisk.cpl --> cpl/i386/imdisk.cpl  SHA-256: b781d3e2d286ac8bf548f44e50cbbb3fe78203296e41e4d2e73b407668f88f2d
  
5.9 INSTALL/ventoy/memdisk
  https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.tar.gz
  decompress it and memdisk is at syslinux-6.03/bios/memdisk/memdisk
  SHA-256: 3f6cd656b8a14109cd3f906fee2dd2e75418f983a5e1bfdb64f44f7765588cbb
  

5.10 UEFIinSecureBoot
 https://github.com/ValdikSS/Super-UEFIinSecureBoot-Disk/releases   Super-UEFIinSecureBoot-Disk_minimal_v3.zip
 unzip it and get Super-UEFIinSecureBoot-Disk_minimal.img, extract the img by 7zip.
 
 INSTALL/EFI/BOOT/BOOTX64.EFI --> EFI/BOOT/BOOTX64.EFI  SHA-256: 475552c7476ad45e42344eee8b30d44c264d200ac2468428aa86fc8795fb6e34
 INSTALL/EFI/BOOT/grubx64.efi --> EFI/BOOT/grubx64.efi  SHA-256: 25d858157349dc52fa70f3cdf5c62fe1e0bae37ddfc3a6b6528af9a3c745775f
 INSTALL/EFI/BOOT/MokManager.efi --> EFI/BOOT/MokManager.efi  SHA-256: 3bf1f46cee0832355c7dd1dba880dea9bcaa78cc44375a1559d43bc9db18933b


5.11 INSTALL/tool/ash
 https://busybox.net/downloads/binaries/1.31.0-i686-uclibc/   busybox_ASH
 SHA-256: 2943f02f85fee0c9551aec47110a558a73f919c032b3c51e56d6f197b5ec4d7b  
   
5.12 7za.exe
 download from https://www.7-zip.org/a/7z1900-extra.7z
 ISNTALL/ventoy/7z/64/7za.exe  SHA-256: 8117e40ee7f824f63373a4f5625bb62749f69159d0c449b3ce2f35aad3b83549
 ISNTALL/ventoy/7z/32/7za.exe  SHA-256: ea308c76a2f927b160a143d94072b0dce232e04b751f0c6432a94e05164e716d
 


