Make를 직접 사용하고 있습니까? [닫은]


31

그래서 makefile을 직접 만드는 방법과 2015 년에 어리석은 일에 대해 많은 의견 / 게시물 / 등을 보았습니다. CMake와 같은 도구를 알고 있으며 실제로 CMake를 자주 사용합니다. 문제는 CMake가 단지 당신을 위해 Makefile을 만들고 스스로 만드는 일을 없애는 것입니다. 물론 다른 많은 훌륭한 기능을 추가하지만 결국에는 Makefile이 추가됩니다.

그래서 내 질문은, Make 유틸리티 전체를 언급하는 make에 관한 '쓸모없는'이야기입니까, 아니면 자신의 Makefile을 수동으로 작성한다는 아이디어입니까? 나는 C / C ++ 개발을 위해 IDE를 전혀 사용하지 않으며 (emacs 만) 항상 Makefile을 작성했습니다.

Make가 구식이라고 생각되면 C / C ++ 개발자는 소규모 개인 프로젝트를 구축하기 위해 무엇을 사용해야합니까?


8
소규모 개인 프로젝트의 make경우 Makefile이 없으면 충분합니다. 번거 로움?
ott--

8
데스크탑과 서버 모두 FreeBSD 시스템에서 사용 가능한 모든 소프트웨어에는 'make'로 시작되는 Makefile이 있습니다. 아니요. 'make'는 더 이상 사용되지 않습니다.
Rob

3
사람들은 IDE를 자유롭게 사용할 수 있지만 IDE make가 처음 작성된 후 거의 40 년 후에 Makefile을 사용하는 프로젝트를 지원할 수 없다면 사람들이 그 문제를 해결할 것을 기 대해서는 안됩니다.
Miles Rout

1
"오래된 이야기에 관한 메이크업은" 단지 증상 또는이다 고통 포인트 가 아닌 중단의 선포. 특히 우수한 총체적 대체물이 아직 존재하지 않고 통증을 줄이기위한 모든 접근 방식은 여전히 ​​통증이 가장 많은 사용자에게 숨겨져있는 방식으로 이루어집니다. 많은 좋은 답변이 제공되었지만 질문 자체는 경계선 의견 기반입니다.
rwong

1
CMake추상화의 레이어입니다. 이 추상화 는 오픈 소스를 준수하지 않는 다양한 소비자 IDE 제품 을 길들이기 위해 필요합니다 Makefile. 다시 한 번 추상화 일뿐 아니라 autoconf와 같은 구성 기능도 허용합니다. 다른 추상화와 마찬가지로 대안허용 합니다. 그러나 CMake 사용자가 쉽게 사용할 수있는 Makefile의 대안에 대한 실험적인 새로운 아이디어를 제시합니다.
shuva

답변:


30

가장 큰 차이점은 CMake는 크로스 플랫폼 메타 빌드 시스템입니다. 단일 CMake 프로젝트는 일반적인 Unix / Linux makefile, Windows 용 Visual Studio 프로젝트, Mac 용 XCode 프로젝트 및 사용하거나 지원하고자하는 거의 모든 기타 메타 빌드 시스템을 생성 할 수 있습니다.

직접 또는 수동으로 makefile을 편집하는 것은 "더 이상 사용되지 않는다"고 말하지는 않지만 Windows로 포팅 할 필요가없는 Unix / Linux 작업을 수행하지 않는 한 아마하지 말아야 할 것입니다. Windows 이외의 파일로 이식하려는 경우 Visual Studio 프로젝트 파일을 직접 편집해서는 안됩니다. 이식성에 관심이 있다면 Scons 또는 CMake와 같은 메타 빌드 시스템을 배우는 것이 좋습니다.


9
POSIX make는 또한 크로스 플랫폼입니다.
Blrfl

