2011-11-25 3 views
11

make resp를 통해 Linux 및 Windows에서 컴파일하려는 간단한 C-Programm (1 소스 파일)이 있습니다. nmake. 단일 메이크 파일로이 작업을 수행 할 수 있습니까?make (Linux) 및 nmake (Windows)에 동일한 makefile 사용

나는 불행하게도 ifeq을 이해하는 NMAKE없는 것 같다

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

같은 것을 생각, 그래서는 사용할 수 없습니다. 나는 작동하는 메이크 파일을 가지고 있지만 아주 못생긴 결과를 낸다 :

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

두 시스템 모두에서 작동한다. 문제는 결과가 각 컴파일러의 기본 동작에 의존한다는 것입니다. 리눅스에서는 'hello'보다는 'a.out'이라는 실행 가능한 이름을 얻습니다. Windows에서 나는 'hello.exe'를 얻지 만, 갖고 싶지 않은 'hello.obj'도 있습니다.

누군가 다른 방법을 알고 있습니까? 아니면 내가 절대적으로 불가능한 것은 무엇인가?

+1

당신은 만들거나 GNU는 Windows 시스템에 만들 얻을 수 있습니다와 NMAKE. –

+7

크로스 플랫폼 프로젝트의 경우 cmake (http://www.cmake.org)를 추천 할 수 있습니다. –

+0

나는 이미 cmake에 대해 읽었습니다. 그러나 우리가 nmake를 사용하기로되어있는 대학에서 운동을하기 위해서는이 것이 필요합니다. – j0ker

답변

9

아마도 불가능하지는 않지만 어쨌든 두 개의 메이크 파일을 작성하는 것이 더 쉽습니다.

GNU make (Linux에서 사용됨)와 nmake는 모두 지시문을 포함하고 있기 때문에 주 메이크 파일에 포함 된 공통 makefile에 몇 가지 일반적인 사항을 넣을 수 있습니다.

+0

[nmdn] (http://msdn.microsoft.com/en-us/library/dd9y37ha.aspx)에 'nmake''include 지시어 '를 찾을 수 없습니다. –

+2

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

1

나는 완전히 다른 것을 생각했습니다.

당신은, 당신이 작동, 말, 그리고 당신의 각각의 환경에서 '표준'변수 CC와 CFLAGS를 넣어, 당신의 매우 간단한 메이크, 충실 각각

export CC=gcc 

set CC=CL.EXE 
말한다면

export CFLAGS=-o myexecutable 

각각

,
set CFLAGS=/out:myexecutable.exe 

그냥 작동 할 수도 있습니다.

정확한 옵션을 사용하는 것이 확실하지 않으므로 직접 생각해야합니다. 하지만 AFAIK는이 두 변종이 동일한 플래그 집합을 인식하도록합니다. 각각의 명령 줄에서 설정할 수도 있습니다 (NMAKE는 다른 'ifeq'구문을 사용하기 때문에 메이크 파일에는 없습니다 ...)

+1

환경을 설정하고 실행 파일을 만드는 간단한 셸 스크립트와 배치 파일을 작성하는 것이 좋습니다. – 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

예, 단일 메이크으로이 작업을 수행 할 수 있습니다. 이 자료에 대한 가장 좋은 소스는 오라일리 책이다

Managing Projects with GNU Make, Third Edition By Robert Mecklenburg

참조 7 장 : 휴대용 메이크. 내가 NMAKE의 메이크 파일을 편집 할 수 sed를 사용하는 휴대용 쉘 스크립트로이 포장

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

: 요약

이 기술은 윈도우 명령 인터프리터가있는 경우라는 환경 변수 COMSPEC을 테스트하는 것입니다 또는 Gnu-make ..

+0

hm,'? ='문법이'nmake'와 함께 유효하지 않습니다. 나는 당신의 예제가'GNU make가 W32에서 실행되는지 아닌지 (nmake/GNUmake polyglot이 아닌) 실행되는지 여부 만 감지한다고 생각한다.) –

+0

@ umläute - 구문을 사용자 정의하기 위해 sed 스크립트를 사용한다고 ... –

+0

공정한; otoh, 휴대용 셸 스크립트가 실제로 질문에 대답하는 마법의 접착제이기 때문에, 그것을 공유하는 것이 좋을 수도 있습니다 :-) –

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 

그냥, 내가 GNU 만들 모두와 MS nmake를 위해 일 공통 메이크 파일을 사용하는 방법을 찾을 수 없습니다입니다 nmake를 특정 코드가 # \

+0

이것은 nmake가 명령에 대한 주석을 허용하지 않지만 작동합니다. 이 기술은 매크로 및 * 단일 행 * 명령에만 사용할 수 있습니다. 여러 명령을 연결하여';'를 사용하여 명령을 한 줄로 유지할 수 있습니다. –

1

에 의해 종료되어 있는지 확인해야 주로 "include"및/또는 "if"지시문에 호환되지 않는 구문이 있기 때문입니다. MS nmake를 사용해야합니다! 지시어 접두사. 예를 들어,! if,! include 등 ...

별도의 매크로를 사용할 수 있으면 속일 수 있습니다.

  1. MS NMAKE 기본 매크로에 대한 TOOLS.INI 파일을 읽습니다 : 여기 내가 지금까지 다음 사항을 관찰하여 두 GNU가하고 MS의 nmake를 호환 메이크 파일을 만들기위한 찾을 수있는 가장 좋은 방법을 제시한다.
  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 단계 (이 설정 파일은 라이브러리 제외 프로젝트 종속성의 독립적 인)하십시오 도구 만들기 ((아래 참고 $ 당신의 메이크 파일을 편집

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 단계 (이 설정 파일은 라이브러리 제외 프로젝트 종속성과 무관) : 아래와 같이 작업 디렉토리 아래에 .gcc 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는 같은 메이크

$ nmake 
$ make clean 
$ nmake clean 
$ make 
관련 문제