生成文件 C/C++,其功能取决于环境
Makefile C/C++ with function depending of environment
我正在努力解决以下问题:
我想在我的 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)
如果在环境中定义了TERM
则make
打印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
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 重载运算符new[]的行为取决于析构函数
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 生成文件 C/C++,其功能取决于环境
- 不同的功能取决于模板类中的类型
- 用于类型转换或转发的功能(取决于输入类型)