2014-06-24 4 views
2

업데이트 후 실행할 수있는 메이크 파일이 있습니다. 메이크 파일에서 메이크 파일이 변경된 후에 컴파일되지 않음

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 여부 (단지 예)로 컴파일 할 수 있도록하려는 것입니다. 그러나, 마지막 컴파일 사이에 파일 자체가 변경되지 않았기 때문에 make는 아무것도 할 필요가 없다는 것을 알려줍니다. 이 문제를 어떻게 해결할 수 있습니까?

또한 mysql 파일의 명령 줄에서 컴파일 할 때 나는 보통 $(mysql_config --cflags --libs)을 사용하여 컴파일합니다. 그러나 메이크 파일에서이 작업을 수행하면 녹색으로 바뀝니다. 어떻게해야합니까?

+0

이것은 분명하지 않습니다. makefile이 수정되었을 때 또는 이전에 사용하지 않은 매개 변수 (예 :'make DEBUG = true')를 사용하여 make를 실행할 때 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 명령을 사용

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

이것은 도움이되지 않습니다. 문제는'make' 다음에'make DEBUG = 1'이 나오면 소스 코드가 후자의 명령으로 다시 빌드되지 않을 것이고 간단하지 않은 '수정'입니다. – nos