2012-05-20 25 views
3

我已經通過鏈接 Passing additional variables from command line to make使在Linux和Windows上工作的命令行參數

我有一個項目,它使用makefile在Linux和Windows上編譯。在Windows中,它使用gcc,而在Linux中它使用ARM版本gcc,即armv7-linux-gcc。 我想使用一個命令行變量,告訴makefile根據Windows或Linux使用哪個編譯器。

例如,在Windows中,它應該是這樣的:

CC= gcc 
CFLAGS= -c -D COMPILE_FOR_WINDOWS 

;對於Linux:

CC = armv7-linux-gcc 
CFLAGS = -c -D COMPILE_FOR_LINUX 

這些預處理器定義COMPILE_FOR_WINDOWS和COMPILE_FOR_LINUX存在於代碼庫,並不能改變。

此外,爲了使清潔它應該清理Windows和Linux。我不能假設我這樣做的人會安裝Cygwin,因此不能使用rm來刪除文件。

+0

看這裏:http://stackoverflow.com/a/10608327/635608 – Mat

+2

由於標準['make'](http://pubs.opengroup.org/onlinepubs/ 9699919799/utilities/make.html)中沒有任何條件機制,在makefile中作爲條件執行的任何操作都是特定於平臺的。如果你不打算強制'rm',大概你不會強制GNU'make',所以你讓自己變得非常困難。考慮爲這兩種配置分別建立makefile或makefile片段,所以你最終運行'make -f makefile.unix'或'make -f makefile.win64'或其他任何東西。儘量減少差異,但你需要知道Windows支持什麼。 –

+1

只需要清楚,您使用的是哪個版本的Make? – Beta

回答

0

也許你可以使用ant(帶有build.xml文件)來構建項目。 否則,在Makefile中,您需要檢查系統並提供一些條件來檢查是否在Unix環境或Windows環境中製作項目。

有條件使用環境變量設置你的化妝變量:

1

這個答案,如果你使用GNU使或類似的纔有效。

爲使'乾淨'規則正常工作,您可能還必須爲任一操作系統的文件擴展名的任何差異創建一個make變量。

樸素例如:

ifeq ($(OS), Windows_NT) 
    CC=gcc 
    RM=del 
    EXE=.exe 
    CFLAGS=-c -DCOMPILE_FOR_WINDOWS 
else 
    CC=armv7-linux-gcc 
    RM=rm 
    EXE= 
    CFLAGS=-c -DCOMPILE_FOR_LINUX 
endif 

PROG=thing$(EXE) 

.PHONY: all 
all: $(PROG) 
     $(CC) $(CFLAGS) -o $(PROG) main.c 

.PHONY: clean 
clean: 
     -$(RM) $(PROG) *.o