Contact: Ethan Slattery
To run the IAR compiler for IAR on linux you will need the following things:
- A valid copy of the IAR compiler
- A license for the compiler
- wine set up for win32 and i386
Assuming you already have a valid copy of IAR installed on a Windows machine, you can simply zip the installation
directory. The installation is "portable" for all use cases needed by compiler explorer. The one thing that doesn't work
so far is building a project file. Individual file compilation works well using iccavr.exe
.
If you installed to the default location this means creating an archive of the directory
C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0
The machine used for compiling needs to have access to a license, or compilation will fail. Ensure the server running compiler explorer can access the license server. If you want to use a dongle, then modify the following instructions accordingly, and good luck.
Note: Each time a compilation happens the machine doing that compilation claims the license for 20 minutes. Each docker instance counts as a different machine. Because of this it is a good idea to ensure that the machine running IAR is a long-lived container/VM/machine to prevent using up all licenses and irritating your coworkers.
There are many places online to learn how to set up wine. A very simplified setup I often use in a fresh ubuntu docker container is:
$ apt-get update
$ dpkg --add-architecture i386
$ apt-get -y update
$ apt-get -y install wine-stable wine32 git curl bzip2 make
$ WINEARCH=win32 winecfg
Refer to the readme on running Native on Windows for general setup of Compiler Explorer and other
compilers. Then add EWAVR as an additional compiler in your c++.local.properties
file. The example in the compiler
explorer documentation folder is written for linux so just modify the paths as needed. The following
properties are the ones that need to be set in addition to the typical settings you do for any compiler.
versionRe=^IAR C\/C\+\+ Compiler.*AVR$
isSemVer=true
options=--eec++
supportsDemangler=false
If you are more experienced with docker this can be done with a volume, but I just use a local folder on my server
Create a folder on the server /opt/compiler_explorer
. We are focusing on EWAVR, but you can see we also include
several other embedded compilers, the native compilers, and many open source and internal libraries. The EWAVR specific
portions of c++.local.properties
is provided in the example, the rest is generic library and
compiler settings. compiler-explorer.local.properties
contains server specific sub-domain settings.
The EWAVR directories are just the archives of the installation folders from windows un-tarred there, as you can see from the layout.
/opt/compiler_explorer/
├── c++.local.properties
├── compiler-explorer.local.properties
├── compilers
│ ├── avr-gcc-5.4.0-atmel
│ ├── avr-gcc-9.2.0-P0829
│ ├── bin -> /usr/bin
│ ├── ewavr_7108
│ │ ├── avr
│ │ ├── common
│ │ └── install-info
│ ├── ewavr_7205
│ │ ├── avr
│ │ ├── common
│ │ └── install-info
│ ├── gcc-arm-none-eabi-6.3.1-atmel
│ ├── gcc-arm-none-eabi-8-2018-q4-major
│ └── gcc-arm-none-eabi-9-2019-q4-major
└── libs
├── bitpacker
├── boost_1_72_0
├── cunpack
├── dyno
├── expected
├── function_ref
├── gsl
├── span
├── static_string
├── static_vector
├── tl-optional
└── xmega-hal
To invoke iccavr
you need to use the command wine /opt/compiler_explorer/compilers/ewavr_7108/avr/bin/iccavr.exe
which created some issues for me in CE. I create small bash script aliases using the following commands, for each
versions bin
folder:
$ IAR_ROOT=/opt/compiler_explorer/compilers/ewavr_7108
$ echo -e "#\!/bin/bash\nwine $IAR_ROOT/avr/bin/iccavr.exe\n" > $IAR_ROOT/avr/bin/iccavr && chmod +x $IAR_ROOT/avr/bin/iccavr
$ IAR_ROOT=/opt/compiler_explorer/compilers/ewavr_7205
$ echo -e "#\!/bin/bash\nwine $IAR_ROOT/avr/bin/iccavr.exe\n" > $IAR_ROOT/avr/bin/iccavr && chmod +x $IAR_ROOT/avr/bin/iccavr
A docker image is available that bundles a working version of Compiler Explorer and wine so that no additional setup is needed on the host server. The IAR license needs to be run once, at system startup to register with the license server, so that can be seen in the docker command. If you have multiple IAR versions, only one needs to be run, and it doesn't matter which one.
$ IAR_SERVER=my.liscense_server.ip.address
$ docker run --restart=always -d --name compiler_explorer \
-v /opt/compiler_explorer:/opt/compiler_explorer \
-v /opt/compiler_explorer/c++.local.properties:/compiler-explorer/etc/config/c++.local.properties \
-p 80:10240 crustyauklet/compiler_explorer \
/bin/bash -c "wine /opt/compiler_explorer/compilers/ewavr_7108/common/bin/LightLicenseManager.exe setup -s ${IAR_SERVER} && make"