juztcode
juztcode

Reputation: 1355

using ifeq statement in makefile, missing separator even when indented with tab correctly

I was just practising with GNU make and I was trying to write a clean target, the make file is this:

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

now the part that is throwing up error is this:

.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

now, when I do make clean, it returns the following error:

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

What exactly am I doing wrong? Why isn't it working and what does the error mean?

Upvotes: 0

Views: 355

Answers (1)

MadScientist
MadScientist

Reputation: 100956

You have to have a space between the ifeq and the open paren.

You have other issues; for example there's no comma between words in the wildcard function, so you're literally asking it to look for the file ./output/main.out, (including the ,) exists.

Anyway, this is not needed because rm -rf foo is simply a no-op if foo doesn't exist... you don't need all this complexity.

Upvotes: 1

Related Questions