OS檢測makefile


Answers

不帶參數的uname命令( http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/uname.1.html )會告訴您操作系統的名稱。 我會使用它,然後根據返回值製作條件。

UNAME := $(shell uname)

ifeq ($(UNAME), Linux)
# do something Linux-y
endif
ifeq ($(UNAME), Solaris)
# do something Solaris-y
endif
Question

我經常在幾台不同的計算機和幾種不同的操作系統上工作,這些操作系統是Mac OS X,Linux或Solaris。 對於我正在處理的項目,我從遠程git存儲庫中提取代碼。

無論我在哪個終端,我都喜歡能夠在我的項目上工作。 到目前為止,我已經找到了通過每次切換計算機時更改makefile來解決操作系統更改的方法。 然而,這是乏味的,並導致一堆頭痛。

我怎樣才能修改我的makefile,以便它能檢測到我正在使用的操作系統並相應地修改語法?

這是makefile:

cc = gcc -g
CC = g++ -g
yacc=$(YACC)
lex=$(FLEX)

all: assembler

assembler: y.tab.o lex.yy.o
        $(CC) -o assembler y.tab.o lex.yy.o -ll -l y

assembler.o: assembler.c
        $(cc) -o assembler.o assembler.c

y.tab.o: assem.y
        $(yacc) -d assem.y
        $(CC) -c y.tab.c

lex.yy.o: assem.l
        $(lex) assem.l
        $(cc) -c lex.yy.c

clean:
        rm -f lex.yy.c y.tab.c y.tab.h assembler *.o *.tmp *.debug *.acts



如果您的makefile可能在非cygwin Windows上運行,則uname可能不可用。 這很尷尬,但這是一個潛在的解決方案。 你必須首先檢查Cygwin來排除它,因為它也有PATH中的WINDOWS。

ifneq (,$(findstring /cygdrive/,$(PATH)))
    UNAME := Cygwin
else
ifneq (,$(findstring WINDOWS,$(PATH)))
    UNAME := Windows
else
    UNAME := $(shell uname -s)
endif
endif



我今天遇到了這個問題,並且我在Solaris上需要它,所以這是一個POSIX標準方法(非常接近)。

#Detect OS
UNAME = `uname`

# Build based on OS name
DetectOS:
    -@make $(UNAME)


# OS is Linux, use GCC
Linux: program.c
    @SHELL_VARIABLE="-D_LINUX_STUFF_HERE_"
    rm -f program
    gcc $(SHELL_VARIABLE) -o program program.c

# OS is Solaris, use c99
SunOS: program.c
    @SHELL_VARIABLE="-D_SOLARIS_STUFF_HERE_"
    rm -f program
    c99 $(SHELL_VARIABLE) -o program program.c



我最近正在試驗以回答這個問題,我問自己。 這是我的結論:

由於在Windows中,您不能確定uname命令是否可用,因此可以使用gcc -dumpmachine 。 這將顯示編譯器目標。

如果你想做一些交叉編譯,使用uname也可能會有問題。

以下是gcc -dumpmachine可能輸出的示例列表:

  • mingw32的
  • i686的-PC-的cygwin
  • x86_64的-紅帽Linux的

你可以像這樣在makefile中檢查結果:

SYS := $(shell gcc -dumpmachine)
ifneq (, $(findstring linux, $(SYS)))
 # Do linux things
else ifneq(, $(findstring mingw, $(SYS)))
 # Do mingw things
else ifneq(, $(findstring cygwin, $(SYS)))
 # Do cygwin things
else
 # Do things for others
endif

它對我很好,但我不確定這是獲取系統類型的可靠方法。 至少MinGW是可靠的,這就是我所需要的,因為它不需要在Windows中使用uname命令或MSYS軟件包。

總而言之, uname為您提供了您正在編譯的系統, gcc -dumpmachine為您提供了正在編譯的系統。

希望它幫助了某人。




另一種方法是使用“configure”腳本。 如果你已經在makefile中使用了一個,你可以使用uname和sed的組合來解決問題。 首先,在您的腳本中,執行:

UNAME=uname

然後,為了把它放在你的Makefile中,從Makefile.in開始,它應該有類似的東西

UNAME=@@UNAME@@

在裡面。

UNAME=uname位後,在配置腳本中使用以下sed命令。

sed -e "s|@@UNAME@@|$UNAME|" < Makefile.in > Makefile

現在你的makefile應該根據需要定義UNAME 。 如果/ elif / else語句都剩下了!






Related