6
@Blrfl 이것은 사실 일 수 있지만 일반적으로 대상으로 삼는 모든 플랫폼이 POSIX 호환이더라도 프로젝트를 컴파일 및 / 또는 링크하는 데 필요한 명령 줄이 플랫폼마다 다릅니다. '모두에서 동일한 컴파일러를 사용하여 다시 (정지의 위치에 성가신 문제가있을 수 있습니다 당신이 필요로하는지 여부, 파일을 포함 -lm, -lnsl등 또는 그 시설이 C 라이브러리 등에 포함되는지 여부).
Jules

5
@Jules 더 많은 (또는 더 적은) CMake기능은 기본적으로 ELF 로더가있는 시스템을위한 표준 모듈 식 응용 프로그램 작성에 맞춰져 있으며 해당 특정 툴 체인에 필요한 모든 도구에 대한 추상화를 제공합니다. 해당 툴체인 (예 : 베어 메탈 용 사용자 지정 링커 스크립트)을 벗어나 CMake갑자기 지원이나 이식성이 전혀 제공되지 않으면 완전히 사용자 지정 빌드 스크립트를 해킹 할 때와 마찬가지로 해킹이 발생합니다.
Ext3h

Q make도 마찬가지다 (** ap CMake가 잘못 동작하는 것으로 문서화되지 않았음에도 불구하고), btw;)
mlvljr

11

되어 make정말 오래된?

나는 그렇게 생각하지 않습니다. 결국, make는 변경된 소스의 조건부 컴파일 등과 같은 원하는 모든 기능을 제공 할 수있을 정도로 강력합니다. 말하고 make, 구식이되었다 쓰는 사용자 정의 링커 스크립트가 구식이 된 말과 같은 것입니다.

그러나 원시 make가 제공하지 않는 것은 매개 변수 헤더 생성, 통합 테스트 프레임 워크 또는 일반적인 조건부 라이브러리와 같은 편의를위한 확장 기능 및 재고 라이브러리입니다.

반면, CMake일반 ELF 라이브러리 및 실행 파일을 생성하도록 직접 조정되었습니다. 미리 정의 된 절차에서 벗어날 때마다 CMake자신의 Makefile을 해킹 할 때와 마찬가지로 해킹을 시작해야합니다 .

ELF 로더를 알고있는 시스템의 일반적인 응용 프로그램보다 C ++로 훨씬 더 많은 것을 만들 수 있다는 점을 고려하면 CMake모든 시나리오에 적합하지는 않습니다. 그러나 표준화 된 환경에서 작업 CMake하거나 이러한 최신 스크립트 생성기 프레임 워크를 사용하는 것이 가장 친한 친구입니다.

항상 응용 프로그램의 전문성과 CMake프레임 워크 구조가 작업 흐름에 얼마나 잘 맞는지 에 따라 다릅니다 .


유용하지만 make는 브레인 데드, 비전 구문 및 많은 불필요한 순간을 만드는 불필요한 제한을 가진 끔찍한 시스템입니다.
antred

7

옛날 옛적에 높은 수준의 언어는 단지 아이디어였습니다. 사람들은 컴파일러를 구현하려고했습니다. 당시에는 하드웨어 제한이 심각했습니다. 그래픽 도구가 없었기 때문에 "일반 텍스트"가 입력 파일 형식으로 사용되었습니다. 컴퓨터에는 일반적으로 매우 작은 양의 RAM이 있으므로 소스 코드를 여러 조각으로 나눠야하고 컴파일러는 별도의 유틸리티 (사전 프로세서, 컴파일러, 어셈블러, 링커)로 분할되었습니다. CPU가 느리고 비싸서 비싼 최적화 등을 할 수 없었습니다.

물론 많은 소스 파일과 많은 유틸리티가 많은 객체 파일을 만드는 데 사용되므로 수동으로 무언가를 빌드하는 것은 엉망입니다. 도구의 설계 결함에 대한 해결책 (하드웨어로 인해 매우 제한됨) 사람들은 자연스럽게 스크립트를 작성하여 번거 로움을 없애기 시작했습니다.

