Cmake是否提供对IAR C编译器icc8051.exe的支持?

时间:2019-04-10 02:05:36

标签: cmake

我想将一个由IAR构建的微控制器C51项目转换为Cmake交叉编译项目。我的开发环境是Windows10。我编写了一个简单的C51程序(main.c)和工具链文件(icc8051.cmake)进行测试。

发生错误:

  

未将CMAKE_C_COMPILER_ARCHITECTURE_ID检测为“ AVR”或“ ARM”。这个   应该是自动的。

以下是我的cmd窗口内容:

C:\works\emakefun\test>cmake -G"NMake Makefiles" -DCMAKE_TOOLCHAIN_FILE=c:\application\cmake\share\cmake-3.14\Toolchains\icc8051.cmake
CMake Warning:
  No source or binary directory provided.  Both will be assumed to be the
  same as the current working directory, but note that this warning will
  become a fatal error in future CMake releases.


-- The C compiler identification is IAR
CMake Error at C:/application/cmake/share/cmake-3.14/Modules/Compiler/IAR-C.cmake:61 (message):
  CMAKE_C_COMPILER_ARCHITECTURE_ID not detected as "AVR" or "ARM".  This
  should be automatic.
Call Stack (most recent call first):
  C:/application/cmake/share/cmake-3.14/Modules/CMakeCInformation.cmake:25 (include)
  CMakeLists.txt:1 (project)


-- Configuring incomplete, errors occurred!
See also "C:/works/emakefun/test/CMakeFiles/CMakeOutput.log".

C:\works\emakefun\test>

以下是我的工具链文件icc8051.cmake

set (CMAKE_SYSTEM_NAME Generic)
set (CMAKE_C_COMPILER "C:/application/IAR Systems/Embedded Workbench 8.0/8051/bin/icc8051.exe")

我还扫描了文件IAR-C.cmake。似乎它仅提供对AVR和ARM的支持,但不提供对C51的支持。您可以通过以下链接浏览该文件的内容:https://github.com/Kitware/CMake/blob/master/Modules/Compiler/IAR-C.cmake

有任何提示吗?谢谢!

1 个答案:

答案 0 :(得分:0)

内置支持:

除了IAR-C.cmake中列出的体系结构之外,CMake不支持IAR,如果您想将CMake用于其他用途,则需要向CMake gitlab页面提交问题。我不确定是否有任何主要的CMake开发人员愿意花时间添加C51支持,因此除非您想自己做,否则它可能无法完成。

根据错误消息判断,您可能正在使用cmake的“较旧”版本。我使用的最后一个版本是3.14,当时它仅支持带有IAR的AVR和ARM。看来最新的IAR-C.cmake支持其他几种架构。错误消息(如果您查看链接到的文件的底部)应为 CMAKE_C_COMPILER_ARCHITECTURE_ID not detected. This should be automatic.较新的IAR模块代码位于CMake 3.15.0中,因此您应该从CMake网站获取最新版本。

添加支持:

我对IAR-CXX.cmake模块进行了一些更改以更好地支持AVR,但我认为这仍处于试验阶段。问题在于,IAR-AVR生成的二进制文件位于difficult to parse proprietary format中,编译器不支持特定的C ++标准(它使用embedded c++),并且命令行选项不支持。轻松映射到cmake的默认值。

我没有IAR 8051编译器,但我将列出我认为要进行的主要更改。因为这全部在模块文件夹的*.cmake文件中,所以您无需重新编译cmake ,它只会更改您现有的安装。当然,如果您能正常工作,则应提交拉取请求,并将其放入主线cmake!

您将需要:the IAR 8051 compiler guide,并在CMake安装中相对于C:\Program Files\CMake\share编辑以下文件:

  • cmake-3.15.0 \ Modules \ Compiler \ IAR-DetermineCompiler.cmake
  • cmake-3.15.0 \ Modules \ CMakePlatformId.h.in
  • cmake-3.15.0 \ Modules \ Compiler \ IAR-C.cmake

cmake-3.15.0 \ Modules \ Compiler \ IAR-DetermineCompiler.cmake

此文件定义了一些宏模板,这些宏模板在简单的C文件中编译。然后,CMake从产生的目标文件中转储字符串以读取这些宏并发现编译器信息。

编译器手册的第391页,您可以看到IAR 8051编译器定义了__IAR_SYSTEMS_ICC____VER____ICC8051__。大!前两个已经处理完毕,只需在第34行的|| defined(__ICC8051__)链的末尾添加#elif

cmake-3.15.0 \ Modules \ CMakePlatformId.h.in

该文件是模板的一部分,该模板是为配置测试而编译的文件的部分。从第155行开始,您可以看到所有IAR编译器宏都已定义。在173行上的# else /* unknown architecture */之前,您应该添加

# elif defined(__ICC8051__)
#  define ARCHITECTURE_ID "8051"

cmake-3.15.0 \ Modules \ Compiler \ IAR-C.cmake

C51编译器将需要在IAR-C.cmake中使用另一个elseif,例如:

# CMAKE_C_COMPILER_ARCHITECTURE_ID should be 8051 because of our edit in the template file
elseif("${CMAKE_C_COMPILER_ARCHITECTURE_ID}" STREQUAL "8051")
  # pretty sure 8051 IAR uses xlink? (compiler guide page 42)
  __compiler_iar_xlink(C)
  # after `C` the format is compiler version followed by default C standard
  # the compiler manual i found says the default version is C99, but I have no idea
  # what the compiler version is. 10.2 is the latest...
  __compiler_check_default_language_standard(C 10.2 99)
  # set to output extension you need, or remove if you want an .elf
  set(CMAKE_C_OUTPUT_EXTENSION ".r90")

尝试再次配置

这时,您可以尝试清除缓存并重新配置项目。 Cmake将使用我们刚刚更改的模块,如果幸运的话,它将可以使用。我在编写这些代码时都没有使用编译器,因此希望您可以使用需要采取的其他任何步骤来编辑我的答案。

其他建议

将行set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)添加到工具链文件中。这样可以防止cmake测试编译器尝试链接。嵌入式链接程序通常需要特殊的脚本,标志等才能起作用。这会导致配置步骤失败,并显示消息The C compiler ... is not able to compile a simple test program.

此外,如果您需要在工具链中设置一些标志以使编译器在基本级别上运行,请参考this answer