2010-10-30 75 views
38

我想要在Linux和Windows上構建相同的Makefile。我在Linux上使用默認的GNU make,在Windows上使用默認的mingw32-make(也可以使用GNU make)。區分Windows和類Unix系統的Makefile

我想讓Makefile檢測它是在Windows還是Linux上運行。


例如在Windows make clean命令如下:

clean: 
    del $(DESTDIR_TARGET) 

但在Linux上:

clean: 
    rm $(DESTDIR_TARGET) 

此外,我想在Windows(\)和Linux使用不同的目錄分隔符(/)。


可以在Makefile中檢測Windows操作系統嗎?

PS:我不想在Windows效仿的Linux(在cygwin等)

有類同的問題:OS detecting makefile,但我沒有在這裏找到答案。

+4

的Windows是能夠同時處理斜槓「/」和「\」是等價的。 – Ency 2010-10-30 13:17:18

+0

如果這是一個大型項目,我想知道是否值得讓autotools處理一些可移植性的東西? – Cascabel 2010-10-30 14:30:10

+0

@Jefromi:autotools假設一個基本的UNIX工具集(sh,m4,sed,rm,...)。 @tomp:不妨將它們安裝在Windows(來自MSYS或GnuWin)上,並將您的努力花在更具挑戰性的可移植性問題上。 – ephemient 2010-10-30 16:07:15

回答

38

我通過查找,將只在Windows上設置環境變量解決了這個。

ifdef SYSTEMROOT 
    RM = del /Q 
    FixPath = $(subst /,\,$1) 
else 
    ifeq ($(shell uname), Linux) 
     RM = rm -f 
     FixPath = $1 
    endif 
endif 

clean: 
    $(RM) $(call FixPath,objs/*) 

因爲%SystemRoot%是路徑目錄應在所有Windows計算機上設置而不是在Linux上的窗口。

這些塊然後爲不同的程序設置變量以及將正斜槓轉換爲反斜槓的函數。

當您調用外部命令(內部命令正常工作)時,您必須使用$(調用FixPath,路徑)。你也可以使用這樣的:

/ :=/

然後

objs$(/)* 

,如果你喜歡該格式更好。

+2

感謝您的支持。我在Windows上的MinGW和Linux上的GCC之間切換,這很好。 – Imbue 2011-01-20 00:27:03

+1

在mingw中它應該是大寫的'SYSTEMROOT' – SystemParadox 2013-01-26 20:51:39

+1

你也可以檢查ComSpec,它只在Windows上定義 – kebs 2013-04-04 06:47:07

7

您應該使用$(RM)變量來刪除一些文件。

3

我想要在Linux和Windows上構建相同的Makefile。

也許你會喜歡CMake

36

的SYSTEMROOT把戲沒有爲我工作在Windows XP但這並:

ifeq ($(OS),Windows_NT) 
    #Windows stuff 
    ... 
else 
    #Linux stuff 
    .... 
endif