代码之家  ›  专栏  ›  技术社区  ›  latiagertrutis

如何知道库是否存在或是否是makefile的最新版本

  •  4
  • latiagertrutis  · 技术社区  · 7 年前

    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)

    那么,当我做的时候,我应该写些什么呢 $(LIB_PATH): 只有在我的库还没有编译的时候?

    1 回复  |  直到 7 年前
        1
  •  2
  •   lockcmpxchg8b    7 年前

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

    尝试:

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

    这应该会导致每次此makefile评估依赖于$(LIB\u PATH)的目标时,make都在$(LIB\u PATH)目录中运行。

    .PHONY clean . 它只是将目标标记为“过时”,即使恰好存在具有该名称且是新的文件。