Я обновляю некоторые Makefiles, чтобы перейти от Make 3.81 к 3.82. Во многих местах автор использовал нечто подобное для создания статических библиотек:
all: lib$(library).a($objects)
Кажется, что каждый файл .o строится по очереди и вставляется в .a, используя ar:
g++ -O2 <snip> -o some_obj.o some_cpp.cpp
ar rv libsome_lib.a some_obj.o
etc...
Эта новая версия make, тем не менее, задыхается от:
*** No rule to make target 'libsome_lib.a()', needed by 'all'
Могу ли я заменить этот ярлык тем способом, которым я привык к этому:
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 $@ : /g'\'' > $@; \
[ -s $@ ] || rm -f $@'
%.d: %.c
$(SHELL) -ec '$(CXX) -M $(CPPFLAGS) $(CXXFLAGS) $< \
| sed '\''s/\($*\)\.o[ :]*/\1.o $@ : /g'\'' > $@; \
[ -s $@ ] || rm -f $@'
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, затем make начинает g ++ с помощью файлов obj. В 3.82 я получаю файлы .d, но не .o, и make завершается неудачно с "*** Нет правил для создания ..."