如何知道库是否存在或是否与 makefile 保持同步
How to know if a library exists or is up to date with makefile
这是我的 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 检查我的库是否已更新或存在,如果不是,则编译它(如对象和源代码),但当我这样做时,它只会争论关于循环规则并编译我的图书馆。
那我make的时候要写什么,只有我的库还没编译的时候才进$(LIB_PATH):
?
这是分层 Makefile 的常见问题。您不希望必须两次指定库依赖项(即,一次知道何时启动子生成文件,然后在子生成文件中再次实际构建目标)所以您只需调用子生成文件每次都让其判断是否需要重建
尝试:
.PHONY: $(LIB_PATH)
$(LIB_PATH):
[tab] $(MAKE) -C $(LIB_PATH) --no-print-directory
每次此 makefile 评估依赖于 $(LIB_PATH).
的目标时,这应该会导致在 $(LIB_PATH) 目录中生成 运行
.PHONY
适用于不真正代表文件的目标,例如 clean
。它只是将目标标记为 'stale',即使恰好存在具有该名称的文件并且是最新的。
这是我的 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 检查我的库是否已更新或存在,如果不是,则编译它(如对象和源代码),但当我这样做时,它只会争论关于循环规则并编译我的图书馆。
那我make的时候要写什么,只有我的库还没编译的时候才进$(LIB_PATH):
?
这是分层 Makefile 的常见问题。您不希望必须两次指定库依赖项(即,一次知道何时启动子生成文件,然后在子生成文件中再次实际构建目标)所以您只需调用子生成文件每次都让其判断是否需要重建
尝试:
.PHONY: $(LIB_PATH)
$(LIB_PATH):
[tab] $(MAKE) -C $(LIB_PATH) --no-print-directory
每次此 makefile 评估依赖于 $(LIB_PATH).
的目标时,这应该会导致在 $(LIB_PATH) 目录中生成 运行.PHONY
适用于不真正代表文件的目标,例如 clean
。它只是将目标标记为 'stale',即使恰好存在具有该名称的文件并且是最新的。