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

Makefile C/C++ with function depending of environment

本文关键字:功能 取决于 环境 C++ 文件      更新时间:2023-10-16

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

我想在我的 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

这里有一个更完整的例子:https://github.com/Hellfire01/Makefile/blob/master/Makefile

两者都可以在任何计算机上正常工作,但不能在我的服务器上工作

我正在尝试做的是只有一个 Makefile 能够在我的计算机和服务器上工作,我尝试查看函数 ifeq,但我没有成功让它工作。

任何帮助将不胜感激,感谢您的阅读。

我认为这个制作文件说明了你想要什么:

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)

如果在环境中定义了TERMmake打印Hello World绿色,否则为纯白色。

参见 7.2 条件的语法

假设这里的问题只是您希望在无法正常运行时忽略tput的错误/故障并继续,您可以通过在tput行上粘贴前导-来做到这一点(与前导@相同(。

所以要么@-tput ...要么-@tput ....

这将导致make看到(并输出(错误,但不会因此而使目标失败。

从 GNU 中的错误制作手册:

要忽略配方行中的错误,请在行文本的开头(在初始制表符之后(写一个"-"。在将行传递到 shell 执行之前,将丢弃"-"。

例如

clean:
    -rm -f *.o
@

-不起作用,您会收到很多错误消息。

这样的东西会起作用,但你肯定可以写得更优雅。

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