안타깝게도 대본은 어색하고 어색했습니다. 제한된 하드웨어로 인한 도구의 디자인 결함에 대한 해결 방법 인 스크립트 문제를 해결하기 위해 사람들은 유틸리티를 발명하여보다 쉽게 ​​작업 할 수있게했습니다 make.

하나; makefile은 어색하고 지저분합니다. 제한된 하드웨어로 인해 발생하는 툴의 설계 결함에 대한 해결 방법이었던 makefile 문제를 해결하기 위해 사람들은 자동 생성 된 makefile을 실험하기 시작했습니다. 컴파일러가 의존성을 생성하는 것과 같은 것부터 시작; auto-conf 및 cmake와 같은 도구로 연결됩니다.

여기는 현재 우리가있는 곳입니다. 제한된 하드웨어로 인한 도구의 설계 결함에 대한 해결 방법을위한 해결 방법.

세기 말까지 기존 더미 위에 "해결 방법에 대한 해결 방법"계층이 몇 개 더있을 것으로 기대합니다. 아이러니하게도,이 모든 문제를 야기한 심각한 하드웨어 제한은 수십 년 전에 사라졌고 지금도 이러한 고풍스러운 혼란을 계속 사용하고있는 유일한 이유는 " 이것이 항상 수행 된 방법 "입니다.


1
대체 대안은 무엇입니까? 대안이 우리가 알고있는 빌드의 개념을 완전히 바꾸고 있습니까?
JParrilla

1
@Darkslash : (가설적인) 대안을 고려하기 시작하면 플러드 게이트를 여는 것과 같습니다. 결국 모든 것에 의문을 갖게되고 (의미론과 구문의 분리, IDE와 도구 및 제공을 개별적인 부분이 아닌 세트로 재 설계하는 것과 같은 아이디어로 끝납니다) 큰 퍼즐). 더 실용적인 것은 도구가 cmake증상 만 치료하고 근본 원인을 치료할 수 없다는 것을 인식하는 것입니다 . "이상적"에 가까운 도구를 사용하는 것 외에는 선택의 여지가 없다는 사실을보다 쉽게 ​​받아 들일 수 있습니다.
Brendan

5
Makefile은 어떤 식 으로든 '어색하고 어지럽 지 않습니다'. 그것들은 엄청나게 우아합니다. make그 중심에는 비 주기적 종속성 그래프를 통과하는 엔진이 있습니다. 'scripts'또는 명령 행에 관한 것은 'archaic'입니다.
Miles Rout

1
@MilesRout : 어색하고 지저분한 부분은 그래프 구성입니다. 순회는 충분히 우아합니다. 그러나 가장 혼란스러운 부분 인 C 헤더 파일을 예로 들어 보자. 각각 #include은 엣지이지만 makeC 파일을 구문 분석 할 수 없습니다. 아직 문제 때문에 make이러한 가장자리 저장할 수 다음 노드합니다 (* .o 인 파일)을하지만 그 중 하나를하지 않습니다.
MSalters

3
더 나은 디자인이 가능하다는 데 동의하지 않습니다. makeC 컴파일만을위한 것이 아닙니다! 당신은 걸리는 프로그램 원하는 .c.h파일 제공합니다 Makefile들. 그러나 그것은 아닙니다 . 그렇게해야 할 일은 make아닙니다 make. 다시 한 번 makeC에 관한 것이 아니며, C에 특화된 솔루션이 내장되어 make있다는 것은 나쁜 생각입니다.
Miles Rout

5

make (Makefile을 통한 도구 또는 직접 사용)는 특히 "소규모 개인 프로젝트"에 적합하지 않습니다.

