├── hello.jl ├── .gitignore ├── rpi3 ├── memo.txt ├── Dockerfile-libgit2-1.7 ├── docker-compose.yml ├── Dockerfile-v1.11.1 ├── Dockerfile-v1.1.1 ├── Dockerfile-v1.2.0 ├── Dockerfile-v1.3.1 ├── Dockerfile-v1.0.5 ├── Dockerfile-v1.3.1-neon ├── Dockerfile-v1.4.1 ├── Dockerfile-v1.4.2 ├── Dockerfile-master ├── Dockerfile-v1.4.0 ├── Dockerfile-v1.5.0 ├── Dockerfile-v1.5.0-rc1 ├── Dockerfile-v1.11.1-bookworm-debug ├── Dockerfile-v1.10.5 ├── Dockerfile-v1.5.1 ├── Dockerfile-v1.5.2 ├── Dockerfile-v1.5.3 ├── Dockerfile-v1.5.4 └── Dockerfile-v1.11.1-bookworm ├── rpi2 ├── docker-compose.yml ├── Dockerfile-v1.1.1 ├── Dockerfile-v1.2.0 ├── Dockerfile-master ├── Dockerfile-v1.3.1 ├── Dockerfile-v1.0.5 └── Dockerfile-v1.4.1 ├── rpizero ├── docker-compose.yml ├── Dockerfile-v1.1.1 ├── Dockerfile-master ├── Dockerfile-v1.3.1 ├── Dockerfile-v1.0.5 ├── Dockerfile-v1.4.1 ├── Dockerfile-v1.4.2 ├── Dockerfile-v1.4.0 ├── Dockerfile-v1.5.0 ├── Dockerfile-v1.5.0-rc1 ├── Dockerfile-v1.5.1 ├── Dockerfile-v1.5.2 └── Dockerfile-v1.5.3 ├── jetson ├── multiarch │ └── Dockerfile └── balenasample │ └── Dockerfile ├── x86-64 ├── Dockerfile ├── Dockerfile-master └── Dockerfile-gpu ├── mac ├── README.md └── Makefile ├── local_build ├── build_v1.11.1-arm32bit-patch-2024-11-04.sh └── build_v1.11.1-arm32bit-patch-2024-11-04.patch └── README.md /hello.jl: -------------------------------------------------------------------------------- 1 | using Pkg 2 | Pkg.add("Example") 3 | using Example 4 | println(hello("World")) 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.jl.cov 2 | *.jl.*.cov 3 | *.jl.mem 4 | deps/deps.jl 5 | mac/build_error.txt 6 | mac/build_log.txt 7 | mac/install_log.txt 8 | mac/install_error.txt 9 | mac/julia/ 10 | -------------------------------------------------------------------------------- /rpi3/memo.txt: -------------------------------------------------------------------------------- 1 | https://julialang.slack.com/archives/C6SHHFV60/p1564967567011200 2 | 3 | We build julia on armv7l all the time 4 | 5 | Check the make variables you're setting 6 | We do it like this: 7 | 8 | ``` 9 | make -j6 VERBOSE=1 USECCACHE=1 JULIA_CPU_TARGET="armv7-a;armv7-a,neon;armv7-a,neon,vfp4" JULIA_TEST_MAXRSS_MB=900 JULIA_CPU_THREADS=6 MARCH=armv7-a USE_BINARYBUILDER=1 (edited) 10 | ``` 11 | We also set this: 12 | 13 | ``` 14 | LLVM_CMAKE="-DLLVM_HOST_TRIPLE=armv7l-unknown-linux-gnueabihf -DLLVM_DEFAULT_TARGET_TRIPLE=armv7l-unknown-linux-gnueabihf" 15 | ``` -------------------------------------------------------------------------------- /rpi2/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | v1.0.5: 4 | build: 5 | context: ./ 6 | dockerfile: Dockerfile-v1.0.5 7 | v1.1.1: 8 | build: 9 | context: ./ 10 | dockerfile: Dockerfile-v1.1.1 11 | v1.2.0: 12 | build: 13 | context: ./ 14 | dockerfile: Dockerfile-v1.2.0 15 | v1.3.1: 16 | build: 17 | context: ./ 18 | dockerfile: Dockerfile-v1.3.1 19 | v1.4.1: 20 | build: 21 | context: ./ 22 | dockerfile: Dockerfile-v1.4.1 23 | v1.4.2: 24 | build: 25 | context: ./ 26 | dockerfile: Dockerfile-v1.4.2 27 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-libgit2-1.7: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:bookworm-20240930 4 | 5 | # insta dependencies 6 | RUN apt-get update && \ 7 | apt-get install -y build-essential libatomic1 python3 gfortran perl wget m4 cmake pkg-config zlib1g-dev \ 8 | git \ 9 | unzip \ 10 | libssl-dev libmbedtls-dev libssh2-1-dev \ 11 | && \ 12 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 13 | 14 | RUN git clone --depth=1 -b v1.7.2 https://github.com/libgit2/libgit2.git && \ 15 | cd libgit2 && \ 16 | mkdir build && cd build && cmake ../ && make -j && make install 17 | 18 | RUN git clone --depth=1 -b curl-8_10_1 https://github.com/curl/curl.git && \ 19 | cd curl && \ 20 | mkdir build && cd build && cmake ../ && make -j && make install -------------------------------------------------------------------------------- /rpizero/docker-compose.yml: -------------------------------------------------------------------------------- 1 | # Usage 2 | # Just run: 3 | # docker-compose build 4 | 5 | version: '3' 6 | services: 7 | v1.0.5: 8 | build: 9 | context: ./ 10 | dockerfile: Dockerfile-v1.0.5 11 | v1.1.1: 12 | build: 13 | context: ./ 14 | dockerfile: Dockerfile-v1.1.1 15 | v1.3.1: 16 | build: 17 | context: ./ 18 | dockerfile: Dockerfile-v1.3.1 19 | v1.4.0: 20 | build: 21 | context: ./ 22 | dockerfile: Dockerfile-v1.4.0 23 | v1.4.1: 24 | build: 25 | context: ./ 26 | dockerfile: Dockerfile-v1.4.1 27 | v1.4.2: 28 | build: 29 | context: ./ 30 | dockerfile: Dockerfile-v1.4.2 31 | v1.5.0: 32 | build: 33 | context: ./ 34 | dockerfile: Dockerfile-v1.5.0 35 | v1.5.1: 36 | build: 37 | context: ./ 38 | dockerfile: Dockerfile-v1.5.1 39 | v1.5.2: 40 | build: 41 | context: ./ 42 | dockerfile: Dockerfile-v1.5.2 43 | v1.5.3: 44 | build: 45 | context: ./ 46 | dockerfile: Dockerfile-v1.5.3 47 | -------------------------------------------------------------------------------- /rpi3/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | v1.0.5: 4 | build: 5 | context: ./ 6 | dockerfile: Dockerfile-v1.0.5 7 | v1.1.1: 8 | build: 9 | context: ./ 10 | dockerfile: Dockerfile-v1.1.1 11 | v1.2.0: 12 | build: 13 | context: ./ 14 | dockerfile: Dockerfile-v1.2.0 15 | v1.3.1: 16 | build: 17 | context: ./ 18 | dockerfile: Dockerfile-v1.3.1 19 | v1.4.0: 20 | build: 21 | context: ./ 22 | dockerfile: Dockerfile-v1.4.0 23 | v1.4.1: 24 | build: 25 | context: ./ 26 | dockerfile: Dockerfile-v1.4.1 27 | v1.4.2: 28 | build: 29 | context: ./ 30 | dockerfile: Dockerfile-v1.4.2 31 | v1.5.0: 32 | build: 33 | context: ./ 34 | dockerfile: Dockerfile-v1.5.0 35 | v1.5.1: 36 | build: 37 | context: ./ 38 | dockerfile: Dockerfile-v1.5.1 39 | v1.5.2: 40 | build: 41 | context: ./ 42 | dockerfile: Dockerfile-v1.5.2 43 | v1.5.3: 44 | build: 45 | context: ./ 46 | dockerfile: Dockerfile-v1.5.3 47 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.11.1: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:bookworm-20240930 4 | 5 | # install dependencies 6 | RUN apt-get update && \ 7 | apt-get install -y build-essential libatomic1 python3 gfortran perl wget m4 cmake pkg-config zlib1g-dev \ 8 | git \ 9 | unzip \ 10 | && \ 11 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 12 | 13 | # build julia from source 14 | ARG JL_VERSION="terasaki/v1.11.1-arm-patch-2" 15 | ARG WDIR=/home/pi/work 16 | ARG JL_BUILD_DIR=$WDIR/build 17 | WORKDIR $WDIR 18 | RUN echo "\ 19 | prefix=/home/pi/julia-$JL_VERSION\n\ 20 | USE_BINARYBUILDER=1\n\ 21 | CFLAGS += "-mfpu=neon-vfpv4"\n\ 22 | CFLAGS += "-mfloat-abi=hard"\n\ 23 | CXXFLAGS += "-mfpu=neon-vfpv4"\n\ 24 | CXXFLAGS += "-mfloat-abi=hard"\n\ 25 | MARCH="armv7-a+fp"\n\ 26 | " > Make.user && \ 27 | cat Make.user && \ 28 | git clone --depth=1 -b $JL_VERSION https://github.com/terasakisatoshi/julia.git $JL_BUILD_DIR && \ 29 | cp Make.user $JL_BUILD_DIR && \ 30 | cd $JL_BUILD_DIR && make -j 31 | -------------------------------------------------------------------------------- /rpi2/Dockerfile-v1.1.1: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberry-pi2:buster-run-20191106 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git 11 | 12 | # build julia from source 13 | ARG JL_VERSION="v1.1.1" 14 | ARG WDIR=/home/pi/work 15 | ARG JL_BUILD_DIR=$WDIR/build 16 | WORKDIR $WDIR 17 | RUN echo "\ 18 | JULIA_CPU_TARGET=cortex-a7\n\ 19 | MARCH=armv7-a\n\ 20 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 21 | prefix=$WDIR/julia-$JL_VERSION\n\ 22 | " > Make.user && \ 23 | cat Make.user && \ 24 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 25 | cp Make.user $JL_BUILD_DIR && \ 26 | cd $JL_BUILD_DIR && make -j 16 && make install 27 | 28 | # add path of Julia 29 | ENV PATH=$WDIR/julia-$JL_VERSION/bin:$PATH 30 | 31 | # clean up 32 | RUN rm -r $JL_BUILD_DIR $WDIR/Make.user 33 | RUN apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 34 | -------------------------------------------------------------------------------- /rpi2/Dockerfile-v1.2.0: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberry-pi2:stretch-run-20181207 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git 11 | 12 | # build julia from source 13 | ARG JL_VERSION="v1.2.0" 14 | ARG WDIR=/home/pi/work 15 | ARG JL_BUILD_DIR=$WDIR/build 16 | WORKDIR $WDIR 17 | RUN echo "\ 18 | JULIA_CPU_TARGET=cortex-a7\n\ 19 | MARCH=armv7-a\n\ 20 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 21 | prefix=$WDIR/julia-$JL_VERSION\n\ 22 | " > Make.user && \ 23 | cat Make.user && \ 24 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 25 | cp Make.user $JL_BUILD_DIR && \ 26 | cd $JL_BUILD_DIR && make -j 16 && make install 27 | 28 | # add path of Julia 29 | ENV PATH=$WDIR/julia-$JL_VERSION/bin:$PATH 30 | 31 | # clean up 32 | RUN rm -r $JL_BUILD_DIR $WDIR/Make.user 33 | RUN apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 34 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.1.1: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:buster-run-20191106 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git 11 | 12 | # build julia from source 13 | ARG JL_VERSION="v1.1.1" 14 | ARG WDIR=/home/pi/work 15 | ARG JL_BUILD_DIR=$WDIR/build 16 | WORKDIR $WDIR 17 | RUN echo "\ 18 | JULIA_CPU_TARGET=cortex-a53\n\ 19 | MARCH=armv7-a\n\ 20 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 21 | prefix=$WDIR/julia-$JL_VERSION\n\ 22 | " > Make.user && \ 23 | cat Make.user && \ 24 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 25 | cp Make.user $JL_BUILD_DIR && \ 26 | cd $JL_BUILD_DIR && make -j 16 && make install 27 | 28 | # add path of Julia 29 | ENV PATH=$WDIR/julia-$JL_VERSION/bin:$PATH 30 | 31 | # clean up 32 | RUN rm -r $JL_BUILD_DIR $WDIR/Make.user 33 | RUN apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 34 | -------------------------------------------------------------------------------- /rpi2/Dockerfile-master: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberry-pi2:buster-run-20191106 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git 11 | 12 | # build julia from source 13 | ARG JL_VERSION="master" 14 | ARG WDIR=/home/pi/work 15 | ARG JL_BUILD_DIR=$WDIR/build 16 | WORKDIR $WDIR 17 | RUN echo "\ 18 | JULIA_CPU_TARGET=cortex-a7\n\ 19 | USE_BINARYBUILDER=0\n\ 20 | MARCH=armv7-a\n\ 21 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 22 | prefix=$WDIR/julia-$JL_VERSION\n\ 23 | " > Make.user && \ 24 | cat Make.user && \ 25 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 26 | cp Make.user $JL_BUILD_DIR && \ 27 | cd $JL_BUILD_DIR && make -j 16 && make install 28 | 29 | # add path of Julia 30 | ENV PATH=$WDIR/julia-$JL_VERSION/bin:$PATH 31 | 32 | # clean up 33 | RUN rm -r $JL_BUILD_DIR $WDIR/Make.user 34 | RUN apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 35 | -------------------------------------------------------------------------------- /rpi2/Dockerfile-v1.3.1: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberry-pi2:buster-run-20191106 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git 11 | 12 | # build julia from source 13 | ARG JL_VERSION="v1.3.1" 14 | ARG WDIR=/home/pi/work 15 | ARG JL_BUILD_DIR=$WDIR/build 16 | WORKDIR $WDIR 17 | RUN echo "\ 18 | JULIA_CPU_TARGET=cortex-a7\n\ 19 | USE_BINARYBUILDER=0\n\ 20 | MARCH=armv7-a\n\ 21 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 22 | prefix=$WDIR/julia-$JL_VERSION\n\ 23 | " > Make.user && \ 24 | cat Make.user && \ 25 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 26 | cp Make.user $JL_BUILD_DIR && \ 27 | cd $JL_BUILD_DIR && make -j 16 && make install 28 | 29 | # add path of Julia 30 | ENV PATH=$WDIR/julia-$JL_VERSION/bin:$PATH 31 | 32 | # clean up 33 | RUN rm -r $JL_BUILD_DIR $WDIR/Make.user 34 | RUN apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 35 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.2.0: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:stretch-run-20181207 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git 11 | 12 | # build julia from source 13 | ARG JL_VERSION="v1.2.0" 14 | ARG WDIR=/home/pi/work 15 | ARG JL_BUILD_DIR=$WDIR/build 16 | WORKDIR $WDIR 17 | RUN echo "\ 18 | JULIA_CPU_TARGET=cortex-a53\n\ 19 | USE_BINARYBUILDER=0\n\ 20 | MARCH=armv7-a\n\ 21 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 22 | prefix=$WDIR/julia-$JL_VERSION\n\ 23 | " > Make.user && \ 24 | cat Make.user && \ 25 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 26 | cp Make.user $JL_BUILD_DIR && \ 27 | cd $JL_BUILD_DIR && make -j 16 && make install 28 | 29 | # add path of Julia 30 | ENV PATH=$WDIR/julia-$JL_VERSION/bin:$PATH 31 | 32 | # clean up 33 | RUN rm -r $JL_BUILD_DIR $WDIR/Make.user 34 | RUN apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 35 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.3.1: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:buster-run-20191106 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git 11 | 12 | # build julia from source 13 | ARG JL_VERSION="v1.3.1" 14 | ARG WDIR=/home/pi/work 15 | ARG JL_BUILD_DIR=$WDIR/build 16 | WORKDIR $WDIR 17 | RUN echo "\ 18 | JULIA_CPU_TARGET=cortex-a53\n\ 19 | USE_BINARYBUILDER=0\n\ 20 | MARCH=armv7-a\n\ 21 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 22 | prefix=$WDIR/julia-$JL_VERSION\n\ 23 | " > Make.user && \ 24 | cat Make.user && \ 25 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 26 | cp Make.user $JL_BUILD_DIR && \ 27 | cd $JL_BUILD_DIR && make -j 16 && make install 28 | 29 | # add path of Julia 30 | ENV PATH=$WDIR/julia-$JL_VERSION/bin:$PATH 31 | 32 | # clean up 33 | RUN rm -r $JL_BUILD_DIR $WDIR/Make.user 34 | RUN apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 35 | -------------------------------------------------------------------------------- /rpi2/Dockerfile-v1.0.5: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 2 | 3 | FROM balenalib/raspberry-pi2:buster-20200502 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git && \ 11 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 12 | 13 | # build julia from source 14 | ARG JL_VERSION="v1.0.5" 15 | ARG WDIR=/home/pi/work 16 | ARG JL_BUILD_DIR=$WDIR/build 17 | WORKDIR $WDIR 18 | RUN echo "\ 19 | JULIA_CPU_TARGET=cortex-a7\n\ 20 | MARCH=armv7-a\n\ 21 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 22 | prefix=$WDIR/julia-$JL_VERSION\n\ 23 | " > Make.user && \ 24 | cat Make.user && \ 25 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 26 | cp Make.user $JL_BUILD_DIR && \ 27 | cd $JL_BUILD_DIR && make -j 16 && make install && \ 28 | rm -r $JL_BUILD_DIR $WDIR/Make.user 29 | 30 | # add path of Julia 31 | ENV PATH=$WDIR/julia-$JL_VERSION/bin:$PATH 32 | 33 | RUN julia -e "using InteractiveUtils; versioninfo()" 34 | 35 | CMD ["julia"] 36 | 37 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.0.5: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:buster-20200502 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git && \ 11 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 12 | 13 | # build julia from source 14 | ARG JL_VERSION="v1.0.5" 15 | ARG WDIR=/home/pi/work 16 | ARG JL_BUILD_DIR=$WDIR/build 17 | WORKDIR $WDIR 18 | RUN echo "\ 19 | JULIA_CPU_TARGET=cortex-a53\n\ 20 | MARCH=armv7-a\n\ 21 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 22 | prefix=$WDIR/julia-$JL_VERSION\n\ 23 | " > Make.user && \ 24 | cat Make.user && \ 25 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 26 | cp Make.user $JL_BUILD_DIR && \ 27 | cd $JL_BUILD_DIR && make -j 16 && make install && \ 28 | rm -r $JL_BUILD_DIR $WDIR/Make.user 29 | 30 | # add path of Julia 31 | ENV PATH=$WDIR/julia-$JL_VERSION/bin:$PATH 32 | # runtime test 33 | RUN julia -e "using InteractiveUtils; versioninfo()" 34 | CMD ["julia"] 35 | -------------------------------------------------------------------------------- /jetson/multiarch/Dockerfile: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm64-bit devices e.g. Jetson-nano, 2 | # sudo docker build -t terasakisatoshi/jlcross:jetson-nano-1.5.1 . 3 | 4 | FROM multiarch/ubuntu-core:arm64-xenial 5 | 6 | ARG VERSION="v1.5.3" 7 | 8 | MAINTAINER SATOSHI TERASAKI 9 | 10 | # install dependencies 11 | RUN apt-get update && \ 12 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 13 | git && \ 14 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 15 | 16 | # build julia from source 17 | ARG WDIR=/home/jetson-nano/work 18 | ARG JL_BUILD_DIR=$WDIR/build 19 | WORKDIR $WDIR 20 | RUN echo "\ 21 | prefix=$WDIR/julia-$VERSION\n\ 22 | JULIA_CPU_TARGET=generic\n\ 23 | MARCH=armv8-a\n\ 24 | USE_BINARYBUILDER=0\n\ 25 | " > Make.user && \ 26 | cat Make.user && \ 27 | git clone --depth=1 -b $VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR && \ 28 | cp Make.user $JL_BUILD_DIR && \ 29 | cd $JL_BUILD_DIR && make -j 16 && make install && \ 30 | rm -r $JL_BUILD_DIR $WDIR/Make.user 31 | 32 | # add path of Julia 33 | ENV PATH=$WDIR/julia-$VERSION/bin:$PATH 34 | # runtime test 35 | RUN julia -e "using InteractiveUtils; versioninfo()" 36 | CMD ["julia"] 37 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.3.1-neon: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:buster-run-20191106 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git 11 | 12 | # build julia from source 13 | ARG JL_VERSION="v1.3.1" 14 | ARG WDIR=/home/pi/work 15 | ARG JL_BUILD_DIR=$WDIR/build 16 | WORKDIR $WDIR 17 | RUN echo "\ 18 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 19 | prefix=/home/pi/julia_$JL_VERSION\n\ 20 | USE_BINARYBUILDER=0\n\ 21 | LDFLAGS=-latomic\n\ 22 | CFLAGS += "-mfpu=neon-vfpv4"\n\ 23 | CXXFLAGS += "-mfpu=neon-vfpv4"\n\ 24 | MARCH="armv7-a"\n\ 25 | JULIA_CPU_TARGET=\"armv7-a\;armv7-a,neon\;armv7-a,neon,vfp4\"\n\ 26 | JULIA_CPU_THREADS=4\n\ 27 | " > Make.user && \ 28 | cat Make.user && \ 29 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 30 | cp Make.user $JL_BUILD_DIR && \ 31 | cd $JL_BUILD_DIR && make -j 16 && make install 32 | 33 | # add path of Julia 34 | ENV PATH=$WDIR/julia-$JL_VERSION/bin:$PATH 35 | 36 | # clean up 37 | RUN rm -r $JL_BUILD_DIR $WDIR/Make.user 38 | RUN apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 39 | -------------------------------------------------------------------------------- /rpizero/Dockerfile-v1.1.1: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit devices e.g. RaspberryPi Zero(W/WH) 2 | FROM balenalib/raspberry-pi:buster-20191030 3 | 4 | MAINTAINER SATOSHI TERASAKI 5 | 6 | # install dependencies 7 | RUN apt-get update && \ 8 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 9 | libopenblas-dev \ 10 | liblapack-dev \ 11 | libgmp3-dev \ 12 | libmpfr-dev \ 13 | git 14 | 15 | # build julia from source 16 | ARG JL_VERSION="v1.1.1" 17 | ARG WDIR=/home/pi/work 18 | ARG JL_BUILD_DIR=$WDIR/build 19 | WORKDIR $WDIR 20 | RUN echo "\ 21 | JULIA_CPU_TARGET=arm1176jzf-s\n\ 22 | prefix=$WDIR/julia-$JL_VERSION\n\ 23 | LDFLAGS=-latomic\n\ 24 | override USE_SYSTEM_BLAS=1\n\ 25 | override USE_SYSTEM_LAPACK=1\n\ 26 | override USE_SYSTEM_LIBM=1\n\ 27 | override USE_SYSTEM_GMP=1\n\ 28 | override USE_SYSTEM_MPFR=1\n\ 29 | " > Make.user && \ 30 | cat Make.user && \ 31 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 32 | cp Make.user $JL_BUILD_DIR && \ 33 | cd $JL_BUILD_DIR && make -j $(nproc) OPENBLAS_USE_THREAD=0 && make install 34 | 35 | # add path of Julia 36 | ENV PATH=$WDIR/julia-$JL_VERSION/bin:$PATH 37 | 38 | # clean up 39 | RUN rm -r $JL_BUILD_DIR $WDIR/Make.user 40 | RUN apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 41 | -------------------------------------------------------------------------------- /x86-64/Dockerfile: -------------------------------------------------------------------------------- 1 | # Build Julia from source on your x86-64 machine, 2 | # which means it is not instruction for cross compilation, 3 | # but it will helpful for one who is trying to create script 4 | # to build Julia from source for any device. 5 | 6 | FROM ubuntu:24.04 7 | 8 | RUN apt-get update && apt-get install -y \ 9 | build-essential \ 10 | libatomic1 \ 11 | python3 \ 12 | gfortran \ 13 | perl \ 14 | wget \ 15 | m4 \ 16 | cmake \ 17 | pkg-config \ 18 | git \ 19 | zlib1g-dev \ 20 | && apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 21 | 22 | ARG JL_VERSION="v1.10.5" 23 | ARG WDIR="/root" 24 | ARG JL_BUILD_DIR=$WDIR/build 25 | WORKDIR $JL_BUILD_DIR 26 | 27 | RUN echo "\ 28 | prefix=/usr/local/julia-$JL_VERSION\n\ 29 | USE_BINARYBUILDER = 0\n\ 30 | " > Make.user \ 31 | && cat Make.user \ 32 | && git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git julia-$JL_VERSION\ 33 | && cp Make.user $JL_BUILD_DIR/julia-$JL_VERSION \ 34 | && cd julia-$JL_VERSION \ 35 | && make -j $(nproc) \ 36 | && make install \ 37 | && echo "clean up $JL_BUILD_DIR" \ 38 | && rm -r $JL_BUILD_DIR \ 39 | && echo "Done" 40 | 41 | ENV PATH=/usr/local/julia-$JL_VERSION/bin:$PATH 42 | # runtime test 43 | RUN julia -e "using InteractiveUtils; versioninfo()" 44 | 45 | CMD ["julia"] 46 | -------------------------------------------------------------------------------- /x86-64/Dockerfile-master: -------------------------------------------------------------------------------- 1 | # Build Julia from source on your x86-64 machine, 2 | # which means it is not instruction for cross compilation, 3 | # but it will helpful for one who is trying to create script 4 | # to build Julia from source for any device. 5 | 6 | FROM ubuntu:24.04 7 | 8 | RUN apt-get update && apt-get install -y \ 9 | build-essential \ 10 | libatomic1 \ 11 | python3 \ 12 | gfortran \ 13 | perl \ 14 | wget \ 15 | m4 \ 16 | cmake \ 17 | pkg-config \ 18 | zlib1g-dev \ 19 | git \ 20 | && apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 21 | 22 | ARG JL_VERSION="master" 23 | ARG WDIR="/root" 24 | ARG JL_BUILD_DIR=$WDIR/build 25 | WORKDIR $JL_BUILD_DIR 26 | 27 | RUN echo "\ 28 | prefix=/usr/local/julia-$JL_VERSION\n\ 29 | USE_BINARYBUILDER = 0\n\ 30 | " > Make.user \ 31 | && cat Make.user \ 32 | && git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git julia-$JL_VERSION\ 33 | && cp Make.user $JL_BUILD_DIR/julia-$JL_VERSION \ 34 | && cd julia-$JL_VERSION \ 35 | && make -j $(nproc) \ 36 | && make install \ 37 | && echo "clean up $JL_BUILD_DIR" \ 38 | && rm -r $JL_BUILD_DIR \ 39 | && echo "Done" 40 | 41 | ENV PATH=/usr/local/julia-$JL_VERSION/bin:$PATH 42 | # runtime test 43 | RUN julia -e "using InteractiveUtils; versioninfo()" 44 | 45 | CMD ["julia"] 46 | 47 | -------------------------------------------------------------------------------- /rpizero/Dockerfile-master: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit devices e.g. RaspberryPi Zero(W/WH) 2 | FROM balenalib/raspberry-pi:buster-20200518 3 | MAINTAINER SATOSHI TERASAKI 4 | 5 | # install dependencies 6 | RUN apt-get update && \ 7 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 8 | libopenblas-dev \ 9 | liblapack-dev \ 10 | libgmp3-dev \ 11 | libmpfr-dev \ 12 | git 13 | 14 | # build julia from source 15 | ARG JL_VERSION="master" 16 | ARG WDIR=/home/pi/work 17 | ARG JL_BUILD_DIR=$WDIR/build 18 | WORKDIR $WDIR 19 | RUN echo "\ 20 | prefix=$WDIR/julia-$JL_VERSION\n\ 21 | JULIA_CPU_TARGET=arm1176jzf-s\n\ 22 | LDFLAGS=-latomic\n\ 23 | USE_BINARYBUILDER=0\n\ 24 | override USE_SYSTEM_BLAS=1\n\ 25 | override USE_SYSTEM_LAPACK=1\n\ 26 | override USE_SYSTEM_LIBM=1\n\ 27 | override USE_SYSTEM_GMP=1\n\ 28 | override USE_SYSTEM_MPFR=1\n\ 29 | " > Make.user && \ 30 | cat Make.user && \ 31 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 32 | cp Make.user $JL_BUILD_DIR && \ 33 | cd $JL_BUILD_DIR && make -j 16 OPENBLAS_USE_THREAD=0 && make install 34 | 35 | # add path of Julia 36 | ENV PATH=$WDIR/julia-$JL_VERSION/bin:$PATH 37 | 38 | # clean up 39 | RUN rm -r $JL_BUILD_DIR $WDIR/Make.user 40 | RUN apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 41 | -------------------------------------------------------------------------------- /rpizero/Dockerfile-v1.3.1: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit devices e.g. RaspberryPi Zero(W/WH) 2 | FROM balenalib/raspberry-pi:buster-20191030 3 | 4 | MAINTAINER SATOSHI TERASAKI 5 | 6 | # install dependencies 7 | RUN apt-get update && \ 8 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 9 | libopenblas-dev \ 10 | liblapack-dev \ 11 | libgmp3-dev \ 12 | libmpfr-dev \ 13 | git 14 | 15 | # build julia from source 16 | ARG JL_VERSION="v1.3.1" 17 | ARG WDIR=/home/pi/work 18 | ARG JL_BUILD_DIR=$WDIR/build 19 | WORKDIR $WDIR 20 | RUN echo "\ 21 | prefix=$WDIR/julia-$JL_VERSION\n\ 22 | JULIA_CPU_TARGET=arm1176jzf-s\n\ 23 | LDFLAGS=-latomic\n\ 24 | USE_BINARYBUILDER=0\n\ 25 | override USE_SYSTEM_BLAS=1\n\ 26 | override USE_SYSTEM_LAPACK=1\n\ 27 | override USE_SYSTEM_LIBM=1\n\ 28 | override USE_SYSTEM_GMP=1\n\ 29 | override USE_SYSTEM_MPFR=1\n\ 30 | " > Make.user && \ 31 | cat Make.user && \ 32 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 33 | cp Make.user $JL_BUILD_DIR && \ 34 | cd $JL_BUILD_DIR && make -j $(nproc) OPENBLAS_USE_THREAD=0 && make install 35 | 36 | # add path of Julia 37 | ENV PATH=$WDIR/julia-$JL_VERSION/bin:$PATH 38 | 39 | # clean up 40 | RUN rm -r $JL_BUILD_DIR $WDIR/Make.user 41 | RUN apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 42 | -------------------------------------------------------------------------------- /x86-64/Dockerfile-gpu: -------------------------------------------------------------------------------- 1 | # Build Julia from source on your x86-64 machine, 2 | # which means it is not instruction for cross compilation, 3 | # but it will helpful for one who is trying to create script 4 | # to build Julia from source for any device. 5 | 6 | FROM nvidia/cuda:12.2.0-base-ubuntu22.04 7 | 8 | RUN apt-get update && apt-get install -y \ 9 | build-essential \ 10 | libatomic1 \ 11 | python3 \ 12 | gfortran \ 13 | perl \ 14 | wget \ 15 | m4 \ 16 | cmake \ 17 | pkg-config \ 18 | git \ 19 | zlib1g-dev \ 20 | && apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 21 | 22 | ARG JL_VERSION="v1.10.5" 23 | ARG WDIR="/root" 24 | ARG JL_BUILD_DIR=$WDIR/build 25 | WORKDIR $JL_BUILD_DIR 26 | 27 | RUN echo "\ 28 | prefix=/usr/local/julia-$JL_VERSION\n\ 29 | USE_BINARYBUILDER = 0\n\ 30 | " > Make.user \ 31 | && cat Make.user \ 32 | && git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git julia-$JL_VERSION\ 33 | && cp Make.user $JL_BUILD_DIR/julia-$JL_VERSION \ 34 | && cd julia-$JL_VERSION \ 35 | && make -j $(nproc) \ 36 | && make install \ 37 | && echo "clean up $JL_BUILD_DIR" \ 38 | && rm -r $JL_BUILD_DIR \ 39 | && echo "Done" 40 | 41 | ENV PATH=/usr/local/julia-$JL_VERSION/bin:$PATH 42 | # runtime test 43 | RUN julia -e "using InteractiveUtils; versioninfo()" 44 | 45 | CMD ["julia"] 46 | -------------------------------------------------------------------------------- /rpi2/Dockerfile-v1.4.1: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 2 | 3 | FROM balenalib/raspberry-pi2:buster-20200502 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git && \ 11 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 12 | 13 | # build julia from source 14 | ARG JL_VERSION="v1.4.1" 15 | ARG WDIR=/home/pi/work 16 | ARG JL_BUILD_DIR=$WDIR/build 17 | WORKDIR $WDIR 18 | RUN echo "\ 19 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 20 | prefix=/home/pi/julia-$JL_VERSION\n\ 21 | USE_BINARYBUILDER=0\n\ 22 | LDFLAGS=-latomic\n\ 23 | CFLAGS += "-mfpu=neon-vfpv4"\n\ 24 | CXXFLAGS += "-mfpu=neon-vfpv4"\n\ 25 | MARCH="armv7-a"\n\ 26 | JULIA_CPU_TARGET=\"armv7-a\;armv7-a,neon\;armv7-a,neon,vfp4\"\n\ 27 | JULIA_CPU_THREADS=4\n\ 28 | " > Make.user && \ 29 | cat Make.user && \ 30 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 31 | cp Make.user $JL_BUILD_DIR && \ 32 | cd $JL_BUILD_DIR && make -j 16 && make install && \ 33 | echo "clean up $JL_BUILD_DIR" && \ 34 | rm -r $JL_BUILD_DIR && \ 35 | echo "Done" 36 | 37 | # add path of Julia 38 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 39 | # runtime test 40 | RUN julia -e "using InteractiveUtils; versioninfo()" 41 | CMD ["julia"] 42 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.4.1: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:buster-20200502 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git && \ 11 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 12 | 13 | # build julia from source 14 | ARG JL_VERSION="v1.4.1" 15 | ARG WDIR=/home/pi/work 16 | ARG JL_BUILD_DIR=$WDIR/build 17 | WORKDIR $WDIR 18 | RUN echo "\ 19 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 20 | prefix=/home/pi/julia-$JL_VERSION\n\ 21 | USE_BINARYBUILDER=0\n\ 22 | LDFLAGS=-latomic\n\ 23 | CFLAGS += "-mfpu=neon-vfpv4"\n\ 24 | CXXFLAGS += "-mfpu=neon-vfpv4"\n\ 25 | MARCH="armv7-a"\n\ 26 | JULIA_CPU_TARGET=\"armv7-a\;armv7-a,neon\;armv7-a,neon,vfp4\"\n\ 27 | JULIA_CPU_THREADS=4\n\ 28 | " > Make.user && \ 29 | cat Make.user && \ 30 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 31 | cp Make.user $JL_BUILD_DIR && \ 32 | cd $JL_BUILD_DIR && make -j 16 && make install && \ 33 | echo "clean up $JL_BUILD_DIR" && \ 34 | rm -r $JL_BUILD_DIR && \ 35 | echo "Done" 36 | 37 | # add path of Julia 38 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 39 | # runtime test 40 | RUN julia -e "using InteractiveUtils; versioninfo()" 41 | CMD ["julia"] 42 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.4.2: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:buster-20200502 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git && \ 11 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 12 | 13 | # build julia from source 14 | ARG JL_VERSION="v1.4.2" 15 | ARG WDIR=/home/pi/work 16 | ARG JL_BUILD_DIR=$WDIR/build 17 | WORKDIR $WDIR 18 | RUN echo "\ 19 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 20 | prefix=/home/pi/julia-$JL_VERSION\n\ 21 | USE_BINARYBUILDER=0\n\ 22 | LDFLAGS=-latomic\n\ 23 | CFLAGS += "-mfpu=neon-vfpv4"\n\ 24 | CXXFLAGS += "-mfpu=neon-vfpv4"\n\ 25 | MARCH="armv7-a"\n\ 26 | JULIA_CPU_TARGET=\"armv7-a\;armv7-a,neon\;armv7-a,neon,vfp4\"\n\ 27 | JULIA_CPU_THREADS=4\n\ 28 | " > Make.user && \ 29 | cat Make.user && \ 30 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 31 | cp Make.user $JL_BUILD_DIR && \ 32 | cd $JL_BUILD_DIR && make -j 16 && make install && \ 33 | echo "clean up $JL_BUILD_DIR" && \ 34 | rm -r $JL_BUILD_DIR && \ 35 | echo "Done" 36 | 37 | # add path of Julia 38 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 39 | # runtime test 40 | RUN julia -e "using InteractiveUtils; versioninfo()" 41 | CMD ["julia"] 42 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-master: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:bullseye-20240930 4 | 5 | # insta dependencies 6 | RUN apt-get update && \ 7 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 8 | libunwind-dev \ 9 | git && \ 10 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 11 | 12 | # build julia from source 13 | ARG JL_VERSION="master" 14 | ARG WDIR=/home/pi/work 15 | ARG JL_BUILD_DIR=$WDIR/build 16 | WORKDIR $WDIR 17 | RUN echo "\ 18 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 19 | prefix=/home/pi/julia-$JL_VERSION\n\ 20 | USE_BINARYBUILDER=0\n\ 21 | LDFLAGS=-latomic\n\ 22 | CFLAGS += "-mfpu=neon-vfpv4"\n\ 23 | CXXFLAGS += "-mfpu=neon-vfpv4"\n\ 24 | MARCH="armv7-a"\n\ 25 | JULIA_CPU_TARGET=\"armv7-a\;armv7-a,neon\;armv7-a,neon,vfp4\"\n\ 26 | override USE_SYSTEM_LIBUV=1\n\ 27 | JULIA_CPU_THREADS=4\n\ 28 | " > Make.user && \ 29 | cat Make.user && \ 30 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 31 | cp Make.user $JL_BUILD_DIR && \ 32 | cd $JL_BUILD_DIR && make -j 16 && make install && \ 33 | echo "clean up $JL_BUILD_DIR" && \ 34 | rm -r $JL_BUILD_DIR && \ 35 | echo "Done" 36 | 37 | # add path of Julia 38 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 39 | # runtime test 40 | RUN julia -e "using InteractiveUtils; versioninfo()" 41 | CMD ["julia"] 42 | -------------------------------------------------------------------------------- /rpizero/Dockerfile-v1.0.5: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit devices e.g. RaspberryPi Zero(W/WH) 2 | 3 | FROM balenalib/raspberry-pi:buster-20200518 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # install dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | libopenblas-dev \ 11 | liblapack-dev \ 12 | libgmp3-dev \ 13 | libmpfr-dev \ 14 | git && \ 15 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 16 | 17 | # build julia from source 18 | ARG JL_VERSION="v1.0.5" 19 | ARG WDIR=/home/pi/work 20 | ARG JL_BUILD_DIR=$WDIR/build 21 | WORKDIR $WDIR 22 | RUN echo "\ 23 | JULIA_CPU_TARGET=arm1176jzf-s\n\ 24 | prefix=$WDIR/julia-$JL_VERSION\n\ 25 | LDFLAGS=-latomic\n\ 26 | override USE_SYSTEM_BLAS=1\n\ 27 | override USE_SYSTEM_LAPACK=1\n\ 28 | override USE_SYSTEM_LIBM=1\n\ 29 | override USE_SYSTEM_GMP=1\n\ 30 | override USE_SYSTEM_MPFR=1\n\ 31 | " > Make.user && \ 32 | cat Make.user && \ 33 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR && \ 34 | cp Make.user $JL_BUILD_DIR && \ 35 | cd $JL_BUILD_DIR && make -j 16 OPENBLAS_USE_THREAD=0 && make install && \ 36 | rm -r $JL_BUILD_DIR $WDIR/Make.user 37 | 38 | # add path of Julia 39 | ENV PATH=$WDIR/julia-$JL_VERSION/bin:$PATH 40 | 41 | # runtime test 42 | RUN julia -e "using InteractiveUtils; versioninfo()" 43 | 44 | CMD ["julia"] 45 | 46 | -------------------------------------------------------------------------------- /rpizero/Dockerfile-v1.4.1: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit devices e.g. RaspberryPi Zero(W/WH) 2 | 3 | FROM balenalib/raspberry-pi:buster-20200518 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # install dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | libopenblas-dev \ 11 | liblapack-dev \ 12 | libgmp3-dev \ 13 | libmpfr-dev \ 14 | git && \ 15 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 16 | 17 | # build julia from source 18 | ARG JL_VERSION="v1.4.1" 19 | ARG WDIR=/home/pi/work 20 | ARG JL_BUILD_DIR=$WDIR/build 21 | WORKDIR $WDIR 22 | RUN echo "\ 23 | prefix=/home/pi/julia-$JL_VERSION\n\ 24 | JULIA_CPU_TARGET=arm1176jzf-s\n\ 25 | LDFLAGS=-latomic\n\ 26 | USE_BINARYBUILDER=0\n\ 27 | override USE_SYSTEM_BLAS=1\n\ 28 | override USE_SYSTEM_LAPACK=1\n\ 29 | override USE_SYSTEM_LIBM=1\n\ 30 | override USE_SYSTEM_GMP=1\n\ 31 | override USE_SYSTEM_MPFR=1\n\ 32 | " > Make.user && \ 33 | cat Make.user && \ 34 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 35 | cp Make.user $JL_BUILD_DIR && \ 36 | cd $JL_BUILD_DIR && make -j 16 OPENBLAS_USE_THREAD=0 && make install && \ 37 | rm -r $JL_BUILD_DIR && \ 38 | echo "Done" 39 | 40 | # add path of Julia 41 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 42 | # runtime test 43 | RUN julia -e "using InteractiveUtils; versioninfo()" 44 | CMD ["julia"] 45 | -------------------------------------------------------------------------------- /rpizero/Dockerfile-v1.4.2: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit devices e.g. RaspberryPi Zero(W/WH) 2 | 3 | FROM balenalib/raspberry-pi:buster-20200518 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # install dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | libopenblas-dev \ 11 | liblapack-dev \ 12 | libgmp3-dev \ 13 | libmpfr-dev \ 14 | git && \ 15 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 16 | 17 | # build julia from source 18 | ARG JL_VERSION="v1.4.2" 19 | ARG WDIR=/home/pi/work 20 | ARG JL_BUILD_DIR=$WDIR/build 21 | WORKDIR $WDIR 22 | RUN echo "\ 23 | prefix=/home/pi/julia-$JL_VERSION\n\ 24 | JULIA_CPU_TARGET=arm1176jzf-s\n\ 25 | LDFLAGS=-latomic\n\ 26 | USE_BINARYBUILDER=0\n\ 27 | override USE_SYSTEM_BLAS=1\n\ 28 | override USE_SYSTEM_LAPACK=1\n\ 29 | override USE_SYSTEM_LIBM=1\n\ 30 | override USE_SYSTEM_GMP=1\n\ 31 | override USE_SYSTEM_MPFR=1\n\ 32 | " > Make.user && \ 33 | cat Make.user && \ 34 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 35 | cp Make.user $JL_BUILD_DIR && \ 36 | cd $JL_BUILD_DIR && make -j 16 OPENBLAS_USE_THREAD=0 && make install && \ 37 | rm -r $JL_BUILD_DIR && \ 38 | echo "Done" 39 | 40 | # add path of Julia 41 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 42 | # runtime test 43 | RUN julia -e "using InteractiveUtils; versioninfo()" 44 | CMD ["julia"] 45 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.4.0: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:buster-run-20191106 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git && \ 11 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 12 | 13 | # build julia from source 14 | ARG JL_VERSION="v1.4.0" 15 | ARG WDIR=/home/pi/work 16 | ARG JL_BUILD_DIR=$WDIR/build 17 | WORKDIR $WDIR 18 | RUN echo "\ 19 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 20 | prefix=/home/pi/julia-$JL_VERSION\n\ 21 | USE_BINARYBUILDER=0\n\ 22 | LDFLAGS=-latomic\n\ 23 | CFLAGS += "-mfpu=neon-vfpv4"\n\ 24 | CXXFLAGS += "-mfpu=neon-vfpv4"\n\ 25 | MARCH="armv7-a"\n\ 26 | JULIA_CPU_TARGET=\"armv7-a\;armv7-a,neon\;armv7-a,neon,vfp4\"\n\ 27 | JULIA_CPU_THREADS=4\n\ 28 | " > Make.user && \ 29 | cat Make.user && \ 30 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 31 | cp Make.user $JL_BUILD_DIR && \ 32 | cd $JL_BUILD_DIR && make -j 16 && make install && \ 33 | echo "copy missing dependency from original directory" && \ 34 | cp $JL_BUILD_DIR/usr/lib/libLLVM-8jl.so /home/pi/julia-$JL_VERSION/lib/julia && \ 35 | echo "clean up $JL_BUILD_DIR" && \ 36 | rm -r $JL_BUILD_DIR && \ 37 | echo "Done" 38 | 39 | # add path of Julia 40 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 41 | CMD ["julia"] 42 | -------------------------------------------------------------------------------- /rpizero/Dockerfile-v1.4.0: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit devices e.g. RaspberryPi Zero(W/WH) 2 | FROM balenalib/raspberry-pi:buster-20191030 3 | 4 | MAINTAINER SATOSHI TERASAKI 5 | 6 | # install dependencies 7 | RUN apt-get update && \ 8 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 9 | libopenblas-dev \ 10 | liblapack-dev \ 11 | libgmp3-dev \ 12 | libmpfr-dev \ 13 | git && \ 14 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 15 | 16 | # build julia from source 17 | ARG JL_VERSION="v1.4.0" 18 | ARG WDIR=/home/pi/work 19 | ARG JL_BUILD_DIR=$WDIR/build 20 | WORKDIR $WDIR 21 | RUN echo "\ 22 | prefix=/home/pi/julia-$JL_VERSION\n\ 23 | JULIA_CPU_TARGET=arm1176jzf-s\n\ 24 | LDFLAGS=-latomic\n\ 25 | USE_BINARYBUILDER=0\n\ 26 | override USE_SYSTEM_BLAS=1\n\ 27 | override USE_SYSTEM_LAPACK=1\n\ 28 | override USE_SYSTEM_LIBM=1\n\ 29 | override USE_SYSTEM_GMP=1\n\ 30 | override USE_SYSTEM_MPFR=1\n\ 31 | " > Make.user && \ 32 | cat Make.user && \ 33 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 34 | cp Make.user $JL_BUILD_DIR && \ 35 | cd $JL_BUILD_DIR && make -j 16 OPENBLAS_USE_THREAD=0 && make install && \ 36 | echo "copy missing dependency from original directory" && \ 37 | cp $JL_BUILD_DIR/usr/lib/libLLVM-8jl.so /home/pi/julia-$JL_VERSION/lib/julia && \ 38 | rm -r $JL_BUILD_DIR && \ 39 | echo "Done" 40 | 41 | # add path of Julia 42 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 43 | CMD ["julia"] 44 | -------------------------------------------------------------------------------- /jetson/balenasample/Dockerfile: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm64-bit devices e.g. Jetson-nano. 2 | # terasakisatoshi/jlcross:jetson-v1.5.1 3 | 4 | FROM balenalib/jetson-nano:buster-20200518 5 | 6 | ARG VERSION="v1.5.4" 7 | 8 | MAINTAINER SATOSHI TERASAKI 9 | 10 | # install dependencies 11 | RUN apt-get update && \ 12 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 13 | git && \ 14 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 15 | 16 | # build julia from source 17 | ARG WDIR=/home/jetson-nano/work 18 | ARG JL_BUILD_DIR=$WDIR/build 19 | WORKDIR $WDIR 20 | RUN echo "\ 21 | JULIA_CPU_TARGET=generic\n\ 22 | MARCH=armv8-a\n\ 23 | prefix=$WDIR/julia-$VERSION\n\ 24 | " > Make.user && \ 25 | cat Make.user && \ 26 | git clone --depth=1 -b $VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR && \ 27 | cp Make.user $JL_BUILD_DIR && \ 28 | # add patches 29 | sed -i -e '69s/devnull/stdout/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 30 | sed -i -e '63,65 s/Pkg\.precompile_script/Pkg.precompile_script\[begin\:189\] \* \"\$(CTRL_C)\$(CTRL_C)exit()\"/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 31 | sed -i -e '190 s/^/#/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 32 | cat ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 33 | cd $JL_BUILD_DIR && make -j 16 && make install && \ 34 | rm -r $JL_BUILD_DIR $WDIR/Make.user 35 | 36 | # add path of Julia 37 | ENV PATH=$WDIR/julia-$VERSION/bin:$PATH 38 | # runtime test 39 | RUN julia -e "using InteractiveUtils; versioninfo()" 40 | CMD ["julia"] 41 | -------------------------------------------------------------------------------- /mac/README.md: -------------------------------------------------------------------------------- 1 | # Build Julia from source on MacOSX/Ubuntu 2 | 3 | # Feature 4 | 5 | - We've confirmed my Mac machine succeeded to build Julia from source at master (2020/08/15) 6 | 7 | ```julia 8 | _ 9 | _ _ _(_)_ | Documentation: https://docs.julialang.org 10 | (_) | (_) (_) | 11 | _ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help. 12 | | | | | | | |/ _` | | 13 | | | |_| | | | (_| | | Version 1.6.0-DEV.646 (2020-08-15) 14 | _/ |\__'_|_|_|\__'_| | Commit d47f7d0827 (1 day old master) 15 | |__/ | | 16 | ``` 17 | 18 | - We've confirmed our `Makefile` works fine On my Ubuntu 16.04 PC 19 | 20 | # Build 21 | 22 | ``` 23 | $ cd path/to/this/README.md 24 | $ make 25 | # just wait 26 | ``` 27 | 28 | # Install 29 | 30 | ``` 31 | $ make install # you may need to add `sudo` 32 | ``` 33 | 34 | - It will create directory named `~/julia_dev`. 35 | - You can call the latest julia via `~/julia_dev/bin/julia` 36 | - Or simply set alias on `~/.bash_profile` for example : 37 | ``` 38 | alias jldev="$HOME/julia_dev/bin/julia" 39 | ``` 40 | 41 | # Clean up 42 | 43 | ``` 44 | make reset 45 | ``` 46 | 47 | # References 48 | 49 | - [julia/doc/build](https://github.com/JuliaLang/julia/tree/master/doc/build) 50 | - [How can I write a makefile to auto-detect and parallelize the build with GNU Make? 51 | ](https://stackoverflow.com/questions/2527496/how-can-i-write-a-makefile-to-auto-detect-and-parallelize-the-build-with-gnu-mak) 52 | - [Conditionals in Makefile: missing separator error? 53 | ](https://stackoverflow.com/questions/16770042/conditionals-in-makefile-missing-separator-error) 54 | -------------------------------------------------------------------------------- /mac/Makefile: -------------------------------------------------------------------------------- 1 | NPROCS:=1 2 | OS:=$(shell uname -s) 3 | 4 | ifeq ($(OS),Linux) 5 | NPROCS:=$(shell grep -c ^processor /proc/cpuinfo) 6 | endif 7 | ifeq ($(OS),Darwin) # Assume Mac OS X 8 | NPROCS:=$(shell getconf _NPROCESSORS_ONLN) 9 | endif 10 | 11 | OWNER=JuliaLang 12 | REPOSITORY=julia 13 | 14 | all: build 15 | 16 | clone: 17 | ifeq ($(wildcard ./$(REPOSITORY)/.),) 18 | git clone --depth=1 https://github.com/$(OWNER)/$(REPOSITORY).git 19 | else 20 | @echo "already exists" 21 | endif 22 | 23 | build: clone 24 | echo "prefix=$(HOME)/julia_dev" > Make.user 25 | echo "USE_BINARYBUILDER=0" >> Make.user 26 | echo "MARCH=native" >> Make.user 27 | mv Make.user ./julia/Make.user 28 | make -C julia -j $(NPROCS) 1>build_log.txt 2>build_error.txt 29 | 30 | # do it in advance 31 | # source /opt/intel/bin/compilervars.sh -arch intel64 -platform mac 32 | build_mkl: clone 33 | echo "prefix=$(HOME)/julia_dev" > Make.user 34 | echo "USEICC = 0" >> Make.user 35 | echo "USEIFC = 0" >> Make.user 36 | echo "USE_INTEL_MKL = 1" >> Make.user 37 | echo "USE_INTEL_LIBM = 0" >> Make.user 38 | echo "USE_BINARYBUILDER = 0" >> Make.user 39 | $(shell source /opt/intel/bin/compilervars.sh intel64) 40 | mv Make.user ./julia/Make.user 41 | make -C julia -j $(NPROCS) 1>build_log.txt 2>build_error.txt 42 | 43 | install: 44 | make -C julia install 1>install_log.txt 2>install_error.txt 45 | 46 | clean: 47 | rm -f build_log.txt 48 | rm -f build_error.txt 49 | rm -f install_log.txt 50 | rm -f install_error.txt 51 | ifneq ($(wildcard ./$(REPOSITORY)/.),) 52 | make -C julia clean 53 | endif 54 | 55 | reset: 56 | rm -f build_log.txt 57 | rm -f build_error.txt 58 | rm -f install_log.txt 59 | rm -f install_error.txt 60 | yes | rm -rf julia 61 | 62 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.5.0: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:buster-20200502 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git && \ 11 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 12 | 13 | # build julia from source 14 | ARG JL_VERSION="v1.5.0" 15 | ARG WDIR=/home/pi/work 16 | ARG JL_BUILD_DIR=$WDIR/build 17 | WORKDIR $WDIR 18 | RUN echo "\ 19 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 20 | prefix=/home/pi/julia-$JL_VERSION\n\ 21 | USE_BINARYBUILDER=0\n\ 22 | LDFLAGS=-latomic\n\ 23 | CFLAGS += "-mfpu=neon-vfpv4"\n\ 24 | CXXFLAGS += "-mfpu=neon-vfpv4"\n\ 25 | MARCH="armv7-a"\n\ 26 | JULIA_CPU_TARGET=\"armv7-a\;armv7-a,neon\;armv7-a,neon,vfp4\"\n\ 27 | JULIA_CPU_THREADS=4\n\ 28 | " > Make.user && \ 29 | cat Make.user && \ 30 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 31 | cp Make.user $JL_BUILD_DIR && \ 32 | # add patches 33 | sed -i -e '69s/devnull/stdout/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 34 | sed -i -e '63,65 s/^/#/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 35 | sed -i -e '190 s/^/#/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 36 | cat ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 37 | cd $JL_BUILD_DIR && make -j 16 && make install && \ 38 | echo "clean up $JL_BUILD_DIR" && \ 39 | rm -r $JL_BUILD_DIR && \ 40 | echo "Done" 41 | 42 | # add path of Julia 43 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 44 | # runtime test 45 | RUN julia -e "using InteractiveUtils; versioninfo()" 46 | CMD ["julia"] 47 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.5.0-rc1: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:buster-20200502 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git && \ 11 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 12 | 13 | # build julia from source 14 | ARG JL_VERSION="v1.5.0-rc1" 15 | ARG WDIR=/home/pi/work 16 | ARG JL_BUILD_DIR=$WDIR/build 17 | WORKDIR $WDIR 18 | RUN echo "\ 19 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 20 | prefix=/home/pi/julia-$JL_VERSION\n\ 21 | USE_BINARYBUILDER=0\n\ 22 | LDFLAGS=-latomic\n\ 23 | CFLAGS += "-mfpu=neon-vfpv4"\n\ 24 | CXXFLAGS += "-mfpu=neon-vfpv4"\n\ 25 | MARCH="armv7-a"\n\ 26 | JULIA_CPU_TARGET=\"armv7-a\;armv7-a,neon\;armv7-a,neon,vfp4\"\n\ 27 | JULIA_CPU_THREADS=4\n\ 28 | " > Make.user && \ 29 | cat Make.user && \ 30 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 31 | cp Make.user $JL_BUILD_DIR && \ 32 | # add patches 33 | sed -i -e '69s/devnull/stdout/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 34 | sed -i -e '63,65 s/^/#/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 35 | sed -i -e '190 s/^/#/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 36 | cat ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 37 | cd $JL_BUILD_DIR && make -j 16 && make install && \ 38 | echo "clean up $JL_BUILD_DIR" && \ 39 | rm -r $JL_BUILD_DIR && \ 40 | echo "Done" 41 | 42 | # add path of Julia 43 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 44 | # runtime test 45 | RUN julia -e "using InteractiveUtils; versioninfo()" 46 | CMD ["julia"] 47 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.11.1-bookworm-debug: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:bookworm-20240930 4 | 5 | # install dependencies 6 | RUN apt-get update && \ 7 | apt-get install -y build-essential libatomic1 python3 gfortran perl wget m4 cmake pkg-config zlib1g-dev \ 8 | git \ 9 | unzip \ 10 | nano \ 11 | libssl-dev libmbedtls-dev libssh2-1-dev \ 12 | libopenlibm-dev \ 13 | && \ 14 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 15 | 16 | RUN git clone --depth=1 -b v1.7.2 https://github.com/libgit2/libgit2.git && \ 17 | cd libgit2 && \ 18 | mkdir build && cd build && cmake ../ && make -j && make install 19 | 20 | RUN cp /usr/local/lib/libgit2.so /usr/lib/arm-linux-gnueabihf/ 21 | 22 | RUN git clone --depth=1 -b curl-8_6_0 https://github.com/curl/curl.git && \ 23 | cd curl && \ 24 | mkdir build && cd build && cmake ../ && make -j && make install 25 | 26 | RUN cp /usr/local/lib/libcurl.so /usr/lib/arm-linux-gnueabihf/libcurl.so.4 27 | 28 | # build julia from source 29 | ARG JL_VERSION="terasaki/v1.11.1-arm-patch-2" 30 | ARG WDIR=/home/pi/work 31 | ARG JL_BUILD_DIR=$WDIR/build 32 | WORKDIR $WDIR 33 | RUN echo "\ 34 | prefix=/home/pi/julia-$JL_VERSION\n\ 35 | USE_BINARYBUILDER=1\n\ 36 | CFLAGS += "-mfpu=neon-vfpv4"\n\ 37 | CFLAGS += "-mfloat-abi=hard"\n\ 38 | CXXFLAGS += "-mfpu=neon-vfpv4"\n\ 39 | CXXFLAGS += "-mfloat-abi=hard"\n\ 40 | USE_SYSTEM_LIBGIT2=1\n\ 41 | USE_SYSTEM_LIBCURL=1\n\ 42 | USE_SYSTEM_OPENLIBM=1\n\ 43 | MARCH="armv7-a+fp"\n\ 44 | " > Make.user && \ 45 | cat Make.user && \ 46 | git clone --depth=1 -b $JL_VERSION https://github.com/terasakisatoshi/julia.git $JL_BUILD_DIR && \ 47 | cp Make.user $JL_BUILD_DIR && \ 48 | cd $JL_BUILD_DIR && make -j 49 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.10.5: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:bullseye-20240930 4 | 5 | # insta dependencies 6 | RUN apt-get update && \ 7 | apt-get install -y build-essential libatomic1 python3 gfortran perl wget m4 cmake pkg-config \ 8 | zlib1g-dev \ 9 | libunwind-dev \ 10 | git \ 11 | unzip \ 12 | libcunit1 libcunit1-doc libcunit1-dev && \ 13 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 14 | 15 | #RUN wget https://github.com/libunwind/libunwind/releases/download/v1.8.1/libunwind-1.8.1.zip && \ 16 | # unzip libunwind-1.8.1.zip && cd libunwind-1.8.1 && \ 17 | # ./configure && \ 18 | # make -j 16 && make install 19 | #RUN apt-get update && apt-get install -y libuv1-dev libssl-dev libhwloc-dev 20 | 21 | # build julia from source 22 | ARG REPOSITORY_OWNER=terasakisatoshi 23 | ARG JL_VERSION="terasaki/arm-patch" 24 | ARG WDIR=/home/pi/work 25 | ARG JL_BUILD_DIR=$WDIR/build 26 | WORKDIR $WDIR 27 | RUN echo "\ 28 | prefix=/home/pi/julia-$JL_VERSION\n\ 29 | #USE_BINARYBUILDER=1\n\ 30 | LDFLAGS=-latomic\n\ 31 | #override USE_SYSTEM_LIBUNWIND=1\n\ 32 | #JULIA_CPU_THREADS=4\n\ 33 | CFLAGS += "-mfpu=neon-vfpv4"\n\ 34 | CXXFLAGS += "-mfpu=neon-vfpv4"\n\ 35 | MARCH="armv7-a"\n\ 36 | " > Make.user && \ 37 | cat Make.user && \ 38 | git clone --depth=1 -b $JL_VERSION https://github.com/$REPOSITORY_OWNER/julia.git $JL_BUILD_DIR &&\ 39 | cp Make.user $JL_BUILD_DIR && \ 40 | cd $JL_BUILD_DIR && make && make install && \ 41 | echo "clean up $JL_BUILD_DIR" && \ 42 | rm -r $JL_BUILD_DIR && \ 43 | echo "Done" 44 | 45 | # add path of Julia 46 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 47 | # runtime test 48 | RUN julia -e "using InteractiveUtils; versioninfo()" 49 | CMD ["julia"] 50 | -------------------------------------------------------------------------------- /rpizero/Dockerfile-v1.5.0: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit devices e.g. RaspberryPi Zero(W/WH) 2 | 3 | FROM balenalib/raspberry-pi:buster-20200518 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # install dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | libopenblas-dev \ 11 | liblapack-dev \ 12 | libgmp3-dev \ 13 | libmpfr-dev \ 14 | git && \ 15 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 16 | 17 | # build julia from source 18 | ARG JL_VERSION="v1.5.0" 19 | ARG WDIR=/home/pi/work 20 | ARG JL_BUILD_DIR=$WDIR/build 21 | WORKDIR $WDIR 22 | RUN echo "\ 23 | prefix=/home/pi/julia-$JL_VERSION\n\ 24 | JULIA_CPU_TARGET=arm1176jzf-s\n\ 25 | LDFLAGS=-latomic\n\ 26 | USE_BINARYBUILDER=0\n\ 27 | override USE_SYSTEM_BLAS=1\n\ 28 | override USE_SYSTEM_LAPACK=1\n\ 29 | override USE_SYSTEM_LIBM=1\n\ 30 | override USE_SYSTEM_GMP=1\n\ 31 | override USE_SYSTEM_MPFR=1\n\ 32 | " > Make.user && \ 33 | cat Make.user && \ 34 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 35 | cp Make.user $JL_BUILD_DIR && \ 36 | # add patches 37 | sed -i -e '69s/devnull/stdout/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 38 | sed -i -e '63,65 s/^/#/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 39 | sed -i -e '190 s/^/#/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 40 | cat ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 41 | cd $JL_BUILD_DIR && make -j 16 OPENBLAS_USE_THREAD=0 && make install && \ 42 | rm -r $JL_BUILD_DIR && \ 43 | echo "Done" 44 | 45 | # add path of Julia 46 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 47 | # runtime test 48 | RUN julia -e "using InteractiveUtils; versioninfo()" 49 | CMD ["julia"] 50 | 51 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.5.1: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:buster-20200502 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git && \ 11 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 12 | 13 | # build julia from source 14 | ARG JL_VERSION="v1.5.1" 15 | ARG WDIR=/home/pi/work 16 | ARG JL_BUILD_DIR=$WDIR/build 17 | WORKDIR $WDIR 18 | RUN echo "\ 19 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 20 | prefix=/home/pi/julia-$JL_VERSION\n\ 21 | USE_BINARYBUILDER=0\n\ 22 | LDFLAGS=-latomic\n\ 23 | CFLAGS += "-mfpu=neon-vfpv4"\n\ 24 | CXXFLAGS += "-mfpu=neon-vfpv4"\n\ 25 | MARCH="armv7-a"\n\ 26 | JULIA_CPU_TARGET=\"armv7-a\;armv7-a,neon\;armv7-a,neon,vfp4\"\n\ 27 | JULIA_CPU_THREADS=4\n\ 28 | " > Make.user && \ 29 | cat Make.user && \ 30 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 31 | cp Make.user $JL_BUILD_DIR && \ 32 | # add patches 33 | sed -i -e '69s/devnull/stdout/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 34 | sed -i -e '63,65 s/Pkg\.precompile_script/Pkg.precompile_script\[begin\:189\] \* \"\$(CTRL_C)\$(CTRL_C)exit()\"/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 35 | sed -i -e '190 s/^/#/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 36 | cat ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 37 | cd $JL_BUILD_DIR && make -j 16 && make install && \ 38 | echo "clean up $JL_BUILD_DIR" && \ 39 | rm -r $JL_BUILD_DIR && \ 40 | echo "Done" 41 | 42 | # add path of Julia 43 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 44 | # runtime test 45 | RUN julia -e "using InteractiveUtils; versioninfo()" 46 | CMD ["julia"] 47 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.5.2: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:buster-20200502 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git && \ 11 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 12 | 13 | # build julia from source 14 | ARG JL_VERSION="v1.5.2" 15 | ARG WDIR=/home/pi/work 16 | ARG JL_BUILD_DIR=$WDIR/build 17 | WORKDIR $WDIR 18 | RUN echo "\ 19 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 20 | prefix=/home/pi/julia-$JL_VERSION\n\ 21 | USE_BINARYBUILDER=0\n\ 22 | LDFLAGS=-latomic\n\ 23 | CFLAGS += "-mfpu=neon-vfpv4"\n\ 24 | CXXFLAGS += "-mfpu=neon-vfpv4"\n\ 25 | MARCH="armv7-a"\n\ 26 | JULIA_CPU_TARGET=\"armv7-a\;armv7-a,neon\;armv7-a,neon,vfp4\"\n\ 27 | JULIA_CPU_THREADS=4\n\ 28 | " > Make.user && \ 29 | cat Make.user && \ 30 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 31 | cp Make.user $JL_BUILD_DIR && \ 32 | # add patches 33 | sed -i -e '69s/devnull/stdout/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 34 | sed -i -e '63,65 s/Pkg\.precompile_script/Pkg.precompile_script\[begin\:189\] \* \"\$(CTRL_C)\$(CTRL_C)exit()\"/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 35 | sed -i -e '190 s/^/#/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 36 | cat ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 37 | cd $JL_BUILD_DIR && make -j 16 && make install && \ 38 | echo "clean up $JL_BUILD_DIR" && \ 39 | rm -r $JL_BUILD_DIR && \ 40 | echo "Done" 41 | 42 | # add path of Julia 43 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 44 | # runtime test 45 | RUN julia -e "using InteractiveUtils; versioninfo()" 46 | CMD ["julia"] 47 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.5.3: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:buster-20200502 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git && \ 11 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 12 | 13 | # build julia from source 14 | ARG JL_VERSION="v1.5.3" 15 | ARG WDIR=/home/pi/work 16 | ARG JL_BUILD_DIR=$WDIR/build 17 | WORKDIR $WDIR 18 | RUN echo "\ 19 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 20 | prefix=/home/pi/julia-$JL_VERSION\n\ 21 | USE_BINARYBUILDER=0\n\ 22 | LDFLAGS=-latomic\n\ 23 | CFLAGS += "-mfpu=neon-vfpv4"\n\ 24 | CXXFLAGS += "-mfpu=neon-vfpv4"\n\ 25 | MARCH="armv7-a"\n\ 26 | JULIA_CPU_TARGET=\"armv7-a\;armv7-a,neon\;armv7-a,neon,vfp4\"\n\ 27 | JULIA_CPU_THREADS=4\n\ 28 | " > Make.user && \ 29 | cat Make.user && \ 30 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 31 | cp Make.user $JL_BUILD_DIR && \ 32 | # add patches 33 | sed -i -e '69s/devnull/stdout/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 34 | sed -i -e '63,65 s/Pkg\.precompile_script/Pkg.precompile_script\[begin\:189\] \* \"\$(CTRL_C)\$(CTRL_C)exit()\"/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 35 | sed -i -e '190 s/^/#/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 36 | cat ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 37 | cd $JL_BUILD_DIR && make -j 16 && make install && \ 38 | echo "clean up $JL_BUILD_DIR" && \ 39 | rm -r $JL_BUILD_DIR && \ 40 | echo "Done" 41 | 42 | # add path of Julia 43 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 44 | # runtime test 45 | RUN julia -e "using InteractiveUtils; versioninfo()" 46 | CMD ["julia"] 47 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.5.4: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:buster-20200502 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # insta dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | git && \ 11 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 12 | 13 | # build julia from source 14 | ARG JL_VERSION="v1.5.4" 15 | ARG WDIR=/home/pi/work 16 | ARG JL_BUILD_DIR=$WDIR/build 17 | WORKDIR $WDIR 18 | RUN echo "\ 19 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0\n\ 20 | prefix=/home/pi/julia-$JL_VERSION\n\ 21 | USE_BINARYBUILDER=1\n\ 22 | LDFLAGS=-latomic\n\ 23 | CFLAGS += "-mfpu=neon-vfpv4"\n\ 24 | CXXFLAGS += "-mfpu=neon-vfpv4"\n\ 25 | MARCH="armv7-a"\n\ 26 | JULIA_CPU_TARGET=\"armv7-a\;armv7-a,neon\;armv7-a,neon,vfp4\"\n\ 27 | JULIA_CPU_THREADS=4\n\ 28 | " > Make.user && \ 29 | cat Make.user && \ 30 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 31 | cp Make.user $JL_BUILD_DIR && \ 32 | # add patches 33 | sed -i -e '69s/devnull/stdout/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 34 | sed -i -e '63,65 s/Pkg\.precompile_script/Pkg.precompile_script\[begin\:189\] \* \"\$(CTRL_C)\$(CTRL_C)exit()\"/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 35 | sed -i -e '190 s/^/#/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 36 | cat ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 37 | cd $JL_BUILD_DIR && make -j 16 && make install && \ 38 | echo "clean up $JL_BUILD_DIR" && \ 39 | rm -r $JL_BUILD_DIR && \ 40 | echo "Done" 41 | 42 | # add path of Julia 43 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 44 | # runtime test 45 | RUN julia -e "using InteractiveUtils; versioninfo()" 46 | CMD ["julia"] 47 | -------------------------------------------------------------------------------- /rpizero/Dockerfile-v1.5.0-rc1: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit devices e.g. RaspberryPi Zero(W/WH) 2 | 3 | FROM balenalib/raspberry-pi:buster-20200518 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # install dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | libopenblas-dev \ 11 | liblapack-dev \ 12 | libgmp3-dev \ 13 | libmpfr-dev \ 14 | git && \ 15 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 16 | 17 | # build julia from source 18 | ARG JL_VERSION="v1.5.0-rc1" 19 | ARG WDIR=/home/pi/work 20 | ARG JL_BUILD_DIR=$WDIR/build 21 | WORKDIR $WDIR 22 | RUN echo "\ 23 | prefix=/home/pi/julia-$JL_VERSION\n\ 24 | JULIA_CPU_TARGET=arm1176jzf-s\n\ 25 | LDFLAGS=-latomic\n\ 26 | USE_BINARYBUILDER=0\n\ 27 | JULIA_PRECOMPILE=0\n\ 28 | override USE_SYSTEM_BLAS=1\n\ 29 | override USE_SYSTEM_LAPACK=1\n\ 30 | override USE_SYSTEM_LIBM=1\n\ 31 | override USE_SYSTEM_GMP=1\n\ 32 | override USE_SYSTEM_MPFR=1\n\ 33 | " > Make.user && \ 34 | cat Make.user && \ 35 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 36 | cp Make.user $JL_BUILD_DIR && \ 37 | # add patches 38 | sed -i -e '69s/devnull/stdout/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 39 | sed -i -e '63,65 s/^/#/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 40 | sed -i -e '190 s/^/#/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 41 | cat ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 42 | cd $JL_BUILD_DIR && make -j 16 OPENBLAS_USE_THREAD=0 && make install && \ 43 | rm -r $JL_BUILD_DIR && \ 44 | echo "Done" 45 | 46 | # add path of Julia 47 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 48 | # runtime test 49 | RUN julia -e "using InteractiveUtils; versioninfo()" 50 | CMD ["julia"] 51 | 52 | -------------------------------------------------------------------------------- /rpizero/Dockerfile-v1.5.1: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit devices e.g. RaspberryPi Zero(W/WH) 2 | 3 | FROM balenalib/raspberry-pi:buster-20200518 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # install dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | libopenblas-dev \ 11 | liblapack-dev \ 12 | libgmp3-dev \ 13 | libmpfr-dev \ 14 | git && \ 15 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 16 | 17 | # build julia from source 18 | ARG JL_VERSION="v1.5.1" 19 | ARG WDIR=/home/pi/work 20 | ARG JL_BUILD_DIR=$WDIR/build 21 | WORKDIR $WDIR 22 | RUN echo "\ 23 | prefix=/home/pi/julia-$JL_VERSION\n\ 24 | JULIA_CPU_TARGET=arm1176jzf-s\n\ 25 | LDFLAGS=-latomic\n\ 26 | USE_BINARYBUILDER=0\n\ 27 | override USE_SYSTEM_BLAS=1\n\ 28 | override USE_SYSTEM_LAPACK=1\n\ 29 | override USE_SYSTEM_LIBM=1\n\ 30 | override USE_SYSTEM_GMP=1\n\ 31 | override USE_SYSTEM_MPFR=1\n\ 32 | " > Make.user && \ 33 | cat Make.user && \ 34 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 35 | cp Make.user $JL_BUILD_DIR && \ 36 | # add patches 37 | sed -i -e '69s/devnull/stdout/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 38 | sed -i -e '63,65 s/Pkg\.precompile_script/Pkg.precompile_script\[begin\:189\] \* \"\$(CTRL_C)\$(CTRL_C)exit()\"/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 39 | sed -i -e '190 s/^/#/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 40 | cat ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 41 | cd $JL_BUILD_DIR && make -j 16 OPENBLAS_USE_THREAD=0 && make install && \ 42 | rm -r $JL_BUILD_DIR && \ 43 | echo "Done" 44 | 45 | # add path of Julia 46 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 47 | # runtime test 48 | RUN julia -e "using InteractiveUtils; versioninfo()" 49 | CMD ["julia"] 50 | 51 | -------------------------------------------------------------------------------- /rpizero/Dockerfile-v1.5.2: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit devices e.g. RaspberryPi Zero(W/WH) 2 | 3 | FROM balenalib/raspberry-pi:buster-20200518 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # install dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | libopenblas-dev \ 11 | liblapack-dev \ 12 | libgmp3-dev \ 13 | libmpfr-dev \ 14 | git && \ 15 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 16 | 17 | # build julia from source 18 | ARG JL_VERSION="v1.5.2" 19 | ARG WDIR=/home/pi/work 20 | ARG JL_BUILD_DIR=$WDIR/build 21 | WORKDIR $WDIR 22 | RUN echo "\ 23 | prefix=/home/pi/julia-$JL_VERSION\n\ 24 | JULIA_CPU_TARGET=arm1176jzf-s\n\ 25 | LDFLAGS=-latomic\n\ 26 | USE_BINARYBUILDER=0\n\ 27 | override USE_SYSTEM_BLAS=1\n\ 28 | override USE_SYSTEM_LAPACK=1\n\ 29 | override USE_SYSTEM_LIBM=1\n\ 30 | override USE_SYSTEM_GMP=1\n\ 31 | override USE_SYSTEM_MPFR=1\n\ 32 | " > Make.user && \ 33 | cat Make.user && \ 34 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 35 | cp Make.user $JL_BUILD_DIR && \ 36 | # add patches 37 | sed -i -e '69s/devnull/stdout/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 38 | sed -i -e '63,65 s/Pkg\.precompile_script/Pkg.precompile_script\[begin\:189\] \* \"\$(CTRL_C)\$(CTRL_C)exit()\"/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 39 | sed -i -e '190 s/^/#/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 40 | cat ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 41 | cd $JL_BUILD_DIR && make -j 16 OPENBLAS_USE_THREAD=0 && make install && \ 42 | rm -r $JL_BUILD_DIR && \ 43 | echo "Done" 44 | 45 | # add path of Julia 46 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 47 | # runtime test 48 | RUN julia -e "using InteractiveUtils; versioninfo()" 49 | CMD ["julia"] 50 | 51 | -------------------------------------------------------------------------------- /rpizero/Dockerfile-v1.5.3: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit devices e.g. RaspberryPi Zero(W/WH) 2 | 3 | FROM balenalib/raspberry-pi:buster-20200518 4 | 5 | MAINTAINER SATOSHI TERASAKI 6 | 7 | # install dependencies 8 | RUN apt-get update && \ 9 | apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 10 | libopenblas-dev \ 11 | liblapack-dev \ 12 | libgmp3-dev \ 13 | libmpfr-dev \ 14 | git && \ 15 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 16 | 17 | # build julia from source 18 | ARG JL_VERSION="v1.5.3" 19 | ARG WDIR=/home/pi/work 20 | ARG JL_BUILD_DIR=$WDIR/build 21 | WORKDIR $WDIR 22 | RUN echo "\ 23 | prefix=/home/pi/julia-$JL_VERSION\n\ 24 | JULIA_CPU_TARGET=arm1176jzf-s\n\ 25 | LDFLAGS=-latomic\n\ 26 | USE_BINARYBUILDER=0\n\ 27 | override USE_SYSTEM_BLAS=1\n\ 28 | override USE_SYSTEM_LAPACK=1\n\ 29 | override USE_SYSTEM_LIBM=1\n\ 30 | override USE_SYSTEM_GMP=1\n\ 31 | override USE_SYSTEM_MPFR=1\n\ 32 | " > Make.user && \ 33 | cat Make.user && \ 34 | git clone --depth=1 -b $JL_VERSION https://github.com/JuliaLang/julia.git $JL_BUILD_DIR &&\ 35 | cp Make.user $JL_BUILD_DIR && \ 36 | # add patches 37 | sed -i -e '69s/devnull/stdout/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 38 | sed -i -e '63,65 s/Pkg\.precompile_script/Pkg.precompile_script\[begin\:189\] \* \"\$(CTRL_C)\$(CTRL_C)exit()\"/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 39 | sed -i -e '190 s/^/#/' ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 40 | cat ${JL_BUILD_DIR}/contrib/generate_precompile.jl && \ 41 | cd $JL_BUILD_DIR && make -j 16 OPENBLAS_USE_THREAD=0 && make install && \ 42 | rm -r $JL_BUILD_DIR && \ 43 | echo "Done" 44 | 45 | # add path of Julia 46 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 47 | # runtime test 48 | RUN julia -e "using InteractiveUtils; versioninfo()" 49 | CMD ["julia"] 50 | 51 | -------------------------------------------------------------------------------- /rpi3/Dockerfile-v1.11.1-bookworm: -------------------------------------------------------------------------------- 1 | # Build Julia binary for arm32-bit armv7-a devices e.g. RaspberryPi 2 or 3 2 | 3 | FROM balenalib/raspberrypi3:bookworm-20240930 4 | 5 | # install dependencies 6 | RUN apt-get update && \ 7 | apt-get install -y build-essential libatomic1 python3 gfortran perl wget m4 cmake pkg-config zlib1g-dev \ 8 | git \ 9 | unzip \ 10 | nano \ 11 | libssl-dev libmbedtls-dev libssh2-1-dev \ 12 | libopenlibm-dev \ 13 | && \ 14 | apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* 15 | 16 | RUN git clone --depth=1 -b v1.7.2 https://github.com/libgit2/libgit2.git && \ 17 | cd libgit2 && \ 18 | mkdir build && cd build && cmake ../ && make -j && make install 19 | 20 | RUN cp /usr/local/lib/libgit2.so /usr/lib/arm-linux-gnueabihf/ 21 | 22 | RUN git clone --depth=1 -b curl-8_6_0 https://github.com/curl/curl.git && \ 23 | cd curl && \ 24 | mkdir build && cd build && cmake ../ && make -j && make install 25 | 26 | RUN cp /usr/local/lib/libcurl.so /usr/lib/arm-linux-gnueabihf/libcurl.so.4 27 | 28 | # Currently this does not work. 29 | 30 | # build julia from source 31 | ARG JL_VERSION="terasaki/v1.11.1-arm-patch-2" 32 | ARG WDIR=/home/pi/work 33 | ARG JL_BUILD_DIR=$WDIR/build 34 | WORKDIR $WDIR 35 | RUN echo "\ 36 | prefix=/home/pi/julia-$JL_VERSION\n\ 37 | USE_BINARYBUILDER=1\n\ 38 | CFLAGS += "-mfpu=neon-vfpv4"\n\ 39 | CFLAGS += "-mfloat-abi=hard"\n\ 40 | CXXFLAGS += "-mfpu=neon-vfpv4"\n\ 41 | CXXFLAGS += "-mfloat-abi=hard"\n\ 42 | USE_SYSTEM_LIBGIT2=1\n\ 43 | USE_SYSTEM_LIBCURL=1\n\ 44 | USE_SYSTEM_OPENLIBM=1\n\ 45 | MARCH="armv7-a+fp"\n\ 46 | " > Make.user && \ 47 | cat Make.user && \ 48 | git clone --depth=1 -b $JL_VERSION https://github.com/terasakisatoshi/julia.git $JL_BUILD_DIR && \ 49 | cp Make.user $JL_BUILD_DIR && \ 50 | cd $JL_BUILD_DIR && make -j && make install && \ 51 | echo "clean up $JL_BUILD_DIR" && \ 52 | rm -r $JL_BUILD_DIR && \ 53 | echo "Done" 54 | 55 | # add path of Julia 56 | ENV PATH=/home/pi/julia-$JL_VERSION/bin:$PATH 57 | # runtime test 58 | RUN julia -e "using InteractiveUtils; versioninfo()" 59 | CMD ["julia"] 60 | -------------------------------------------------------------------------------- /local_build/build_v1.11.1-arm32bit-patch-2024-11-04.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | # MIT License 4 | # 5 | # Copyright (c) 2024 Satoshi Terasaki 6 | # 7 | # Permission is hereby granted, free of charge, to any person obtaining a copy 8 | # of this software and associated documentation files (the "Software"), to deal 9 | # in the Software without restriction, including without limitation the rights 10 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | # copies of the Software, and to permit persons to whom the Software is 12 | # furnished to do so, subject to the following conditions: 13 | # 14 | # The above copyright notice and this permission notice shall be included in all 15 | # copies or substantial portions of the Software. 16 | # 17 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 | # SOFTWARE. 24 | 25 | # Usage: 26 | # 1. Copy this file to your raspberry pi e.g. /home/pi 27 | # 2. Run this file `bash build_v1.11.1-arm32bit-patch-2024-11-04.sh` 28 | 29 | # This script is tested on the following cases: 30 | # Case 1: 31 | # Operating System: Raspberry Pi OS Lite (32-bit) 32 | # Device: Raspberry Pi 4 with 4 GB RAM 33 | 34 | # Case 2: 35 | # Operating System: Raspberry Pi OS Lite (32-bit) 36 | # Device: Raspberry Pi 4 with 8 GB RAM 37 | 38 | # Case 3 (preferred): 39 | # Operating System: Raspberry Pi OS Lite (32-bit) 40 | # Device: Raspberry Pi 5 with 8 GB RAM 41 | 42 | # Need to increase the swap file size. To do so, edit /etc/dphys-swapfile 43 | sudo sed -i 's/^CONF_SWAPSIZE=200/#&/; s/^#CONF_SWAPSIZE=2048/CONF_SWAPSIZE=2048/' \ 44 | /etc/dphys-swapfile 45 | 46 | sudo /etc/init.d/dphys-swapfile stop 47 | sudo /etc/init.d/dphys-swapfile start 48 | 49 | sudo apt-get update && sudo apt-get install -y \ 50 | build-essential libatomic1 python3 gfortran perl wget m4 cmake pkg-config zlib1g-dev \ 51 | git unzip nano \ 52 | libopenlibm-dev 53 | 54 | REPOSITORY_OWNER=terasakisatoshi 55 | # See build_v1.11.1-arm32bit-patch-2024-11-04.patch to see the changes what I made. 56 | JL_VERSION=terasaki/v1.11.1-arm32bit-patch-2024-11-04 57 | JL_BUILD_DIR=build-julia-${JL_VERSION} 58 | git clone --depth 1 -b ${JL_VERSION} https://github.com/${REPOSITORY_OWNER}/julia.git $JL_BUILD_DIR 59 | 60 | cat > ${JL_BUILD_DIR}/Make.user << EOF 61 | USE_BINARYBUILDER=1 62 | prefix=${HOME}/${JL_VERSION} 63 | CFLAGS += -mfpu=neon-vfpv4 64 | CFLAGS += -mfloat-abi=hard 65 | CXXFLAGS += -mfpu=neon-vfpv4 66 | CXXFLAGS += -mfloat-abi=hard 67 | USE_SYSTEM_OPENLIBM=1 68 | USE_SYSTEM_CSL=1 69 | MARCH=armv7-a+fp 70 | EOF 71 | 72 | # You can change the number of threads to reduce RAM consumption 73 | # e.g., make -j 2 on Raspberry Pi 4 with 4GB RAM 74 | # By default, it uses all available threads 75 | # During compilation there are some warnings, e.g., 'armv7-a+fp' is not a recognized processor for this target (ignoring processor) 76 | # You can ignore them. 77 | cd ${JL_BUILD_DIR} && make -j && sudo make install && cd .. 78 | 79 | ${HOME}/${JL_VERSION}/bin/julia -e 'using InteractiveUtils; versioninfo()' 80 | echo "Installation of Julia is completed." 81 | echo "Please add ${HOME}/${JL_VERSION}/bin to your PATH." 82 | echo "You can do so by adding the following line to your ~/.bashrc:" 83 | echo "export PATH=\$PATH:${HOME}/${JL_VERSION}/bin" 84 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # jlcross 2 | 3 | Dockerfiles for arm devices e.g. Raspberry Pi Series 4 | 5 | Raspberry Pi 3 (As of 2024-11-04 with dirty hacked Julia) 6 | 7 | ```sh 8 | # Need to increase the swap file size. To do so, edit /etc/dphys-swapfile 9 | sudo sed -i 's/^CONF_SWAPSIZE=200/#&/; s/^#CONF_SWAPSIZE=2048/CONF_SWAPSIZE=2048/' \ 10 | /etc/dphys-swapfile 11 | 12 | sudo /etc/init.d/dphys-swapfile stop 13 | sudo /etc/init.d/dphys-swapfile start 14 | 15 | sudo apt-get update && sudo apt-get install -y \ 16 | build-essential libatomic1 python3 gfortran perl wget m4 cmake pkg-config zlib1g-dev \ 17 | git unzip nano \ 18 | libopenlibm-dev 19 | ``` 20 | 21 | image 22 | 23 | ![image](https://user-images.githubusercontent.com/16760547/99069776-5c8d2780-25f2-11eb-8517-8b201ea28c90.png) 24 | 25 | ![image](https://user-images.githubusercontent.com/16760547/99069656-20f25d80-25f2-11eb-9014-31ae79538b75.png) 26 | 27 | 28 | # About [this repository](https://github.com/terasakisatoshi/jlcross) 29 | 30 | - This repository contains several Dockerfiles which build Julia (binary/docker-image) for (some) Arm devices e.g. Raspberry Pi Series (also including Zero) using cross compilation. 31 | - Since Julia for Arm32bit system bump downs from Tier2 to Tier3, the official homepage does not provide pre-build binary. If you like to use a Julia version of more than 1.4.1, you have to build by yourself. 32 | 33 | ## What we believe. 34 | 35 | - We believe that not a few people want to run Julia on Raspberry Pi. 36 | - Raspberry Pi was originally used for educational purposes as an inexpensive computer, but it is now used for industrial purposes (e.g. IoT device or edge computing device) as well. Julia is currently the ONLY programming language that is as dynamic, easy to write, like Python and high performance and as good (or faster) than C on Raspberry Pi. If the Julia community ignores Raspberry Pi, it will deprive them of the opportunity to take advantage of Julia's industrial applications. 37 | 38 | ## Wait! Can we REALLY construct an application for RPis? 39 | 40 | - The answer is YES, [PackageCompiler.jl](https://github.com/JuliaLang/PackageCompiler.jl) can compile Julia application that runs on RaspberryPi's and provide an executable file. You can deploy them to another RaspberryPi. The following examples provides simple applications: 41 | - https://github.com/terasakisatoshi/HelloX.jl 42 | - https://github.com/terasakisatoshi/CameraApp.jl 43 | 44 | - You should checkout Julia discourse to learn more!!! 45 | - [Have a try Julia v1.4.2 for arm32bit](https://discourse.julialang.org/t/have-a-try-julia-v1-4-2-for-arm32bit/40284) 46 | - [Have a try Julia v1.5.1 for arm32bit](https://discourse.julialang.org/t/have-a-try-julia-v1-5-1-for-arm32bit/45558) 47 | - Also, there are great posts regarding to Julia package for RPi families: 48 | - [[ANN] Introducing BaremetalPi.jl - A package to access Raspberry Pi peripherals without external libraries](https://discourse.julialang.org/t/ann-introducing-baremetalpi-jl-a-package-to-access-raspberry-pi-peripherals-without-external-libraries/41417) 49 | 50 | ## Wow, really cool. Can I help jlcross ? 51 | 52 | - If you know a lot of Raspberry Pi system or eager to use Julia on your Raspberry Pi, please help/contribute [Julia community](https://github.com/JuliaLang/julia) rather than here. 53 | - Note that this jlcross repository just only provides Dockerfiles. 54 | 55 | # How to use 56 | 57 | - We will assume your build machine is 58 | - Linux machine equipped with high-end CPU 59 | - macOS (Catalina) e.g. iMac 60 | - WSL ??? (not tested) 61 | 62 | ## Read the official documentation/repositories. 63 | 64 | - We recommend that you read through/checkout the following links. Once you've read through how to build julia for you device then come back here. 65 | - https://github.com/JuliaLang/julia/tree/master/doc/build 66 | - https://github.com/JuliaCI/julia-buildbot 67 | 68 | ## Prepare environment 69 | 70 | 1. Install [Docker](https://docs.docker.com/install/linux/docker-ce/ubuntu/) 71 | 72 | For Ubuntu user, you will need install cross compilation tools: 73 | 74 | ``` 75 | $ apt-get update 76 | $ apt-get install -y qemu-user-static binfmt-support 77 | ``` 78 | 79 | Thats' all 80 | 81 | ## Try to run Julia 82 | 83 | To prove Julia can run on arm devices We've uploaded Docker images on [Docker Hub repository named `jlcross`](https://hub.docker.com/r/terasakisatoshi/jlcross) 84 | 85 | - Install docker image from Docker Hub. 86 | 87 | ```console 88 | $ docker pull terasakisatoshi/jlcross:rpizero-v1.5.3 89 | Unable to find image 'terasakisatoshi/jlcross:rpizero-v1.5.3' locally 90 | rpizero-v1.5.3: Pulling from terasakisatoshi/jlcross 91 | (start to pull image...) 92 | 93 | ``` 94 | 95 | - Run Julia script using container 96 | 97 | ```console 98 | $ cat hello.jl 99 | using Pkg 100 | Pkg.add("Example") 101 | using Example 102 | hello("World") 103 | $ docker run --rm -it -v $PWD:/work -w /work terasakisatoshi/jlcross:rpizero-v1.4.2 julia hello.jl 104 | Cloning default registries into `~/.julia` 105 | Cloning registry from "https://github.com/JuliaRegistries/General.git" 106 | Added registry `General` to `~/.julia/registries/General` 107 | Resolving package versions... 108 | Installed Example ─ v0.5.3 109 | Updating `~/.julia/environments/v1.4/Project.toml` 110 | [7876af07] + Example v0.5.3 111 | Updating `~/.julia/environments/v1.4/Manifest.toml` 112 | [7876af07] + Example v0.5.3 113 | ``` 114 | 115 | ## Build Julia on your machine 116 | 117 | - If you'd like to build Julia for your Raspberry Pi3, download, for example, `rpi3/Dockerfile-v1.5.3` and run the following command on your terminal to build Docker image which will include Julia binary: 118 | 119 | ```console 120 | $ docker build -t jl4rpi3 -f Dockerfile-v1.5.3 . 121 | ``` 122 | 123 | - Please be patient, it will take long time (within a half day) to build. 124 | - Also see my gist: 125 | - [(gist) Build Julia for RaspberryPi Zero](https://gist.github.com/terasakisatoshi/3f8a55391b1fc22a5db4a43da8d92c98) 126 | - [Cross Compile Julia For RaspberryPi3 using Docker](https://gist.github.com/terasakisatoshi/00fa7d7b81b7c6748f2298f6ff65bf6e) 127 | - Using `docker-compose` will build each version of Julia. Namely: 128 | 129 | ```console 130 | $ docker-compose build --parallel 131 | ``` 132 | 133 | 134 | ## Get binary from container 135 | 136 | 137 | - After building the docker image(or pulling docker image from our Docker Hub repository), you can get Julia binary by copying it from docker container generated by docker image what you've got 138 | 139 | ### Raspberry Pi Zero 140 | 141 | - in this section, you'll know how to get Julia for Raspberry Pi Zero. 142 | 143 | ```console 144 | # open your terminal e.g. your work station 145 | $ cat get_binary.sh # write shell script by yourself like below: 146 | #!/bin/bash 147 | 148 | JL_VERSION=v1.5.3 149 | IMAGE_NAME=terasakisatoshi/jlcross:rpizero-${JL_VERSION} 150 | CONTAINER_NAME=jltmp_${JL_VERSION} 151 | docker run --name ${CONTAINER_NAME} $IMAGE_NAME /bin/bash 152 | docker cp ${CONTAINER_NAME}:/home/pi/julia-${JL_VERSION} . 153 | docker rm ${CONTAINER_NAME} 154 | $ bash get_binary.sh 155 | $ ls 156 | julia-v1.5.3 157 | ``` 158 | 159 | - Copy `julia-v1.5.3` to your Raspberry Pi zero: 160 | 161 | ```console 162 | $ scp -r julia-v1.5.3 pi@raspberrypi.local:/home/pi 163 | ``` 164 | 165 | - After copying `julia-v1.5.3` to your Raspberry Pi, one need install the following dependencies via `apt` which is almost same as Dockerfile-v1.5.3. 166 | 167 | ```console 168 | # Open Your Raspberry Pi's terminal 169 | $ sudo apt-get update && \ 170 | sudo apt-get install -y build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config \ 171 | libopenblas-dev \ 172 | liblapack-dev \ 173 | libgmp3-dev \ 174 | libmpfr-dev 175 | $ echo export 'PATH=${HOME}/julia-v1.5.3/bin:${PATH}' >> ~/.bashrc 176 | $ source ~/.bashrc 177 | $ julia # Oh Yes!!! 178 | ``` 179 | 180 | That's all 181 | 182 | ### Raspberry Pi 3/4 183 | 184 | - Similar to Raspberry Zero, have a try 185 | 186 | ```console 187 | # open your terminal e.g. your work station 188 | $ cat get_binary.sh # write shell script by yourself like below: 189 | #!/bin/bash 190 | 191 | JL_VERSION=v1.5.4 192 | IMAGE_NAME=terasakisatoshi/jlcross:rpi3-${JL_VERSION} 193 | CONTAINER_NAME=jltmp_${JL_VERSION} 194 | docker run --name ${CONTAINER_NAME} $IMAGE_NAME /bin/bash 195 | docker cp ${CONTAINER_NAME}:/home/pi/julia-${JL_VERSION} . 196 | docker rm ${CONTAINER_NAME} 197 | $ bash get_binary.sh 198 | $ ls 199 | julia-v1.5.4 200 | ``` 201 | 202 | - You can also build julia `v1.6.0-DEV` by yourself. 203 | - [See my gist](https://gist.github.com/terasakisatoshi/8a95eb8b676a29ad3f5fe4a717ff3254) 204 | ![image](https://user-images.githubusercontent.com/16760547/99070290-4a5fb900-25f3-11eb-8d3b-23c009df7b0d.png) 205 | 206 | # Restriction 207 | 208 | - We can't confirm building Julia version = `v1.2.0` and `v1.5.4` on Raspberry Pi zero works fine. 209 | - You'll see some error message with respect to illegal instruction. 210 | - `v1.0.5`, `v1.1.1`, `v1.3.1`, `v1.4.0`, `v1.4.1`, `v1.4.2`, `v1.5.0-rc1`, `v1.5.0`, `v1.5.1`, `v1.5.2`, `v1.5.3` are O.K. 211 | 212 | - To pass building procedure for Julia v1.5.0, we have to modify `contrib/generate_precompile.jl` script that omit precompile statements regarding to `Pkg` installation to avoid this issue [armv7l: ptrtoint not supported for non-integral pointers #36062](https://github.com/JuliaLang/julia/issues/36062). This modification will increase the latency for users to install arbitrary packages. If you are new to Julia and want to try it on your Raspberry Pi, we strongly recommend to use julia `v1.4.2` or `v1.5.2` not `v1.5.0`. 213 | 214 | - We can't build Julia version = `v1.2.0` on Raspberry Pi3 using Docker its base image is `balenalib/raspberrypi3:buster-20191030` with error message something like: 215 | - ` undefined reference to llvm::BasicBlockPass::createPrinterPass(llvm::raw_ostream&, std::string const&) const'` 216 | 217 | 218 | # References 219 | 220 | - [Docker](https://www.docker.com/) 221 | - [Docker Machine](https://docs.docker.com/machine/) 222 | - [The easy way to set up Docker on a Raspberry Pi](https://medium.freecodecamp.org/the-easy-way-to-set-up-docker-on-a-raspberry-pi-7d24ced073ef) 223 | - [How to install Docker on your Raspberry Pi](https://howchoo.com/g/nmrlzmq1ymn/how-to-install-docker-on-your-raspberry-pi) 224 | - [Happy Pi Day with Docker and Raspberry Pi](https://blog.docker.com/2019/03/happy-pi-day-docker-raspberry-pi/) 225 | - [Base Image List](https://www.balena.io/docs/reference/base-images/base-images-ref/) 226 | - [multiarch/crossbuild](https://github.com/multiarch/crossbuild) 227 | 228 | # References (Japanese blog) 229 | 230 | - [Julia 1.1.0 をソースからビルドして RaspberryPi Zeroシリーズ や 3B+ とかで使いたいんじゃが?(Dockerでクロスコンパイルでどうじゃろ?)](https://qiita.com/SatoshiTerasaki/items/00f6bc2428ef81999164) 231 | - [x86_64のUbuntuでC/C++のソースコードをARM/ARM64用にクロスコンパイルしてQEMUで実行する方法のまとめ](https://qiita.com/tetsu_koba/items/9bdcb59f912efbff3128) 232 | - [ラズパイ向けのOpenCVを、x86_64機のDockerでビルド](https://qiita.com/mt08/items/51a2187076ddca0db7b0) 233 | - [Jetson 上で Docker イメージをビルドするのが辛かったので EC2 上にビルド環境を作った](https://tech-blog.abeja.asia/entry/environment-of-building-docker-image-for-jetson) 234 | 235 | # License 236 | 237 | - As with all Dockerfiles, how to build julia, are licensed under the terms of MIT License. 238 | 239 | - As with all Docker images, these likely also contain other software which may be under other licenses (such as Bash, etc from the base distribution, along with any direct or indirect dependencies of the primary software being contained). 240 | 241 | - Some additional license information which was able to be auto-detected might be found in [the repo-info repository's julia/ directory](https://github.com/docker-library/repo-info/tree/master/repos/julia). 242 | 243 | - As for any pre-built image usage, it is the image user's responsibility to ensure that any use of this image complies with any relevant licenses for all software contained within. 244 | -------------------------------------------------------------------------------- /local_build/build_v1.11.1-arm32bit-patch-2024-11-04.patch: -------------------------------------------------------------------------------- 1 | diff --git a/base/compiler/typeinfer.jl b/base/compiler/typeinfer.jl 2 | index f3f6c38125..382804714a 100644 3 | --- a/base/compiler/typeinfer.jl 4 | +++ b/base/compiler/typeinfer.jl 5 | @@ -28,7 +28,7 @@ using Core.Compiler: -, +, :, Vector, length, first, empty!, push!, pop!, @inlin 6 | # What we record for any given frame we infer during type inference. 7 | struct InferenceFrameInfo 8 | mi::Core.MethodInstance 9 | - world::UInt64 10 | + world::UInt 11 | sptypes::Vector{Core.Compiler.VarState} 12 | slottypes::Vector{Any} 13 | nargs::Int 14 | @@ -55,16 +55,16 @@ MethodInstance. 15 | """ 16 | struct Timing 17 | mi_info::InferenceFrameInfo 18 | - start_time::UInt64 19 | - cur_start_time::UInt64 20 | - time::UInt64 21 | + start_time::UInt 22 | + cur_start_time::UInt 23 | + time::UInt 24 | children::Core.Array{Timing,1} 25 | bt # backtrace collected upon initial entry to typeinf 26 | end 27 | Timing(mi_info, start_time, cur_start_time, time, children) = Timing(mi_info, start_time, cur_start_time, time, children, nothing) 28 | -Timing(mi_info, start_time) = Timing(mi_info, start_time, start_time, UInt64(0), Timing[]) 29 | +Timing(mi_info, start_time) = Timing(mi_info, start_time, start_time, UInt(0), Timing[]) 30 | 31 | -_time_ns() = ccall(:jl_hrtime, UInt64, ()) # Re-implemented here because Base not yet available. 32 | +_time_ns() = ccall(:jl_hrtime, UInt, ()) # Re-implemented here because Base not yet available. 33 | 34 | # We keep a stack of the Timings for each of the MethodInstances currently being timed. 35 | # Since type inference currently operates via a depth-first search (during abstract 36 | @@ -127,7 +127,7 @@ end 37 | mi_info = _typeinf_identifier(frame) 38 | 39 | # Start the new timer right before returning 40 | - push!(_timings, Timing(mi_info, UInt64(0))) 41 | + push!(_timings, Timing(mi_info, UInt(0))) 42 | len = length(_timings) 43 | new_timer = @inbounds _timings[len] 44 | # Set the current time _after_ appending the node, to try to exclude the 45 | @@ -1032,17 +1032,17 @@ typeinf_ircode(interp::AbstractInterpreter, method::Method, @nospecialize(atype) 46 | typeinf_ircode(interp, specialize_method(method, atype, sparams), optimize_until) 47 | function typeinf_ircode(interp::AbstractInterpreter, mi::MethodInstance, 48 | optimize_until::Union{Integer,AbstractString,Nothing}) 49 | - start_time = ccall(:jl_typeinf_timing_begin, UInt64, ()) 50 | + start_time = ccall(:jl_typeinf_timing_begin, UInt, ()) 51 | frame = typeinf_frame(interp, mi, false) 52 | if frame === nothing 53 | - ccall(:jl_typeinf_timing_end, Cvoid, (UInt64,), start_time) 54 | + ccall(:jl_typeinf_timing_end, Cvoid, (UInt,), start_time) 55 | return nothing, Any 56 | end 57 | (; result) = frame 58 | opt = OptimizationState(frame, interp) 59 | ir = run_passes_ipo_safe(opt.src, opt, result, optimize_until) 60 | rt = widenconst(ignorelimited(result.result)) 61 | - ccall(:jl_typeinf_timing_end, Cvoid, (UInt64,), start_time) 62 | + ccall(:jl_typeinf_timing_end, Cvoid, (UInt,), start_time) 63 | return ir, rt 64 | end 65 | 66 | @@ -1053,29 +1053,29 @@ typeinf_frame(interp::AbstractInterpreter, method::Method, @nospecialize(atype), 67 | run_optimizer::Bool) = 68 | typeinf_frame(interp, specialize_method(method, atype, sparams), run_optimizer) 69 | function typeinf_frame(interp::AbstractInterpreter, mi::MethodInstance, run_optimizer::Bool) 70 | - start_time = ccall(:jl_typeinf_timing_begin, UInt64, ()) 71 | + start_time = ccall(:jl_typeinf_timing_begin, UInt, ()) 72 | result = InferenceResult(mi, typeinf_lattice(interp)) 73 | cache_mode = run_optimizer ? :global : :no 74 | frame = InferenceState(result, cache_mode, interp) 75 | frame === nothing && return nothing 76 | typeinf(interp, frame) 77 | - ccall(:jl_typeinf_timing_end, Cvoid, (UInt64,), start_time) 78 | + ccall(:jl_typeinf_timing_end, Cvoid, (UInt,), start_time) 79 | return frame 80 | end 81 | 82 | # compute (and cache) an inferred AST and return type 83 | function typeinf_ext(interp::AbstractInterpreter, mi::MethodInstance) 84 | method = mi.def::Method 85 | - start_time = ccall(:jl_typeinf_timing_begin, UInt64, ()) 86 | + start_time = ccall(:jl_typeinf_timing_begin, UInt, ()) 87 | code = get(code_cache(interp), mi, nothing) 88 | if code isa CodeInstance 89 | # see if this code already exists in the cache 90 | inf = @atomic :monotonic code.inferred 91 | if use_const_api(code) 92 | - ccall(:jl_typeinf_timing_end, Cvoid, (UInt64,), start_time) 93 | + ccall(:jl_typeinf_timing_end, Cvoid, (UInt,), start_time) 94 | return codeinfo_for_const(interp, mi, WorldRange(code.min_world, code.max_world), code.rettype_const) 95 | elseif isa(inf, CodeInfo) 96 | - ccall(:jl_typeinf_timing_end, Cvoid, (UInt64,), start_time) 97 | + ccall(:jl_typeinf_timing_end, Cvoid, (UInt,), start_time) 98 | if !(inf.min_world == code.min_world && 99 | inf.max_world == code.max_world && 100 | inf.rettype === code.rettype) 101 | @@ -1086,7 +1086,7 @@ function typeinf_ext(interp::AbstractInterpreter, mi::MethodInstance) 102 | end 103 | return inf 104 | elseif isa(inf, String) 105 | - ccall(:jl_typeinf_timing_end, Cvoid, (UInt64,), start_time) 106 | + ccall(:jl_typeinf_timing_end, Cvoid, (UInt,), start_time) 107 | inf = _uncompressed_ir(code, inf) 108 | return inf 109 | end 110 | @@ -1099,7 +1099,7 @@ function typeinf_ext(interp::AbstractInterpreter, mi::MethodInstance) 111 | frame = InferenceState(result, #=cache_mode=#:global, interp) 112 | frame === nothing && return nothing 113 | typeinf(interp, frame) 114 | - ccall(:jl_typeinf_timing_end, Cvoid, (UInt64,), start_time) 115 | + ccall(:jl_typeinf_timing_end, Cvoid, (UInt,), start_time) 116 | if result_is_constabi(interp, true, frame.result) 117 | return codeinfo_for_const(interp, frame.linfo, frame.result.valid_worlds, frame.result.result.val) 118 | end 119 | @@ -1117,16 +1117,16 @@ end 120 | typeinf_type(interp::AbstractInterpreter, match::MethodMatch) = 121 | typeinf_type(interp, specialize_method(match)) 122 | function typeinf_type(interp::AbstractInterpreter, mi::MethodInstance) 123 | - start_time = ccall(:jl_typeinf_timing_begin, UInt64, ()) 124 | + start_time = ccall(:jl_typeinf_timing_begin, UInt, ()) 125 | code = get(code_cache(interp), mi, nothing) 126 | if code isa CodeInstance 127 | # see if this rettype already exists in the cache 128 | - ccall(:jl_typeinf_timing_end, Cvoid, (UInt64,), start_time) 129 | + ccall(:jl_typeinf_timing_end, Cvoid, (UInt,), start_time) 130 | return code.rettype 131 | end 132 | result = InferenceResult(mi, typeinf_lattice(interp)) 133 | typeinf(interp, result, :global) 134 | - ccall(:jl_typeinf_timing_end, Cvoid, (UInt64,), start_time) 135 | + ccall(:jl_typeinf_timing_end, Cvoid, (UInt,), start_time) 136 | is_inferred(result) || return nothing 137 | return widenconst(ignorelimited(result.result)) 138 | end 139 | @@ -1141,7 +1141,7 @@ function typeinf_ext_toplevel(interp::AbstractInterpreter, mi::MethodInstance) 140 | src = mi.uninferred::CodeInfo 141 | if !src.inferred 142 | # toplevel lambda - infer directly 143 | - start_time = ccall(:jl_typeinf_timing_begin, UInt64, ()) 144 | + start_time = ccall(:jl_typeinf_timing_begin, UInt, ()) 145 | if !src.inferred 146 | result = InferenceResult(mi, typeinf_lattice(interp)) 147 | frame = InferenceState(result, src, #=cache_mode=#:global, interp) 148 | @@ -1149,7 +1149,7 @@ function typeinf_ext_toplevel(interp::AbstractInterpreter, mi::MethodInstance) 149 | @assert is_inferred(frame) # TODO: deal with this better 150 | src = frame.src 151 | end 152 | - ccall(:jl_typeinf_timing_end, Cvoid, (UInt64,), start_time) 153 | + ccall(:jl_typeinf_timing_end, Cvoid, (UInt,), start_time) 154 | end 155 | end 156 | return src 157 | diff --git a/base/float.jl b/base/float.jl 158 | index ff628f0ac7..b44490cd2a 100644 159 | --- a/base/float.jl 160 | +++ b/base/float.jl 161 | @@ -121,7 +121,7 @@ significand_mask(::Type{Float16}) = 0x03ff 162 | 163 | mantissa(x::T) where {T} = reinterpret(Unsigned, x) & significand_mask(T) 164 | 165 | -for T in (Float16, Float32, Float64) 166 | +for T in (Float32, Float64) 167 | @eval significand_bits(::Type{$T}) = $(trailing_ones(significand_mask(T))) 168 | @eval exponent_bits(::Type{$T}) = $(sizeof(T)*8 - significand_bits(T) - 1) 169 | @eval exponent_bias(::Type{$T}) = $(Int(exponent_one(T) >> significand_bits(T))) 170 | @@ -233,7 +233,7 @@ uabs(x::BitSigned) = unsigned(abs(x)) 171 | # TODO: deprecate in 2.0 172 | Float16(x::Integer) = convert(Float16, convert(Float32, x)::Float32) 173 | 174 | -for t1 in (Float16, Float32, Float64) 175 | +for t1 in (Float32, Float64) 176 | for st in (Int8, Int16, Int32, Int64) 177 | @eval begin 178 | (::Type{$t1})(x::($st)) = sitofp($t1, x) 179 | @@ -950,7 +950,7 @@ such `y` exists (e.g. if `x` is `-Inf` or `NaN`), then return `x`. 180 | prevfloat(x::AbstractFloat) = nextfloat(x,-1) 181 | 182 | for Ti in (Int8, Int16, Int32, Int64, Int128, UInt8, UInt16, UInt32, UInt64, UInt128) 183 | - for Tf in (Float16, Float32, Float64) 184 | + for Tf in (Float32, Float64) 185 | if Ti <: Unsigned || sizeof(Ti) < sizeof(Tf) 186 | # Here `Tf(typemin(Ti))-1` is exact, so we can compare the lower-bound 187 | # directly. `Tf(typemax(Ti))+1` is either always exactly representable, or 188 | diff --git a/base/precompilation.jl b/base/precompilation.jl 189 | index 406b6dee2f..0aa08b601e 100644 190 | --- a/base/precompilation.jl 191 | +++ b/base/precompilation.jl 192 | @@ -679,7 +679,12 @@ function precompilepkgs(pkgs::Vector{String}=String[]; 193 | dep, config = pkg_config 194 | loaded = warn_loaded && haskey(Base.loaded_modules, dep) 195 | _name = haskey(exts, dep) ? string(exts[dep], " → ", dep.name) : dep.name 196 | + #occursin("Pkg", string(_name)) && continue 197 | + #occursin("REPLExt", string(_name)) && continue 198 | + #occursin("LazyArtifacts", string(_name)) && continue 199 | + #occursin("Downloads", string(_name)) && continue 200 | name = dep in direct_deps ? _name : string(color_string(_name, :light_black)) 201 | + 202 | if nconfigs > 1 && !isempty(config[1]) 203 | config_str = "$(join(config[1], " "))" 204 | name *= color_string(" $(config_str)", :light_black) 205 | @@ -726,7 +731,7 @@ function precompilepkgs(pkgs::Vector{String}=String[]; 206 | wait(t) 207 | end 208 | catch err 209 | - handle_interrupt(err, true) || rethrow() 210 | + # handle_interrupt(err, true) || rethrow() 211 | finally 212 | fancyprint && print(io, ansi_enablecursor) 213 | end 214 | @@ -739,6 +744,11 @@ function precompilepkgs(pkgs::Vector{String}=String[]; 215 | ## precompilation loop 216 | 217 | for (pkg, deps) in depsmap 218 | + #occursin("Pkg", string(pkg)) && continue 219 | + #occursin("REPLExt", string(pkg)) && continue 220 | + #occursin("LazyArtifacts", string(pkg)) && continue 221 | + #occursin("Downloads", string(pkg)) && continue 222 | + 223 | cachepaths = Base.find_all_in_cache_path(pkg) 224 | sourcepath = Base.locate_package(pkg) 225 | single_requested_pkg = length(pkgs) == 1 && only(pkgs) == pkg.name 226 | diff --git a/base/ryu/utils.jl b/base/ryu/utils.jl 227 | index 2064dfbefc..4e2ed5c2fe 100644 228 | --- a/base/ryu/utils.jl 229 | +++ b/base/ryu/utils.jl 230 | @@ -267,7 +267,7 @@ end 231 | [`pow5invsplit`](@ref) computed via lookup table. 232 | """ 233 | function pow5invsplit_lookup end 234 | -for T in (Float64, Float32, Float16) 235 | +for T in (Float64, Float32) 236 | e2_max = exponent_max(T) - precision(T) - 1 237 | i_max = log10pow2(e2_max) 238 | table_sym = Symbol("pow5invsplit_table_", string(T)) 239 | @@ -295,7 +295,7 @@ end 240 | [`pow5split`](@ref) computed via lookup table. 241 | """ 242 | function pow5split_lookup end 243 | -for T in (Float64, Float32, Float16) 244 | +for T in (Float64, Float32) 245 | e2_min = 1 - exponent_bias(T) - significand_bits(T) - 2 246 | i_max = 1 - e2_min - log10pow5(-e2_min) 247 | table_sym = Symbol("pow5split_table_", string(T)) 248 | diff --git a/contrib/generate_precompile.jl b/contrib/generate_precompile.jl 249 | index e4eeeed577..e4d686cc10 100644 250 | --- a/contrib/generate_precompile.jl 251 | +++ b/contrib/generate_precompile.jl 252 | @@ -120,7 +120,7 @@ precompile(Tuple{typeof(Core.kwcall), NamedTuple{(:context,), Tuple{Base.TTY}}, 253 | precompile(Tuple{Type{Base.UUID}, Base.UUID}) 254 | """ 255 | 256 | -for T in (Float16, Float32, Float64), IO in (IOBuffer, IOContext{IOBuffer}, Base.TTY, IOContext{Base.TTY}) 257 | +for T in (Float32, Float64), IO in (IOBuffer, IOContext{IOBuffer}, Base.TTY, IOContext{Base.TTY}) 258 | global hardcoded_precompile_statements 259 | hardcoded_precompile_statements *= "precompile(Tuple{typeof(show), $IO, $T})\n" 260 | end 261 | diff --git a/doc/Makefile b/doc/Makefile 262 | index 4469a40f74..355732c8f3 100644 263 | --- a/doc/Makefile 264 | +++ b/doc/Makefile 265 | @@ -44,7 +44,10 @@ cleanall: clean 266 | 267 | html: deps 268 | @echo "Building HTML documentation." 269 | - $(JULIA_EXECUTABLE) --color=yes $(call cygpath_w,$(SRCDIR)/make.jl) $(DOCUMENTER_OPTIONS) 270 | + # This causes a Bus error on 32 bit raspberry pi 271 | + # $(JULIA_EXECUTABLE) --color=yes $(call cygpath_w,$(SRCDIR)/make.jl) $(DOCUMENTER_OPTIONS) 272 | + # dummy 273 | + mkdir -p _build/html/index.html 274 | @echo "Build finished. The HTML pages are in _build/html." 275 | 276 | pdf: deps 277 | diff --git a/src/jitlayers.cpp b/src/jitlayers.cpp 278 | index d7fef44377..ed16476de5 100644 279 | --- a/src/jitlayers.cpp 280 | +++ b/src/jitlayers.cpp 281 | @@ -1143,10 +1143,12 @@ namespace { 282 | if (jl_processor_print_help || (target_flags & JL_TARGET_UNKNOWN_NAME)) { 283 | std::unique_ptr MSTI( 284 | TheTarget->createMCSubtargetInfo(TheTriple.str(), "", "")); 285 | + /* 286 | if (!MSTI->isCPUStringValid(TheCPU)) { 287 | jl_errorf("Invalid CPU name \"%s\".", TheCPU.c_str()); 288 | return nullptr; 289 | } 290 | + */ 291 | if (jl_processor_print_help) { 292 | // This is the only way I can find to print the help message once. 293 | // It'll be nice if we can iterate through the features and print our own help 294 | diff --git a/src/processor_arm.cpp b/src/processor_arm.cpp 295 | index 0d069b085a..67161816fa 100644 296 | --- a/src/processor_arm.cpp 297 | +++ b/src/processor_arm.cpp 298 | @@ -1649,6 +1649,7 @@ static void ensure_jit_target(bool imaging) 299 | auto &features0 = jit_targets[t.base].en.features; 300 | // Always clone when code checks CPU features 301 | t.en.flags |= JL_TARGET_CLONE_CPU; 302 | + /* 303 | static constexpr uint32_t clone_fp16[] = {Feature::fp16fml,Feature::fullfp16}; 304 | for (auto fe: clone_fp16) { 305 | if (!test_nbit(features0, fe) && test_nbit(t.en.features, fe)) { 306 | @@ -1656,6 +1657,7 @@ static void ensure_jit_target(bool imaging) 307 | break; 308 | } 309 | } 310 | + */ 311 | // The most useful one in general... 312 | t.en.flags |= JL_TARGET_CLONE_LOOP; 313 | #ifdef _CPU_ARM_ 314 | @@ -1834,7 +1836,7 @@ JL_DLLEXPORT jl_value_t *jl_cpu_has_fma(int bits) 315 | #else 316 | TargetData target = jit_targets.front(); 317 | FeatureList features = target.en.features; 318 | - if (bits == 32 && test_nbit(features, Feature::vfp4sp)) 319 | + if (bits == 32 && test_nbit(features, Feature::vfp4)) 320 | return jl_true; 321 | else if ((bits == 64 || bits == 32) && test_nbit(features, Feature::vfp4)) 322 | return jl_true; 323 | diff --git a/src/runtime_intrinsics.c b/src/runtime_intrinsics.c 324 | index ff479a4d30..f6b2d2a9e6 100644 325 | --- a/src/runtime_intrinsics.c 326 | +++ b/src/runtime_intrinsics.c 327 | @@ -252,7 +252,12 @@ JL_DLLEXPORT float julia_half_to_float(uint16_t param) { 328 | 329 | // starting with GCC 12 and Clang 15, we have _Float16 on most platforms 330 | // (but not on Windows; this may be a bug in the MSYS2 GCC compilers) 331 | -#if ((defined(__GNUC__) && __GNUC__ > 11) || \ 332 | +#if defined(_CPU_ARM_) 333 | + // otherwise, pass using floating-point calling conventions 334 | + #define FLOAT16_TYPE float 335 | + #define FLOAT16_TO_UINT16(x) ((uint16_t)*(uint32_t*)&(x)) 336 | + #define FLOAT16_FROM_UINT16(x) ({ uint32_t tmp = (uint32_t)(x); *(float*)&tmp; }) 337 | +#elif ((defined(__GNUC__) && __GNUC__ > 11) || \ 338 | (defined(__clang__) && __clang_major__ > 14)) && \ 339 | !defined(_CPU_PPC64_) && !defined(_CPU_PPC_) && \ 340 | !defined(_OS_WINDOWS_) 341 | diff --git a/src/stackwalk.c b/src/stackwalk.c 342 | index 37f2396095..04786b7113 100644 343 | --- a/src/stackwalk.c 344 | +++ b/src/stackwalk.c 345 | @@ -915,6 +915,8 @@ static void jl_rec_backtrace(jl_task_t *t) JL_NOTSAFEPOINT 346 | context = &t->ctx.ctx; 347 | #elif defined(JL_HAVE_UCONTEXT) 348 | context = jl_to_bt_context(&t->ctx.ctx); 349 | +#elif defined(_CPU_ARM_) 350 | + context = jl_to_bt_context(&t->ctx.ctx); 351 | #elif defined(JL_HAVE_ASM) 352 | memset(&c, 0, sizeof(c)); 353 | #if defined(_OS_LINUX_) && defined(__GLIBC__) 354 | diff --git a/stdlib/LinearAlgebra/test/lu.jl b/stdlib/LinearAlgebra/test/lu.jl 355 | index 0cb45047a1..885477976d 100644 356 | --- a/stdlib/LinearAlgebra/test/lu.jl 357 | +++ b/stdlib/LinearAlgebra/test/lu.jl 358 | @@ -391,7 +391,7 @@ end 359 | end 360 | 361 | @testset "more rdiv! methods" begin 362 | - for elty in (Float16, Float64, ComplexF64), transform in (transpose, adjoint) 363 | + for elty in (Float64, ComplexF64), transform in (transpose, adjoint) 364 | A = randn(elty, 5, 5) 365 | C = copy(A) 366 | B = randn(elty, 5, 5) 367 | @@ -409,7 +409,7 @@ end 368 | end 369 | 370 | @testset "transpose(A) / lu(B)' should not overwrite A (#36657)" begin 371 | - for elty in (Float16, Float64, ComplexF64) 372 | + for elty in (Float64, ComplexF64) 373 | A = randn(elty, 5, 5) 374 | B = randn(elty, 5, 5) 375 | C = copy(A) 376 | diff --git a/stdlib/Project.toml b/stdlib/Project.toml 377 | index 0cfdfab02b..4fc5eedddb 100644 378 | --- a/stdlib/Project.toml 379 | +++ b/stdlib/Project.toml 380 | @@ -58,3 +58,6 @@ libLLVM_jll = "8f36deef-c2a5-5394-99ed-8e07531fb29a" 381 | libblastrampoline_jll = "8e850b90-86db-534c-a0d3-1478176c7d93" 382 | nghttp2_jll = "8e850ede-7688-5339-a07c-302acd2aaf8d" 383 | p7zip_jll = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" 384 | + 385 | +[sources] 386 | +Pkg = {url = "https://github.com/terasakisatoshi/Pkg.jl", rev = "terasaki/v1.11.1-arm-patch"} 387 | diff --git a/stdlib/Random/src/RNGs.jl b/stdlib/Random/src/RNGs.jl 388 | index 7782de88ba..806ed02d14 100644 389 | --- a/stdlib/Random/src/RNGs.jl 390 | +++ b/stdlib/Random/src/RNGs.jl 391 | @@ -604,7 +604,7 @@ mask128(u::UInt128, ::Type{Float16}) = 392 | mask128(u::UInt128, ::Type{Float32}) = 393 | (u & 0x007fffff007fffff007fffff007fffff) | 0x3f8000003f8000003f8000003f800000 394 | 395 | -for T in (Float16, Float32) 396 | +for T in (Float32,) 397 | @eval function rand!(r::MersenneTwister, A::Array{$T}, ::SamplerTrivial{CloseOpen12{$T}}) 398 | n = length(A) 399 | n128 = n * sizeof($T) ÷ 16 400 | diff --git a/stdlib/Random/test/runtests.jl b/stdlib/Random/test/runtests.jl 401 | index 9b46951f63..d88e913d43 100644 402 | --- a/stdlib/Random/test/runtests.jl 403 | +++ b/stdlib/Random/test/runtests.jl 404 | @@ -867,7 +867,7 @@ end 405 | @test rand!(GLOBAL_RNG, vA, I1) === vA 406 | rand!(xo, vB, I1) 407 | @test A == B 408 | - for T in (Float16, Float32) 409 | + for T in (Float32) 410 | B = fill!(B, 1.0) 411 | @test rand!(GLOBAL_RNG, A, I2) === A == rand!(xo, B, I2) === B 412 | B = fill!(B, 1.0) 413 | diff --git a/test/complex.jl b/test/complex.jl 414 | index 63304652ee..47eb7bdcd1 100644 415 | --- a/test/complex.jl 416 | +++ b/test/complex.jl 417 | @@ -41,7 +41,7 @@ end 418 | end 419 | 420 | @testset "arithmetic" begin 421 | - @testset for T in (Float16, Float32, Float64, BigFloat) 422 | + @testset for T in (Float32, Float64, BigFloat) 423 | t = true 424 | f = false 425 | @testset "equality" begin 426 | @@ -912,7 +912,7 @@ end 427 | @test sign(1 + im) ≈ (1 + im) / sqrt(2) 428 | @test sign(1 - im) ≈ (1 - im) / sqrt(2) 429 | 430 | - for T in (Float16, Float32, Float64) 431 | + for T in (Float32, Float64) 432 | z = Complex(zero(T), zero(T)) 433 | @test sign(z) === z 434 | @test sign(-z) === -z 435 | @@ -1046,7 +1046,7 @@ end 436 | @testset "corner cases of division, issue #22983" begin 437 | # These results abide by ISO/IEC 10967-3:2006(E) and 438 | # mathematical definition of division of complex numbers. 439 | - for T in (Float16, Float32, Float64, BigFloat) 440 | + for T in (Float32, Float64, BigFloat) 441 | @test isequal(one(T) / zero(Complex{T}), one(Complex{T}) / zero(Complex{T})) 442 | @test isequal(one(T) / zero(Complex{T}), Complex{T}(NaN, NaN)) 443 | @test isequal(one(Complex{T}) / zero(T), Complex{T}(Inf, NaN)) 444 | @@ -1057,7 +1057,7 @@ end 445 | end 446 | 447 | @testset "division by Inf, issue#23134" begin 448 | - @testset "$T" for T in (Float16, Float32, Float64, BigFloat) 449 | + @testset "$T" for T in (Float32, Float64, BigFloat) 450 | @test isequal(one(T) / complex(T(Inf)), complex(zero(T), -zero(T))) 451 | @test isequal(one(T) / complex(T(Inf), one(T)), complex(zero(T), -zero(T))) 452 | @test isequal(one(T) / complex(T(Inf), T(NaN)), complex(zero(T), -zero(T))) 453 | @@ -1217,7 +1217,7 @@ end 454 | end 455 | 456 | @testset "issue #55266" begin 457 | - for T in (Float16, Float32, Float64) 458 | + for T in (Float32, Float64) 459 | @test isapprox(atanh(1+im*floatmin(T)), Complex{T}(atanh(1+im*big(floatmin(T))))) 460 | end 461 | end 462 | diff --git a/test/fastmath.jl b/test/fastmath.jl 463 | index 34744f325a..a0dc33e31a 100644 464 | --- a/test/fastmath.jl 465 | +++ b/test/fastmath.jl 466 | @@ -99,7 +99,7 @@ end 467 | # math functions 468 | 469 | @testset "real arithmetic" begin 470 | - for T in (Float16, Float32, Float64, BigFloat) 471 | + for T in (Float32, Float64, BigFloat) 472 | half = 1/convert(T,2) 473 | third = 1/convert(T,3) 474 | 475 | diff --git a/test/floatfuncs.jl b/test/floatfuncs.jl 476 | index d5d697634b..458943bab0 100644 477 | --- a/test/floatfuncs.jl 478 | +++ b/test/floatfuncs.jl 479 | @@ -25,7 +25,7 @@ end 480 | end 481 | 482 | @testset "isinteger" begin 483 | - for elty in (Float16, Float32, Float64) 484 | + for elty in (Float32, Float64) 485 | @test !isinteger(elty(1.2)) 486 | @test isinteger(elty(12)) 487 | @test isinteger(zero(elty)) 488 | @@ -294,7 +294,7 @@ end 489 | end 490 | 491 | @testset "Conversion from floating point to integer near extremes (exhaustive)" begin 492 | - for Ti in Base.BitInteger_types, Tf in (Float16, Float32, Float64), x in (typemin(Ti), typemax(Ti)) 493 | + for Ti in Base.BitInteger_types, Tf in (Float32, Float64), x in (typemin(Ti), typemax(Ti)) 494 | y = Tf(x) 495 | for i in -3:3 496 | z = nextfloat(y, i) 497 | diff --git a/test/generic_map_tests.jl b/test/generic_map_tests.jl 498 | index b155370dd6..4f5e29a754 100644 499 | --- a/test/generic_map_tests.jl 500 | +++ b/test/generic_map_tests.jl 501 | @@ -5,7 +5,7 @@ Base.iterate(::GenericIterator{N}, i=1) where {N} = i > N ? nothing : (i, i + 1) 502 | Base.IteratorSize(::Type{GenericIterator{N}}) where {N} = Base.SizeUnknown() 503 | 504 | function generic_map_tests(mapf, inplace_mapf=nothing) 505 | - for typ in (Float16, Float32, Float64, 506 | + for typ in (Float32, Float64, 507 | Int8, Int16, Int32, Int64, Int128, 508 | UInt8, UInt16, UInt32, UInt64, UInt128), 509 | arg_typ in (Integer, 510 | diff --git a/test/gmp.jl b/test/gmp.jl 511 | index 13413abe55..cc5abea292 100644 512 | --- a/test/gmp.jl 513 | +++ b/test/gmp.jl 514 | @@ -562,7 +562,7 @@ end 515 | @test Float16(x) == reinterpret(Float16, 0x7401) 516 | @test Float16(-x) == -Float16(x) 517 | 518 | - for T in (Float16, Float32, Float64) 519 | + for T in (Float32, Float64) 520 | n = exponent(floatmax(T)) 521 | @test T(big"2"^(n+1)) === T(Inf) 522 | @test T(big"2"^(n+1) - big"2"^(n-precision(T))) === T(Inf) 523 | diff --git a/test/math.jl b/test/math.jl 524 | index be134adb15..00c18539b3 100644 525 | --- a/test/math.jl 526 | +++ b/test/math.jl 527 | @@ -173,7 +173,7 @@ end 528 | # We compare to BigFloat instead of hard-coding 529 | # values, assuming that BigFloat has an independently tested implementation. 530 | @testset "basic math functions" begin 531 | - @testset "$T" for T in (Float16, Float32, Float64) 532 | + @testset "$T" for T in (Float32, Float64) 533 | x = T(1//3) 534 | y = T(1//2) 535 | yi = 4 536 | @@ -729,7 +729,7 @@ end 537 | end 538 | 539 | @testset "modf" begin 540 | - @testset "$T" for T in (Float16, Float32, Float64) 541 | + @testset "$T" for T in (Float32, Float64) 542 | @test modf(T(1.25)) === (T(0.25), T(1.0)) 543 | @test modf(T(1.0)) === (T(0.0), T(1.0)) 544 | @test modf(T(-Inf)) === (T(-0.0), T(-Inf)) 545 | @@ -741,7 +741,7 @@ end 546 | end 547 | 548 | @testset "frexp" begin 549 | - @testset "$elty" for elty in (Float16, Float32, Float64) 550 | + @testset "$elty" for elty in (Float32, Float64) 551 | @test frexp( convert(elty,0.5) ) == (0.5, 0) 552 | @test frexp( convert(elty,4.0) ) == (0.5, 3) 553 | @test frexp( convert(elty,10.5) ) == (0.65625, 4) 554 | @@ -1345,7 +1345,7 @@ end 555 | @test hypot(1s, 2s, 3s) ≈ s * hypot(1, 2, 3) rtol=8eps(T) 556 | end 557 | end 558 | - @testset "$T" for T in (Float16, Float32, Float64, BigFloat) 559 | + @testset "$T" for T in (Float32, Float64, BigFloat) 560 | let x = 1.1sqrt(floatmin(T)) 561 | @test (@inferred hypot(x, x/4)) ≈ x * sqrt(17/BigFloat(16)) 562 | @test (@inferred hypot(x, x/4, x/4)) ≈ x * sqrt(9/BigFloat(8)) 563 | @@ -1414,7 +1414,7 @@ end 564 | POW_TOLS = Dict(Float16=>[.51, .51, .51, 2.0, 1.5], 565 | Float32=>[.51, .51, .51, 2.0, 1.5], 566 | Float64=>[.55, 0.8, 1.5, 2.0, 1.5]) 567 | - for T in (Float16, Float32, Float64) 568 | + for T in (Float32, Float64) 569 | for x in (0.0, -0.0, 1.0, 10.0, 2.0, Inf, NaN, -Inf, -NaN) 570 | for y in (0.0, -0.0, 1.0, -3.0,-10.0 , Inf, NaN, -Inf, -NaN) 571 | got, expected = T(x)^T(y), T(big(x)^T(y)) 572 | diff --git a/test/numbers.jl b/test/numbers.jl 573 | index 922fa0da33..511cf47ccd 100644 574 | --- a/test/numbers.jl 575 | +++ b/test/numbers.jl 576 | @@ -98,7 +98,7 @@ end 577 | Top(T, op, x, y) = op(T.(x), T.(y)) 578 | Top(T, op) = (x, y) -> Top(T, op, x, y) 579 | _compare(x, y) = x == y 580 | - for T in (Float16, Float32, Float64, BigFloat) 581 | + for T in (Float32, Float64, BigFloat) 582 | minmax = Top(T,Base.minmax) 583 | min = Top(T,Base.min) 584 | max = Top(T,Base.max) 585 | @@ -135,7 +135,7 @@ end 586 | end 587 | end 588 | @testset "Base._extrema_rf for float" begin 589 | - for T in (Float16, Float32, Float64, BigFloat) 590 | + for T in (Float32, Float64, BigFloat) 591 | ordered = T[-Inf, -5, -0.0, 0.0, 3, Inf] 592 | unorded = T[NaN, -NaN] 593 | for i1 in 1:6, i2 in 1:6, j1 in 1:6, j2 in 1:6 594 | @@ -2083,7 +2083,7 @@ end 595 | @test nextpow(2, T(42)) === T(64) 596 | @test prevpow(2, T(42)) === T(32) 597 | end 598 | - for T in (Float16, Float32, Float64) 599 | + for T in (Float32, Float64) 600 | @test prevpow(2, prevfloat(T(1024.0))) == T(512.0) 601 | @test nextpow(2, nextfloat(T(1024.0))) == T(2048.0) 602 | @test prevpow(T(2.0), prevfloat(T(1024.0))) == T(512.0) 603 | @@ -2277,7 +2277,7 @@ end 604 | for T in ( 605 | UInt8, UInt16, UInt32, UInt64, UInt128, Int8, Int16, Int32, Int64, Int128, BigInt 606 | ) 607 | - for S in (Float16, Float32, Float64, BigFloat) 608 | + for S in (Float32, Float64, BigFloat) 609 | @test_throws InexactError convert(T, typemin(S)) 610 | @test_throws InexactError convert(T, typemax(S)) 611 | end 612 | @@ -2604,7 +2604,7 @@ end 613 | 614 | @test !isempty(complex(1,2)) 615 | 616 | -@testset "rem $T rounded" for T in (Float16, Float32, Float64, BigFloat) 617 | +@testset "rem $T rounded" for T in (Float32, Float64, BigFloat) 618 | @test rem(T(1), T(2), RoundToZero) == 1 619 | @test rem(T(1), T(2), RoundNearest) == 1 620 | @test rem(T(1), T(2), RoundDown) == 1 621 | @@ -2653,7 +2653,7 @@ end 622 | 623 | @testset "divrem rounded" begin 624 | #rounded Floats 625 | - for T in (Float16, Float32, Float64, BigFloat) 626 | + for T in (Float32, Float64, BigFloat) 627 | @test divrem(T(1.5), T(2), RoundToZero)[2] == 1.5 628 | @test divrem(T(1.5), T(2), RoundNearest)[2] == -0.5 629 | @test divrem(T(1.5), T(2), RoundDown)[2] == 1.5 630 | @@ -2686,7 +2686,7 @@ end 631 | @test divrem(a,-(a-20), RoundDown) == (div(a,-(a-20), RoundDown), rem(a,-(a-20), RoundDown)) 632 | end 633 | 634 | -@testset "rem2pi $T" for T in (Float16, Float32, Float64, BigFloat, Int8, Int16, Int32, Int64, Int128) 635 | +@testset "rem2pi $T" for T in (Float32, Float64, BigFloat, Int8, Int16, Int32, Int64, Int128) 636 | @test rem2pi(T(1), RoundToZero) == 1 637 | @test rem2pi(T(1), RoundNearest) == 1 638 | @test rem2pi(T(1), RoundDown) == 1 639 | @@ -2731,7 +2731,7 @@ end 640 | @test rem2pi(T(-13), RoundUp) ≈ -13+4π 641 | end 642 | 643 | -@testset "PR #36420 $T" for T in (Float16, Float32, Float64, BigFloat) 644 | +@testset "PR #36420 $T" for T in (Float32, Float64, BigFloat) 645 | nan = reinterpret(Float64, reinterpret(UInt64, NaN) | rand(UInt64)) 646 | for r in (RoundToZero, RoundNearest, RoundDown, RoundUp) 647 | for x in (Inf, -Inf, NaN, -NaN, nan) 648 | @@ -2757,7 +2757,7 @@ Base.literal_pow(::typeof(^), ::PR20530, ::Val{p}) where {p} = 2 649 | @test x^p == 1 650 | @test x^2 == 2 651 | @test [x, x, x].^2 == [2, 2, 2] 652 | - for T in (Float16, Float32, Float64, BigFloat, Int8, Int, BigInt, Complex{Int}, ComplexF64) 653 | + for T in (Float32, Float64, BigFloat, Int8, Int, BigInt, Complex{Int}, ComplexF64) 654 | for p in -4:4 655 | v = eval(:($T(2)^$p)) 656 | @test 2.0^p == v 657 | diff --git a/test/ranges.jl b/test/ranges.jl 658 | index 4660a96dfc..2405778fcc 100644 659 | --- a/test/ranges.jl 660 | +++ b/test/ranges.jl 661 | @@ -167,7 +167,7 @@ end 662 | # end 663 | # end 664 | 665 | - for T in (Float16, Float32) # skip Float64 (bit representation of BigFloat is not available) 666 | + for T in (Float32) # skip Float64 (bit representation of BigFloat is not available) 667 | for i = 1:10^5 668 | x, y = rand(T), rand(T) 669 | highprec_pair(x, y) 670 | diff --git a/test/rational.jl b/test/rational.jl 671 | index b59b25c206..419d6615d4 100644 672 | --- a/test/rational.jl 673 | +++ b/test/rational.jl 674 | @@ -451,7 +451,7 @@ end # parse 675 | @test floor(11//3) == round(11//3, RoundDown) == 3//1 676 | @test floor(-11//3) == round(-11//3, RoundDown) == -4//1 677 | 678 | - for T in (Float16, Float32, Float64) 679 | + for T in (Float32, Float64) 680 | @test round(T, true//false) === convert(T, Inf) 681 | @test round(T, true//true) === one(T) 682 | @test round(T, false//true) === zero(T) 683 | --------------------------------------------------------------------------------