Я пытаюсь 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 секунды, но в основном работает на 1ядро.
Кажется, что каждый исполняемый файл получает свой собственный каталог сборки, такой как build/1x@exe
и т. Д. Со всеми файлами .mod
и .o
, соответствующими src
.При запуске ninja -v
создается впечатление, что измененный файл компилируется столько раз, сколько существует исполняемых файлов.Между тем, make компилирует его только один (но затем компилирует другие файлы из-за зависимостей, установленных между объектами, а не модулями).
Так какой же самый умный способ сделать это?