Создание нескольких исполняемых файлов из одной базы кода - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь 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 компилирует его только один (но затем компилирует другие файлы из-за зависимостей, установленных между объектами, а не модулями).

Так какой же самый умный способ сделать это?

...