NXP’s Eclipse-based MCUXpresso IDE is the easiest way to make full use of the
hardware debugging features of modern NXP micro controllers such as the i.MX
RT1060
found on the NXP i.MX RT1060 Evaluation Kit
(MIMXRT1060-EVK
),
which I use for Teensy 4 development.
For projects that are fully under your control, such as imported SDK examples, or anything you created within Eclipse, you wouldn’t necessarily need Compilation Database support.
When working with projects of type Makefile Project with Existing Code
,
however, Eclipse doesn’t know about preprocessor definition flags and include
directories, unless you would manually duplicate them. In large and
fast-changing projects, this is not an option.
The lack of compiler configuration knowledge (defines and include directories)
breaks various C/C++ tooling features, such as Macro Expansion or the Open Declaration
feature, both of which are an essential tool in my toolbelt, and
particularly useful in large code bases such as micro controller projects with
various SDKs etc.
In some configurations, Eclipse might be able to parse GCC build output, but
when I was working with the QMK keyboard firmware, I couldn’t
get the QMK makefiles to print commands that Eclipse would understand, not even
with VERBOSE=true
.
Luckily, there is a solution! Eclipse CDT 9.10 introduced Compilation Database support in 2019. MCUXpresso v11.3.0 ships with CDT 9.11.1.202006011430, meaning it does contain Compilation Database support.
In case you want to check which version your installed IDE has, open Help
→
About MCUXpresso IDE
, click Installation Details
, open the Features
tab,
then locate the Eclipse CDT
, C/C++ Development Platform
line.
For comparison, Eclipse IDE 2021-03 contains 10.2.0.202103011047, if you want to verify that the issues I reference below are indeed fixed.
Bug: command vs. arguments
Before we can enable Compilation Database support, we need to ensure we have a
compatible compile_commands.json
database file. Eclipse CDT’s Compilation
Database support before version CDT 10 suffered from Bug
563006: it only
understood the command
JSON property, not the arguments
property.
Depending on your build system, this isn’t a problem. For example, Meson/ninja’s
compile_commands.json
uses command
and will work fine.
But, when using Make with Bear, you will end
up with arguments
by default.
Bear 3.0 allows generating a compile_commands.json
Compilation Database with
command
, but requires multiple commands and config
files,
which is a bit inconvenient with Eclipse.
So, let’s put the extra commands into a commandbear.sh
script:
#!/bin/sh
set -eux
intercept --output commands.json -- "$@"
citnames \
--input commands.json \
--output compile_commands.json \
--config config.json
The "command_as_array": false
option goes into config.json
:
{
"compilation": {
},
"output": {
"content": {
"include_only_existing_source": true
},
"format": {
"command_as_array": false,
"drop_output_field": false
}
}
}
Don’t forget to make the script executable:
chmod +x commandbear.sh
Then configure Eclipse to use the commandbear.sh
script to build:
- Open Project Properties by right-clicking your project in the Project Explorer panel.
- Select
C/C++ Build
and open theBuilder Settings
tab - In the
Builder
group, set theBuild command
text field to:${workspace_loc:/qmk_firmware}/commandbear.sh make -j16
Verify your build is working by selecting Project
→ Clean…
and triggering a
build.
Enabling Compilation Database support
- Open Project Properties by right-clicking your project in the Project Explorer panel.
- Expand
C/C++ General
, selectPreprocessor Include Paths, Macros etc.
and open theProviders
tab. - Untick everything but:
- MCU GCC Built-in Compiler Parser
- MCU GCC Build Output Parser
- Compilation Database Parser
- Select
Compilation Database Parser
, clickApply
to make the Compilation Database text field editable. - Put a full path to your compile_commands.json file into the text field,
e.g.
/home/michael/kinx/workspace/qmk_firmware/compile_commands.json
. Note that variables will not be expanded! Support for using variables was added later in Bug 559186. - Select
MCU GCC Build Output Parser
asBuild parser
. - Tick the
Exclude files not in the Compilation Database
checkbox. - Click
Apply and Close
.
You will know Compilation Database support works when its progress view shows up:
If you have an incompatible or empty compile_commands.json
, nothing visible
will happen (no progress indicator or error messages).
After indexing completes, you should see:
- Files that were not used as greyed out in the
Project Explorer
Open Declaration
in the context menu of a selected identifier (orF3
) should jump to the correct file. For example, my test sequence for this feature in the QMK repository is:- in
tmk_core/protocol/chibios/main.c
, openinit_usb_driver
- open
usbStart
, should bring uplib/chibios
git submodule - open
usb_lld_start
, should bring upMIMXRT1062
port
- in
- Macros expanded correctly, e.g.
MIMXRT1062_USB_USE_USB1
in the following example
Slow file exclusion in projects with many files
Bug 565457 explains an optimization in the algorithm used to generate the list of excluded paths, which I would summarize as “use whole directories instead of individual files”.
This optimization was introduced later, so in MCUXpresso v11.3, we still have to endure watching the slow algorithm for a few seconds:
Conclusion
NXP, please release a new MCUXpresso IDE with a more recent CDT version!
The improvements in the newer version would make the setup so much simpler.
I run a blog since 2005, spreading knowledge and experience for almost 20 years! :)
If you want to support my work, you can buy me a coffee.
Thank you for your support! ❤️