2011-11-25 36 views
11

我有一個簡單的C-Programm(1源文件),我想通過make resp在Linux和Windows上編譯。 NMAKE。是否有可能通過單個makefile來完成此操作?使用相同的makefile make(Linux)和nmake(Windows)

我想過像

ifeq($(MAKE), nmake) 
    // nmake code here 
else 
    // make code here 
endif 

不幸的是NMAKE似乎不明白ifeq,所以我不能使用。我有一個工作的生成文件,但會產生非常難看的結果:

hello: hello.c 
    $(CC) hello.c 

這對兩個系統都有效。問題在於結果取決於各編譯器的默認行爲。在Linux下,我得到一個名爲'a.out'而不是'hello'的可執行文件。在Windows下,我得到'hello.exe',但也有'hello.obj',這是我不想要的。

有誰知道另一種方法?或者,我正在嘗試絕對不可能?

+1

你可能會建立或得到GNU讓你的Windows系統上執行nmake。 –

+7

對於跨平臺項目,我可以推薦cmake(http://www.cmake.org)。 –

+0

我已閱讀cmake。但我需要在大學裏練習使用nmake。 – j0ker

回答

9

這可能不是不可能的,但最有可能非常難以編寫兩個makefile。

儘管GNU make(在Linux中使用)和nmake都包含指令,所以一些常見的東西可以放在主makefile所包含的通用makefile中。

+0

我似乎無法在[msdn](http://msdn.microsoft.com/en-us/library/dd9y37ha.aspx)中的任何位置找到'nmake''include指令? –

+2

@JosephQuinsey http://msdn.microsoft.com/en-us/library/7y32zxwh.aspx –

1

我只是想到完全不同的東西。

如果你堅持你的極其簡單的Makefile,你說哪,工作,只是把在各自的環境中的「標準」變量CC和CFLAGS,說

export CC=gcc 

分別

set CC=CL.EXE 

export CFLAGS=-o myexecutable 

分別

set CFLAGS=/out:myexecutable.exe 

它可能只是工作。

請注意,我並不確定要使用的確切選項,您必須親自弄清楚。但是AFAIK都會讓變體識別同一組標誌。你甚至可以在各自的命令行上設置它們(但不是在makefile中,因爲NMAKE使用不同的'ifeq'語法......)

+1

這可能是一個好主意,編寫一個簡單的shell腳本和批處理文件來設置環境並調用make ... – Christoph

6

你應該看看使用CMake。有了一個源文件,它應該很容易!

編輯:

這裏是你如何能建立一個簡單的項目:

cmake_minimum_required(VERSION 2.8) 

project(Simple) 

include_directories("${PROJECT_BINARY_DIR}") 

add_executable(Simple simple.cpp) 

要構建簡單的項目,你會做以下(假設你的源和CMakeLists。txt文件是在~/src/simple

[email protected]~/src/simple$ mkdir build 
[email protected]~/src/simple$ cd build 
[email protected]~/src/simple$ cmake .. 
[email protected]~/src/simple$ make 
+1

- 1在評論OP狀態時,他需要使用NMAKE。 –

+2

@JohanBezem當我發佈這個答案時,該評論不可用。但是,我認爲這個答案是解決問題的正確方法,而不是在作業任務的人爲約束下解決問題。 – mevatron

+1

CMake可以生成nmake,所以它不會被遠程獲取以使用CMake。至少值得考慮。 – ideasman42

1

是的,你可以用一個Makefile中做到這一點。這種材料的最佳來源是O'Reilly的書:

Managing Projects with GNU Make, Third Edition By Robert Mecklenburg

見第7章:便攜式Makefile文件。

總之,該技術是測試環境變量COMSPEC其說,如果窗命令解釋存在:

ifdef COMSPEC 
MV ?= move 
RM ?= del 
else 
MV ?= mv -f 
RM ?= rm -f 
endif 

我與使用sed將編輯NMAKE生成文件的便攜式外殼腳本包裹這或Gnu -...

+0

hm,''=''語法對'nmake'無效。我認爲你的例子只檢測'GNU make'是否在W32上運行(而不是作爲nmake/GNUmake多邊形)) –

+0

@umläute - 它的確說我使用sed腳本來定製語法.... –

+0

很公平; otoh,因爲可移植shell腳本實際上是回答這個問題的魔術膠,所以也可以很好地共享這個問題:-) –

4

我想使用make和nmake使用相同的makefile include。由於make會在註釋行中識別續行,但nmake不會,因此這意味着我們可以爲make和nmake分別提供指令。例如:

# \ 
!ifndef 0 # \ 
# nmake code here \ 
MV=move # \ 
RM=del # \ 
CP=copy # \ 
!else 
# make code here 
MV=mv -f 
RM=rm -f 
CP=cp -f 
# \ 
!endif 

只是要確保NMAKE特定代碼由#\

+0

雖然nmake不允許對命令發表評論,但它可以工作。您只能將這種技術用於宏和*單行*命令。不過,您可以使用';'連接多個命令來將它們保留在一行中。 –

1

終止我不能找到一種方法,使用共同的makefile以兩個GNU製作和MS NMAKE工作,主要是因爲它們對於「包含」和/或「if」指令具有不兼容的語法。 MS nmake需要使用!指令的前綴。例如,!if,!include等...

但是,如果它被允許有單獨的宏,它可能會被欺騙。在這裏,我提出我發現迄今通過觀察以下makefile文件製作兩個GNU製作和MS NMAKE兼容的最佳方式:

  1. MS NMAKE讀取默認的宏TOOLS.INI文件。
  2. MS套件使用.obj作爲目標文件擴展名。
  3. GNU make讀取MAKEFILES環境變量中定義的文件。
  4. GNU套件使用.o作爲目標文件擴展名。
  5. GNU make無需爲目標提供可執行擴展名.exe。

注意:以下已經使用MS Visual Studio 2015和MINGW32進行了測試。

第1步:創建一個下面的DOS批處理文件,並讓它在CMD提示符被調用時運行。

set MAKEFILES=TOOLS.gcc 
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" 

第2步:創建如下您的工作目錄下的TOOLS.INI文件:(這個文件是獨立的,除了可能是庫的項目依賴的)

[NMAKE] 
LDLIBS = 
CDEBUG = /Zi 
LDEBUG = /debug:full 
WDFLAGS = /wd4996 /wd4774 /wd4018 /wd4710 /wd4820 
CFLAGS = /nologo $(CDEBUG) /EHsc /Wall $(WDFLAGS) 
LDFLAGS = /nologo $(LDEBUG) 
RM  = del /F /Q 
LINK = "$(VCINSTALLDIR)bin\link" $(LDFLAGS) 
CP = copy 
CC = cl 
CPP = $(CC) /P 
X = .exe 
O = .obj 

.obj.exe: 
    $(LINK) $** $(LOADLIBES) $(LDLIBS) /Out:[email protected] 

第3步:創建工具你的工作目錄下.gcc如下:(這個文件是獨立於你的項目依賴的除了庫可能)

LD_LIBS = 
LDLIBS = 
CDEBUG = -g 
LDEBUG = -g 
CFLAGS = $(CDEBUG) 
LDFLAGS = $(LDEBUG) 
RM  = rm -f 
LINK = gcc $(LDFLAGS) 
CP  = cp 
CC  = gcc 
CPP  = $(CC) -E 
X  = 
O  = .o 

%: %.o 
    $(LINK) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] 

步驟4:編輯如下生成文件(注意$( X)和$(O)),其中只指定了依賴關係。

SHELL = /usr/bin/sh 
app: app1$(X) app2$(X) 
app1$(X): app1$(O) 
app2$(X): app2$(O) 

clean: 
    $(RM) *.exe *.o *.obj *.ilk *.pdb *.tmp *.i *~ 

第5步:享受GNU製作和MS具有相同的makefile

$ nmake 
$ make clean 
$ nmake clean 
$ make 
相關問題