Unix 如何在Makefile中获取目录内容及其路径的非递归列表?
我的项目的目录结构如下: 我的Makefile如下所示:Unix 如何在Makefile中获取目录内容及其路径的非递归列表?,unix,makefile,ls,Unix,Makefile,Ls,我的项目的目录结构如下: 我的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)' 当我运行mak
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\u contents
中获取dir1
的内容。但我不想要递归内容。仅显示dir1
目录下的内容。我怎么做
如果我从Makefile的前两行中删除/*
,我就会得到想要的正确内容。但他们却迷失了方向,我也需要:
$ pwd
make-test
$ make -s
dir1_contents = dir2 file2.junk
dir3_contents = file3.junk
如何使用我需要的文件路径获得我想要的正确内容?您遇到的问题与
ls
的工作方式有关,与GNU make无关。如果运行ls dir1/*
,则shell会在调用ls
之前展开通配符,因此这与运行相同:
ls dir1/dir2 dir1/file2.junk
当您ls
a目录时,默认情况下会显示该目录的内容,因此输出为:
$ ls dir1/dir2 dir1/file2.junk
dir1/file2.junk
dir1/dir2:
file1.junk
(继续并在命令提示下尝试此操作)。因为这是贝壳的图案,这就是你得到的结果
如果只想查看目录而不想查看目录中的文件,可以将-d
选项添加到ls
命令:
$ 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的内置通配符功能呢?除了更易于理解之外,它还具有更高的可移植性和更高的效率(上面的版本需要调用shell和ls
程序)。我还建议您使用:=
而不是=
,以便只执行一次通配符操作:
dir1_contents := $(wildcard dir1/*)
dir3_contents := $(wildcard dir3/*)
您遇到的问题与
ls
的工作方式有关,与GNU make无关。如果运行ls dir1/*
,则shell会在调用ls
之前展开通配符,因此这与运行相同:
ls dir1/dir2 dir1/file2.junk
当您ls
a目录时,默认情况下会显示该目录的内容,因此输出为:
$ ls dir1/dir2 dir1/file2.junk
dir1/file2.junk
dir1/dir2:
file1.junk
(继续并在命令提示下尝试此操作)。因为这是贝壳的图案,这就是你得到的结果
如果只想查看目录而不想查看目录中的文件,可以将-d
选项添加到ls
命令:
$ 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的内置通配符功能呢?除了更易于理解之外,它还具有更高的可移植性和更高的效率(上面的版本需要调用shell和ls
程序)。我还建议您使用:=
而不是=
,以便只执行一次通配符操作:
dir1_contents := $(wildcard dir1/*)
dir3_contents := $(wildcard dir3/*)
dir1\u contents=dir1/$(shell ls dir1)
igagis,这不起作用:这个解决方案可以纠正:dir1\u contents=$(addprefix dir1/,$(shell ls dir1))
,但我还是稍微喜欢我的解决方案。这里的后续问题:dir1\u contents=dir1/$(shell ls dir1)
igagis,这不起作用:该解决方案可以更正:dir1\u contents=$(addprefix dir1/,$(shell ls dir1))
,但我仍然更喜欢我的解决方案。这里的后续问题:这里的后续问题:这里的后续问题: