[CMake] Toolchain file for TI in CMake 3.10: how do I override compiler options and specify tools?

Patrick Griffiths patrick.griffiths at gmail.com
Sat Feb 23 13:52:06 EST 2019


On Sat, Feb 23, 2019 at 12:49 AM Jason Heeris <jason.heeris at gmail.com>
wrote:

> I am trying to use CMake (3.10) to build an ANSI C project that may be
> compiled on PC with eg. GCC, but also needs to compile with Texas
> Instruments' compilers for their microprocessors. So I have about a million
> questions.
>
> According to[1] it seems like the way to do this is via a toolchain file.
> So I'm trying to write a toolchain file to use TI's compiler/linker/etc,
> which do not (always) take the same arguments as eg. GCC or Clang.
>
> Is there a complete list of tools I can override in a toolchain file?
> Specifically, I want to set the C compiler, C++ compiler, assembler and
> linker. I know about CMAKE_C(XX)_COMPILER, but what about the others? Are
> they documented anywhere? (I could guess, but I don't think that's wise.)
>
> As I mentioned, TI's tools aren't the same as GCC, so I need to pare back
> a lot of options and start from almost-scratch (there are some
> commonalities). Options like "-D" and "-I" are fine, which is good because
> then eg. target_include_directories() still works. But certain other flags
> are just going to cause errors. How do I completely remove all compile
> flags from the generated Makefiles and replace them with my own? I can do
> this:
>
> set(CMAKE_C_FLAGS ${MINIMAL_FLAGS} CACHE STRING "" FORCE)
> set(CMAKE_C_FLAGS_DEBUG ${MINIMAL_FLAGS} CACHE STRING "" FORCE)
> set(CMAKE_C_FLAGS_RELEASE ${MINIMAL_FLAGS} CACHE STRING "" FORCE)
> set(CMAKE_C_FLAGS_RELWITHDEBINFO ${MINIMAL_FLAGS} CACHE STRING "" FORCE)
> set(CMAKE_C_FLAGS_MINSIZEREL ${MINIMAL_FLAGS} CACHE STRING "" FORCE)
>
> But I *still* see flags in the generated makefiles that I didn't put there
> such as "--compile_only" and "--c_file=...". How do I get rid of these and
> specify what's correct for my toolchain? (Also, why do I need the CACHE
> STRING "" FORCE options? I pulled that out of various Stackoverflow posts
> but I have no idea why it's necessary. Is that documented? What about the
> configurations... where are they listed? Do I have them all?)
>
> (I keep asking "is this documented anywhere" because I like to provide
> references in code for future maintainers. I'm not trying to be unkind.
> Maybe once I know enough I can volunteer to write any missing docs myself.)
>
> How do I add default flags that involve the source file name eg. for a
> file "main.c" I want to have a C compiler flag "--some_option='main.x'"?
>
> Finally, this really seems like a lot of work despite the fact that
> toolchain files are (I thought) meant to be the way to define a different
> toolchain. It really feels like I'm swimming against the tide here. Is
> there another, more-CMake-ish way to accomplish what I'm trying to do?
>
> [1]
> https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/CrossCompiling
>
> Thanks for any help.
>
> - Jason
> --
>
>

I've written toolchain files for cross-compiling with gcc and/or clang, but
not for for proprietary compilers, but maybe this brain dump can help:

In addition to CMAKE_<LANG>_COMPILER, you'll probably need to look at:

CMAKE_<LANG>_FLAGS_INIT
CMAKE_<LANG>_FLAGS_DEBUG_INIT
etc ...

Sounds like you need to set them all explicitly since CMake doesn't know
anything about your toolchain out of the box. The configurations (debug,
release, etc) are handled by the variable naming. You should be able to set
exactly what you want.  CMake glues the various flag variables together so
you might need to experiment a little to see what the result is.

You might want to look at the CMAKE_TRY_COMPILE_* variable as it sounds
like you're compiling for baremetal or an RTOS.

Unfortunately, I think you're best best is  to dig through the
documentation and trial and error. The variables and toolchain sections
will be helpful:

https://cmake.org/cmake/help/v3.10/index.html

cmake has command line options you might find useful like --trace and
--debug-trycompile.

You can do make VERBOSE=1 to see what's executed.

FWIW, I suggest starting with a single .c file with an empty main. Once
that compiles, start adding complexity. Good luck.

HTH
Patrick
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20190223/72d0c0a7/attachment.html>


More information about the CMake mailing list