2014-06-24 55 views
2

我有一個makefile,我希望能夠在更新它後執行。C makefile在makefile變更後沒有編譯

EXE = sensor log 
LDIR = lib 
CC = gcc 
CFLAGS = -Wall -c $(DEFINES) 
LFLAGS = -Wall -L./$(LDIR) -Wl,-rpath=./$(LDIR) 
CDFLAGS = -Wall -c -fPIC 
LDFLAGS = -Wall -shared 

DEFINES = -D SET_ID=20 

.SUFFIXES: 

all: sensor log 
debug: DEFINES += -DDEBUG 
debug: all 

$(EXE) : % : %.o $(LDIR)/liblist.so $(LDIR)/libtcpsocket.so 
    @echo "\n***** LINKING $< *****" 
    $(CC) $(LFLAGS) $< -llist -ltcpsocket -lpthread -lm -o [email protected] 

liblist libmyqueue libtcpsocket libsensor_db : % : $(LDIR)/%.so 

%.o : %.c %.check 
    @echo "\n***** COMPILING $< *****" 
    $(CC) $(CFLAGS) [email protected] $< 

$(LDIR)/lib%.so : %.c %.check 
    $(eval name = $(basename $<)) 
    @echo "\n***** COMPILING LIB $< *****" 
    $(CC) $(CDFLAGS) $< 
    mkdir -p $(LDIR) 
    @echo "\n***** LINKING LIB $< *****" 
    $(CC) $(LDFLAGS) $(name).o -o $(LDIR)/lib$(name).so 

.PHONY : clean clean-all *.check 

%.check : %.c 
    @echo "\n***** CPPCHECK $< *****" 
    cppcheck --enable=all $^ 

clean: 
    rm -f *.o $(EXE) *~ 

clean-all: clean 
    rm -rf $(LDIR) 

的問題是,我希望能夠有一個參數DEBUG或沒有(只是一個例子)進行編譯。但是,由於這些文件在上次編譯之間並沒有改變,所以只是告訴我沒有什麼可做的。我該如何解決這個問題?

而且,在一個MySQL文件的命令行編譯時,我通常使用$(mysql_config --cflags --libs)編譯它。但是,在makefile中這樣做會導致它變成綠色。我該怎麼做呢?

+0

這還不清楚。當makefile被修改時,或者當您使用上一次沒有使用的參數(例如'make DEBUG = true')執行它時,您是否希望Make重建對象? – Beta

回答

0

對於DEBUG參數,以最簡單的方法是在命令行添加的參數。您可以通過第一目標之前添加下一行做到這一點:

ifeq ($(DEBUG),1) 
DEFINES += -DDEBUG 
endif 

即使這樣,限制DEBUG參數只能在命令行:

ifeq ("$(origin DEBUG)", "command line") 
ifeq ($(DEBUG),1) 
DEFINES += -DDEBUG 
endif 
endif 

然後你只需要做這在調試模式下編譯:

$ make DEBUG=1 

對於MySQL的事情,只需要使用shell命令那樣:

CFLAGS := -Wall -c $(DEFINES) $(shell mysql_config --cflags --libs) 
+2

這沒有什麼幫助,問題在於,如果您執行'make'後跟'make DEBUG = 1',那麼源代碼將不會使用後一個命令重新構建 - 而且「修復」不是微不足道的。 – nos