[英]How to get a loading animation in a Makefile for the time .o files are compiling?
只要 Makefile 編譯 my.o 文件,我就想得到一點加載 animation 我看到加載 animation 在 [|]、[/]、[-]、[] 之間切換,這就是我現在想要實現的。
我試圖通過使用 printf 一個 Make 變量和一些 ifeq 和其他 ifeq 條件來實現這一點,但不知何故這並沒有奏效,在第一次調用 $(OBJDIR)/%.o: 規則后僅檢查一次 if 條件
我期望的是,每次調用 $(OBJDIR)/%.o: 規則時加載框的階段都會切換,或者如果有一個簡單的解決方案,則以某種方式基於時間,但我認為它太復雜了,所以我會堅持第一個現在
這也是我第一次在這里提問,請耐心等待並告訴我如何改進我的問題
那是 makefile
# **************************************************************************** #
# #
# ::: :::::::: #
# Makefile :+: :+: :+: #
# +:+ +:+ +:+ #
# By: pharbst <pharbst@student.42heilbronn.de +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2022/05/06 09:33:42 by pharbst #+# #+# #
# Updated: 2022/11/29 03:29:26 by pharbst ### ########.fr #
# #
# **************************************************************************** #
SHELL= /bin/bash
Black = $(shell echo -e "\033[0;30m")
FBlack = $(shell echo -e "\033[1;30m")
Red = $(shell echo -e "\033[0;31m")
FRed = $(shell echo -e "\033[1;31m")
Green = $(shell echo -e "\033[0;32m")
FGreen = $(shell echo -e "\033[1;32m")
Brown/Orange = $(shell echo -e "\033[0;33m")
FBrown/Orange = $(shell echo -e "\033[1;33m")
FYellow = $(shell echo -e "\033[1;33m")
Yellow = $(shell echo -e "\033[0;33m")
Blue = $(shell echo -e "\033[0;34m")
FBlue = $(shell echo -e "\033[1;34m")
Purple = $(shell echo -e "\033[0;35m")
FPurple = $(shell echo -e "\033[1;35m")
Cyan = $(shell echo -e "\033[0;36m")
FCyan = $(shell echo -e "\033[1;36m")
FWhite = $(shell echo -e "\033[1;37m")
White = $(shell echo -e "\033[0;37m")
RESET = $(shell echo -e "\033[0m")
TICK = $(shell echo -e "\xE2\x9C\x94")
PRONAME = libftio
NAME = libftio.a
CC = cc
CFLAGS = -Wall -Wextra -Werror -I includes -g
HEADER = ./includes/libftio.h
SRCDIR = ./src
OBJDIR = ./obj
FILES = ft_atoi.c \
ft_bzero.c \
ft_calloc.c \
ft_isalnum.c \
ft_isalpha.c \
ft_isascii.c \
ft_isdigit.c \
ft_isprint.c \
ft_memchr.c \
ft_memcmp.c \
ft_memcpy.c \
ft_memmove.c \
ft_memset.c \
ft_strchr.c \
ft_strlcat.c \
ft_strlcpy.c \
ft_strlen.c \
ft_strncmp.c \
ft_strnstr.c \
ft_strrchr.c \
ft_tolower.c \
ft_toupper.c \
ft_itoa.c \
ft_putchar_fd.c \
ft_putendl_fd.c \
ft_putnbr_fd.c \
ft_putstr_fd.c \
ft_split.c \
ft_strdup.c \
ft_strjoin.c \
ft_strtrim.c \
ft_substr.c \
ft_strmapi.c \
ft_striteri.c \
\
ft_lstnew.c \
ft_lstadd_front.c \
ft_lstsize.c \
ft_lstlast.c \
ft_lstadd_back.c \
ft_lstdelone.c \
ft_lstclear.c \
ft_lstiter.c \
ft_lstmap.c \
\
ft_bufferjoin.c \
ft_buffinit.c \
ft_chartostr.c \
ft_itohex.c \
ft_ptrtohex.c \
ft_strjoinchar.c \
ft_strjoinfree.c \
ft_strlower.c \
ft_strupper.c \
ft_uitoa.c \
ft_printf.c \
ft_printf_helper.c \
get_next_line.c \
ft_strcmp.c \
ft_free_split.c \
OBJS = $(addprefix $(OBJDIR)/, $(FILES:.c=.o))
OBJ_FLAG = 0
all: $(NAME)
$(NAME): header obj_header $(OBJS) linking_header
@ar rcs $(NAME) $(OBJS)
@printf "\b\b\b$(FGreen)[$(TICK)]\n$(RESET)"
$(OBJDIR)/%.o: $(SRCDIR)/*/%.c
@mkdir -p $(OBJDIR)
@$(CC) $(CFLAGS) -o $@ -c $<
ifeq ($(OBJ_FLAG), 0)
@printf "\b\b\]"
@OBJ_FLAG=1
else ifeq ($(OBJ_FLAG), 1)
@printf "\b\b|]"
@OBJ_FLAG=2
else ifeq ($(OBJ_FLAG), 2)
@printf "\b\b/]"
@OBJ_FLAG=3
else ifeq ($(OBJ_FLAG), 3)
@printf "\b\b-]"
@OBJ_FLAG=0
endif
clean: header
@echo "$(FRed)Clean $(PRONAME)$(FGreen) [$(TICK)]"
@rm -rf $(OBJS)
@rm -rf $(OBJDIR)
@echo "$(RESET)"
fclean: header
@echo "$(FRed)FCleaning $(PRONAME)$(FGreen) [$(TICK)]"
@rm -rf $(OBJDIR)
@rm -rf $(NAME)
re: fclean all
header:
@echo "$(FBlue)====================$(FYellow)$(PRONAME)$(FBlue)====================$(RESET)"
obj_header:
@printf "$(FBlue)Compiling .o files $(FYellow)[-]"
linking_header:
@printf "\b\b\b$(FGreen)[$(TICK)]\n$(Green)Linking $(PRONAME) $(FYellow)[-]$(RESET)"
git: commit push
commit:
git commit -m "$(msg)"
push:
git push
update:
git pull
.PHONY: all clean fclean re
彼得(順便說一句,這個句柄怎么會在 2022 年之前沒有被使用?),首先,您確實需要 go 到 gnu.org 並閱讀make
手冊。 如果你想使用make
及其親戚背后的構建語言和概念,這不僅是推薦的,而且是至關重要的。
其次,這是我跳到你應該首先閱讀的章節How make reads a makefile之前的地方, make
不會按照你設想的方式執行ifeq
: if
, ifeq
等僅在第一次通過時使用解析 makefile 以確定 makefile 的哪些部分被解析,哪些部分被忽略(永遠)。 當make
運行其條件之一時,它僅解析真實路徑( if
或else
分支)並逐字丟棄來自錯誤路徑的所有行。 這意味着它在創建循環構造或重復運行時決策時沒有用,在這些決策中,各種分支由動態邏輯謂詞引發執行。 簡而言之,您示例中的ifeq
不屬於它們看似嵌入的規則,而是屬於整個文件。
就是說,您對make
規則的看法還有一個問題:它們是通過調用一個額外的 shell 進程來執行的,因此每行配方都有一組全新的變量(例外:請參閱手冊),因此分配如下
@OBJ_FLAG=1
無效,因為該變量存在且值為1
的過程僅適用於這一行,並在之后立即被刪除。 (請參閱手冊中的.ONESHELL
以獲得豁免)
我在這里所說的所有內容的最終結果是,以編程方式在make
中與配方執行並行循環是極其困難的。 這根本不是其開發的重點,其目的是在某些配方過程運行時最大限度地非侵入性和回避make
過程本身。 用交互式元素裝飾構建運行留給用戶,即留給用戶提供的程序,這些程序還必須解決 1:n stdout 到並行make
運行中的編譯過程的並發問題。 也許你可以從那里得到一些靈感: https://unix.stackexchange.com/questions/225179/display-spinner-while-waiting-for-some-process-to-finish
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.