如何知道库是否存在或是否与makefile保持同步

时间:2017-11-21 06:17:11

标签: c makefile static-libraries

这是我的Makefile:

NAME = fillit

FLAGS = -Wall -Wextra -Werror

LIB_NAME = libft.a

LIB_DIR = ../libft/

LIB_PATH = $(LIB_DIR)$(LIB_NAME)

OBJ_DIR_NAME = objects

OBJ_DIR = $(OBJ_DIR_NAME)/

HEADER_DIR = ../libft

SRC = main.c

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

all :
    mkdir -p $(OBJ_DIR_NAME)
    $(MAKE) $(NAME)

$(NAME) : $(OBJ) $(LIB_PATH) 
    gcc -o $(NAME) $(addprefix $(OBJ_DIR), $(OBJ)) -L$(LIB_DIR) -lft 

$(LIB_PATH) : $(LIB_PATH) 
    $(MAKE) -C $(LIB_DIR) --no-print-directory

%.o : %.c 
    gcc $(FLAGS) -I$(HEADER_DIR) -c $<
    mv $@ $(OBJ_DIR)

clean : 
    rm -f $(addprefix $(OBJ_DIR), $(OBJ))
    rm -rvf $(OBJ_DIR_NAME)

fclean : clean
    rm -f $(NAME)
    rm -f $(addprefix $(LIB_DIR), $(LIB_NAME))

re: fclean
    make

当我写$(LIB_PATH) : $(LIB_PATH)时,我希望我的Makefile检查我的lib是否已更新或存在,如果不是这种情况则编译它(如对象和源)但是当我确实只是争论圆形时规则并编译我的图书馆。

然后,当我做的时候我应该写什么,只有当我的库尚未编译时才进入$(LIB_PATH):

1 个答案:

答案 0 :(得分:0)

这是分层Makefile的常见问题。您不希望必须两次指定库依赖项(即,一次知道何时启动子makefile,再次在子makefile中实际构建目标),因此您只需要调用sub -makefile每次让它确定是否需要重建。

尝试:

.PHONY: $(LIB_PATH) 
$(LIB_PATH): 
[tab] $(MAKE) -C $(LIB_PATH) --no-print-directory

每次此makefile计算依赖于$(LIB_PATH)的目标时,这应该导致make在$(LIB_PATH)目录中运行。

.PHONY适用于并非真正代表文件的目标,例如clean。它只是将目标标记为“陈旧”。即使文件恰好存在于该名称并且是新鲜的。