【问题标题】:Makefile C/C++ with function depending of environment具有取决于环境的功能的 Makefile C/C++
【发布时间】:2016-09-09 00:37:20
【问题描述】:

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

我想在我的 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 但我没有成功让它工作。

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

【问题讨论】:

    标签: c++ c function makefile environment-variables


    【解决方案1】:

    我认为这个 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)
    

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

    7.2 Syntax of Conditionals

    【讨论】:

    • 感谢您的回答:它无法正常工作,因为 $TERM 在尝试“env -i make”时获得了值“dumb”,但它让我得到了答案^^。你知道为什么 $TERM 会取这个值吗?我是否应该小心使用它?
    • 扩展它以检查dumb 很简单。真正的问题是,如果 TERM 值没有被请求 tput 错误的能力,那么您必须检查 that 以确保避免出现“有问题”的值TERM 稳健地做到这一点。
    • 实际上,这里甚至不需要$(shell),因为$(TERM)make 中直接可用(因为它是从父shell 导出的)。 (虽然我认为这可能并不完全可靠。)
    • @MatthieuRaynauddeFitte 哑终端只是一个单色屏幕和键盘,没有任何本地计算能力(包括图形能力),例如用于将我连接到远程主机在遥远的过去。如果TERM 报告dumb 关于您的服务器,我会假设终端只能打印单色文本。 This question 可能会有所帮助。
    【解决方案2】:

    假设这里的问题只是您想要忽略来自 tput 的错误/故障,当它无法正常运行并继续时,您可以通过在 tput 行上粘贴前导 - 来做到这一点(和前面的@一样)。

    所以@-tput ...-@tput ...

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

    来自 GNU Make 手册中的 Errors

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

    例如,

    clean:
        -rm -f *.o
    

    【讨论】:

    • 不是我要找的答案,但非常有用,谢谢^^
    【解决方案3】:

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

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多