Создавайте несколько исполняемых файлов из одной и той же кодовой базы

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

Итак, как это сделать умнее?


person Jonatan Öström    schedule 19.06.2019    source источник


Ответы (1)


Самый простой способ - сначала создать static_library() из всех других исходных файлов (т.е. всего, что не prog.f90) и добавить его в link_with kwarg вашего исполняемого файла.

В итоге получилось бы что-то вроде этого:

# Note that 'prog.f90' is no longer in here
src = files('src/f1.f90', 'src/f2.f90', 'tools.f90', ...)

# This is the static library which will only get compiled once
lib = static_library(src, fortran_args: flags)


progs = [
    ['1.x',   '-DROUTINE=sub1'    ],
    ['2.x',   '-DROUTINE=sub2'    ],
    ['3.x',   '-DROUTINE=sub3'    ],
    ...
]

foreach p : progs
    executable(p[0], 'prog.f90', fortran_args: flags + [p[1]], link_with: lib)
endforeach
person nielsdg    schedule 06.06.2020