GNU makefile如何以及何时引用字符串

his*_*amp 25 makefile gnu-make

如何以及何时在make文件中引用字符串?什么是最佳做法?

以下是引用方式吗?

$(warning  $(shell ls -ld "$(CURDIR)" ) )
Run Code Online (Sandbox Code Playgroud)

我熟悉Bash,你通常引用变量来允许嵌入空格.你是否在makefile中这样做?

我该如何使用字符串进行赋值语句?

vara := "$(CURDIR)"

varb := $(CURDIR)

varc := /home/me/source

vard := "/home/me/source"
Run Code Online (Sandbox Code Playgroud)

平等后的空间怎么样?

Mad*_*ist 29

你不应该因为make而引用任何东西.Make无法以任何方式理解或解析单引号或双引号字符.您在makefile中编写的每个引用字符都将保留为文字引用,并按原样传递给调用的命令.

因此,如果shell期望并且可以解释带引号的字符串,那么您应该使用引号.如果shell不期望或不会正确解释带引号的字符串,则不应使用引号.

在您的示例中,引号是否可接受取决于这些变量的使用方式.如上所述,make不会对引号做任何特殊操作,这意味着vard(例如)包含文字字符串"/home/me/source"(包括引号).

如果你以shell为你处理引号的方式使用该值,那么它很好:

all: ; echo $(vard)
Run Code Online (Sandbox Code Playgroud)

将打印/home/me/source(没有引号),因为shell解释它们.但是,如果您在make上下文中使用该变量,例如作为目标或先决条件:

all: $(vard)
$(vard): ; echo $@
Run Code Online (Sandbox Code Playgroud)

那么这是正确的,因为目标和前提是文字字符串"/home/me/source"(包括引号).

通常,最好不要在变量中使用文件名周围的引号,而是在make变量周围的配方中添加引号.当然,如果变量包含整个shell脚本,而不仅仅是文件名,那么您应该为脚本添加适当的引用.

  • 可能与OP的意图无关,但是其他用户可能会落在这里而不理解_make variables_之间的区别,比如`$(VARX)`和_shell variables_就像`$$ {VARZ}` - 注意双美元符号`$$ `当你想要将shell变量作为变量**传递给没有扩展的**时,它会用来区分它们_和so_那么你可能想要使用单引号,EG:传递`$ ORIGIN`到链接器,然后用单引号使用`cc -Wl,-rpath ='$$ {ORIGIN}'-shared -fPIC -Wall $(SRC)-o $(DIR)/ $(LIB)`来防止它扩展在壳中. (4认同)
  • 一个结果是_make_不能在文件名中保留空格。空格是列表分隔符,并且-如MadScientist所指出的-不可引用。_make_通常将这样的文件名分解成无用的片段。 (2认同)