andryuhat
andryuhat

Reputation: 45

gnu make. recompile unchanged files only

Help me with makefile, please. I want `make' to recompile only files that have been changed. Here is my makefile:

ROOT_DIR= ..
BUILD_TYPE= Release
BUILD_DIR= $(ROOT_DIR)/$(BUILD_TYPE)
O_DIR= $(BUILD_DIR)/obj

TARGETS= ftp_auto_backup sftp_auto_backup

CXX= g++
CXXFLAGS= -DBOOST_THREAD_USE_LIB -O3 -Wall -fmessage-length=0
FTP_LDFLAGS= -static-libstdc++ -static-libgcc -s -L $(ROOT_DIR)/lib/Release -l:libboost_thread-mgw46-mt-1_49.a -l:libcommon.a \
    -l:libfile.a -l:libfilesearcher.a -l:libftpclient.a -l:libftplib.a -l:libdbclient.a -l:libsqlite3.a -l:libscheduler.a -l:libws2_32.a
SFTP_LDFLAGS= -static-libstdc++ -static-libgcc -s -L $(ROOT_DIR)/lib/Release -l:libboost_thread-mgw46-mt-1_49.a -l:libcommon.a \
    -l:libfile.a -l:libfilesearcher.a -l:libdbclient.a -l:libsqlite3.a -l:libscheduler.a -l:libsftpclient.a -l:libws2_32.a -l:libssh.dll

OBJECTS= appconfig.o backuplauncher.o clientbackup.o main.o
LD_OBJECTS= $(addprefix $(O_DIR)/,$(OBJECTS))

all: init $(TARGETS)

debug: CXXFLAGS= -O0 -g3 -Wall -fmessage-length=0
debug: BUILD_TYPE= Debug
debug: all

init:
    @mkdir -p $(BUILD_DIR)
    @mkdir -p $(O_DIR)

ftp_auto_backup: set_type_ftp $(OBJECTS) 
    $(CXX) -o $(BUILD_DIR)/[email protected] $(LD_OBJECTS) $(FTP_LDFLAGS)

sftp_auto_backup: set_type_sftp $(OBJECTS)
    $(CXX) -o $(BUILD_DIR)/[email protected] $(LD_OBJECTS) $(SFTP_LDFLAGS)

set_type_ftp:
    $(eval CXXFLAGS+=-DPROJECT_TYPE=FTP)

set_type_sftp:
    $(eval CXXFLAGS+=-DPROJECT_TYPE=SFTP)

%.o: %.cpp
    $(CXX) -c $(CXXFLAGS) $< -o $(O_DIR)/$@

clean:
    rm -rf $(addprefix $(ROOT_DIR)/Release/obj/,$(OBJECTS)) $(addprefix $(ROOT_DIR)/Debug/obj/,$(OBJECTS))
    rm -rf $(addprefix $(ROOT_DIR)/Release/,$(addsuffix .exe,$(TARGETS))) $(addprefix $(ROOT_DIR)/Debug/,$(addsuffix .exe,$(TARGETS)))

Yes, I know about Generating Prerequisites Automatically, but should I really use it? Thanks in advance!

Upvotes: 1

Views: 271

Answers (2)

pmod
pmod

Reputation: 10997

I suppose that %.o : %.cpp is not enough, you should use VPATH to let know make where the sources are:

vpath %.cpp src

Upvotes: 0

Kristian
Kristian

Reputation: 486

Your targets depend on objects in the current directory, not in obj/. Change to this:

ftp_auto_backup: set_type_ftp $(LD_OBJECTS)
    $(CXX) -o $(BUILD_DIR)/[email protected] $(LD_OBJECTS) $(FTP_LDFLAGS)

sftp_auto_backup: set_type_sftp $(LD_OBJECTS)
    $(CXX) -o $(BUILD_DIR)/[email protected] $(LD_OBJECTS) $(SFTP_LDFLAGS)

# (...)

$(O_DIR)/%.o: %.cpp
    $(CXX) -c $(CXXFLAGS) $< -o $@

And yes, if you want your object files to recompile not only when you change the .cpp file, but also when you change the header (.h) files, you need to generate those prerequisites...

Upvotes: 3

Related Questions