Я борюсь со следующей проблемой:

Я хотел бы использовать tput в моем Makefile для цвета, но для этого нужна переменная окружения $ TERM (а альтернатива echo с \ 033 [0; 31m не переносима и не будет вести себя одинаково на всех компьютерах).

В среде, не имеющей переменной, 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, но мне не удалось заставить ее работать.

Любая помощь будет принята с благодарностью за чтение.

1
Matthieu Raynaud de Fitte 13 Май 2016 в 03:20

3 ответа

Лучший ответ

Думаю, этот make-файл иллюстрирует то, что вы хотите:

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 Синтаксис условных операторов

2
Mike Kinghan 13 Май 2016 в 07:31

Предполагая, что проблема здесь только в том, что вы хотите, чтобы программа make игнорировала ошибки / сбои из tput, когда он не может работать правильно, и продолжать, вы можете сделать это, вставив ведущий - на tput строки (такие же, как ведущие @).

Так что либо @-tput ..., либо -@tput ....

Это заставит make увидеть (и вывести) ошибки, но не приведет к сбою цели из-за них.

Из Ошибок в Руководстве по созданию GNU:

Чтобы игнорировать ошибки в строке рецепта, напишите «-» в начале текста строки (после начальной табуляции). Знак «-» отбрасывается до того, как строка будет передана оболочке для выполнения.

Например,

clean:
    -rm -f *.o
1
Etan Reisner 13 Май 2016 в 02:28

@ - не сработает, вы получите много сообщений об ошибках.

Что-то вроде этого сработает, но вы определенно можете написать это более элегантно.

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
1
revamped 24 Сен 2016 в 06:04