【问题标题】:What is the sequence of wildcard function in MakefileMakefile中通配符函数的顺序是什么
【发布时间】:2021-01-14 05:16:37
【问题描述】:

我创建了几个 test*.c 文件

$ ls
Makefile  test2.c  test3.c  test4.c  test5.c  test6.c  test7.c  test8.c  test9.c

除了文件名和函数名之外,所有的 test*.c 都有相同的代码

$ cat test2.c
#include <stdio.h>

int test_2_()
{
        return 0;
}
$ cat test3.c
#include <stdio.h>

int test_3_()
{
        return 0;
}
$ cat test4.c
#include <stdio.h>

int test_4_()
{
        return 0;
}

Makefile 很简单,只是 echo $(src):

$ cat Makefile
src = $(wildcard *.c)
seq:
        @echo $(src)

现在,我的问题是通配符的顺序是什么

$ make seq
test2.c test4.c test6.c test3.c test8.c test9.c test5.c test7.c

如果按字母顺序排列,应该是“test2.c test3.c test4.c ...”,但实际上是“test2.c test4.c test6.c test3.c test8.c test9.c”测试5.c 测试7.c" 而且不遵循文件更新时间顺序

$ for i in `ls test*`;do echo $i;touch $i;sleep 1;done
test2.c
test3.c
test4.c
test5.c
test6.c
test7.c
test8.c
test9.c
$ make seq
test2.c test4.c test6.c test3.c test8.c test9.c test5.c test7.c

【问题讨论】:

  • 如果您希望它们排序,请使用sort,如$(sort $(wildcard *.c))

标签: c makefile wildcard


【解决方案1】:

在旧版本的 GNU make 中,wildcard 的结果是操作系统在读取目录时返回这些值的顺序。出于所有实际目的,该顺序是随机的。 实际上不是随机的:它有一个顺序,两次运行 make(没有其他更改)将返回相同的顺序。但是这个顺序并不容易预测:它取决于文件系统的类型和其他东西。对于大多数文件系统来说,顺序或多或少是文件创建(未更新)的顺序,但即使这样也并不总是确定,因为新文件可以重新使用已删除文件中的空槽。 p>

从 GNU make 4.3 开始,wildcard 函数保证以排序顺序(ASCII 顺序,IIRC)返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 2016-08-27
    • 2016-08-27
    • 2020-06-07
    相关资源
    最近更新 更多