C++ 生成文件C/C++;功能取决于环境

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

我正在努力解决以下问题:

我想在我的Makefile中使用tput来表示颜色,但它需要环境变量$TERM(并且带有\033[0;31m的echo替代方案不可移植,在所有计算机上的行为都不相同)

在没有变量的环境中,make会失败,并且程序不会编译。 我已经尝试在Makefile中搜索环境变量测试,但迄今为止没有成功

这是我想做的一个例子:

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谢谢你^^