在makefile中使用ifeq语句,即使正确地用tab缩进,也缺少分隔符。

问题描述 投票:0回答:1

我只是在用GNU make练习,我想写一个 clean 目标,make文件是这样的。

includePath := -I $(CURDIR)
outputDir = $(CURDIR)/output
COMPILER := g++
standard := -std=c++17

#sourceFiles
main.cpp := main.cpp

#output files
binaryPath = $(outputDir)
binary = main.out
#int_binaryPath = intermediate binary
int_binaryPath = $(outputDir)/int_binaries
int_binary = main.o


GPP = $(COMPILER) $(standard) $(includePath)

#print info while make is executing
# $(info $(includeDir) ) 


VPATH = outputDir/int_binaries $(CURDIR)/glad/src


#build=compile,link and run

$(binary): $(int_binary) glad.c -lGL -lGLU -lglfw -ldl
    $(GPP) $(int_binaryPath)/main.o $(CURDIR)/glad/src/glad.c -o $(binaryPath)/$@  -lGL -lGLU -lglfw -ldl

$(int_binary): $(main.cpp)
    $(GPP) $(main.cpp) -c -o $(int_binaryPath)/$(int_binary)  

build: $(binary)
    $(binaryPath)/$(binary)

build@bg: $(binary)
    $(binaryPath)/$(binary) &

rebuild: clean build
    @echo "rebuild successful"


.PHONY: clean 
clean:
    ifeq($(wildcard $(outputDir)/$(binary)), $(outputDir)/$(binary))
        rm -rf $(outputDir)/$(binary)
    else ifeq($(wildcard $(outputDir)/$(int_binary)), $(outputDir)/$(int_binary))
        rm -rf $(outputDir)/$(int_binary)
    endif

现在出现错误的部分是这样的:

.PHONY: clean 
clean:
    ifeq($(wildcard $(outputDir)/$(binary)), $(outputDir)/$(binary)) #this has spaces, line 47
        rm -rf $(outputDir)/$(binary) #this has 2 tabs, but even 1 tab didn't work
    else ifeq($(wildcard $(outputDir)/$(int_binary)), $(outputDir)/$(int_binary))
        rm -rf $(outputDir)/$(int_binary)
    endif

现在,当我做 make clean,它返回以下错误。

makefile:47: *** missing separator.  Stop.  

我到底做错了什么?为什么不能用,这个错误是什么意思?

makefile
1个回答
1
投票

你必须在 ifeq 和开放的paren。

你还有其他的问题,比如在 "我的名字 "中,单词之间没有逗号。wildcard 函数,所以你实际上是让它去寻找 ./output/main.out, (包括 ,)存在。

无论如何,这是不需要的,因为 rm -rf foo 是根本不可能的,如果 foo 不存在... 你不需要这些复杂的东西。

© www.soinside.com 2019 - 2024. All rights reserved.