Makefile FILES命令将不会执行

时间:2019-03-18 21:27:23

标签: makefile

我正在尝试学习Make语法,我已指示它编译文件并正确执行此操作,当我告诉它执行shell命令以使用touch创建文件时,它不执行此操作,它不会返回错误表示有任何问题。

命令

HelloWorld: HelloWorld.c
    gcc -o HelloWorld HelloWorld.c 

FILES="$(shell touch > file1.txt)"

2 个答案:

答案 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