make-файл перестроить, даже если он в курсе - PullRequest
2 голосов
/ 31 октября 2019

Мой make-файл всегда пересобирается, не понимаю почему ..

Вот оно:

SRC =   $(DIR)/my_getnbr.c \
        $(DIR)/my_isneg.c \
        $(DIR)/my_putchar.c \

OBJ =   $(SRC:.c=.o)

DIR =   lib/my

LIB_DIR =   lib

NAME    =   libmy.a

MYH =   include/my.h

BUILD = ar rcs $(NAME) $(DIR)/*.o

MV =    mv $(NAME) $(LIB_DIR)

CP =    cp $(MYH) $(DIR)

all:    $(NAME)

$(NAME):    $(OBJ)
            $(BUILD)
            $(MV)
            $(CP)

clean:
    rm -f $(OBJ)

fclean:clean
    rm -f $(LIB_DIR)/$(NAME)

re: fclean all

.PHONY: fclean all re clean

Я добавил .PHONY, но он что-то меняет: (

Он всегда делает BUILD, MV and CP вызовы. Если я удаляю их из Makefile, он не будет перестраиваться, если он в курсе (только с .OBJ). Еще раз спасибо.

1 Ответ

5 голосов
/ 31 октября 2019

вы переходите libmy.a в каталог lib. в следующий раз, когда вы запустите make, он будет искать libmy.a, а поскольку он не существует, он будет собран.

make всегда будет искать цели (libmy.a в вашем случае) в текущем каталоге,поэтому, если вы перемещаете файл в другое место, make подумает, что файл не был создан.

Практическое правило таково: рецепт для цели всегда должен создавать файл, названный целью.

возможные решения:

  • не перемещать файл
  • квалифицировать имя цели с каталогом (NAME = lib/libmy.a) (возможно, самый простой в вашем случае)
  • createфиктивный файл вместо перемещенного файла для make, чтобы увидеть, что файл существует. но это сложно и склонно к недоразумениям, если не сделано хорошо.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...