2013-01-19 21 views
2

如何在生成文件中動態更改變量值? 我想根據宏的值調用特定的目標。更改生成文件中的變量值

對於如。

STATIC_LIB = TRUE 

all: makelib $(var) 

makelib: 
ifeq (${STATIC_LIB}, TRUE) 
    var=staticlib 
else 
    var=sharedlib 
endif 

這裏我想根據目標的值調用staticlib target或sharedlib target。

代碼:

.SUFFIXES: .cpp .hpp 

# Programs 
SHELL = bash 
CC  = g++ 
LD = ld 
RM = rm 
ECHO = /bin/echo 
CAT = cat 
PRINTF = printf 
SED = sed 
DOXYGEN = doxygen 
STATIC_LIB = TRUE 
###################################### 
# Project Name (generate executable with this name) 
TARGET = cs296_exe_28 

# Project Paths 
PROJECT_ROOT=$(HOME)/Desktop/cs296/cs296_base_code 
EXTERNAL_ROOT=$(PROJECT_ROOT)/external 
SRCDIR = $(PROJECT_ROOT)/src 
OBJDIR = $(PROJECT_ROOT)/myobjs 
BINDIR = $(PROJECT_ROOT)/mybins 
LIBDIR = $(PROJECT_ROOT)/mylibs 
DOCDIR = $(PROJECT_ROOT)/doc 

# Library Paths 
BOX2D_ROOT=$(EXTERNAL_ROOT) 
GLUI_ROOT=/usr 
GL_ROOT=/usr 

#Libraries 
LIBS = -lBox2D -lglui -lglut -lGLU -lGL 

# Compiler and Linker flags 
CPPFLAGS =-g -O3 -Wall 
CPPFLAGS+=-I $(BOX2D_ROOT)/include -I $(GLUI_ROOT)/include 
LDFLAGS+=-L $(BOX2D_ROOT)/lib -L $(GLUI_ROOT)/lib 

###################################### 

