Я пытаюсь скомпилировать проект, над которым я недавно начал работать, и меня попросили скомпилировать код в clang вместо gcc. Существует файл CMake для проекта, и я попытался создать проект, используя
cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ../src
Однако возникает ошибка, которая, как я полагаю, заключается в том, что в clang нет компилятора Fortran, а часть проекта содержит код Fortran. Есть ли способ заставить его использовать gfortran (ранее использовался, когда используется gcc) при компиляции кода на Fortran, и clang / clang ++ для остальных?
Часть файла cmake, которая, на мой взгляд, важна:
enable_language(Fortran)
string(REGEX MATCH gfortran HAVE_GFORTRAN ${CMAKE_Fortran_COMPILER})
string(REGEX MATCH xlf HAVE_XLF ${CMAKE_Fortran_COMPILER})
string(REGEX MATCH pg77 HAVE_PG77 ${CMAKE_Fortran_COMPILER})
string(REGEX MATCH g77 HAVE_G77 ${CMAKE_Fortran_COMPILER})
string(REGEX MATCH ifort HAVE_ifORT ${CMAKE_Fortran_COMPILER})
string(REGEX MATCH f77 HAVE_F77 ${CMAKE_Fortran_COMPILER})
if(HAVE_GFORTRAN)
set(F_LIBRARY gfortran CACHE string "fortran library")
find_library(F_LIBRARY NAMES gfortran)
set(FORTRAN_UNDERSCORE end CACHE string "What type of fortran underscore style - linux,end,none")
set(DEF_FORTRAN_UNDERSCORE "#define FORTRAN_UNDERSCORE_END")
elseif(HAVE_XLF)
set(F_LIBRARY xlf90 CACHE string "fortran library")
find_library(F_LIBRARY NAMES xlf90)
set(FORTRAN_UNDERSCORE none CACHE string "What type of fortran underscore style - linux,end,none")
set(DEF_FORTRAN_UNDERSCORE "#define FORTRAN_UNDERSCORE_NONE")
elseif(HAVE_PGF77)
set(F_LIBRARY pgftnrtl CACHE string "fortran library")
find_library(F_LIBRARY NAMES pgftnrtl)
set(FORTRAN_UNDERSCORE end CACHE string "What type of fortran underscore style - linux,end,none")
set(DEF_FORTRAN_UNDERSCORE "#define FORTRAN_UNDERSCORE_END")
elseif(HAVE_G77)
set(F_LIBRARY g2c CACHE string "fortran library")
find_library(F_LIBRARY NAMES g2c)
set(FORTRAN_UNDERSCORE linux CACHE string "What type of fortran underscore style - linux,end,none")
set(DEF_FORTRAN_UNDERSCORE "#define FORTRAN_UNDERSCORE_LINUX")
elseif(HAVE_ifort)
set(F_LIBRARY ifcore CACHE string "fortran library")
find_library(F_LIBRARY NAMES ifcore)
set(FORTRAN_UNDERSCORE end CACHE string "What type of fortran underscore style - linux,end,none")
set(DEF_FORTRAN_UNDERSCORE "#define FORTRAN_UNDERSCORE_END")
elseif(HAVE_F77)
set(FORTRAN_UNDERSCORE end CACHE string "What type of fortran underscore style - linux,end,none")
set(FORTRAN_LIBRARY "" CACHE string "fortran library")
set(DEF_FORTRAN_UNDERSCORE "#define FORTRAN_UNDERSCORE_END")
endif()
# f77 on redstorm currently an exception - doesn't need it
if(NOT F_LIBRARY AND NOT HAVE_F77)
message(FATAL_ERROR "Cannot find fortran library")
endif(NOT F_LIBRARY AND NOT HAVE_F77)
Вывод терминала говорит, что это выдало ошибку, когда я попробовал cmake:
message(FATAL_ERROR "Cannot find fortran library")
Пожалуйста, дайте мне знать, если мне нужно больше информации. Спасибо заранее!
Чтобы не оставить вопрос открытым:
Переменная CMAKE_Fortran_COMPILER
должно быть установлено имя исполняемого файла компилятора (gfortran
) если cmake не может определить это автоматически.