lintkeilpc-lintpredefined-macro

Is there a way to export the predefined macros from a Keil build configuration?


Context:

I'm trying to automate some of the more mundane tasks in embedded development with Keil. The end result I'm aiming for is that clicking build in a Keil project will run a pre-build step that runs all the code through Uncrustify (a source code beautifier) to ensure it conforms to the company style-guide, and a post-build step which then runs the code through pc-lint (a static code analyser) to highlight any potentially unsafe code that it might find. I've written a PC utility that searches through the .uvproj file for the #define macros, the include paths and the file-paths all of which are needed for both tools and then modifies the pre and post-build user commands to call up my batch files which will manage both steps. The uncrustify part is working fine and the lint part is producing some sensible messages, but the signal-to-noise ratio isn't that great.

My problem:

Lint keeps on producing messages that seem to relate to macros that the Keil compiler is aware of, but that Lint isn't. I'm trying to find a way to plug that gap. I found a table of predefined macros documented on the Keil website, which seems like a good start, but rather than manually copying them into a static .lnt file, I'd like to find a way of grabbing the up-to-date values at the time the project gets built. This way, the "__ARMCC_VERSION" macro, for instance, would be updated whenever the developer updates his/her Keil compiler, rather than being stuck at a point in time whenever I manually copied it.

I'd love it if someone can answer my question directly, but I'd be equally pleased if someone has a viable suggestion for a more straightforward alternative approach I could try instead. Many thanks!


Solution

  • I am assuming you're using the Keil ARM Compiler.

    From the Compiler User Guide:

    To list macros that are defined on the command line, predefined by the compiler, and found in header and source files, use --list_macros with a non-empty source file.

    To list only macros predefined by the compiler and specified on the command line, use --list_macros with an empty source file.

    EDIT:

    It looks like your SDK also adds a few macros.

    From the µVision User's Guide:

    The following control strings are added, depending on the use of MDK:

    __UVISION_VERSION:

    Major and minor version of µVision. For example: -D__UVISION_VERSION="520".

    RTE:

    Set when RTE is in use. For example: -D_RTE_.

    __RTX:

    Set when RTX Kernel has been selected in Options for Target - Target - Operation System. Not set when using RTE. For example: -D__RTX.

    __MICORLIB:

    Set when Use MicroLIB has been enabled in Options for Target - Target. For example: -D__MICROLIB.

    __EVAL:

    µVision runs in evaluation mode. License MDK-Lite. For example: -D__EVAL.

    device header name:

    Device header name.