Search code examples
arduinoarduino-uno

Where does core.a come from in the Arduino build process?


I am trying to generate a Rust wrapper around an Arduino C++ library (right now I'm targeting Adafruit_NeoPixel) . I have been using strace to figure out what the Arduino IDE execs.

I am currently convinced that core.a is an important part of the process because it shows up in the ld invocation.

2337  execve("/usr/libexec/gcc/avr/ld", ["/usr/libexec/gcc/avr/ld", "-plugin", "/usr/libexec/gcc/avr/11.2.0/liblto_plugin.so", "-plugin-opt=/usr/libexec/gcc/avr/11.2.0/lto-wrapper", "-plugin-opt=-fresolution=/tmp/ccqWVTle.res", "-plugin-opt=-pass-through=-lgcc", "-plugin-opt=-pass-through=-lm", "-plugin-opt=-pass-through=-lc", "-plugin-opt=-pass-through=-latmega328p", "-mavr5", "-Tdata", "0x800100", "-o", "/tmp/arduino_build_966100/sketch_jan13a.ino.elf", "/usr/lib/gcc/avr/11.2.0/../../../../avr/lib/avr5/crtatmega328p.o", "-L/tmp/arduino_build_966100", "-L/usr/lib/gcc/avr/11.2.0/avr5", "-L/usr/lib/gcc/avr/11.2.0/../../../../avr/lib/avr5", "-L/usr/lib/gcc/avr/11.2.0", "-L/usr/lib/gcc/avr/11.2.0/../../../../avr/lib", "--gc-sections", "/tmp/arduino_build_966100/sketch/sketch_jan13a.ino.cpp.o", "/tmp/arduino_build_966100/core/core.a", "-lm", "--start-group", "-lgcc", "-lm", "-lc", "-latmega328p", "--end-group"], 0x12d9410 /* 62 vars */ <unfinished ...>

 $ ar t /tmp/arduino_build_966100/core/core.a
wiring_pulse.S.o
WInterrupts.c.o
hooks.c.o
wiring.c.o
wiring_analog.c.o
wiring_digital.c.o
wiring_pulse.c.o
wiring_shift.c.o
CDC.cpp.o
HardwareSerial.cpp.o
HardwareSerial0.cpp.o
HardwareSerial1.cpp.o
HardwareSerial2.cpp.o
HardwareSerial3.cpp.o
IPAddress.cpp.o
PluggableUSB.cpp.o
Print.cpp.o
Stream.cpp.o
Tone.cpp.o
USBCore.cpp.o
WMath.cpp.o
WString.cpp.o
abi.cpp.o
main.cpp.o
new.cpp.o

It appears in the /tmp/arduino_build_* sketch build directory, but I am not sure where it comes from. I can not find it in /usr/share/arduino.

How is core.a created?


Solution

  • TLDR: there are a bunch of files in /usr/share/arduino/hardware/arduino/avr/cores/arduino/ (on Linux) that become core.a

    Given the comment from aMike, I was able to observe this from the arduino IDE:

    Compiling libraries...
    Compiling core...
    "/usr/bin/avr-gcc" -c -g -x assembler-with-cpp -flto -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/wiring_pulse.S" -o "/tmp/arduino_build_26920/core/wiring_pulse.S.o"
    "/usr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/WInterrupts.c" -o "/tmp/arduino_build_26920/core/WInterrupts.c.o"
    "/usr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/hooks.c" -o "/tmp/arduino_build_26920/core/hooks.c.o"
    "/usr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/wiring.c" -o "/tmp/arduino_build_26920/core/wiring.c.o"
    "/usr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/wiring_analog.c" -o "/tmp/arduino_build_26920/core/wiring_analog.c.o"
    "/usr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/wiring_digital.c" -o "/tmp/arduino_build_26920/core/wiring_digital.c.o"
    "/usr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/wiring_pulse.c" -o "/tmp/arduino_build_26920/core/wiring_pulse.c.o"
    "/usr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/wiring_shift.c" -o "/tmp/arduino_build_26920/core/wiring_shift.c.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/CDC.cpp" -o "/tmp/arduino_build_26920/core/CDC.cpp.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/HardwareSerial.cpp" -o "/tmp/arduino_build_26920/core/HardwareSerial.cpp.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/HardwareSerial0.cpp" -o "/tmp/arduino_build_26920/core/HardwareSerial0.cpp.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/HardwareSerial1.cpp" -o "/tmp/arduino_build_26920/core/HardwareSerial1.cpp.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/HardwareSerial2.cpp" -o "/tmp/arduino_build_26920/core/HardwareSerial2.cpp.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/HardwareSerial3.cpp" -o "/tmp/arduino_build_26920/core/HardwareSerial3.cpp.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/IPAddress.cpp" -o "/tmp/arduino_build_26920/core/IPAddress.cpp.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/PluggableUSB.cpp" -o "/tmp/arduino_build_26920/core/PluggableUSB.cpp.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/Print.cpp" -o "/tmp/arduino_build_26920/core/Print.cpp.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/Stream.cpp" -o "/tmp/arduino_build_26920/core/Stream.cpp.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/Tone.cpp" -o "/tmp/arduino_build_26920/core/Tone.cpp.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/USBCore.cpp" -o "/tmp/arduino_build_26920/core/USBCore.cpp.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/WMath.cpp" -o "/tmp/arduino_build_26920/core/WMath.cpp.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/WString.cpp" -o "/tmp/arduino_build_26920/core/WString.cpp.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/abi.cpp" -o "/tmp/arduino_build_26920/core/abi.cpp.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/main.cpp" -o "/tmp/arduino_build_26920/core/main.cpp.o"
    "/usr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/usr/share/arduino/hardware/arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/arduino/avr/variants/standard" "/usr/share/arduino/hardware/arduino/avr/cores/arduino/new.cpp" -o "/tmp/arduino_build_26920/core/new.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/wiring_pulse.S.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/WInterrupts.c.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/hooks.c.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/wiring.c.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/wiring_analog.c.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/wiring_digital.c.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/wiring_pulse.c.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/wiring_shift.c.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/CDC.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/HardwareSerial.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/HardwareSerial0.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/HardwareSerial1.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/HardwareSerial2.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/HardwareSerial3.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/IPAddress.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/PluggableUSB.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/Print.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/Stream.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/Tone.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/USBCore.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/WMath.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/WString.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/abi.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/main.cpp.o"
    "/usr/bin/avr-gcc-ar" rcs  "/tmp/arduino_build_26920/core/core.a" "/tmp/arduino_build_26920/core/new.cpp.o"
    Archiving built core (caching) in: /tmp/arduino_cache_784519/core/core_arduino_avr_uno_1621df717313d057c92202babd71649a.a
    

    I have even managed to get these files to compile from within a Rust build.rs.

    As of 2022-Jan, I have managed to wrap this up in a couple of crates: https://github.com/mutantbob/rust-arduino-helpers . It is very rough around the edges, partly because I am very new to embedded rust development, and partly because I am fairly new to Rust. The good news, is that I have used it with success at linking Rust programs with C++ libraries like Ethernet and Adafruit_NeoPixel.