Jumpnow Technologies
home
Adding Fortran support to a Yocto build
Adding Fortran support to a Yocto build
02 Apr 2014
Being asked to add support for Fortran
is a rare thing. I am not a Fortran
developer.
Here are some notes while it’s still fresh.
This is was done using tools from the Yocto Project version 1.5.1, the [dora]
branch.
Build
local.conf
Add the following line to your build/conf/local.conf
# Enable fortran
FORTRAN_forcevariable = ",fortran"
gcc-runtime.bbappend
Add this one-liner bbappend
to the gcc-runtime
recipe
scott@octo:~/<project>$ cat meta-<project>/recipes-devtools/gcc/gcc-runtime_4.8.bbappend
RUNTIMETARGET += "libgfortran"
Add packages
Add these to your image recipe
...
FORTRAN_TOOLS = " \
gfortran \
gfortran-symlinks \
libgfortran \
libgfortran-dev \
"
...
IMAGE_INSTALL += " \
...
${FORTRAN_TOOLS} \
...
"
...
You should do this before building the first time or you’ll just have to wait for it a second time. The gcc-runtime
modification will force a recompile of gcc
leading to a rebuild of almost everything else.
Testing
I grabbed some Fortran
test code from the WikiBooks Fortran/Fortran examples page.
I’m using the Summations with a DO loop example.
Native compile and run
Copy the example code to the target board (I’m using a Gumstix Overo) and compile it with this command
root@overo:~# ls
sum.f90
root@overo:~# gfortran -o fsum sum.f90
root@overo:~# ls
fsum sum.f90
Here’s a run
root@overo:~# ./fsum
This program performs summations. Enter 0 to stop.
Add:
1
Add:
2
Add:
3
Add:
4
Add:
0
Summation = 10
root@overo:~# ls
SumData.DAT fsum sum.f90
Cross-compile
Setup an environment pointed at the cross-build tools. A script like this will work.
--- set-fortran-env.sh ---
export STAGEDIR=$OETMP/sysroots/`uname -m`-linux/usr
# soft-float
export PATH=${STAGEDIR}/bin:${STAGEDIR}/bin/armv7a-vfp-neon-poky-linux-gnueabi:${PATH}
# hard-float
# export PATH=${STAGEDIR}/bin:${STAGEDIR}/bin/cortexa8hf-vfp-neon-poky-linux-gnueabi:${PATH}
unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS
export ARCH="arm"
export CROSS_COMPILE="arm-poky-linux-gnueabi-"
--- end set-fortran-env.sh ---
Before sourcing that file, export an OETMP
environment variable that is the same as the Yocto build/conf/local.conf
TMPDIR
variable.
export OETMP=/oe8/tmp-poky-dora-build
The default location for TMPDIR
is <project>/build/tmp
. But local.conf
is where it comes from.
After that, a Makefile
like the following will work
--- Makefile ---
# Use Yocto cross-tools to compile a Fortran program
# Source the setup-fortran-env.sh script first
CC = arm-poky-linux-gnueabi-gfortran
SRC = sum.f90
TARGET = fsum
$(TARGET): $(SRC)
$(CC) $(SRC) -o $(TARGET)
--- end Makefile ---
So it goes like this
scott@octo:~/<project>/fortran$ ls -l
total 8
drwxrwxr-x 2 scott scott 4096 Apr 2 11:06 fsum
-rwxrwxr-x 1 scott scott 270 Apr 2 10:56 set-fortran-env.sh
scott@octo:~/<project>/fortran$ export OETMP=/oe8/tmp-poky-dora-build
scott@octo:~/<project>/fortran$ source set-fortran-env.sh
scott@octo:~/<project>/fortran$ cd fsum
scott@octo:~/<project>/fortran/fsum$ ls -l
total 8
-rw-rw-r-- 1 scott scott 215 Apr 2 10:58 Makefile
-rw-rw-r-- 1 scott scott 460 Apr 2 10:13 sum.f90
scott@octo:~/<project>/fortran/fsum$ make
arm-poky-linux-gnueabi-gfortran sum.f90 -o fsum
scott@octo:~/<project>/fortran/fsum$ ls -l
total 20
-rwxrwxr-x 1 scott scott 12098 Apr 2 11:08 fsum
-rw-rw-r-- 1 scott scott 215 Apr 2 10:58 Makefile
-rw-rw-r-- 1 scott scott 460 Apr 2 10:13 sum.f90
Copy the fsum
executable to the target board and it should run.
Jumpnow Technologies, LLC - Privacy Policy