From 02d0bbc0a1d04afa97e560c2707129909aaf2625 Mon Sep 17 00:00:00 2001 From: tcsullivan Date: Sun, 2 Dec 2018 14:18:36 -0500 Subject: working toochain build script --- arm-stmos/README.md | 28 ++++++++++++ arm-stmos/create-toolchain.sh | 104 ++++++++++++++++++++++++++++-------------- 2 files changed, 98 insertions(+), 34 deletions(-) create mode 100644 arm-stmos/README.md (limited to 'arm-stmos') diff --git a/arm-stmos/README.md b/arm-stmos/README.md new file mode 100644 index 0000000..ba234f7 --- /dev/null +++ b/arm-stmos/README.md @@ -0,0 +1,28 @@ +# The arm-stmos toolchain + +A special binutils/gcc toolchain is necessary to build stmos and associated +programs. For convenience, a bash script has been written to attempt to automate +the majority of the compilation/installation process. This process is based of +off various tutorials from [osdev.org](wiki.osdev.org). + +Some programs are required for the build process. A list can be found [here] +(https://wiki.osdev.org/GCC_Cross-Compiler#Installing_Dependencies). Once +installed, just run the script: +``` +./create-toolchain.sh +``` +It should be safe to re-run the script, if necessary. + +After successful installation, be sure to add the toolchain to your path ($HOME +/arm-stmos/bin). Then, follow these steps to build pdclib and the crt0: +* Cd to src/pdclib +* Make sure the Makefile does not have the ```-g``` flag set under CFLAGS +* Build pdclib (make) +* Copy pdclib.a to ~/arm-stmos/lib/gcc/arm-stmos/8.2.0/libc.a +* Add the ```-g``` flag to CFLAGS in the Makefile; Rebuild pdclib +* Copy pdclib.a to ~/arm-stmos/lib/gcc/arm-stmos/8.2.0/libg.a +* Cd to the stmos root directory; run ```make crt``` +* Copy crt0.o ~/arm-stmos/lib/gcc/arm-stmos/8.2.0/crt0.o + +Now everything should be ready. Build stmos, run it, hope it works. + diff --git a/arm-stmos/create-toolchain.sh b/arm-stmos/create-toolchain.sh index 1df12ee..c197b2a 100755 --- a/arm-stmos/create-toolchain.sh +++ b/arm-stmos/create-toolchain.sh @@ -13,47 +13,83 @@ # libmpfr-dev # Get sources -wget https://ftp.gnu.org/gnu/binutils/binutils-2.31.1.tar.xz -wget https://ftp.gnu.org/gnu/gcc/gcc-8.2.0/gcc-8.2.0.tar.xz -tar xfv ./binutils-2.31.1.tar.xz -tar xfv ./gcc-8.2.0.tar.xz +if [ ! -d ./binutils-2.31.1 ]; then + wget https://ftp.gnu.org/gnu/binutils/binutils-2.31.1.tar.xz + tar xf ./binutils-2.31.1.tar.xz + rm ./binutils-2.31.1.tar.xz + + # Apply binutils changes + for file in $(find ./binutils-files -name '*.*'); do + cp -v $file $(echo $file | sed s/binutils-files/binutils-2.31.1/) + done +fi +if [ ! -d ./gcc-8.2.0 ]; then + wget https://ftp.gnu.org/gnu/gcc/gcc-8.2.0/gcc-8.2.0.tar.xz + tar xf ./gcc-8.2.0.tar.xz + rm ./gcc-8.2.0.tar.xz + + # Apply gcc changes + for file in $(find ./gcc-files -name '*.*'); do + cp -v $file $(echo $file | sed s/gcc-files/gcc-8.2.0/) + done +fi -# Apply binutils changes -for file in $(find ./binutils-files -name '*.*'); do - cp -v $file $(echo $file | sed s/binutils-files/binutils-2.31.1/) -done -# Apply gcc changes -for file in $(find ./gcc-files -name '*.*'); do - cp -v $file $(echo $file | sed s/gcc-files/gcc-8.2.0/) -done # Prepare export TARGET=arm-stmos -mkdir -p $HOME/$TARGET -export PATH="$HOME/$TARGET/bin:$PATH" +export PREFIX=$HOME/$TARGET +mkdir -p $PREFIX +export PATH="$PREFIX/bin:$PATH" # Build binutils -cd ./binutils-2.31.1/ld -automake - -mkdir ../build -cd ../build -echo "Configure binutils... (../configure)" -bash -echo "Building binutils..." -make -j8 -make install +if ! [ -x "$(command -v $TARGET-as)" ]; then + echo "Starting binutils..." + cd ./binutils-2.31.1/ld + aclocal + automake + + mkdir ../build + cd ../build + echo "Configuring binutils..." + ../configure --prefix=$PREFIX --target=$TARGET --with-sysroot --disable-nls + echo "Building binutils..." + make -j8 + make install + + echo "Binutils installed. Test if it works? (Ctrl+D to continue with gcc)" + bash +else + echo "Binutils found, skipping..." + cd binutils-2.31.1/build +fi # Build gcc -cd ../../gcc-8.2.0/libstdc++-v3/ -autoconf - -mkdir ../build -cd ../build -echo "Configure gcc... (../configure)" -bash -echo "Building gcc..." -make -j8 -make install +if ! [ -x "$(command -v $TARGET-gcc)" ]; then + if [ ! -d "$PREFIX/usr/include" ]; then + # Control will enter here if $DIRECTORY doesn't exist. + echo "Installing pdclib includes..." + mkdir -p $PREFIX/usr/include + cp -Rv ../../../src/pdclib/include/* $PREFIX/usr/include + cp -Rv ../../../src/pdclib/platform/stmos/include/* \ + $PREFIX/usr/include + fi + + cd ../../gcc-8.2.0/libstdc++-v3/ + autoreconf + autoconf + + mkdir ../build + cd ../build + echo "Configuring gcc..." + ../configure --prefix=$PREFIX --target=$TARGET --with-sysroot=$PREFIX \ + --disable-nls --enable-languages=c,c++ + echo "Building gcc..." + make all-gcc all-target-libgcc -j8 + make install-gcc install-target-libgcc -j8 +else + echo "gcc found, skipping..." +fi + +echo "All done :) enjoy" -- cgit v1.2.3