【问题标题】:Build multiple executables from same code base从相同的代码库构建多个可执行文件
【发布时间】:2019-06-19 21:32:05
【问题描述】:

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

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

【问题讨论】:

    标签: fortran ninja meson-build


    【解决方案1】:

    最简单的方法是首先从所有其他源文件(即所有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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2016-04-28
      • 2020-04-12
      • 2022-08-23
      • 1970-01-01
      • 2011-11-30
      相关资源
      最近更新 更多