makefile не создает цели - PullRequest
       4

makefile не создает цели

1 голос
/ 25 апреля 2019

У меня есть make-файл, make-файл должен создавать несколько общих объектных файлов. Эти файлы будут модулями Python. У цели все есть модули как зависимости. Файлы swig wrappers (.cpp) создаются, как и следовало ожидать с помощью программы swig, .cpp компилируются как объектные файлы .o, однако модули не создаются.

Мой make-файл выглядит так:

CXXFLAGS        :=$(CXXFLAGS) -fpic $(PYTHON3_CFLAGS)
LDLIBS          :=$(LDLIBS) $(PYTHON3_LIBS)

SWIG=swig
SWIG_FLAGS:=-Wall -c++ -python #-DSWIG_TYPE_TABLE=fam #-external-runtime swigpyrun.h

IFACE_FILES += person.i
IFACE_FILES += parent.i
IFACE_FILES += child.i

WRAPPER_FILES = $(IFACE_FILES:.i=_wrap.cpp)
OBJS = $(WRAPPER_FILES:.cpp=.o)
MODULES = $(addprefix _, $(IFACE_FILES:.i=.so))

all:_person.so _child.so _parent.so #$(MODULES)

$(OBJS):$(WRAPPER_FILES)

$(MODULES):$(OBJS)

_%.so:%.cpp
    $(CXX) -shared -o $@ $<

%_wrap.cpp:%.i
    $(SWIG) $(SWIG_FLAGS) -o $@ $< 

clean:
    $(RM) $(WRAPPER_FILES)
    $(RM) $(OBJS)
    $(RM) $(MODULES)

Когда я запускаю его, я получаю:

$ make clean
rm -f person_wrap.cpp parent_wrap.cpp child_wrap.cpp
rm -f person_wrap.o parent_wrap.o child_wrap.o
rm -f _person.so _parent.so _child.so

$ make
swig -Wall -c++ -python  -o person_wrap.cpp person.i 
swig -Wall -c++ -python  -o parent_wrap.cpp parent.i 
swig -Wall -c++ -python  -o child_wrap.cpp child.i 
g++  -fpic `pkg-config --cflags python3`   -c -o person_wrap.o person_wrap.cpp
g++  -fpic `pkg-config --cflags python3`   -c -o parent_wrap.o parent_wrap.cpp
g++  -fpic `pkg-config --cflags python3`   -c -o child_wrap.o child_wrap.cpp

$ make
make: Nothing to be done for 'all'.

Так что я, должно быть, что-то делаю не так, поскольку файлы .so не создаются / не связаны между собой. Но чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Вы намереваетесь (я думаю), что трубопровод должен работать

person.i => person_wrap.cpp => person.o => _person.so

Но посмотрите на эти два правила:

$(MODULES):$(OBJS)

_%.so:%.cpp
    $(CXX) -shared -o $@ $<

Вы запрашиваете _person.so, второе правило может строить _person.so из person.cpp, , но нет person.cpp и нет способа его построить. Первое правило охватывает _person.so и имеет в качестве своих предварительных условий person_wrap.o parent_wrap.o child_wrap.o, который может быть собран , но не имеет команд, поэтому Make выполняет его - и ничего не делает.

Сложно проверить, но я думаю, что убрав правило $(MODULES) и сделав небольшое изменение:

_%.so:%_wrap.o
    $(CXX) -shared -o $@ $<

даст вам нужный эффект.

1 голос
/ 25 апреля 2019

Вы пытаетесь связать свой .so из своих файлов .cpp, но вам следует связать из своих .o файлов:

_%.so: wrap_%.o
    $(CXX) -shared -o $@ $<
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...