使用CMake + Ninja + Emacs

时间:2017-08-09 19:36:55

标签: cmake fortran ninja

我正在使用Emacs编写Fortran代码,使用Nakeja生成器编写CMake。如果我使用make作为生成器而不是Ninja,并且存在编码错误,则会收到类似

的错误消息
/home/raul/Projects/test/main.f90:54:9:

   my_cols = 1
     1
Error: Symbol ‘my_cols’ at (1) has no IMPLICIT type

Emacs报告源文件的正确位置以及行号和列号,以便我可以快速跳转到有问题的代码。另一方面,使用Ninja,返回的错误消息如下所示:

CMakeFiles/run.dir/main.f90-pp.f90:54:9:


         1
Error: Symbol ‘my_cols’ at (1) has no IMPLICIT type

我指出看起来像预处理的Fortran源文件,而不是原始源文件。行号和列号对应于原始文件,错误消息的内容略有不同(“1”以上的行已丢失)。这显然很烦人,因为我需要在原始文件中进行任何修复,而不是预处理的文件。有没有办法改变这种行为?我不确定这是否与Emacs,Ninja,Cmake或Fortran有关。

编辑。最小的例子。

# CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(test Fortran)
add_executable(main main.f90)

# main.f90
  implicit none
  a = 5
end program

有了gfortran,我得到了

[3/4] Building Fortran object CMakeFiles/main.dir/main.f90.o
FAILED: CMakeFiles/main.dir/main.f90.o 
/usr/bin/f95  -I../  -c CMakeFiles/main.dir/main.f90-pp.f90 -o CMakeFiles/main.dir/main.f90.o
CMakeFiles/main.dir/main.f90-pp.f90:2:3:

 # 1 "<built-in>"
   1
Error: Symbol ‘a’ at (1) has no IMPLICIT type
ninja: build stopped: subcommand failed.

有趣的是,使用英特尔Fortran编译器(ifort),我得到了

[3/4] Building Fortran object CMakeFiles/main.dir/main.f90.o
FAILED: CMakeFiles/main.dir/main.f90.o 
/opt/intel/compilers_and_libraries_2017.4.196/linux/bin/intel64/ifort  -I../  -c CMakeFiles/main.dir/main.f90-pp.f90 -o CMakeFiles/main.dir/main.f90.o
../main.f90(2): error #6404: This name does not have a type, and must have an explicit type.   [A]
  a = 5
--^
compilation aborted for CMakeFiles/main.dir/main.f90-pp.f90 (code 1)
ninja: build stopped: subcommand failed.

错误消息略有不同,现在它可以指向正确的位置。 (在一个包含多个子目录的更复杂的项目中,ifort也会出错。)

0 个答案:

没有答案