C++ 生成文件C/C++;功能取决于环境
我正在努力解决以下问题: 我想在我的Makefile中使用tput来表示颜色,但它需要环境变量$TERM(并且带有\033[0;31m的echo替代方案不可移植,在所有计算机上的行为都不相同) 在没有变量的环境中,make会失败,并且程序不会编译。 我已经尝试在Makefile中搜索环境变量测试,但迄今为止没有成功 这是我想做的一个例子:C++ 生成文件C/C++;功能取决于环境,c++,c,function,makefile,environment-variables,C++,C,Function,Makefile,Environment Variables,我正在努力解决以下问题: 我想在我的Makefile中使用tput来表示颜色,但它需要环境变量$TERM(并且带有\033[0;31m的echo替代方案不可移植,在所有计算机上的行为都不相同) 在没有变量的环境中,make会失败,并且程序不会编译。 我已经尝试在Makefile中搜索环境变量测试,但迄今为止没有成功 这是我想做的一个例子: define my_color @tput setaf $2 @tput bold @echo $1 @tput sgr0 e
define my_color
@tput setaf $2
@tput bold
@echo $1
@tput sgr0
endef
CC = gcc
CFLAGS = -Wall -Wextra
SRCS = my_super_file.c
OBJS = $(SRCS:.c=.o)
NAME = super_programm
all: $(NAME)
$(NAME): $(OBJS)
$(call my_color, " Compiling $<", 2)
$(CC) -o $(NAME) $(OBJS)
clean:
rm -rf $(OBJS)
fclean: clean
rm -rf $(NAME)
re: fclean all
.PHONY: all re clean fclean
定义我的颜色
@tput setaf$2
@t输出粗体
@回声1美元
@tput sgr0
恩德夫
CC=gcc
CFLAGS=-Wall-Wextra
SRCS=my\u super\u file.c
OBJS=$(SRCS:.c=.o)
NAME=super\u程序
全部:$(名称)
$(名称):$(OBJS)
$(称为my_color,“编译$假设这里的问题只是您想在tput
无法正确运行时忽略错误/失败,然后继续,您可以通过在tput
行上粘贴一个前导的-
(与前导的@
相同)
所以要么@-tput…
要么-@tput…
这将导致make
查看(并输出)错误,但不会因此而使目标失败
从GNU Make手册中:
若要忽略配方行中的错误,请在该行文本的开头(在初始选项卡之后)写入“-”。在将该行传递给shell执行之前,将丢弃“-”
比如说,
clean:
-rm -f *.o
假设此处的问题只是您希望在tput
无法正常运行时忽略错误/故障,然后继续,您可以通过在tput
行上粘贴一个前导-
来完成(与前导@
相同)
所以要么@-tput…
要么-@tput…
这将导致make
查看(并输出)错误,但不会因此而使目标失败
从GNU Make手册中:
若要忽略配方行中的错误,请在该行文本的开头(在初始选项卡之后)写入“-”。在将该行传递给shell执行之前,将丢弃“-”
比如说,
clean:
-rm -f *.o
我认为这个makefile说明了您想要什么:
have_term := $(shell echo $$TERM)
ifdef have_term
define my_color =
@tput setaf $2
@tput bold
@echo $1
@tput sgr0
endef
else
my_color = @echo $1
endif
all:
$(call my_color, "Hello world", 2)
如果在环境中定义了术语
,则make
在中打印Hello World
绿色,否则为纯白色
请参见我认为此makefile说明了您想要什么:
have_term := $(shell echo $$TERM)
ifdef have_term
define my_color =
@tput setaf $2
@tput bold
@echo $1
@tput sgr0
endef
else
my_color = @echo $1
endif
all:
$(call my_color, "Hello world", 2)
如果在环境中定义了术语
,则make
在中打印Hello World
绿色,否则为纯白色
请参见@-无效,您将收到大量错误消息
像这样的东西会有用,但你可以写得更优雅
have_term := $(TERM)
ifeq ($(TERM),dumb)
have_term=
endif
ifdef have_term
color_blue = @tput setaf 6
color_end = @tput sgr0
else
color_blue =
color_end =
endif
@-不起作用,你会收到很多错误消息
像这样的东西会有用,但你可以写得更优雅
have_term := $(TERM)
ifeq ($(TERM),dumb)
have_term=
endif
ifdef have_term
color_blue = @tput setaf 6
color_end = @tput sgr0
else
color_blue =
color_end =
endif
谢谢你的回答:它本身不起作用,因为$TERM在尝试“env-imake”时得到了“dumb”值"但是它让我得到了答案。^^。你知道$TERM为什么会取那个值吗?我是否应该小心使用它?扩展它来检查dumb
非常简单。真正的问题是如果项
值没有被请求的功能tput
错误,你必须检查be确保您避免了TERM
的“有问题”值来可靠地执行此操作。实际上,您甚至不需要$(shell)
,因为$(TERM)
在make
中直接可用(因为它是从父shell导出的)。(尽管我认为这可能并不完全可靠。)@哑终端只是一个单色屏幕和键盘,没有任何本地计算能力(包括图形能力),例如,在遥远的过去用于将我连接到远程主机。如果TERM
报告有关您的服务器的dumb
,我认为终端只能打印单色文本。可能会有所帮助。感谢您的回答:它无法正常工作,因为$TERM在尝试“env-I make”时获得值“dumb”但是它让我得到了答案。^^。你知道$TERM为什么会取那个值吗?我是否应该小心使用它?扩展它来检查dumb
非常简单。真正的问题是如果项
值没有被请求的功能tput
错误,你必须检查be确保您避免了TERM
的“有问题”值来可靠地执行此操作。实际上,您甚至不需要$(shell)
,因为$(TERM)
在make
中直接可用(因为它是从父shell导出的)。(尽管我认为这可能并不完全可靠。)@哑终端只是一个单色屏幕和键盘,没有任何本地计算能力(包括图形能力),例如,在遥远的过去,用于将我连接到遥远的主机。如果TERM
报告有关您的服务器的dumb
,我认为终端只能打印单色文本。可能会有所帮助。不是我要找的答案,而是非常有用的答案,谢谢^^不是我要找的答案,而是非常有用的答案,th谢谢你^^