2016-05-13 8 views
1

に依存し、私は次のような問題に苦しんでいます:MakefileのC/C++環境

私は色のための私のMakefileでtputを使用したいが、それは環境変数$ TERM(と\とエコーの代替を必要とします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を1つだけ持つことです。関数ifeqを見てみましたが、うまく動作しませんでした。

読んでいただきありがとうございますようお願い申し上げます。ここでの問題を想定し

答えて

2

私はこのメイクは、あなたが欲しいものを示し思う:

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 Syntax of Conditionals

+0

感謝^^感謝:「ENV -iをしようとしたときに$ TERMは「ダム」の値を取得しますので、それは次のような動作しませんでした私は答えを得ることができました^^。 $ TERMがなぜその価値を持っているのか、私はそれに注意する必要があるのか​​分かりますか? –

+1

これを拡張して 'ダム'をチェックするだけで十分です。本当の問題は、 'TERM'値が要求された' tput'エラーの能力を持たず、 'TERM'の値を避けるために* that *をチェックしなければならない場合ですこれは堅牢です。 –

+0

実際、 '$(TERM)'は 'make 'の中で直接(親シェルからエクスポートされるので)利用できるので、' $(shell) 'は必要ありません。 (完全に信頼できるとは限りませんが) –

1

は、あなたはそれが正しく動作してtputライン上の主要な-を貼り付けることで、あなたがそれを行うことができます続けることができないとき有数@と同じ(tputからのエラー/失敗を無視するように作りたいだけのことです)。

したがって@-tput ...または[email protected] ...です。

これにより、エラーが表示され(出力される)ようになりますが、そのためにターゲットが失敗することはありません。

GNUでErrorsから手動で行います書き込み、レシピ行でエラーを無視するには

を - (初期タブの後に)行のテキストの先頭に「」を。実行のために行がシェルに渡される前に、 ' - 'は破棄されます。例えば

clean: 
    -rm -f *.o 
+0

ない私が探していた答えが、非常に便利な1、あなたは答えを –

1

を参照してください。

このようなことはうまくいくが、これをよりエレガントに書くことができます。

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 
関連する問題