2014-06-24 87 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