GNU Создавать отчеты без правил при работе с целью в подкаталоге с источником из другого каталога - PullRequest
0 голосов
/ 31 декабря 2018

Каталог моего проекта монтируется через NFS.Из каталога, в котором он монтируется, я звоню make -f msh/Makefile cd=msh.(msh - это мое монтирование.) cd - это переменная в Makefile, которая предшествует исходным файлам.Это прекрасно работает с исходными файлами прямо под cd.Однако, если исходные файлы находятся в подкаталоге в пределах cd, Make завершается неудачно, говоря, что не существует правила для создания этой цели.Он не завершится ошибкой, если я вызову Make из моего монтирования.

Это мой Makefile.

CC?=gcc
CFLAGS:=-Wall -Werror -D_POSIX_C_SOURCE=200112L $(CFLAGS)

cd?=.

objects_nix=if/tty.o
objects:=sub.o if.o $(objects_nix)

ifdef SO
CFLAGS+=-fPIC

bin=libmsh.so
else
bin=libmsh.a
endif

.PHONY : clean

$(bin) :


libmsh.a : $(objects)
    $(AR) -r -c -s $@ $(objects)

libmsh.so : $(objects)
    @echo
    @echo If you have resumed compilation after not having used the SO flag,
    @echo you should run make clean.
    @echo
    $(LD) $(LDFLAGS) -shared -o $@ $(objects)

test : $(cd)/test.c $(bin)
ifdef SO
    $(CC) $(CFLAGS) -I$(cd) $(LDFLAGS) -L. -lmsh -Wl,-rpath,. -o $@ $(cd)/test.c
else
    $(CC) $(CFLAGS) -I$(cd) $(LDFLAGS) -o $@ $(cd)/test.c $(bin)
endif

%.o : $(cd)/%.c
    $(CC) $(CFLAGS) -c -o $@ $<

clean :
    rm -f libmsh.so libmsh.a
    rm -f $(objects)
    rm -f test.o test

Я попытался создать другое правило для подкаталога, и это работает.Но я бы хотел, чтобы он работал только с одним правилом.

1 Ответ

0 голосов
/ 31 декабря 2018

Вы сказали Make, как сделать файл .o из файла .c в $(cd).Он не знает, как создать файл .o, если файл .c находится в каком-либо другом каталоге.Это можно решить различными способами, например:

  • Добавить явное правило для всех каталогов.Вы уже сделали это.
  • Используйте VPATH .
  • Создайте Makefile для каждого каталога.
...