[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