Я обновляю некоторые Makefile, чтобы перейти от Make 3.81 до 3.82. В нескольких местах, оригинальный автор использовал что-то вроде этого, чтобы построить статическую LIBS:
all: lib$(library).a($objects)
Это, кажется, строить каждый файл .o в своей очереди, и вставьте его в .a используя ар:
g++ -O2 <snip> -o some_obj.o some_cpp.cpp
ar rv libsome_lib.a some_obj.o
etc...
Эта новая версия сделает, хотя, дроссели с:
*** No rule to make target 'libsome_lib.a()', needed by 'all'
Am I безопасно заменить этот ярлык с тем, как я привык делать это:
lib$(library).a: $(objects)
ar -rs lib$(library).a $objects
Спасибо.
EDIT
Похоже, мне нужно лучше Makefile образование. Вот большая выдержка из оригинального файла Makefile:
CXXFLAGS += -O2 -g -Wall -Wunused-parameter \
`pkg-config --cflags gthread-2.0 glibmm-2.4 gtkmm-2.4`
libs += `pkg-config --libs gthread-2.0 glibmm-2.4` -lc
%.d: %.cpp
$(SHELL) -ec '$(CXX) -M $(CPPFLAGS) $(CXXFLAGS) $< \
| sed '\''s/\($*\)\.o[ :]*/\1.o [email protected] : /g'\'' > [email protected]; \
[ -s [email protected] ] || rm -f [email protected]'
%.d: %.c
$(SHELL) -ec '$(CXX) -M $(CPPFLAGS) $(CXXFLAGS) $< \
| sed '\''s/\($*\)\.o[ :]*/\1.o [email protected] : /g'\'' > [email protected]; \
[ -s [email protected] ] || rm -f [email protected]'
from_sources = $(patsubst %.c,$(2),$(filter %.c, $(1))) $(patsubst %.cpp,$(2),$(filter %.cpp, $(1)))
sources = $(shell cat sources.inc)
objects = $(call from_sources,$(sources),%.o)
depends = $(call from_sources,$(sources),%.d)
library = some_lib
.PHONY: all clean fresh
all: lib$(library).a($(objects))
clean:
<SNIP>
if neq($(MAKECMDGOALS),clean)
include $(depends)
endif
Когда это работает под 3.81, я получаю все .d зависимости создали, а затем сделать начинается г ++ ТРАЕКТОРИЙ OBJ файлов. В 3.82, я получаю файлы .d, но нет .o и делает сбой с «*** Нет правила делать ...»
Для полноты, вы имеете в виду GNU Make? – beldaz 2010-12-16 03:38:25
@beldaz, да извините GNU Make. – Mark 2010-12-16 03:41:38
Предполагается, что это [функция вызова] (http://www.gnu.org/software/make/manual/make.html#Call-Function). Обратите внимание, что переменные типа = (в противоположность: = type) связывают последнее, заставляя это делать интересные вещи. Слишком умный для моего уставшего маленького мозга. – dmckee 2010-12-16 04:58:22