使用GNU make检查目录是否存在

时间:2012-09-02 19:25:12

标签: bash makefile

我将编译的所有目标文件转储到一个名为的单独目录中 objfiles

编译时我想检查目录objfiles是否存在 如果它不存在(表示整个项目的重新编译) 我想创建它。

这是我的Makefile并试图解决问题

    SHELL := /bin/zsh
    #All object files are dumped into OBJDIR
    OBJDIR=objfiles
    OBJECTS=$(OBJDIR)/main.o \
            $(OBJDIR)/printdata.o \
            #...
            #...

   COMPILER=nvcc -arch=sm_20

   exec: objdir_exist $(OBJECTS)
        $(COMPILER) $(OBJECTS) -o exec
        @printf "\nExecutable updated!\n\n"

    $(OBJDIR)/main.o: main.cu octree.h
        $(COMPILER) -c $< -o $@

    $(OBJDIR)/printdata.o: printdata.cu  
        $(COMPILER) -c $< -o $@
    ...    


    #Clean-up executables and object files
    .PHONY=clean objdir_exist
    clean:
        rm exec 
        rm -r $(OBJDIR)

    # Check for the existence of object files. 
    # If it does not exist, then create another object_file directory to dump data to.
    # If it exists do nothing
   objdir_exist: 
        if [ ! -d "$(OBJDIR)" ] then mkdir $(OBJDIR)  fi

我收到以下错误。

if [ ! -d "objfiles" ] then mkdir objfiles  fi
zsh:[:1: ']' expected
nvcc -arch=sm_20 -c main.cu -o objfiles/main.o
Assembler messages:
Fatal error: can't create objfiles/main.o: No such file or directory
make: *** [objfiles/main.o] Error 1

我哪里错了?

3 个答案:

答案 0 :(得分:5)

问题是因为当你在一行中写if时,你应该使用;作为行分隔符。

所以,替换

if [ ! -d "$(OBJDIR)" ] then mkdir $(OBJDIR)  fi

通过

if [ ! -d "$(OBJDIR)" ]; then mkdir $(OBJDIR);  fi

答案 1 :(得分:3)

更简单的是:

mkdir -p $(OBJDIR)

答案 2 :(得分:0)

我找到的解决方案就是这样的

BIN=exec
OBJSDIR=objs

all: $(OBJSDIR) $(BIN)

$(OBJSDIR):
    if [ ! -d $(OBJSDIR) ]; then mkdir $(OBJSDIR); fi

$(OBJSDIR)/obj1.o: obj1.c header1.h
    # $< expands only to first prerequisite
    $(COMPILER) -c $< -o $@

$(OBJSDIR)/obj2.o: obj2.c header2.h
    $(COMPILER) -c $< -o $@

$(BIN): $(OBJSDIR)/obj1.o $(OBJSDIR)/obj2.o
    # $^ expands to all prerequisites
    $(COMPILER) $^ -o $@

全部取决于$(OBJSDIR)和$(BIN)。如果$(OBJSDIR)不存在,则会创建它。然后继续检查$(BIN)并构建它,如果它不存在或其先决条件已经改变。