0

LINUX と HP-UX オペレーティング システムの両方と互換性がなければならないメイクファイルを作成しています。LINUX の特定のシェル コマンドが HP-UX と互換性がないことは承知しています。そこで、OS が HP-UX であると判断された場合はマクロを特定の方法で定義し、OS が LINUX である場合は別の方法で定義するように、条件付きでマクロを宣言することは可能でしょうか?

OS       = `uname`
myOS     = Linux


ifeq ($(OS),$(myOS))
    message = "HELLO LINUX"
else
    message = "HELLO FOO" 
endif

all: install

install:
    echo $(message)

上記のアプローチを使用してみました。しかし、ifeq は OS と myOS が同じではないと判断しているようです。どちらも「Linux」である必要がありますが、代わりにelseブロックを出力しています。

4

3 に答える 3

2

SHELL コマンドを実行するには、$(shell ...) を使用する必要があります。これは機能します。

OS       := $(shell uname)
myOS     := Linux


ifeq ($(OS),$(myOS))
    message := "HELLO LINUX"
else
    message := "HELLO FOO" 
endif

all: install

install:
    echo $(message)
于 2012-06-08T14:43:22.417 に答える
2

はい、 makefiles で条件を定義できます。

上記のリンクから取得したこの例

libs_for_gcc = -lgnu
normal_libs =

foo: $(objects)
ifeq ($(CC),gcc)
        $(CC) -o foo $(objects) $(libs_for_gcc)
else
        $(CC) -o foo $(objects) $(normal_libs)
endif

これは、条件文の構文を示しています。

これを考えると、特定のものを定義することは問題になりません。-Dたとえば、 C プログラムのスイッチを介してマルコを定義/渡すことができます。

更新: OS変数がシェルコマンドの出力を取得しないという問題を修正するには、シェル関数unameを使用する必要があります(@AraundFによって正しく指摘されているように):私が投稿したリンクから引用するには:

「シェル関数は、ほとんどのシェルでバッククォート (``) が実行するのと同じ機能を実行します ...」

だからあなたは正しい軌道に乗っていました。

于 2012-06-08T14:01:09.780 に答える
0

ここで行っていたのはARCH、ビルドするすべてのシステムで環境変数を定義することです。Linux システムでは value linux、AIXaixなどではMakefile

include make.$(ARCH)

プラットフォームごとに、そのプラットフォームに固有の定義を含む 、 などのファイルを作成しますmake.linuxmake.aixたとえば、次のものmake.linuxが含まれます。

CC=g++

およびmake.aix含む

CC=xlC_r

これは非常に優れたクリーンなアプローチですが、現在は cmake ( http://www.cmake.org/ ) に移行しています。

于 2012-06-08T14:23:29.847 に答える