如何为CMake配置未知编译器并自定义Fortran预处理源文件后缀
如何为CMake配置未知编译器并自定义Fortran预处理源文件后缀
看起来你已经在为这个小众编译器折腾CMake配置了,前面搞定C/C++的编译链接规则已经很不容易,卡在Fortran预处理的后缀上确实有点头疼😅
核心问题是CMake默认给Fortran预处理后的源文件加了-pp.for后缀,而你的编译器不接受带-的后缀。解决这个问题其实很直接——CMake提供了专门的变量来控制这个后缀:CMAKE_Fortran_PREPROCESS_SOURCE_SUFFIX。
具体操作步骤
设置预处理后缀:在指定Fortran编译器之后(或者
project命令之前),直接设置这个变量为你的编译器能接受的后缀,比如改成.ppfor或者.pre.for:# 先指定你的自定义Fortran编译器路径 set(CMAKE_Fortran_COMPILER /path/to/your/fortran/compiler) # 设置预处理后的源文件后缀,替换掉默认的-pp.for set(CMAKE_Fortran_PREPROCESS_SOURCE_SUFFIX ".ppfor")配合自定义预处理规则:如果你已经自定义了
CMAKE_Fortran_PREPROCESS_SOURCE规则,只要规则里保留了<PREPROCESSED_SOURCE>这个占位符,CMake就会自动用你设置的新后缀生成预处理文件。比如你的自定义规则可能是这样的:set(CMAKE_Fortran_PREPROCESS_SOURCE "<CMAKE_Fortran_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -E <SOURCE> -o <PREPROCESSED_SOURCE>" )现在
<PREPROCESSED_SOURCE>就会以.ppfor为后缀生成,编译器就能正常识别了。
额外的自定义编译器小贴士
既然你在配置完全陌生的编译器,再分享几个实用的CMake变量,帮你覆盖更多特殊场景:
CMAKE_<LANG>_OUTPUT_EXTENSION:控制目标文件(比如.o/.obj)的后缀,如果你的编译器用特殊后缀可以调整CMAKE_EXECUTABLE_SUFFIX:控制最终生成的可执行文件后缀(比如Windows下的.exe,或者你的编译器要求的特殊后缀)- 自定义编译/链接规则时,尽量保留CMake自带的占位符(比如
<DEFINES>、<INCLUDES>、<FLAGS>),这样你用target_compile_definitions、target_include_directories这些现代CMake语法时,设置的参数还能正常传递给编译器,不用全手动硬编码
你前面已经搞定了C/C++的部分,现在加上这个后缀设置,应该就能顺利解决Fortran预处理的问题了。如果还有其他编译器的特殊要求,继续找对应的CMAKE_*变量调整就行,CMake的灵活性足够应对大部分小众编译器的需求。
备注:内容来源于stack exchange,提问作者通配符




