[CMake] CMake 2.8.6 --> 2.8.8 New TryCompile Fails on GCC-GNAT Ada Linking
Matthew Schuchard
matthew.schuchard at gtri.gatech.edu
Mon Jul 2 10:22:38 EDT 2012
So I am back for more CMake fun in attempting to get it working with our
massive and convoluted product. I am now trying to use my office
computer to configure and build our software, and am hitting an issue
with the new TryCompile in CMake 2.8.8 (or possibly 2.8.7 if it was
introduced then).
My machine is running RedHat 6 which has GNU44 as baseline (as opposed
to earlier RHEL-5 which had GNU41 as baseline). Fortran, C, and C++ are
all working fine thus far with code changes I made, but I am hitting a
snag with Ada and CMake 2.8.8. We have a custom RPM made for CMake
2.8.6 RHEL-5 which interacted well with GNAT41, but I yum installed
CMake 2.8.8 and GCC-GNAT 4.4.6 and expected everything to still perform
the same (I am naive sometimes).
I am pretty sure this issue is because of a code change made to the
TryCompile behavior between CMake 2.8.6 and CMake 2.8.8. TryCompile now
creates unique directory names, i.e.
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CMakeFiles/cmTryCompileExec(RANDOMNUMBERSTRING).dir/(TRYCOMPILE
OUTPUT FILES)
I used the --debug-trycompile argument during configuration to get some
more information, and I see that the target name is being generated with
the random number string. This breaks both my custom Ada CMake
toolchain and the freely available one on the internet because both have
similar link statement methodologies (mine below):
"${CMAKE_Ada_BUILDER} <LINK_FLAGS> <TARGET_BASE>.adb -cargs <FLAGS>
-bargs ${CMAKE_Ada_BIND_FLAGS} -largs <CMAKE_Ada_LINK_FLAGS>
<LINK_LIBRARIES>"
This, of course, generates a link statement for TryCompile similar to
the following:
/usr/bin/gnatmake cmTryCompileExec162931069.adb -cargs
-gnatec/path/to/gnat.adc -g -Wall -bargs -largs -rdynamic
which obviously fails since the file is named cmTryCompileExec.adb.
This file is specified in my CMakeTestAdaCompiler.cmake via:
FILE(WRITE
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/cmTryCompileExec.adb
"with Ada.Text_IO;\n"
"use Ada.Text_IO;\n"
"procedure cmTryCompileExec is\n"
"begin\n"
"Put(\"Hello World\");\n"
"end cmTryCompileExec;\n")
<OBJECTS> does not work because it appends a ".o" extension to the
target. There is no way of getting around this either because
"SET(CMAKE_Ada_OUTPUT_EXTENSION .o)" and
"SET(CMAKE_Ada_OUTPUT_EXTENSION_REPLACE 1)" are both needed in the
compiler configuration input file. <TARGET> fails for the same reason as
<TARGET_BASE>.
I could always try to force the Ada ABI and then it skips the
compilation test (correct?), but i want to avoid that if at all possible.
So I basically need a way to block or strip off the random number string
from the target, or revert CMake's TryCompile behavior to the method
from 2.8.6. Eventually we will be updating the CMake and Redhat
versions we officially use, so I need to get Ada working with newer
versions of GNAT and CMake. If there is a clean way of fixing this that
does not involve hacking off the number string, so much the better.
I am out of ideas at this point and would welcome virtually any
suggestions. The only feasible idea I can think of is to loop through
the TryCompile directories and "sed" off the random number string from
the link.txt files for Ada, which sounds really ugly, but still would
probably work. Thank you for your attention.
More information about the CMake
mailing list