짧은 대답 : make
좋지 않기 때문입니다. C 전선에서도 많은 대안이 나타납니다.
긴 대답 : make
C 컴파일에는 거의 적합하지 않으며 Java 컴파일에는 전혀 적합하지 않은 몇 가지 결함이 있습니다. 원하는 경우 Java를 강제로 컴파일하도록 할 수 있지만 문제에 부딪 칠 것으로 예상되는데 그 중 일부에는 적합한 솔루션이나 해결 방법이 없습니다. 몇 가지가 있습니다 :
의존성 해결
make
본질적으로 파일은 서로에 대해 트리와 같은 종속성을 가질 것으로 기대합니다. 한 파일은 여러 다른 파일을 빌드 한 결과입니다. 헤더 파일을 다룰 때 C에서 이미 역효과를냅니다. make
필요 make
후자에 변화가 이전에 재건 원인이 될 것이다, 그래서 파일을 포함 특이, 그 헤더 파일에 C 파일의 의존성을 표현하기 위해 생성 할 수 있습니다. 그러나 C 파일 자체는 재 작성되지 않고 (단순히 재 빌드되기 때문에) 대상을로 지정해야하는 경우가 종종 .PHONY
있습니다. 다행히 GCC는 이러한 파일을 자동으로 생성하도록 지원합니다.
Java에서 종속성은 순환적일 수 있으며 make
형식으로 클래스 종속성을 자동 생성하기위한 도구가 없습니다 . ant
의 Depend
대신에, 클래스 파일을 읽을 수있는 작업은 직접, 어떤 클래스 그것을 수입을 결정하고, 그 중 하나가 구식 인 경우 클래스 파일을 삭제합니다. 이것이 없으면 사소하지 않은 종속성으로 인해 반복적 인 클린 빌드를 사용해야하므로 빌드 도구를 사용할 때의 이점이 사라집니다.
파일 이름의 공백
Java 나 C는 소스 코드 파일 이름에 공백을 사용하도록 권장하지 않지만 make
공백이 파일 경로에 있어도 문제가 될 수 있습니다. 예를 들어 소스 코드가에있는 경우를 고려하십시오 C:\My Documents\My Code\program\src
. 이것으로 충분합니다 make
. make
파일 이름을 문자열로 취급 하기 때문 입니다. ant
경로를 특수 객체로 취급합니다.
빌드 할 파일 스캔
make
각 대상에 대해 빌드 할 파일을 명시 적으로 설정해야합니다. ant
소스 파일을 자동 검색 할 폴더를 지정할 수 있습니다. 약간의 편의처럼 보이지만 Java에서는 새 클래스마다 새 파일이 필요하다는 것을 고려하십시오. 프로젝트에 파일을 추가하는 것은 큰 번거 로움이 될 수 있습니다.
그리고 가장 큰 문제 make
:
POSIX에 의존합니다
Java의 모토는 "한 번 실행하면 어디서나 컴파일"입니다. 그러나 Java 지원이 실제로 최악 인 POSIX 기반 시스템으로 컴파일을 제한하는 것은 의도가 아닙니다.
빌드 규칙 make
은 본질적으로 작은 bash
스크립트입니다. make
Windows에 대한 포트가 있지만 제대로 작동하려면 bash
파일 시스템의 POSIX 에뮬레이션 계층을 포함하는 포트와 함께 번들로 묶어야합니다.
이것은 두 가지 종류가 있습니다.
MSYS
POSIX 변환을 파일 경로로 제한하려고 시도하기 때문에 특별히 만들어지지 않은 외부 도구를 실행할 때 불쾌한 문제가 발생할 수 있습니다.
cygwin
완전한 POSIX 에뮬레이션을 제공합니다. 그러나 결과 프로그램은 여전히 해당 에뮬레이션 계층에 의존하는 경향이 있습니다.
이러한 이유로 Windows에서 표준 빌드 도구는 전혀 make
없지만 MSBuild
XML 기반 도구이기도하며 원칙적으로에 가깝습니다 ant
.
반대로, ant
Java로 빌드되어 어디서나 실행할 수 있으며 플랫폼 독립적 인 방식으로 파일을 조작하고 명령을 실행하기위한 "작업"이라는 내부 도구를 포함합니다. 를 사용하는 ant
것보다 Windows를 사용하여 C 프로그램을 작성하는 데 실제로 더 쉬운 시간을 가질 수있을 정도로 충분히 다재다능합니다 make
.
그리고 마지막 작은 하나 :
C 프로그램조차도 기본적으로 make를 사용하지 않습니다
처음에는이를 알지 못할 수도 있지만 C 프로그램은 일반적으로로 제공되지 않습니다 Makefile
. 이들은 실제 또는를 생성 CMakeLists.txt
하는 bash
구성 스크립트 와 함께 제공됩니다 Makefile
. 반대로, 사용하여 빌드 된 Java 프로그램의 소스는 사전 빌드 ant
된 ant
스크립트 와 함께 제공됩니다 . A Makefile
는 다른 도구의 제품입니다. 즉 make
, 자체 빌드 도구로는 적합하지 않습니다. ant
독립형이며 추가 요구 사항이나 종속성없이 Java 빌드 프로세스에 필요한 모든 것을 처리합니다.
ant
모든 플랫폼에서 실행 하면 Just Works (tm)입니다. 당신은 그것을 얻을 수 없습니다 make
. 엄청나게 플랫폼과 구성에 따라 다릅니다.
make
. 그리고 하나의 시스템에서만 작동하는 makefile을 갖는 것은 크로스 플랫폼 언어에 좋지 않습니다.