【问题标题】:How do I derive an executable name from a source file in Meson build?如何从 Meson 构建中的源文件派生可执行名称?
【发布时间】:2019-04-10 21:39:17
【问题描述】:

我正在尝试在 Meson 中创建一个单元测试目标列表,每个测试用例都从单个源文件构建。源文件在子目录中使用 files() 命令定义:

my_test_files = files(['test_foo.c','test_bar.c','test_baz.c'])

我想要在顶层构建中做这样的事情:

foreach t_file : my_test_files
    t_name = t.split('.')[0]
    test(t_name, executable(t_name, t_file, ...))
endforeach

我知道如果文件名是纯字符串,则可以这样做,但上述方法失败并出现“文件对象不可调用”错误。

是否有更“中音”的方式从源文件名派生可执行/测试名称?

【问题讨论】:

    标签: meson-build


    【解决方案1】:

    如果您将变量简单地定义为数组,它应该可以工作,例如:

    my_test_files = ['test_foo.c','test_bar.c','test_baz.c']
    

    循环保持不变,除了一些错字修正:

    foreach t_file : my_test_files
        t_name = t_file.split('.')[0]
        test(t_name, executable(t_name, t_file, ...))
    endforeach
    

    而不是构建文件对象数组。这是因为 executable() accepts input files in many forms: 作为文件对象(你试图这样做)和作为字符串或者源文件(应该被编译)或对象文件(被链接) - 由文件扩展名检测。

    为了获得更大的灵活性和更好的控制,可以使用数组数组(当然,它是可扩展的,并且可能包含生成测试所需的任何内容):

    foo_files = files('test_foo.c')
    bar_files = files('test_bar.c')
    baz_files = files('test_baz.c')
    
    test_files = [
      ['foo', foo_files, foo_deps],
      ['bar', bar_files, []],
      ['baz', baz_files, baz_deps]]
    
    foreach t : test_files
        test(t[0], executable(t[0], t[1], dependencies=t[2], ...))
    endforeach
    

    【讨论】:

    • 这会起作用,尽管我想使用“文件”命令(而不是纯字符串)的原因是为了保留路径。这些文件在每个子目录中定义,而可执行/测试规则在顶级文件中定义。我真正喜欢的功能是只读访问 File 对象的字符串部分(例如路径、名称、扩展名等)。
    • @user2059564 好的,数组也可以包含文件对象...查看我的更新
    • 您的方法很有意义,看起来是一个很好的折衷方案,尤其是因为我可以在 subdir 文件中进行字符串操作以生成外部数组。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2015-04-02
    • 2023-01-29
    • 2018-01-23
    • 2015-05-02
    • 2013-09-16
    相关资源
    最近更新 更多