Я пытаюсь Meson/Ninja
делать то, что я обычно делаю в make
. У меня есть исходные файлы, перечисленные в переменной src
, одна из которых является программой prog.f90
с оператором call ROUTINE
, а препроцессор вставляет имена, подобные sub1, sub2...
, для различных исполняемых файлов тестов 1.x, 2.x...
. Нравится:
project('proj','fortran', version : '0')
flags = ['-cpp','-fmax-errors=3','-Wall','-fcheck=all','-fbacktrace','-Og', ...]
src = ['src/f1.f90', 'src/f2.f90', prog.f90, tools.f90, ...]
progs = [
['1.x', '-DROUTINE=sub1' ],
['2.x', '-DROUTINE=sub2' ],
['3.x', '-DROUTINE=sub3' ],
...
]
foreach p : progs
executable(p[0], src,fortran_args : flags + [p[1]])
endforeach
Это быстрее, чем использование make
, но Meson/Ninja
удается использовать все ядра примерно в течение 1 секунды при изменении определенного файла, в то время как make занимает 2 секунды, но в основном выполняется на одном ядре.
Кажется, что каждый исполняемый файл получает свой собственный каталог сборки, например build/1x@exe
и т. Д., Со всеми файлами .mod
и .o
, соответствующими src
. И при запуске ninja -v
кажется, что измененный файл компилируется столько раз, сколько есть исполняемых файлов. При этом make компилирует только его (но затем компилирует другие файлы из-за зависимостей, установленных между объектами, а не модулями).
Итак, как это сделать умнее?