我想将一个由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
有任何提示吗?谢谢!
答案 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
编辑以下文件:
此文件定义了一些宏模板,这些宏模板在简单的C文件中编译。然后,CMake从产生的目标文件中转储字符串以读取这些宏并发现编译器信息。
编译器手册的第391页,您可以看到IAR 8051编译器定义了__IAR_SYSTEMS_ICC__
,__VER__
和__ICC8051__
。大!前两个已经处理完毕,只需在第34行的|| defined(__ICC8051__)
链的末尾添加#elif
。
该文件是模板的一部分,该模板是为配置测试而编译的文件的部分。从第155行开始,您可以看到所有IAR编译器宏都已定义。在173行上的# else /* unknown architecture */
之前,您应该添加
# elif defined(__ICC8051__)
# define ARCHITECTURE_ID "8051"
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。