CMake
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
- 1. 개요
- 2. 역사
- 3. 특징
- 3.1. 빌드 시스템 생성 (Generators)
- 3.2. 빌드 대상 (Build targets)
- 3.3. 계층적 설정 (Hierarchical configuration)
- 3.4. 소스 트리와 빌드 트리 분리 (Separate build tree)
- 3.5. 종속성 관리 (Dependency management)
- 3.6. 유연한 프로젝트 구조 (Flexible project structure)
- 3.7. IDE 설정 지원 (IDE configuration support)
- 3.8. 컴파일러 기능 감지 (Compiler feature detection)
- 3.9. 컴파일러 지원 (Compiler support)
- 3.10. 패키징 (Packaging)
- 3.11. 기타 기능
- 4. CMake 언어
- 5. 내부 구성
- 6. CPack
- 7. 빌드 과정
- 8. CMake를 채택한 프로젝트
- 9. 예제
- 참조
1. 개요
CMake는 소프트웨어 빌드를 위한 오픈 소스 크로스 플랫폼 도구이다. 1999년 키트웨어에서 개발을 시작하여, C, C++, 자바, 포트란 등 다양한 언어의 프로젝트를 지원하며, 다양한 플랫폼과 IDE에 대응하는 makefile을 생성한다. CMake는 복잡한 디렉터리 구조와 여러 라이브러리에 의존하는 애플리케이션의 빌드를 지원하며, CTest를 통한 유닛 테스트, CPack을 통한 자동 인스톨러 생성 등의 기능을 제공한다. 또한, 소스 트리와 빌드 트리를 분리하여 여러 빌드를 관리하고, 종속성 관리 및 유연한 프로젝트 구조를 지원한다. CMake는 3.0 버전부터 "모던 CMake"를 도입하여 대상별 명령을 권장하며, CPack을 통해 패키징 기능을 제공한다.
더 읽어볼만한 페이지
- 컴파일 도구 - Libtool
Libtool은 다양한 유닉스 계열 운영 체제에서 정적 및 동적 라이브러리 생성을 관리하고, 운영 체제별 차이로 인한 소프트웨어 이식 문제를 해결하기 위해 GNU 빌드 시스템에서 사용되는 도구이다. - 컴파일 도구 - GNU 빌드 시스템
GNU 빌드 시스템은 Autoconf, Automake, Libtool 등의 오토툴과 GNU make 등으로 구성되어 다양한 UNIX 시스템에서 소프트웨어 빌드 및 설치를 지원하지만, 복잡성과 이식성에 대한 비판도 존재한다. - 빌드 자동화 - GNU 빌드 시스템
GNU 빌드 시스템은 Autoconf, Automake, Libtool 등의 오토툴과 GNU make 등으로 구성되어 다양한 UNIX 시스템에서 소프트웨어 빌드 및 설치를 지원하지만, 복잡성과 이식성에 대한 비판도 존재한다. - 빌드 자동화 - MSBuild
MSBuild는 마이크로소프트에서 개발한 빌드 자동화 도구로서, 프로젝트 파일에 기술된 대상을 실행하여 빌드 과정을 자동화하며, Team Foundation 빌드와 연동하여 팀 빌드 환경을 구성하는 데 사용된다. - BSD 라이선스 소프트웨어 - V8 (자바스크립트 엔진)
V8은 구글이 개발한 오픈 소스 자바스크립트 엔진으로, 자바스크립트 코드 실행 속도 향상을 위해 여러 컴파일러를 거쳐 크롬, 노드.js 등에서 활용된다. - BSD 라이선스 소프트웨어 - VP9
VP9는 구글이 개발한 오픈 소스 비디오 코덱으로, VP8보다 압축 효율을 높이고 HEVC보다 나은 성능을 목표로 개발되었으며, WebM 형식으로 사용되고 주요 웹 브라우저와 넷플릭스, 유튜브 등에서 지원했으나 AV1의 등장으로 개발이 중단되었다.
CMake - [IT 관련 정보]에 관한 문서 | |
---|---|
기본 정보 | |
![]() | |
개발자 | 앤디 세딜니크, 빌 호프만, 브래드 킹, 켄 마틴, 알렉산더 노인도르프 |
출시일 | 2000년 |
최신 안정화 버전 | 3.28.1 |
최신 안정화 버전 출시일 | 2024년 2월 28일 |
최신 프리뷰 버전 | 3.29.0-rc1 |
최신 프리뷰 버전 출시일 | 2024년 3월 11일 |
프로그래밍 언어 | C, C++ |
운영체제 | 크로스 플랫폼 |
장르 | 소프트웨어 개발 도구 |
라이선스 | BSD-3-Clause |
웹사이트 | CMake 공식 웹사이트 |
2. 역사
키트웨어(Kitware)에서 1999년 미국 국립 의학 도서관(United States National Library of Medicine)의 지원을 받아 가시 인간 프로젝트(Visible Human Project)의 일환으로 초기 개발을 시작했다.[3] 2000년에 CMake가 처음 출시되었다.
CMake는 여러 플랫폼에서 인사이트 분할 및 등록 툴킷(Insight Segmentation and Registration Toolkit)(ITK)을 빌드하기 위해 개발되었다. 목표는 autoconf 및 libtool과 같은 당시 도구의 강점을 유지하면서 약점을 해결하고, 당시 최첨단 빌드 기술인 구성 스크립트와 Unix 플랫폼용 Make 파일, Windows용 Visual Studio 프로젝트 파일과 일치시키는 것이었다.[5][3]
CMake는 여러 현대적인 도구에서 영감을 받았다. 켄 마틴 등이 개발하여 시각화 툴킷 (VTK)를 빌드하는 데 사용된 pcmaker는 Unix Make 파일을 Windows에서 빌드하기 위한 NMake 파일로 변환했다.[3] gmake는 Unix 및 Windows 컴파일러를 지원했지만, 설계로 인해 해결하기 어려운 환경 문제가 발생했다. 두 도구 모두 Unix와 Windows를 모두 지원하는 빌드 도구의 작동 예시였지만, 심각한 결함이 있었다. 많은 개발자가 Visual Studio와 같은 통합 개발 환경(IDE) 사용을 선호함에도 불구하고 Windows 개발자가 명령줄을 사용해야 했다.
CMake는 유사한 크로스 플랫폼 지원을 제공하면서 각 플랫폼의 개발자 선호도를 더 잘 충족시키기 위해 개발되었다.
첫 번째 버전의 설계 목표는 다음과 같았다.[3]
- 호스트 C++ 컴파일러에만 의존; 다른 타사 도구나 라이브러리 필요 없음
- Visual Studio 프로젝트 파일 생성(Unix 파일 포함)
- 프로그램, 정적 라이브러리, 공유 라이브러리 빌드 대상 지원
- 빌드 타임 코드 생성기 실행
- 소스 코드와 빌드 파일에 대한 별도의 디렉터리 트리 지원
- 호스트 컴퓨터 기능 내성 지원
- C/C++ 헤더 파일의 자동 종속성 스캔 지원
- 모든 기능은 지원되는 모든 플랫폼에서 일관되고 동일하게 작동해야 함
다양한 이유로, CMake 개발자는 당시 빌드에 널리 사용되던 언어인 Tcl 대신 CMake용 스크립팅 언어를 개발하기로 결정했다. Tcl을 사용하면 컴파일러 외에 다른 종속성이 없는 것을 목표로 하는 호스트 시스템에 종속성이 추가되었을 것이다. 또한 Tcl은 초기 개발 당시 Windows 및 일부 Unix 시스템에서 제대로 지원되지 않았다.[3]
이후 개발 및 개선은 VXL 프로젝트, 브래드 킹이 추가한 CABLE[6] 기능, 및 DART 지원을 위한 GE 기업 R&D를 포함하여 개발자의 자체 시스템에 CMake를 통합함으로써 이루어졌다. VTK가 빌드 환경과 ParaView 지원을 위해 CMake로 전환하면서 추가 기능이 생성되었다.
3.0 버전은 2014년 6월에 출시되었다.[7] 이는 "모던 CMake"의 시작으로 묘사되었다.[8] 전문가들은 이제 변수를 피하고 ''대상''과 ''속성''을 사용하는 것을 권장한다.[9] CMake 2의 핵심이었던 add_compile_options영어, include_directories영어, link_directories영어, link_libraries영어 명령은 이제 대상별 명령으로 대체해야 한다.
3. 특징
CMake는 소프트웨어 빌드에 특화된 언어를 사용하며, 독자적인 설정 스크립트를 사용한다. C, C++, 자바, 포트란에 대해서는 자체적으로 의존 관계를 분석할 수 있으며, 스위그, Qt 지원에 특화되어 있다.
마이크로소프트 비주얼 스튜디오를 자체적으로 지원하고(6, 7, 7.1, 8.0, 9.0 등), 이클립스용 빌드 파일을 생성할 수 있다. 또한, 타임스탬프를 통해 파일 내용의 변화를 파악하고, 평행 빌드와 크로스 컴파일을 지원한다.
CMake는 다음과 같은 다양한 플랫폼을 지원한다.
내부 모듈인 CTest를 통해 유닛 테스트를 수행할 수 있으며, CPack을 사용하여 자동 인스톨러를 생성할 수도 있다.
3. 1. 빌드 시스템 생성 (Generators)
CMake는 다양한 플랫폼에서 소프트웨어를 빌드하기 위한 도구로, 각 플랫폼에 맞는 빌드 시스템을 생성하는 기능을 제공한다. 이러한 기능은 "제너레이터"라고 불리는 별도의 모듈을 통해 제공된다.CMake는 기본적으로 호스트 환경(현재 사용 중인 운영 체제 및 개발 환경)에 맞는 제너레이터를 자동으로 선택한다. 예를 들어, 유닉스 계열 운영 체제에서는 make를 위한 파일을 생성하는 'Unix Makefiles' 제너레이터가 기본적으로 사용된다.[3] 사용자는 명령줄 옵션을 사용하여 원하는 제너레이터를 직접 지정할 수도 있다.
CMake는 다음과 같은 다양한 제너레이터를 지원한다.
- Unix Makefiles: make를 위한 파일을 생성한다.[3]
- Visual Studio: 마이크로소프트 비주얼 스튜디오 프로젝트 파일을 생성한다. (6, 7, 7.1, 8.0, 9.0 등 지원)
- Xcode: macOS에서 사용되는 Xcode 프로젝트 파일을 생성한다.
- 이클립스: 이클립스용 빌드 파일을 생성할 수 있다.
CMake는 사용자 지정 제너레이터를 직접 지원하지는 않지만, 필요한 경우 CMake 소스 코드를 수정하여 사용자 지정 제너레이터를 추가할 수 있다.
CMake는 인플레이스(in-place) 빌드와 아웃오브플레이스(out-of-place) 빌드를 모두 지원한다. 아웃오브플레이스 빌드를 사용하면 동일한 소스 트리에서 여러 빌드 결과를 생성할 수 있으며, 크로스 컴파일도 가능하다. 이 방식은 빌드 트리가 삭제되어도 소스 파일에 영향을 주지 않는다는 장점이 있다.
3. 2. 빌드 대상 (Build targets)
CMake는 실행 파일, 라이브러리(예: `libxyz`, `xyz.dll` 등), 오브젝트 파일 라이브러리 및 가상 대상(별칭 포함)의 빌드를 지원한다.[11] 실행 바이너리/라이브러리에 링크될 수 있는 오브젝트 파일을 생성하여 동적(런타임) 링크를 피하고 정적(컴파일 타임) 링크를 대신 사용할 수 있도록 하여 다양한 최적화 설정을 유연하게 할 수 있게 한다.[11]대상 생성은 대상 속성을 통해 구성할 수 있다. 이전 버전에서는 `CMAKE_` 접두사가 붙은 전역 변수를 통해 수행되었지만, 이 방식은 더 이상 사용되지 않는다.[9][12]
CMake는 다음과 같은 빌드 방식을 지원한다.
- 인플레이스(in-place) 빌드
- 아웃오브플레이스(out-of-place) 빌드: 동일한 소스 트리에서 여러 빌드 결과를 생성할 수 있다.
- 크로스 컴파일
소스 트리 외부에서 빌드 결과를 생성하는 아웃오브플레이스 방식은 CMake의 중요한 특징으로, 빌드 트리가 삭제되어도 소스 파일에는 영향을 미치지 않도록 해준다.
CMake는 필요한 실행 파일, 기타 파일 및 라이브러리의 위치를 찾아낼 수 있으며, 그 결과는 캐시에 저장되어 빌드 전에 조정할 수 있다. 조정에는 프로젝트에 포함된 그래픽 편집기를 사용할 수 있다.
복잡한 디렉터리 계층 구조나 여러 라이브러리에 의존하는 애플리케이션에도 CMake는 대응한다. 예를 들어, 의존하는 툴킷이나 라이브러리가 각각 여러 디렉토리를 가지는 경우에도 처리가 가능하다. 또한, 최종 애플리케이션의 컴파일에 필요한 코드를 생성하는 실행 파일을 미리 생성해 두어야 하는 복잡한 빌드에도 대응할 수 있다. CMake는 오픈 소스이며, 확장이 용이하므로 필요에 따라 특정 프로젝트에 맞게 개조할 수도 있다.
CMake는 유닉스, Windows, macOS, OS/2와 같은 다양한 플랫폼과 마이크로소프트 비주얼 C++, Cygwin, MinGW, Xcode와 같은 IDE에 대응하는 makefile을 생성할 수 있다.
3. 3. 계층적 설정 (Hierarchical configuration)
CMake 설정 파일은 소스 코드의 계층 구조(소스 트리)에 따라 구성될 수 있다. 루트 소스 디렉터리의 `CMakeLists.txt` 파일은 설정의 루트 역할을 한다. 여기에는 각각 `CMakeLists.txt` 파일을 포함하는 하위 디렉터리가 포함될 수 있다. 이를 반복하면 소스 코드의 구조를 따르는 설정의 계층 구조가 생성된다.[9][12]3. 4. 소스 트리와 빌드 트리 분리 (Separate build tree)
CMake는 생성된 파일(CMake와 네이티브 빌드 도구 모두)을 소스 트리와는 별개의 디렉터리 트리에서 찾을 수 있도록 지원한다.[3]이를 통해 각 빌드가 겹치지 않는 파일 시스템 공간을 가지므로, 동일한 소스 트리에서 여러 빌드를 수행할 수 있다. 이는 서로 다른 플랫폼과 같이 서로 다르거나 호환되지 않는 구성을 빌드하는 데 활용될 수 있다.
또한, 소스 트리 전체에서 여러 파일과 디렉터리를 제거하는 대신 단일 디렉터리 트리를 삭제하여 생성된 파일을 제거할 수 있으므로 파일 관리가 간소화된다. 이는 실수로 소스 파일을 삭제하거나 실수로 생성된 파일을 소스 관리에 추가하는 것을 방지하는 경향이 있다. CMake는 인플레이스(in-place) 및 아웃오브플레이스(out-of-place) 빌드 모두를 지원하며, 동일한 소스 트리에서 여러 빌드 결과를 생성할 수 있고, 크로스 컴파일도 지원한다. 소스 트리 외부에서 빌드 결과를 생성하는 방식은 CMake의 중요한 특징으로, 빌드 트리가 삭제되어도 소스 파일에는 영향을 미치지 않는다.
3. 5. 종속성 관리 (Dependency management)
CMake는 C, C++, 자바, 포트란에 대해 자체적으로 의존 관계를 분석할 수 있다.[3] 소스 코드가 변경되거나 빌드될 때 다운스트림 구성 요소가 다시 빌드되도록 보장한다.[3]CMake는 필요한 실행 파일, 기타 파일 및 라이브러리의 위치를 찾아낼 수 있으며, 그 결과는 캐시에 저장되어 빌드 전에 조정할 수 있다.
3. 6. 유연한 프로젝트 구조 (Flexible project structure)
CMake는 인플레이스(in-place) 및 아웃오브플레이스(out-of-place) 빌드를 모두 지원하며, 동일한 소스 트리에서 여러 빌드 결과를 생성할 수 있고, 크로스 컴파일도 지원한다. 소스 트리 외부에서 빌드 결과를 생성하는 방식은 CMake의 중요한 특징으로, 빌드 트리가 삭제되어도 소스 파일에는 영향을 미치지 않는다.[13]CMake는 필요한 실행 파일, 기타 파일 및 라이브러리의 위치를 찾아낼 수 있다. 그 결과는 캐시에 저장되며, 빌드 전에 조정할 수 있다. 조정에는 프로젝트에 포함된 그래픽 편집기를 사용할 수 있다.[13]
복잡한 디렉토리 계층 구조나 여러 라이브러리에 의존하는 애플리케이션에도 CMake는 대응한다. 예를 들어, 의존하는 툴킷이나 라이브러리가 각각 여러 디렉토리를 가지는 경우에도 처리가 가능하다. 또한, 최종 애플리케이션의 컴파일에 필요한 코드를 생성하는 실행 파일을 미리 생성해 두어야 하는 복잡한 빌드에도 대응할 수 있다. CMake는 오픈 소스이며, 확장이 용이하므로 필요에 따라 특정 프로젝트에 맞게 개조할 수도 있다.[13]
CMake는 유닉스, Windows, macOS, OS/2와 같은 다양한 플랫폼과 마이크로소프트 비주얼 C++, Cygwin, MinGW, Xcode와 같은 IDE에 대응하는 makefile을 생성할 수 있다.
3. 7. IDE 설정 지원 (IDE configuration support)
CMake는 마이크로소프트 비주얼 스튜디오, Xcode, 이클립스 CDT 등 여러 인기 IDE용 프로젝트 파일을 생성할 수 있다.[3] Windows에서는 MSBuild 또는 NMake용 빌드 스크립트를, 리눅스, macOS, Cygwin 등 유닉스 계열 플랫폼에서는 Unix Make를, Windows 및 유닉스 계열 플랫폼 모두에서는 Ninja를 생성할 수 있다.CMake는 인플레이스(in-place) 및 아웃오브플레이스(out-of-place) 빌드를 모두 지원하며, 동일한 소스 트리에서 여러 빌드 결과를 생성할 수 있고, 크로스 컴파일도 지원한다. 소스 트리 외부에서 빌드 결과를 생성하는 방식은 CMake의 중요한 특징으로, 빌드 트리가 삭제되어도 소스 파일에는 영향을 미치지 않는다.
CMake는 유닉스, Windows, macOS, OS/2 등 다양한 플랫폼과 마이크로소프트 비주얼 C++, Cygwin, MinGW, Xcode 등 IDE에 대응하는 makefile을 생성할 수 있다.
3. 8. 컴파일러 기능 감지 (Compiler feature detection)
CMake는 대상 프로그램이나 라이브러리를 컴파일하기 위해 컴파일러가 지원해야 하는 기능을 지정할 수 있게 한다.[14]3. 9. 컴파일러 지원 (Compiler support)
CMake는 다음과 같은 다양한 컴파일러를 지원한다.[15]지원 컴파일러 |
---|
애플 Clang |
Clang |
GNU GCC |
MSVC |
Oracle Developer Studio |
Intel C++ Compiler |
CMake는 소스 트리 내부(in-place) 및 외부(out-of-place) 빌드를 모두 지원하며, 동일한 소스 트리에서 여러 빌드 결과를 생성할 수 있고, 크로스 컴파일도 지원한다. 소스 트리 외부에서 빌드 결과를 생성하는 방식은 CMake의 중요한 특징으로, 빌드 트리가 삭제되어도 소스 파일에는 영향을 미치지 않는다.
3. 10. 패키징 (Packaging)
CPack은 CMake와 긴밀하게 통합된 소프트웨어 배포를 위한 패키징 시스템이다. 하지만 CMake가 없어도 동작하도록 만들어졌다.[16][17][18]일반적으로 다음과 같은 용도로 사용할 수 있다.
CMake는 패키지를 소비하고 생성할 수 있다. CMake는 빌드 프로세스의 일부로 사용할 수 있는 원격 서버에서 패키지를 가져오는 기능을 제공한다. CPack을 통해 파일은 대상 플랫폼에서 지원하는 압축 파일, 패키지 관리자 또는 설치 프로그램으로 압축될 수 있다.[16][17][18]
3. 11. 기타 기능
CMake는 독자적인 설정 스크립트를 사용하여 소프트웨어 빌드에 특화된 언어이다. C, C++, 자바, 포트란에 대해서는 자체적으로 의존 관계를 분석할 수 있다. 스위그, Qt 지원에 특화되어 있다.마이크로소프트 비주얼 스튜디오를 자체적으로 지원하며(6, 7, 7.1, 8.0, 9.0 등), 이클립스용 빌드 파일을 생성할 수 있다. 타임스탬프를 통해 파일 내용의 변화를 알아낼 수 있으며, 평행 빌드 및 크로스 컴파일도 가능하다.
다양한 플랫폼을 지원한다.
내부 모듈인 CTest로 유닛 테스트를 수행할 수 있고, CPack으로 자동 인스톨러를 만들 수 있다. CMake는 명령줄 인터페이스나 `ccmake`와 같은 ncurses 프로그램을 사용하여 프로젝트를 구성할 수 있다.
4. CMake 언어
CMake는 변수, 문자열 조작, 배열, 함수 및 매크로 선언, 모듈 포함(가져오기)을 지원하는 비교적 단순하고 사용자 정의된 명령형 스크립트 언어에 대한 인터프리터를 포함하고 있다.[21]
인터프리터는 소스 파일과 빌드 환경 설정을 지정하는 `CMakeLists.txt`라는 이름의 파일에서 CMake 언어 명령어를 읽는다. CMake는 이 정보를 사용하여 네이티브 툴 구성 파일을 생성한다. `.cmake` 접미사가 있는 파일은 추가 스크립트를 저장하는 데 사용될 수 있다.[21]
5. 내부 구성
CMake 스크립트 언어는 Yacc 및 Lex 생성기를 통해 구현된다.[23]
실행 프로그램인 CMake, CPack, CTest는 C++(C++)로 작성되었다.[23]
CMake 기능의 상당 부분은 CMake 언어로 작성된 모듈로 구현된다.[23]
CMake 문서(3.0 릴리스 이후)는 reStructuredText 마크업을 사용한다.[23] HTML 페이지와 man 페이지는 Sphinx 문서 생성기에 의해 생성된다.[23]
6. CPack
CPack은 CMake와 긴밀하게 통합된 소프트웨어 배포용 패키징 시스템이다. 하지만 CMake 없이도 동작하도록 만들어졌다.[16]
CPack은 일반적으로 다음과 같은 용도로 사용할 수 있다.
7. 빌드 과정
CMake를 통한 빌드는 다음 두 가지 주요 단계로 이루어진다.[3]
1. 먼저, CMake 스크립트 언어로 작성된 CMake 구성 파일(`CMakeLists.txt`)로부터 네이티브 빌드 도구 구성 파일이 생성된다. 명령줄 구문은 `cmake
2. 다음으로, CMake (`cmake --build
각 프로젝트는 디렉터리마다 빌드 프로세스를 제어하기 위한 파일 `CMakeLists.txt`를 갖는다. 해당 파일에는 하나 이상의 명령어가 `COMMAND (args...)` 형식으로 기술된다. 여기서 `COMMAND`는 명령어를 나타내는 이름이며, `args`는 공백으로 구분된 인수의 목록이다. CMake에는 정적/동적 라이브러리나 실행 파일을 컴파일하기 위한 다양한 내장 규칙이 제공되며, 사용자가 규칙을 추가할 수도 있다. 빌드에 관한 종속성의 일부는 자동으로 해결된다. 고급 사용법으로는 특수한 컴파일러나 운영체제에 대응하기 위한 makefile 생성기를 통합하는 것이 가능하다.[33]
8. CMake를 채택한 프로젝트
다음은 CMake를 채택한 주요 프로젝트들이다.
프로젝트명 | 설명 |
---|---|
KDE | 4판부터 채택 |
LMMS | |
MySQL | 마이크로소프트 윈도우, 리눅스에서 채택 |
OpenLieroX | |
OpenSceneGraph | |
OpenSourceComputerVision | |
SuperTux | |
VTK | |
뮤즈스코어 | |
스크리버스 | |
스텔라리움 | |
퀀텀 GIS | |
포플러 | Autoconf와 CMake를 함께 지원 |
헷지워즈 | |
GNU Radio | 외부 링크 |
안드로이드 NDK | |
넷플릭스 | |
INRIA | |
부스트 (C++ 라이브러리) | |
KeePassXC | |
키캐드 | |
FreeCAD | |
웹킷 | |
블렌더[28] | |
Biicode | |
ReactOS | |
아파치 큐피드 | |
ATLAS 실험[29] | |
세컨드 라이프[30] |
9. 예제
cmake
if (${UNIX})
set (DESKTOP $ENV{HOME})
else()
set (DESKTOP $ENV{USERPROFILE}/Desktop)
endif()
set (PRJ ${DESKTOP}/common/svn)
set (FILELIST ${PRJ}/src/source.txt)
message(STATUS "CMAKE_GENERATOR : ${CMAKE_GENERATOR}")
message(STATUS "DESKTOP : ${DESKTOP}")
message(STATUS "PRJ : ${PRJ}")
message(STATUS "FILELIST : ${FILELIST}")
message(STATUS "SYSTEM_NAME : ${CMAKE_SYSTEM_NAME}")
project(project_name)
include_directories(
${PRJ}/src
${PRJ}/includes
)
# Load SRC Variable from file
file(READ ${FILELIST} SRC)
string(REGEX REPLACE "#.*$" "" SRC ${SRC})
string(REPLACE "\n" ";" SRC ${SRC})
add_executable(${PROJECT_NAME} ${SRC})
foreach (f ${SRC})
set_source_files_properties(${f} PROPERTIES LANGUAGE CXX)
endforeach(f)
if (${WIN32})
link_directories()
add_definitions(
- DDEFINE1
)
target_link_libraries(
${PROJECT_NAME}
wsock32.lib
)
endif()
```
CMake는 구성 파일(CMakeLists.txt)을 통해 프로젝트를 관리한다. 위의 코드는 CMake 구성 파일의 예시로, 유닉스 계열 및 윈도우 시스템에 따라 다른 설정을 적용하고, 파일을 읽어 변수를 설정하며, 실행 파일을 생성하고, 소스 파일 속성을 설정하며, 윈도우 환경에서 필요한 라이브러리를 링크하는 등의 작업을 수행한다.
'Hello world'와 'Include' 예제는 하위 섹션에서 더 자세히 다룬다.
9. 1. Hello world
다음은 C++로 작성된 헬로 월드 프로그램을 빌드하도록 CMake를 구성하고, CMake를 사용하여 프로그램을 빌드하는 방법을 보여준다.hello.cpp:
#include
int main() {
std::cout << "Hello, world!" << std::endl;
return 0;
}
CMakeLists.txt:
cmake_minimum_required(VERSION 3.5)
project(HelloWorld CXX)
add_executable(hello hello.cpp)
CMake를 통해 빌드하려면 먼저 위의 두 파일을 포함하는 디렉토리로 이동한다. 그런 다음, 크로스 플랫폼 CMake 명령을 통해 네이티브 빌드 구성 파일을 생성한다.
cmake -B out .
생성된 모든 파일은 ''out'' 디렉터리 아래에 있다.
그런 다음 CMake를 통해 지원되는 네이티브 빌드 도구를 통해 빌드한다.
cmake --build out
그러면 프로그램을 실행할 수 있다. Bash를 통해 명령은 ./out/hello와 같다. Windows에서는 출력 파일이 .exe로 끝난다.
9. 2. Include
다음은 전처리기 포함 경로를 설정하는 예시이다.'''hello.cpp:'''
```cpp
#include "hello.h"
#include
int main() {
for (int i = 0; i < Times; i++) {
std::cout << "Hello, world!" << std::endl;
}
return 0;
}
```
'''hello.h:'''
```cpp
const int Times = 10;
```
'''CMakeLists.txt:'''
```cmake
cmake_minimum_required(VERSION 3.5)
project(HelloWorld CXX)
include_directories(${PROJECT_SOURCE_DIR})
add_executable(hello hello.cpp)
```
`include_directories()`는 전처리기 포함 경로를 설정한다. `${PROJECT_SOURCE_DIR}`는 현재 프로젝트의 소스 디렉토리를 나타내는 CMake 변수이다.
참조
[1]
웹사이트
The CMake Open Source Project on OpenHub
https://www.openhub.[...]
OpenHub
2016-04-09
[2]
웹사이트
CMake
https://cmake.org/
[3]
웹사이트
The Architecture of Open Source Applications (Volume 1)CMake
https://aosabook.org[...]
2023-06-11
[4]
웹사이트
Licenses · master · CMake / CMake
https://gitlab.kitwa[...]
2020-11-13
[5]
웹사이트
FLOSS Weekly 111: CMake
http://twit.tv/floss[...]
TWiT Network
2011-02-27
[6]
웹사이트
The CABLE
https://web.archive.[...]
2010-11-10
[7]
웹사이트
'[CMake] [ANNOUNCE] CMake 3.0.0 Released.'
https://cmake.org/pi[...]
2014-06-10
[8]
웹사이트
Effective Modern CMake
https://gist.github.[...]
[9]
웹사이트
Effective Modern CMake
https://gist.github.[...]
2018-07-22
[10]
URL
https://public.kitwa[...]
2024-08
[11]
웹사이트
cmake-buildsystem(7) — CMake 3.19.0-rc3 Documentation
https://cmake.org/cm[...]
2020-11-14
[12]
conference
Effective Cmake
https://github.com/b[...]
2017-05-19
[13]
웹사이트
Why the KDE project switched to CMake—and how
https://lwn.net/Arti[...]
LWN.net
2006-06-21
[14]
웹사이트
CMake compiler feature detect
https://www.scivisio[...]
2020-11-15
[15]
웹사이트
Supported Compilers
https://cmake.org/cm[...]
2022-01-22
[16]
서적
CMake Best Practices : Discover Proven Techniques for Creating and Maintaining Programming Projects with CMake
https://www.worldcat[...]
Packt Publishing, Limited
2022
[17]
웹사이트
cmake-packages(7) — CMake 3.24.1 Documentation
https://cmake.org/cm[...]
2022-09-11
[18]
웹사이트
Exposing a module's configuration (advanced) — CMake build procedure 1.0 documentation
https://docs.salome-[...]
2022-09-11
[19]
웹사이트
target_precompile_headers — CMake 3.21.20210925-gb818e3c Documentation
https://cmake.org/cm[...]
2021-09-25
[20]
웹사이트
CMake 3.19 Release Notes — CMake 3.19.7 Documentation
https://cmake.org/cm[...]
2021-03-15
[21]
웹사이트
cmake-language(7) — CMake 3.19.0-rc2 Documentation
https://cmake.org/cm[...]
2020-10-29
[22]
웹사이트
Cross-Platform Software Development Using CMake Software
https://www.linuxjou[...]
Linux Journal
2021-01-29
[23]
웹사이트
cmake-language(7) — CMake 3.19.0-rc1 Documentation
https://cmake.org/cm[...]
2020-10-25
[24]
웹사이트
cmake-modules(7) — CMake 3.14.7 Documentation
https://cmake.org/cm[...]
2020-10-24
[25]
웹사이트
ExternalProject — CMake 3.14.7 Documentation
https://cmake.org/cm[...]
2020-10-24
[26]
웹사이트
Packaging With CPack
https://gitlab.kitwa[...]
[27]
문서
cpack
[28]
웹사이트
Building Blender - Blender Developer Wiki
https://wiki.blender[...]
2021-07-01
[29]
웹사이트
Large Scale Software Building with CMake in ATLAS
https://cds.cern.ch/[...]
CERN
[30]
웹사이트
CMake Success
https://cmake.org/su[...]
Kitware
2011
[31]
웹사이트
cmake-toolchains(7) — CMake 3.19.0-rc2 Documentation
https://cmake.org/cm[...]
2020-10-29
[32]
웹사이트
Ohloh Analysis Summary - CMake
http://www.ohloh.net[...]
Ohloh
2009-12-25
[33]
웹사이트
Why the KDE project switched to CMake—and how
http://lwn.net/Artic[...]
LWN.net
2006-06-21
[34]
웹사이트
FLOSS Weekly 111: CMake
http://twit.tv/floss[...]
TWiT Network
2011-02-27
[35]
웹사이트
The CABLE
http://public.kitwar[...]
[36]
웹인용
Ohloh Analysis Summary - CMake
http://www.ohloh.net[...]
Ohloh
2009-12-25
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com