从同一代码库构建多个可执行文件



我正在尝试Meson/Ninja我在make中所做的一切。我在 src 变量中列出了源文件,其中一个是带有语句 call ROUTINE 的程序prog.f90,预处理器为不同的测试可执行文件插入1.x, 2.x... sub1, sub2...等名称。喜欢这个:

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 只编译它(但由于对象而不是模块之间的依赖关系,然后编译其他文件(。

那么,更聪明的方法是什么呢?

最简单的方法是首先从所有其他源文件(即prog.f90的所有内容(进行static_library(),并将其添加到可执行文件的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

相关内容

  • 没有找到相关文章

最新更新