Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
近似Fortran_编译器_ID CMake生成器表达式_Cmake_Fortran - Fatal编程技术网

近似Fortran_编译器_ID CMake生成器表达式

近似Fortran_编译器_ID CMake生成器表达式,cmake,fortran,Cmake,Fortran,我(试图)利用CMake的生成器表达式来支持基于Fortran项目编译器供应商的生成时间编译器标志配置 不幸的是,虽然相关描述了在C和C++项目中可能如何完成(参见 CyCuffeleRID ID/COD>和 CXXICOMPILRIGIDID/COD>逻辑表达式),但没有提到FORTRAN模拟。p> 我已确认没有Fortran\u编译器\u IDgenerator表达式,使用时会发出以下错误: CMake Error at CMakeLists.txt:<line number>

我(试图)利用CMake的生成器表达式来支持基于Fortran项目编译器供应商的生成时间编译器标志配置

不幸的是,虽然相关描述了在C和C++项目中可能如何完成(参见<代码> CyCuffeleRID ID/COD>和 CXXICOMPILRIGIDID/COD>逻辑表达式),但没有提到FORTRAN模拟。p> 我已确认没有

Fortran\u编译器\u ID
generator表达式,使用时会发出以下错误:

CMake Error at CMakeLists.txt:<line number> (target_compile_options):
  Error evaluating generator expression:

    $<Fortran_COMPILER_ID:GNU>

  Expression did not evaluate to a known generator expression
CMakeLists.txt上的CMake错误:(目标编译选项): 计算生成器表达式时出错: $ 表达式的计算结果不是已知的生成器表达式 对于Fortran项目,是否可以近似地描述这种行为

编辑:

所需行为的最小示例

cmake_minimum_required( VERSION 3.2 ) 

project( myProject LANGUAGES Fortran )

set( fortran_module_directory "${CMAKE_BINARY_DIR}/modules" CACHE PATH "directory for fortran modules" )
file( MAKE_DIRECTORY ${fortran_module_directory} ) 
set( CMAKE_Fortran_MODULE_DIRECTORY ${fortran_module_directory} )

set( myProject_GNU_DEBUG_flags "flag1" "flag2" )
set( myProject_GNU_RELEASE_flags "flag3" "flag4" )
set( myProject_Intel_DEBUG_flags "flag5" "flag6")
set( myProject_Intel_RELEASE_flags "flag7" "flag8" )
# other compilers    

add_library( myProject STATIC 
             ${CMAKE_CURRENT_SOURCE_DIR}/src/mySource.f90
             ${CMAKE_CURRENT_SOURCE_DIR}/src/myOtherSource.f90 )

target_include_directories( myProject PUBLIC ${fortran_module_directory} )

target_compile_options( njoy PRIVATE 
$<$<Fortran_COMPILER_ID:GNU>:
    $<$<CONFIG:Debug>:${myProject_GNU_DEBUG_flags}>>
    $<$<CONFIG:Release>:${myProject_GNU_RELEASE_flags}>>>
$<$<Fortran_COMPILER_ID:Intel>:
    $<$<CONFIG:Debug>:${myProject_Intel_DEBUG_flags}>>
    $<$<CONFIG:Release>:${myProject_Intel_RELEASE_flags}>>>
# other compilers
)
cmake_最低要求(3.2版)
项目(myProject语言Fortran)
设置(fortran_模块目录“${CMAKE_BINARY_DIR}/modules”CACHE PATH“fortran模块目录”)
文件(生成目录${fortran\u模块{u目录})
集合(CMAKE_Fortran_模块_目录${Fortran_模块_目录})
设置(myProject_GNU_调试_标志“flag1”和“flag2”)
设置(myProject_GNU_RELEASE_flags“flag3”和“flag4”)
设置(myProject_英特尔_调试_标志“flag5”和“flag6”)
设置(myProject\u英特尔发布\u标志“flag7”“flag8”)
#其他编译器
添加_库(myProject静态)
${CMAKE_CURRENT_SOURCE_DIR}/src/mySource.f90
${CMAKE_CURRENT_SOURCE_DIR}/src/myOtherSource.f90)
目标目录(myProject PUBLIC${fortran\u模块目录})
目标编译选项(njoy PRIVATE
$
$>>
$
$>>
#其他编译器
)
我从HDF5中找到了一种可行方法的灵感。 例如:

set (Fortran_COMPILER_ID CMAKE_Fortran_COMPILER_ID)

target_link_libraries(target PUBLIC
  $<$<STREQUAL:"${Fortran_COMPILER_ID}","GNU">:"-lgfortran">
  $<$<STREQUAL:"${Fortran_COMPILER_ID}","Intel">:"-lifcore">
  )
set(Fortran\u编译器\u ID CMAKE\u Fortran\u编译器\u ID)
目标链接库(目标公共
$
$
)

您能给出一个最低限度的工作示例吗?另外,您是否为cmake项目启用了Fortran?我比较变量CMAKE_Fortran_COMPILER_ID来设置标志。我的印象是,
CMAKE_Fortran_COMPILER_ID
变量是在配置时指定的,如果多配置生成器(例如Xcode或Visual Studio)切换其编译器,该变量保持不变。不是这样吗?好吧,我混淆了定义。我必须承认,我一次使用命令行cmake和configure来配置一个编译器。在cmake的源代码中,或者在文档或邮件列表中,没有Fortran_编译器_ID的痕迹。如果你真的想要这个,你必须问开发人员。最终,这也是我最终发明的。到目前为止,它还没有咬过我,但是我们很遗憾,在CMake,对于Fortran和C和C++没有同样的支持。