Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > GNU toolchain > Makefile и не измененные файлы


Автор: AndryuhaT 19.4.2012, 22:01
всем привет! помогите с makefile'ом, пжлста. как заставить make компилировать только измененные файлы?
Код

ROOT_DIR= ..
SRC_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 $(LIB_DIR)/$@.exe $(LD_OBJECTS) $(FTP_LDFLAGS)

sftp_auto_backup: set_type_sftp $(OBJECTS)
    $(CXX) -o $(LIB_DIR)/$@.exe $(LD_OBJECTS) $(SFTP_LDFLAGS)

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

%.o: $(SRC_DIR)/%.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)))


Автор: boostcoder 19.4.2012, 22:08
RTFM: http://linux.yaroslavl.ru/docs/prog/gnu_make_3-79_russian_manual.html#SEC43

Автор: AndryuhaT 19.4.2012, 22:20
Цитата(boostcoder @ 19.4.2012,  21:08)
RTFM: http://linux.yaroslavl.ru/docs/prog/gnu_make_3-79_russian_manual.html#SEC43

ага, спс, но я уже сам нашел http://www.gnu.org/software/make/manual/make.html#Automatic-Prerequisites

Автор: AndryuhaT 20.4.2012, 00:33
boostcoder, как оказалось, приведенная выше ссылка ваще не в тему! "спасибо" за RTFM, но перед тем как постить ответ можно глянуть хоть краем глаза на код.

Автор: boostcoder 20.4.2012, 01:14
Цитата(AndryuhaT @  20.4.2012,  00:33 Найти цитируемый пост)
оказалось, приведенная выше ссылка ваще не в тему

оказалось, что вам удалось заставить обрабатываться список зависимостей, не генерируя список зависимостей! да вы "гений"! "удачи"!

Автор: AndryuhaT 20.4.2012, 01:40
Цитата(boostcoder @ 20.4.2012,  00:14)
Цитата(AndryuhaT @  20.4.2012,  00:33 Найти цитируемый пост)
оказалось, приведенная выше ссылка ваще не в тему

оказалось, что вам удалось заставить обрабатываться список зависимостей, не генерируя список зависимостей! да вы "гений"! "удачи"!

эх, еще раз, "мистер всезнайка",  причем здесь приведенная выше ссылка конкретно к моему примеру?

о, "взаимно"!)

Автор: boostcoder 20.4.2012, 01:43
попробуйте прочтите мой первый пост. глядишь - поможет.

Автор: AndryuhaT 20.4.2012, 01:46
Цитата(boostcoder @ 20.4.2012,  00:43)
попробуйте прочтите мой первый пост. глядишь - поможет.

еще раз - проблема была не в этом. но спасибо, что есть люди, которые действительно помогают решить траблу, а не строят из себя бог знает что..

Автор: AndryuhaT 20.4.2012, 02:16
boostcoder, поворчали и проехали ок?

кто что может сказать теперь по поводу следующей проблемы. итак имеется поправленный 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= $(O_DIR)/appconfig.o $(O_DIR)/backuplauncher.o $(O_DIR)/clientbackup.o $(O_DIR)/main.o

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)/$@.exe $(OBJECTS) $(FTP_LDFLAGS)

sftp_auto_backup: set_type_sftp $(OBJECTS)
    $(CXX) -o $(BUILD_DIR)/$@.exe $(OBJECTS) $(SFTP_LDFLAGS)

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

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

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



собственно в чем проблема: когда `make' вызывается с дефолтной целью, то все ок. но когда я вызываю `make debug', то implicit rule вызывается для BUILD_TYPE= Release. нагуглилось вот что: http://stackoverflow.com/questions/4069515/bug-in-gnu-make-target-specific-variables-are-not-expanded-in-implicit-rules. как красиво прикрутить решение к моему файлу подскажите, пжлста.

Добавлено через 11 минут и 28 секунд
всем спасибо, все решил.

Добавлено через 14 минут и 23 секунды
сам с собой блин поговорил  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)