【发布时间】:2021-05-22 23:47:06
【问题描述】:
我正在尝试在规则中使用 eval 函数来增加 Makefile 变量(做一个花哨的加载栏),方法是
$(eval COUNTER=$(shell echo $$(($(COUNTER) + 1))))
我在互联网上发现这对某些人有用,但这一行导致我出现语法错误:文件意外结束,我应该怎么做才能增加我的计数器?这个函数有一些不可怕的替代品,或者有一种方法可以避免这种意外的文件结束吗?感谢您的帮助 这是我正在处理的整个 Makefile
SHELL = /bin/sh
.SUFFIXES = .c .h .o
NAME = Necklace
SRCD = src
INCD = inc
OBJD = .obj
SRC = $(addsuffix $(word 1, $(.SUFFIXES)),\
main\
necklace\
utils)
INC = $(addsuffix $(word 2, $(.SUFFIXES)),\
necklace)
OBJ = $(SRC:$(word 1, $(.SUFFIXES))=$(word 3, $(.SUFFIXES)))
CC = gcc
CFLAGS = -Wall\
-Werror\
-Wextra\
-I $(INCD)
COUNT = $(shell cat file.count 2>/dev/null)
COMPILED = $(shell echo $$(($(shell ls src/*$(word 1, $(.SUFFIXES)) | wc -l | tr -d ' ') - $(COUNT))))
define set
set = $(eval $1 := $2)
ifeq ($(COUNT),)
all:
echo $(words $(SRC)) > file.count && $(MAKE) -n | grep $(CC) | wc -l | tr -d ' ' > tmp.txt && rm -f file.count && echo $$(($$(cat tmp.txt) - 1)) > file.count && make
else
all: $(NAME)
endif
$(NAME): $(addprefix $(OBJD)/, $(OBJ)) | $(addprefix $(INCD)/, $(INC))
$(CC) $(CFLAGS) $^ -o $@
$(OBJD):
mkdir $@
$(OBJD)/%.o: $(SRCD)/%.c | $(OBJD)
@printf '\r\033[2KCompiling [' && sh prc.sh $(COMPILED) $(COUNT) && printf ']' && $(CC) $(CFLAGS) -c $< -o $@ && $(eval COMPILED:=$(shell echo $$(($(COMPILED) + 1)))) #Syntax Error is here
clean:
rm -rf $(OBJD)
fclean: clean
rm -rf $(NAME)
re: fclean all
【问题讨论】:
-
您能否更清楚地解释您要完成的工作,并给出您的代码minimal complete example? (你以前被告知过。)
-
(我强烈怀疑问题是你试图在应该使用 shell 语法的地方使用 Make 语法,但我无法在没有上下文的情况下证明这一点。)
-
@Beta 我知道问题出在这个命令上,当我删除它时不会发生语法错误所以我认为给出整个makefile没用,我会更新帖子
-
你想做的事都可以做到,但你需要一个非常不同的设计。规则中的 shell 命令对 Make 变量没有影响。
标签: makefile