【问题标题】:How to get non-recursive list of directory contents with their paths in Makefile?如何获取目录内容的非递归列表及其在 Makefile 中的路径?
【发布时间】:2017-07-01 06:37:09
【问题描述】:

我的项目的目录结构如下:

我的 Makefile 看起来像这样:

dir1_contents = $(shell ls dir1/*)
dir3_contents = $(shell ls dir3/*)

all: clean_dir1 clean_dir3

clean_dir1:
    echo 'dir1_contents = $(dir1_contents)'

clean_dir3:
    echo 'dir3_contents = $(dir3_contents)'

当我运行 make 时,这是我得到的:

$ pwd
make-test

$ make -s
dir1_contents = dir1/file2.junk  dir1/dir2: file1.junk
dir3_contents = dir3/file3.junk

我想在dir1_contents 中获取dir1 的内容。但我不想要递归内容。只是在dir1 目录下的内容。我该怎么做?

如果我从 Makefile 的前两行中删除 /*,我会得到我想要的正确内容。但是他们错过了我也需要的路径:

$ pwd
make-test

$ make -s
dir1_contents = dir2 file2.junk
dir3_contents = file3.junk

如何通过我还需要的文件路径获得我想要的正确内容?

【问题讨论】:

标签: unix makefile ls


【解决方案1】:

您遇到的问题与ls 的工作方式有关,与GNU make 无关。如果你运行ls dir1/*,那么shell会在调用ls之前扩展通配符,所以这和运行是一样的:

ls dir1/dir2 dir1/file2.junk

而当你ls一个目录时,它默认显示目录的内容,所以输出是:

$ ls dir1/dir2 dir1/file2.junk
dir1/file2.junk

dir1/dir2:
file1.junk

(继续并在命令提示符下尝试此操作)。由于这就是 shell 打印的内容,所以这就是您返回的结果。

如果您只想查看目录而不是目录中的文件,可以在ls 命令中添加-d 选项:

$ ls -d dir1/dir2 dir1/file2.junk
dir1/file2.junk dir1/dir2

或者,在makefile中:

dir1_contents = $(shell ls -d dir1/*)
dir3_contents = $(shell ls -d dir3/*)

但是,无论如何,我认为这不是一个好方法。为什么不使用 GNU make 的内置 wildcard 函数呢?除了更容易理解之外,它还更便携、更高效(上述版本需要调用 shell 和 ls 程序)。我还建议你使用:= 而不是=,这样你就只执行一次通配符操作:

dir1_contents := $(wildcard dir1/*)
dir3_contents := $(wildcard dir3/*)

【讨论】:

猜你喜欢
  • 2021-11-20
  • 1970-01-01
  • 2011-10-10
  • 2012-04-23
  • 1970-01-01
  • 2014-11-22
  • 2023-01-12
  • 2017-04-03
  • 1970-01-01
相关资源
最近更新 更多