물론 여러 플랫폼을 대상으로하는 프로젝트를 포함하여 더 큰 프로젝트에 사용할 수도 있습니다. 로 다음 대상별 변수를 쉽게 사용자 정의가 다른 플랫폼에 구축하는 방법을 수 있습니다. 요즘에는 Linux 배포판에 크로스 컴파일 툴체인 (예 : mingw-w64 )이 제공되므로 Makefile을 기반으로 Linux에서 완전한 Windows 소프트웨어 패키지 (원하는 경우 설치 프로그램 포함)를 빌드 할 수 있습니다.

cmakeqmake 와 같은 도구 가 유용 할 수 있지만 문제가없는 것은 아닙니다. 일반적으로 라이브러리와 함께 응용 프로그램 자체를 빌드하는 데 적합합니다 (하지만 항상 라이브러리와 라이브러리를 사용하는 프로그램간에 적절한 종속성 검사를 수행하는 qmake에 문제가 있었지만). 작업 (설치 프로그램 작성, 문서 또는 번역 파일 생성 / 설치, 아카이브를 공유 라이브러리로 변환하는 등의 비정상적인 작업 수행) 종속성 추적make 과 같은 작업에는 약간의 노력이 필요할 수 있지만 이 모든 작업은에서 수행 할 수 있습니다 .

Qt Creator 및 Eclipse와 같은 IDE도 Makefile 기반 프로젝트를 가져올 수 있으므로 IDE 사용 개발자와 공유 할 수 있습니다. Qt Creator IDE는 C ++ IDE만큼 우수하다고 생각하지만 Emacs에서 더 효과적으로 사용하기 위해 시간을 보낸 후 더 많은 Ada 개발을 수행하고 있기 때문에 모든 것을 위해 Emacs를 선호하고 있습니다. 에 대한 질문과 관련하여 makeMakefile의 포스트 링크 단계 로 다음 과 같이 로드 된 내 TAGS 파일 ( Emacs의 심볼 탐색 용)을 업데이트합니다 M-x visit-tags-table.

find $(SRC_DIR) $(TEST_DIR) -regex ".*\.[ch]\(pp\)?" -print | etags -

또는 Ada 개발의 경우 :

find $(SRC_DIR) $(TEST_DIR) -name "*.ad?" -print | etags -

2

이 답변은 @lxrec 답변을 보완합니다.

Makefile은 소스 코드에서 프로그램 / 라이브러리를 만드는 것뿐만 아니라 많은 용도로 사용할 수 있습니다. CMake 또는 autotools와 같은 빌드 시스템은 코드를 가져와 사용자의 플랫폼에 맞는 방식으로 빌드합니다 (예 : 라이브러리 찾기 또는 올바른 컴파일 옵션 지정). 예를 들어, 다음과 같은 일부 릴리스 작업을 자동화하는 데 도움이되는 makefile이있을 수 있습니다. git에서 파생 된 버전으로 코드가 포함 된 zip 파일을 빌드하십시오. 코드에 대해 테스트를 실행하십시오. zip 파일을 일부 호스팅 서비스에 업로드하십시오. automake와 같은 일부 빌드 시스템은이를 수행하는 쉬운 방법을 제공 할 수 있지만 다른 시스템은 그렇지 않을 수도 있습니다.

즉, makefile을 사용해야한다고 말하는 것은 아닙니다. 스크립팅 언어 (쉘, 파이썬 등)를 이러한 작업에 사용할 수 있습니다.


1

나는 인간의 서면 Makefile-s가 특히 다음과 같은 경우에 더 이상 사용되지 않는다고 생각하지 않습니다 .

  1. POSIX make를 사용하여 휴대용 Makefile
  2. 또는 GNU make 4를 사용하면 Makefile생성기에서 제공하는 멋진 기능을 효율적으로 코딩 할 수있는 매우 흥미로운 기능, 특히 GUILE 스크립팅 기능을 제공합니다 (autotools 또는 Cmake의 기능은 GNU make의 Guile 사용자 정의로 쉽게 작성할 수 있다고 생각합니다) ). 물론, 지불해야하는 가격은 GNU make 4 (IMHO)가 아니라는 것입니다.

0

