[CMake] Unresolved symbol VerifyFortran with clang C compiler and xlf_r Fortran compiler
David Wootton
dwootton at us.ibm.com
Thu May 24 16:22:59 EDT 2018
I'm trying to build the lapack library I obtained from
http://www.netlib.org/lapack/lapack-3.8.0.tar.gz. using the clang C
compiler and the xlf Fortran compiler with cmake 3.11. I'm using a Power 9
Linux system running Red Hat 7
The default behavior for the xlf compiler is to mangle Fortran so the
external symbol name is folded to all lower case with no trailing '_', In
this case, VerifyFortran should be mangled tp verifyfortran.
When I attempt to build it, my build system issues these error messages
99 CMakeFiles/VerifyFortranC.dir/main.c.o: In function `main':
>>
100 /nfshome/drw/spack/spack/opt/spack/linux-rhel7-ppc64le/gcc-4.8.5/cm
ake-3.11.1-rcn6qgw6pldsuuk2gkijnn4dalajl4wr/share/cmake-3.11/Module
s/FortranCInterface/Verify/main.c:(.text+0x24): undefined
reference
to `VerifyFortran'
>> 101 clang-3.8: error: linker command failed with exit code 1
(use -
v to see invocation)
>> 102 gmake[3]: *** [VerifyFortranC] Error 1
103 gmake[3]: Leaving directory
`/tmp/drw/spack-staging/spack-stage
/spack-stage-h3S7X1/lapack-3.8.0/spack-build-static/CMakeFiles/Fort
ranCInterface/VerifyC'
where cmake is attempting to verify Fortran/C compatibility for this pair
of compilers.
I tried to track this down by extracting this tar file in a scratch
directory. The build process requires cmake to be invoked in a separate
drectory from the source code so I created a 'build' directory in the
parent directory where my lapack-3.8.0 source resided, cd to that directory
and ran the command 'cmake ../lapack-3.8.0 -DCBLAS=ON' I get these messages
cd /nfshome/drw/spack/lapack/build/CMakeFiles/FortranCInterface/VerifyC
&& /nfshome/drw/cmake/bin/cmake -E cmake_depends "Unix
Makefiles" /nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Verify /nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Verify /nfshome/drw/spack/lapack/build/CMakeFiles/FortranCInterface/VerifyC /nfshome/drw/spack/lapack/build/CMakeFiles/FortranCInterface/VerifyC /nfshome/drw/spack/lapack/build/CMakeFiles/FortranCInterface/VerifyC/CMakeFiles/VerifyFortranC.dir/DependInfo.cmake
Scanning dependencies of target VerifyFortranC
gmake[3]: Leaving directory
`/nfshome/drw/spack/lapack/build/CMakeFiles/FortranCInterface/VerifyC'
/bin/gmake -f CMakeFiles/VerifyFortranC.dir/build.make
CMakeFiles/VerifyFortranC.dir/build
gmake[3]: Entering directory
`/nfshome/drw/spack/lapack/build/CMakeFiles/FortranCInterface/VerifyC'
[ 60%] Building C object CMakeFiles/VerifyFortranC.dir/main.c.o
/opt/clang-coral/bin/clang
-I/nfshome/drw/spack/lapack/build/CMakeFiles/FortranCInterface/VerifyC -O3
-DNDEBUG -o CMakeFiles/VerifyFortranC.dir/main.c.o
-c /nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Verify/main.c
[ 80%] Building C object CMakeFiles/VerifyFortranC.dir/VerifyC.c.o
/opt/clang-coral/bin/clang
-I/nfshome/drw/spack/lapack/build/CMakeFiles/FortranCInterface/VerifyC -O3
-DNDEBUG -o CMakeFiles/VerifyFortranC.dir/VerifyC.c.o
-c /nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Verify/VerifyC.c
[100%] Linking C executable VerifyFortranC
/nfshome/drw/cmake/bin/cmake -E cmake_link_script
CMakeFiles/VerifyFortranC.dir/link.txt --verbose=1
/opt/clang-coral/bin/clang -O3 -DNDEBUG
CMakeFiles/VerifyFortranC.dir/main.c.o
CMakeFiles/VerifyFortranC.dir/VerifyC.c.o -o VerifyFortranC
-L/opt/ibm/xlsmp/5.1.0/lib -L/opt/ibm/xlmass/9.1.0/lib
-L/opt/ibm/xlf/16.1.0/lib libVerifyFortran.a -lxlf90_r -lxlopt -lxlomp_ser
-lxl -lxlfmath -ldl -lrt -lpthread -lm
CMakeFiles/VerifyFortranC.dir/main.c.o: In function `main':
/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Verify/main.c:(.text
+0x24): undefined reference to `VerifyFortran'
clang-3.8: error: linker command failed with exit code 1 (use -v to see
invocation)
gmake[3]: *** [VerifyFortranC] Error 1
gmake[3]: Leaving directory
`/nfshome/drw/spack/lapack/build/CMakeFiles/FortranCInterface/VerifyC'
gmake[2]: *** [CMakeFiles/VerifyFortranC.dir/all] Error 2
gmake[2]: Leaving directory
`/nfshome/drw/spack/lapack/build/CMakeFiles/FortranCInterface/VerifyC'
gmake[1]: *** [CMakeFiles/VerifyFortranC.dir/rule] Error 2
gmake[1]: Leaving directory
`/nfshome/drw/spack/lapack/build/CMakeFiles/FortranCInterface/VerifyC'
gmake: *** [VerifyFortranC] Error 2
I tried to figure out what's happening by running cmake with the
--trace-expand flag.
When I backtrack thru the log, I see these error messages related to
VerifyFortranC.
/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Detect.cmake
(24): unset(FortranCInterface_VERIFIED_C CACHE )
/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Detect.cmake
(25): unset(FortranCInterface_VERIFIED_CXX CACHE )
/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Detect.cmake
(27): set(_result )
/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Detect.cmake
(30): set(CMAKE_TRY_COMPILE_CONFIGURATION Release )
/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Detect.cmake
(31): try_compile
(FortranCInterface_COMPILED /nfshome/drw/spack/lapack/build/CMakeFiles/FortranCInterface /nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface
FortranCInterface FortranCInterface CMAKE_FLAGS -DCMAKE_C_FLAGS:STRING=
-DCMAKE_Fortran_FLAGS:STRING=-qfree -qthreaded -qhalt=e -qnosave
-qstrict=none -qfixed -DCMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
-DCMAKE_Fortran_FLAGS_RELEASE:STRING=-O OUTPUT_VARIABLE
FortranCInterface_OUTPUT )
/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Detect.cmake
(42): set(FortranCInterface_COMPILED FALSE )
/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Detect.cmake
(43): unset(FortranCInterface_COMPILED CACHE )
/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Detect.cmake
(46): if(FortranCInterface_COMPILED )
/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Detect.cmake
(54): else()
/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Detect.cmake
(55): set(_result Failed to compile )
/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Detect.cmake
(56): set(FortranCInterface_EXE )
/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Detect.cmake
(57): file
(APPEND /nfshome/drw/spack/lapack/build/CMakeFiles/CMakeError.log Fortran/C
interface test project failed with the following output:
Change Dir: /nfshome/drw/spack/lapack/build/CMakeFiles/FortranCInterface
Run Build Command:"/bin/gmake" "FortranCInterface"
Scanning dependencies of target myfort
[ 2%] Building Fortran object CMakeFiles/myfort.dir/my_module.f90.o
COMMAND LINE 1520-022 (W) The FREE option has been replaced by the option
FREE(F90).
"/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/my_module.f90",
line 1.0: 1515-005 (S) Continuation line is not permitted at beginning of
program or after INCLUDE, EJECT, @PROCESS statements or comment directive.
Line is ignored.
"/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/my_module.f90",
line 2.0: 1515-005 (S) Continuation line is not permitted at beginning of
program or after INCLUDE, EJECT, @PROCESS statements or comment directive.
Line is ignored.
"/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/my_module.f90",
line 3.0: 1515-005 (S) Continuation line is not permitted at beginning of
program or after INCLUDE, EJECT, @PROCESS statements or comment directive.
Line is ignored.
"/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/my_module.f90",
line 4.3: 1515-017 (S) Label contains characters that are not permitted.
Label is ignored.
"/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/my_module.f90",
line 7.3: 1515-017 (S) Label contains characters that are not permitted.
Label is ignored.
"/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/my_module.f90",
line 8.20: 1515-030 (E) END INTERFACE card is missing. One is assumed.
"/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/my_module.f90",
line 8.20: 1515-002 (S) END card is missing. One is assumed.
"/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/my_module.f90",
1515-002 (S) END card is missing. One is assumed.
** _main === End of Compilation 1 ===
1501-511 Compilation failed for file my_module.f90.
gmake[3]: *** [CMakeFiles/myfort.dir/my_module.f90.o] Error 1
gmake[2]: *** [CMakeFiles/myfort.dir/all] Error 2
gmake[1]: *** [CMakeFiles/FortranCInterface.dir/rule] Error 2
gmake: *** [FortranCInterface] Error 2
)
/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Detect.cmake
(63): set(FortranCInterface_SYMBOLS )
/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Detect.cmake
(64): if(FortranCInterface_EXE )
/nfshome/drw/cmake/share/cmake-3.11/Modules/FortranCInterface/Detect.cmake
(72): elseif(NOT _result )
These messages seem to result because the -qfixed flag is passed in the xlf
invocation, while my_module.f90 is written in free format, so based on
compiler options, the compiler error messages are legitimate.
My problem is that I don't know if VerifyFortranC is doing somthing that is
expected to fail and then recover from by alternate action or if something
is broken.
Can someone offer insight or resolution?
Thanks
Dave
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20180524/cce44fa1/attachment-0001.html>
More information about the CMake
mailing list