簡體   English   中英

如何在編譯 time.o 文件時在 Makefile 中加載 animation?

[英]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不會按照你設想的方式執行ifeqififeq等僅在第一次通過時使用解析 makefile 以確定 makefile 的哪些部分被解析,哪些部分被忽略(永遠)。 make運行其條件之一時,它僅解析真實路徑( ifelse分支)並逐字丟棄來自錯誤路徑的所有行。 這意味着它在創建循環構造或重復運行時決策時沒有用,在這些決策中,各種分支由動態邏輯謂詞引發執行。 簡而言之,您示例中的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM