我正在尝试学习Make语法,我已指示它编译文件并正确执行此操作,当我告诉它执行shell命令以使用touch创建文件时,它不执行此操作,它不会返回错误表示有任何问题。
命令
HelloWorld: HelloWorld.c
gcc -o HelloWorld HelloWorld.c
FILES="$(shell touch > file1.txt)"
答案 0 :(得分:2)
正如已经指出的那样,您的语法是错误的。但是除此之外,您的Shell函数甚至都不会执行。
为什么不呢?因为在您的makefile中,您定义了一个包含shell变量调用的变量,但是您再也不会在任何地方使用了。由于不使用它,因此该变量永远不会扩展。由于该变量永远不会展开,因此永远不会调用其中的函数。
如果要扩展变量,则需要将其设置为简单变量(使用:=
),以便在分配变量时在右侧进行扩展,或者必须使用函数在立即扩展的情况下;另一个答案有一个使用它的示例(在任何变量分配之外)
以下是使用简单变量的示例:
HelloWorld: HelloWorld.c
gcc -o HelloWorld HelloWorld.c
FILES := $(shell touch file1.txt)
(请注意,设置makefile变量时不需要引号,与shell变量不同)。
至于该手册,它被写成一个用户指南:也就是说,您应该从头开始阅读它,而不是四处浏览的参考手册。特别是,在仔细阅读并完全理解开头两章“ Makefile简介”和“ Writing Makefiles”之前,您将无处编写Makefile。为了流利,您需要了解How make Reads a Makefile部分。
答案 1 :(得分:1)
我想你想要
$(shell touch file1.txt)
(请注意,那里没有>
重定向)。而且touch不会向stdout输出任何内容,因此FILES
不管如何都将为空白,因此分配是无用的。
如果要执行此类操作,请注意,$(shell ...)
命令(在全局范围内)在运行任何配方之前在解析时执行。
------------编辑-------------
关于您关于创建空白文件的问题:
all:
$(info output $(shell echo "hello world"))
$(shell touch file1.txt)
应生成您的文件:
> ls file1.txt; make; ls file1.txt
file1.txt
output hello world
make-3.81: Nothing to be done for `all'.
file1.txt