NO_COLOR=\e[0m 
OK_COLOR=\e[1;32m 
ERR_COLOR=\e[1;31m 
WARN_COLOR=\e[1;33m 
MESG_COLOR=\e[1;34m 
FILE_COLOR=\e[1;37m 

OK_STRING="[OK]" 
ERR_STRING="[ERRORS]" 
WARN_STRING="[WARNINGS]" 
OK_FMT="${OK_COLOR}%30s\n${NO_COLOR}" 
ERR_FMT="${ERR_COLOR}%30s\n${NO_COLOR}" 
WARN_FMT="${WARN_COLOR}%30s\n${NO_COLOR}" 
###################################### 

SRCS := $(wildcard $(SRCDIR)/*.cpp) 
INCS := $(wildcard $(SRCDIR)/*.hpp) 
OBJS := $(SRCS:$(SRCDIR)/%.cpp=$(OBJDIR)/%.o) 
OBJSNMAIN := $(filter-out $(OBJDIR)/main.o,$(OBJS)) 

.PHONY: all setup doc clean distclean 

ifndef STATIC_LIB 
makelib : sharedlib # line 5 
else ifeq (${STATIC_LIB}, TRUE) 
makelib : staticlib # line 7 
else 
makelib : sharedlib # line 9 
endif 


all: setup makelib exelib 

setup: 
    @$(ECHO) "Setting up compilation..." 
    @mkdir -p myobjs 
    @mkdir -p mybins 
    @mkdir -p mylibs 

$(BINDIR)/$(TARGET): $(OBJS) 
    @$(PRINTF) "$(MESG_COLOR)Building executable:$(NO_COLOR) $(FILE_COLOR) %16s$(NO_COLOR)" "$(notdir [email protected])" 
    @$(CC) -o [email protected] $(LDFLAGS) $(OBJS) $(LIBS) 2> temp.log || touch temp.err 
    @if test -e temp.err; \ 
    then $(PRINTF) $(ERR_FMT) $(ERR_STRING) && $(CAT) temp.log; \ 
    elif test -s temp.log; \ 
    then $(PRINTF) $(WARN_FMT) $(WARN_STRING) && $(CAT) temp.log; \ 
    else $(PRINTF) $(OK_FMT) $(OK_STRING); \ 
    fi; 
    @$(RM) -f temp.log temp.err 

-include $(OBJS:.o=.d) 

$(OBJS): $(OBJDIR)/%.o : $(SRCDIR)/%.cpp 
    @$(PRINTF) "$(MESG_COLOR)Compiling: $(NO_COLOR) $(FILE_COLOR) %25s$(NO_COLOR)" "$(notdir $<)" 
    @$(CC) $(CPPFLAGS) -c $< -o [email protected] -MD 2> temp.log || touch temp.err 
    @if test -e temp.err; \ 
    then $(PRINTF) $(ERR_FMT) $(ERR_STRING) && $(CAT) temp.log; \ 
    elif test -s temp.log; \ 
    then $(PRINTF) $(WARN_FMT) $(WARN_STRING) && $(CAT) temp.log; \ 
    else printf "${OK_COLOR}%30s\n${NO_COLOR}" "[OK]"; \ 
    fi; 
    @$(RM) -f temp.log temp.err 

exe: $(BINDIR)/$(TARGET) 

makelib: 
ifeq (${STATIC_LIB}, TRUE) 
LIB_TYPE = staticlib 
else 
LIB_TYPE = sharedlib 
endif 

staticlib: 
    @$(ECHO) "static" 
    @ar rcs $(LIBDIR)/libCS296.a $(OBJSNMAIN) 

sharedlib: 
    @$(ECHO) "shared" 
    @$(CC) -shared -o $(LIBDIR)/libCS296.so $(OBJSNMAIN) 

exelib: 
    $(CC) -L $(LIBDIR) $(LDFLAGS) -o cs296_exelib_28 $(OBJDIR)/main.o -lCS296 $(LIBS) 

doc: 
    @$(ECHO) -n "Generating Doxygen Documentation ... " 
    @$(RM) -rf doc/html 
    @$(DOXYGEN) $(DOCDIR)/Doxyfile 2 > /dev/null 
    @$(ECHO) "Done" 

clean: 
    @$(ECHO) -n "Cleaning up..." 
    @$(RM) -rf $(OBJDIR) *~ $(DEPS) $(SRCDIR)/*~ $(LIBDIR) 
    @$(ECHO) "Done" 

distclean: clean 
    @$(RM) -rf $(BINDIR) $(DOCDIR)/html 

回答

2

,你想出了自$(var)是行不通的解決方案將makelib之前評估執行。

你可以做的反而是有條件地定義makelib:

STATIC_LIB = TRUE 
all : makelib 

ifndef STATIC_LIB 
makelib : sharedlib # line 5 
else ifeq (${STATIC_LIB}, TRUE) 
makelib : staticlib # line 7 
else 
makelib : sharedlib # line 9 
endif 

ifndef條件指令從可能發生的情況下,沒有定義STATIC_LIB錯誤撲救。

+0

但是這不會工作,因爲makelib目標不存在。錯誤:無法完成所有 – Rajs123

+0

@rajlaxmisahu確保在您的makefile中對應於上述第5,7,9行的行中的「makelib」之前沒有空格或製表符。剪切並粘貼到可識別語法的編輯器可能會引入製表符。 –

+0

試過了。這是行不通的。應該是因爲所有人都會調用makelib,但是makelib不存在,因爲ifndef部分沒有執行。我甚至試圖使目標'一: IFNDEF STATIC_LIB makelib 其他IFEQ($ {} STATIC_LIB,TRUE) makelib:staticlib 其他 makelib:sharedlib endif'和調用所有:這亙古不變的工作 – Rajs123

2

您可以定義規則之前設置VAR值:

編輯,生成文件:

STATIC_LIB = TRUE 

ifeq (${STATIC_LIB}, TRUE) 
var=staticlib 
else 
var=sharedlib 
endif 

all: $(var) 

staticlib: 
    echo "staticlib" 

sharedlib: 
    echo "sharedlib" 

測試

輸出

echo "staticlib" 
staticlib 
+0

這不起作用,因爲var = staiclib/sharedlib在bash中執行,並且$(var)仍然爲空。我已經測試了這個 – Rajs123

+0

@rajlaxmi sahu你使用什麼版本? (make -v)。在GNU Make 3.81上它工作正常。但是..你說得對,賦值的var寫得不正確。現在它修復了。我的錯。 –

+0

是的,它可以工作,但不適用於我的文件。我正在上傳它。 – Rajs123