C Makefile中通配符函数的顺序是什么

C Makefile中通配符函数的顺序是什么,c,makefile,wildcard,C,Makefile,Wildcard,我创建了几个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*.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;
}
现在,我的问题是通配符的顺序是什么

$ make seq
test2.c test4.c test6.c test3.c test8.c test9.c test5.c test7.c
如果按字母顺序排列,它应该是“test2.ctest3.ctest4.c…”,但实际上是“test2.ctest4.ctest6.ctest3.ctest8.ctest9.ctest5.ctest7.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

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


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

如果您希望对值进行排序,请使用
排序
,如
$(sort$(wildcard*.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