텍스트 파일이 더 이상 사용되지 않는 것처럼 Makefile은 더 이상 사용되지 않습니다. 모든 데이터를 일반 텍스트로 저장하는 것이 항상 올바른 방법은 아니지만 원하는 모든 작업이 Todo List이면 일반 텍스트 파일이 좋습니다. 좀 더 복잡한 경우 Markdown 또는 XML과 같은 더 복잡한 형식이나 사용자 정의 이진 형식 또는 그 사이의 모든 것을 원할 수 있지만 간단한 경우 일반 텍스트가 정상적으로 작동합니다.

마찬가지로, 당신이 원하는 g++ -g src/*.c -o blah -W -Wall -Werror && ./blah모든 것이 항상 쓰지 않는 방법이라면 , 손으로 쓴 Makefile이 완벽합니다!

이식성을 직접 관리 할 필요가없는 이식성이 뛰어난 무언가를 만들고 싶다면 Autotools와 같은 것이 올바른 Makefile을 생성하기를 원할 것입니다. Autotools는 다양한 플랫폼에서 지원되는 기능을 감지합니다. Autotools로 빌드 된 표준 C89로 작성된 프로그램은 거의 모든 곳에서 컴파일됩니다.


"거의 모든 곳에서 컴파일"-> "가장 최근의 유닉스 계열 시스템에서 컴파일" autotools예를 들어 (Windows의 Unix와 유사한 시스템 인 Cygwin / MingW는 할인) Windows 시스템에서 어느 정도 관련이 있다고 생각하지 않습니다 .
sleske

최근과는 아무 상관이 없습니다. autotools의 장점은 모든 원격 POSIX 시스템에서 작동한다는 것입니다. Windows는 다소 POSIX를 준수합니다.
Miles Rout

그렇습니다, 나는 정정되었습니다. 실제로 autotools에 대한 하나의 비판은 아주 오래된 시스템에서도 코드가 포함되어 있다는 사실을 기억합니다. 그래도 여전히 Windows 부분에 서 있습니다.
썰매

그리고 그 책임은 전적으로 Microsoft에 있습니다. 그들이 양질의 제품을 생산하는 데 관심이 있다면 Windows는 POSIX와 같은 국제 운영 체제 표준을 적절히 지원할 것입니다. POSIX는 "유닉스"일뿐만 아니라 모든 운영 체제 휴대용 운영 체제 표준입니다. Windows는 단지 비 규격 정크 파일입니다.
Miles Rout 4

@MilesRout의 결론은 여전히 ​​"가상 어디에나" 90 % 데스크톱 컴퓨터를 배제한다는 것 입니다.
el.pescado

-2

프로젝트가 단순하고 파일이 거의없는 경우 make 파일이 필요하지 않습니다.

그러나 프로젝트가 복잡하고 많은 메모리 영역을 사용하고 파일이 많으면 주소 지정 가능한 메모리의 올바른 지점에 각 메모리 영역을 배치해야합니다. 사소한 변경이있을 때마다 모든 파일을 다시 컴파일하지 않는 것이 좋습니다. 하나의 파일로 만든

최소한의 번거 로움과 키 누르기 실수로 오래된 파일 / 컴파일 / 링크 / 설치를 지우려면 makefile이 정말 좋습니다.

'실제 세계'프로젝트에 들어가면 거의 1 ~ 2 개의 파일이 아니라 수백 개의 파일이됩니다. makefile은 항상 올바른 조치를 수행하고 불필요한 조치 (디버그 된 후)를 수행하지 않으므로 하나의 간단한 명령 만 입력하면 makefile이 모든 작업을 수행합니다.


1
그것은 왜 그 make이상 을 선호하는지 cmake또는 그 반대도 대답하지 못했습니다 .
Ext3h

makefile을 사용한다고해서 매번 모든 파일이 재 구축되는 것은 아닙니다. (다른 CMake 또는 자동 도구로는 사용할 수 없습니다.)
ideasman42
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.