最终,我尝试构建Apache QPID以在HPE NonStop OSS环境(NonStop系统上类似Posix的环境)中运行。最新版本的QPID使用cmake来构建,所以我首先需要让cmake为该环境工作。我之前的尝试试图直接在OSS中构建(我需要在尝试构建QPID之前先构建cmake),但我遇到了很多问题。最近,我尝试使用一组用于NonStop的交叉开发工具(编译器等)在Windows中构建。我已经下载了Windows版本的cmake 2.8(由QPID构建说明建议),并尝试使用X-dev工具为OSS构建QPID。
我遇到的一个大问题与cmake如何在早期测试编译器等事情有关。它将调用编译器从C(和/或C ++)源文件创建中间目标文件,然后它将调用编译器链接中间文件中的目标文件。似乎cmake更喜欢将.obj添加到文件名以创建中间对象文件名。在创建文件时(使用-o传递给编译器的名称),这对我的交叉编译器可以正常工作,但是为了链接目的传递此名称时不工作。这是CMakeError.log文件的一小部分输出(来自尝试构建cmake 2.8本身的OSS版本):
Determining if the C compiler works failed with the following output:
Change Dir: C:/Source/cmake-2.8.0/bld/CMakeFiles/CMakeTmp
Run Build Command:C:/cygwin/bin/make.exe "cmTryCompileExec/fast"
/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
make[1]: Entering directory '/cygdrive/c/Source/cmake-2.8.0/bld/CMakeFiles/CMakeTmp'
"C:/Program Files (x86)/CMake 2.8/bin/cmake.exe" -E cmake_progress_report C:/Source/cmake-2.8.0/bld/CMakeFiles/CMakeTmp/CMakeFiles 1
Building C object CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.obj
/cygdrive/c/NonStop/tndm_cmplrs-j20/usr/bin/c89.exe -o CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.obj -c C:/Source/cmake-2.8.0/bld/CMakeFiles/CMakeTmp/testCCompiler.c
Linking C executable cmTryCompileExec
/cygdrive/c/NonStop/tndm_cmplrs-j20/usr/bin/c89.exe "CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.obj" -o cmTryCompileExec
c89.exe: error: Invalid input file extension"CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.obj".
交叉编译器失败,因为要求中间对象文件使用.o作为扩展名,以确定它们是中间目标文件。没有办法让c89编译器将testCCompiler.c.obj识别为它知道如何处理的文件类型。
所以我一直在寻找(试图寻找当地专家,但我的组织中没有人知道cmake;还有很多谷歌搜索,但找不到答案)看看有没有办法让cmake到更改它用于这些类型的编译和测试的输出文件的名称。我找到了信息,然后在工具链文件中设置了CMAKE_C_OUTPUT_EXTENSION:
SET(CMAKE_C_OUTPUT_EXTENSION ".o")
但这没有任何区别。
如果我能找到一种方法让cmake创建名为testCCompiler.c.o而不是testCCompiler.c.obj的目标文件,那么c89交叉编译器就可以工作。
是否可以这样做?
更新:我已经设法弄清楚在工具链文件中设置CMAKE_C_OUTPUT_EXTENSION并没有帮助。这会在CMakeCInformation.cmake中被覆盖(取决于是否设置了UNIX)。我还追踪到在Platform / UnixPaths.cmake中UNIX被设置为true,它被各种Platform文件获得INCLUDEd。所以我创建了一个Modules / Platform / OSS.cmake文件,其中包含它来处理这个问题。我稍后可能需要/想要添加其他设置,因为我确定了更多应该设置为OSS环境特定值的编译器标志等。