Development/Tutorials/CMake (ko): Difference between revisions

From KDE TechBase
No edit summary
No edit summary
 
(14 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{Template:I18n/Language Navigation Bar|Development/Tutorials/CMake}}


== 소개 ==
== 소개 ==
CMake는 스크립트 파일을 읽고, 그것이 실행되는 플랫폼의 native 빌드 시스템의 위해 input 파일들을 생성한다.
CMake는 스크립트 파일을 읽고, 그것이 실행되는 플랫폼의 native 빌드 시스템의 위해 input 파일들을 생성한다.
이것은 GNU Makefile, KDevelop 프로젝트파일, XCode 프로젝트 파일, 그리고 Visual Studio 프로젝트 파일을 생성할수 있다.
이것은 GNU Makefile, KDevelop 프로젝트파일, XCode 프로젝트 파일, 그리고 Visual Studio 프로젝트 파일을 생성할수 있다.
:''CMake reads script files and produces input files for the native buildsystem of the platform where it runs on. It can create GNU Makefiles, KDevelop project files, XCode project files, and Visual Studio project files.''


CMake는 자유 소프트웨어이고, BSD-style 라이센스 한에서 릴리즈된다. 이것은 [http://www.kitware.com Kitware Inc.]에 의해 개발되었다.
CMake는 자유 소프트웨어이고, BSD-style 라이센스 한에서 릴리즈된다. 이것은 [http://www.kitware.com Kitware Inc.]에 의해 개발되었다.
:''CMake is free software and released under a BSD-style license.  It is developed by [http://www.kitware.com Kitware Inc.]''


아래의 링크들은 일반적으로 CMake에 대해 배울수 있는 몇몇 괜찮은 곳들이다.:
아래의 링크들은 일반적으로 CMake에 대해 배울수 있는 몇몇 괜찮은 곳들이다.
* [http://www.cmake.org/HTML/Documentation.html CMake 메뉴얼]
* [http://www.cmake.org/HTML/Documentation.html CMake 매뉴얼]
* [http://www.cmake.org/Wiki/CMake CMake 위키]
* [http://www.cmake.org/Wiki/CMake CMake 위키]
* [http://www.cmake.org/Wiki/CMake_HowToDoPlatformChecks CMake 시스템 검사]
* [http://www.cmake.org/Wiki/CMake_HowToDoPlatformChecks CMake 시스템 검사]
* [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware 추가적인 패키지 찾기]
* [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware 추가 꾸러미 찾기]
* [http://www.cmake.org/Wiki/HowToBuildKDE4Software CMake 위키에서의 KDE 4 튜트리얼]
* [http://www.cmake.org/Wiki/HowToBuildKDE4Software CMake 위키에서의 KDE 4 튜토리얼]
* [http://www.cmake.org/Wiki/CMake_FAQ CMake FAQ]
* [http://www.cmake.org/Wiki/CMake_FAQ CMake FAQ]
* [http://mail.kde.org/pipermail/kde-buildsystem/ kde-buildsystem 메일링 리스트 문서]
* [http://mail.kde.org/pipermail/kde-buildsystem/ kde-buildsystem 메일링 리스트 문서]
:''Here are some good places to learn about CMake in general:
* [http://www.cmake.org/HTML/Documentation.html CMake Manual]
* [http://www.cmake.org/Wiki/CMake CMake Wiki]
* [http://www.cmake.org/Wiki/CMake_HowToDoPlatformChecks CMake System Checks ]
* [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware Finding Optional Packages ]
* [http://www.cmake.org/Wiki/HowToBuildKDE4Software KDE 4 Tutorial at the CMake Wiki ]
* [http://www.cmake.org/Wiki/CMake_FAQ CMake FAQ]
* [http://mail.kde.org/pipermail/kde-buildsystem/ The kde-buildsystem Mailing List Archive]''


또한 [http://www.cmake.org/mailman/listinfo/cmake CMake 메일링 리스트]에 가입하는 것을 고려해보라.
또한 [http://www.cmake.org/mailman/listinfo/cmake CMake 메일링 리스트]에 가입하는 것을 고려해보라.
:''Also, consider joining the [http://www.cmake.org/mailman/listinfo/cmake CMake mailing list].''


== 왜 CMake를 사용하는가 ==
== 왜 CMake를 사용하는가 ==
Line 35: Line 22:
* 컴파일 시간이 훨신 빠른데, 대개 더이상 libtool을 사용하지 않아도 되기 때문이다.
* 컴파일 시간이 훨신 빠른데, 대개 더이상 libtool을 사용하지 않아도 되기 때문이다.
* 빌드 파일들을 작성하기 더 쉬워졌다.
* 빌드 파일들을 작성하기 더 쉬워졌다.
:CMake is the official tool of KDE 4 release, decided in March 2006, primarily due to technical merits as compared to the older KDE tools automake and unsermake:
* CMake is developed independently of KDE, it can be used by other projects as well
* Compilation time is much faster, mainly due to not using libtool anymore
* The build files are easier to write''


== CMake를 사용하여 KDE를 어떻게 컴파일하는가 ==
== CMake를 사용하여 KDE를 어떻게 컴파일하는가 ==
Line 45: Line 27:
=== CMake를 얻고 설치하기===
=== CMake를 얻고 설치하기===
==== Linux, BSD, and other Unix Systems ====
==== Linux, BSD, and other Unix Systems ====
[http://www.cmake.org/HTML/Download.html]에서 CMake의 마지막 버전을 검색한다.
[http://www.cmake.org/HTML/Download.html]에서 CMake의 최신판을 검색한다.
:''Retrieve the latest stable version of CMake from [http://www.cmake.org/HTML/Download.html].''


다운로드 하여 압축을 풀고, 컴파일 한다.:
내려받아 압축을 풀고, 컴파일한다.
:''Once downloaded, unpack and compile it:''
<syntaxhighlight lang="text">
<code>
$ mkdir cmake-build
$ mkdir cmake-build
$ cd cmake-build
$ cd cmake-build
Line 56: Line 36:
$ make
$ make
$ make install
$ make install
</code>
</syntaxhighlight>


기본적으로 이것은 CMake를 /user/local 안에 설치할 것이다. 그러므로 당신의 실행 경로 안에/user/local/bin을 가지고 있도록 해야한다. 만약 설치 prefix를 바꾸려면, (예를 들어 데비안에서는 /usr로), '--prefix=PATH' 옵션을 bootstrap 명령에 추가하라.
CMake는 소스에서 직접 컴파일해 설치하는 경우 기본적으로 /user/local 안에 설치된다. 다른 곳에 설치하고 싶다면 ../bootstrap을 실행할 때 뒤에 '--prefix=경로'를 붙여 주면 된다.  
:''By default, this will install CMake in /usr/local, so make sure to have /usr/local/bin in your execute path.  To change the installation prefix (e.g. to /usr in debian), add the '--prefix=PATH' option to the bootstrap command.''


만약 현재 개발버전을 사용하기를 원한다면, [http://cmake.org/HTML/Download.html#cvs here]에 위치한 설명에 따르라.
현재 개발버전을 사용하고 싶다면 [http://cmake.org/HTML/Download.html#cvs here]에 위치한 설명에 따르면 된다.
:''Please follow the instructions located [http://cmake.org/HTML/Download.html#cvs here] if you would like to use the current development version.''


==== Windows ====
==== Windows ====
[http://www.cmake.org/HTML/Download.html]에서 CMake의 가장 마지막 안정 버전을 검색하라.
1. [http://www.cmake.org/HTML/Download.html]에서 CMake 최신판을 찾는다.
:''Retrieve the latest stable version of CMake from [http://www.cmake.org/HTML/Download.html].''


다운로드받아서 cmake 인스톨러를 설치하라.
2. 내려받아 cmake 인스톨러를 실행한다.
:''Once downloaded, run the cmake installer. ''


기본적으로 이것은 C:\Program Files\CMake 2.4에 설치될 것이다. 그러므로 당신의 실행 경로에 <installpath>\bin를 추가시켜야 한다.
기본적으로 이것은 C:\Program Files\CMake 2.4에 설치될 것이다. 그러므로 당신의 실행 경로에 <installpath>\bin를 추가시켜야 한다.
Line 81: Line 57:
==== Linux, BSD, and other Unix Systems ====
==== Linux, BSD, and other Unix Systems ====
당신의 시스템을 위해 빌드 파일들을 생성하기 위해서는 CMake를 실행해야 한다. in-source(소스 안에서)와 out-of-source(소스 밖에서) 둘 다 CMake에 의해 지원된다. 그러나 현재 in-source(소스 안에서) 빌드는 KDE 구현에 의하여 막혀져 있다.
당신의 시스템을 위해 빌드 파일들을 생성하기 위해서는 CMake를 실행해야 한다. in-source(소스 안에서)와 out-of-source(소스 밖에서) 둘 다 CMake에 의해 지원된다. 그러나 현재 in-source(소스 안에서) 빌드는 KDE 구현에 의하여 막혀져 있다.
:''You have to run CMake so that it generates the build files for your system.  Both in-source and out-of-source builds are supported by CMake, but currently in-source builds are prevented by the KDE implementation.''


그러므로 ~/src/kdelibs/ 안에 kdelibs/를 가지고 있다고 한다면, 다음을 수행한다.
그러므로 ~/src/kdelibs/ 안에 kdelibs/를 가지고 있다고 한다면, 다음을 수행한다.
:''So, let's say you have kdelibs/ in ~/src/kdelibs/, then do the following:''
<syntaxhighlight lang="text">
<code>
$ ls
$ ls
kdelibs/
kdelibs/
Line 91: Line 65:
$ cd kdelibs-build
$ cd kdelibs-build
$ cmake ../kdelibs
$ cmake ../kdelibs
</code>
</syntaxhighlight>
이것은 kdelibs-build/ 안에 kdelibs의 빌드를 위해 Makefile을 생성할 것이다.
이것은 kdelibs-build/ 안에 kdelibs의 빌드를 위해 Makefile을 생성할 것이다.
:''This will generate the Makefiles for building kdelibs/ in kdelibs-build/.


==== Windows ====
==== Windows ====
당신의 시스템을 위해 빌드 파일들을 생성하기 위해서는 CMake를 실행해야 한다. in-source(소스 안에서)와 out-of-source(소스 밖에서) 둘 다 CMake에 의해 지원된다. 그러나 현재 in-source(소스 안에서) 빌드는 KDE 구현에 의하여 막혀져 있다.
당신의 시스템을 위해 빌드 파일들을 생성하기 위해서는 CMake를 실행해야 한다. in-source(소스 안에서)와 out-of-source(소스 밖에서) 둘 다 CMake에 의해 지원된다. 그러나 현재 in-source(소스 안에서) 빌드는 KDE 구현에 의하여 막혀져 있다.
:''You have to run CMake so that it generates the build files for your system.  Both in-source and out-of-source builds are supported by CMake, but currently in-source builds are prevented by the KDE implementation.''


c:\daten\kde4 안에 kdelib\를 가지고 있다고 한다면, 다음을 수행한다.:
c:\daten\kde4 안에 kdelib\를 가지고 있다고 한다면, 다음을 수행한다.:
<code>
<syntaxhighlight lang="text">
c:\daten\kde4> cd kdelibs\win
c:\daten\kde4> cd kdelibs\win
c:\daten\kde4> cmake
c:\daten\kde4> cmake
Line 109: Line 81:
c:\daten\kde4> cd kdelibs-build
c:\daten\kde4> cd kdelibs-build
c:\daten\kde4\kdelibs-build> cmake ..\kdelibs
c:\daten\kde4\kdelibs-build> cmake ..\kdelibs
</code>
</syntaxhighlight>


이것은 kdelibs-build/ 안에 kdelibs의 빌드를 위해 Makefile을 생성할 것이다.
이것은 kdelibs-build/ 안에 kdelibs의 빌드를 위해 Makefile을 생성할 것이다.
윈도우에서 KDE 컴파일에 관한 정보를 얻고 싶다면, [[Projects/KDE_on_Windows (ko)|KDE on Windows]]를 참고하라.
윈도우에서 KDE 컴파일에 관한 정보를 얻고 싶다면, [[Projects/KDE_on_Windows|KDE on Windows]]를 참고하라.
:''See [[Projects/KDE_on_Windows|KDE on Windows]] for more informations about compiling KDE on Windows.''


==== KDevelop 프로젝트 파일 ====
==== KDevelop 프로젝트 파일 ====
만약 (기본적으로 KDevelop를 위한 몇몇 파일에 의해 Makefile이 동반되는)KDevelop를 위한 프로젝트 파일을 좋아한다면, 이것과 같이 실행하라.
만약 (기본적으로 KDevelop를 위한 몇몇 파일에 의해 Makefile이 동반되는)KDevelop를 위한 프로젝트 파일을 좋아한다면, 이것과 같이 실행하라.
:''If you prefer project files for KDevelop (which will basically be Makefiles accompanied by some extra files for KDevelop), run it like this:''
<syntaxhighlight lang="text">
<code>
$ cmake ../kdelibs -GKDevelop3
$ cmake ../kdelibs -GKDevelop3
</code>
</syntaxhighlight>
CMake가 지원하는 것과 다른 옵션을 찾기 위해 'cmake -h'를 사용하라.
CMake가 지원하는 것과 다른 옵션을 찾기 위해 'cmake -h'를 사용하라.
:''Use 'cmake -h' to find out which generators CMake supports and the other options.''


==== CMake와 Qt4 ====
==== CMake와 Qt4 ====
Qt 4에 위치한 곳을 찾아내기 위해, CMake는 당신의 실행 경로에서 qmake를 찾는다. CMake는 QTDIR 환경 변수를 사용하지 않는다. 그러므로, 실행 경로에서 찾은 처음 qmake가 사용하기 원하는 것인지 확인하라.
Qt 4에 위치한 곳을 찾아내기 위해, CMake는 당신의 실행 경로에서 qmake를 찾는다. CMake는 QTDIR 환경 변수를 사용하지 않는다. 그러므로, 실행 경로에서 찾은 처음 qmake가 사용하기 원하는 것인지 확인하라.
:''To locate Qt 4, CMake searches for qmake in your execute path. CMake does ''not'' use the QTDIR environment variable.  So make sure that the first qmake found in the execution path is the one you like to use.''


==== 더 자세한 세부사항 ====
==== 더 자세한 세부사항 ====
CMake가 종료되었을 때, "CMakeCache.txt"라는 파일이 생성될 것이다. 이것은 당신의 시스템에서 CMake가 찾은 모든 설정을 포함한다. 만약 다른 생성 프로그램으로 CMake를 수행하기를 원하거나, CMake가 모든 것을 다시 찾기를 원한다면 이 파일을 지워라.
CMake가 종료되었을 때, "CMakeCache.txt"라는 파일이 생성될 것이다. 이것은 당신의 시스템에서 CMake가 찾은 모든 설정을 포함한다. 만약 다른 생성 프로그램으로 CMake를 수행하기를 원하거나, CMake가 모든 것을 다시 찾기를 원한다면 이 파일을 지워라.
:''When CMake has finished, it will have created a file called "CMakeCache.txt".  This file contains all the settings CMake has detected on your system.  If you want to run CMake with another generator or you want CMake to detect everything again, delete this file.''


만약 CMake가 무언가를 찾지 않았지만, 당신이 이것이 당신의 상자의 어딘가에 있다는 것을 안다면, 당신은 CMake에게 찾을 곳을 수동적으로 알려줄 수 있다. CMake는 이 정보를 저장하는 변수를 사용한다. 이 변수들은 이미 언급된 CMakeCache.txt 파일에  캐시된다. 이 변수들을 수동적으로 적용하기 위해 3가지 방법이 있다.
만약 CMake가 무언가를 찾지 않았지만, 당신이 이것이 당신의 상자의 어딘가에 있다는 것을 안다면, 당신은 CMake에게 찾을 곳을 수동적으로 알려줄 수 있다. CMake는 이 정보를 저장하는 변수를 사용한다. 이 변수들은 이미 언급된 CMakeCache.txt 파일에  캐시된다. 이 변수들을 수동적으로 적용하기 위해 3가지 방법이 있다.
:''If CMake didn't find something, but you know it is somewere on your box, you can tell CMake manually where to find it.  CMake uses variables to store this information.  These variables are cached in the already mentioned file CMakeCache.txt.  You have three options to adjust these variables manually:''


* 커맨드 라인 하에서 올바른 값을 CMake에게 말하기 : cmake ../kdelibs -DNAME_OF_THE_VARIABLE=value
* 커맨드 라인 하에서 올바른 값을 CMake에게 말하기 : cmake ../kdelibs -DNAME_OF_THE_VARIABLE=value
* CMake 변수를 정용하기 위해 GUI 기반의 커서를 제공하는 ccmake를 사용하기(실행: ccmake ../kdelibs)
* CMake 변수를 정용하기 위해 GUI 기반의 커서를 제공하는 ccmake를 사용하기(실행: ccmake ../kdelibs)
* CMakeCache.txt를 직접 수정하기(추천하지 않는다.)
* CMakeCache.txt를 직접 수정(추천하는 길은 아니다)
:''* tell CMake the correct value via the command line: cmake ../kdelibs -DNAME_OF_THE_VARIABLE=value
* use ccmake, which provides a curses based GUI to adjust the CMake variables (run: ccmake ../kdelibs)
* edit the file CMakeCache.txt directly (not recommended)''


당신은 최소한 한번은 "ccmake ../kdelibs"를 실행해야 한다. 그래서 CMake가 사용하는 변수의 결과물을 얻는다.
당신은 최소한 한번은 "ccmake ../kdelibs"를 실행해야 한다. 그래서 CMake가 사용하는 변수의 결과물을 얻는다.
"T"를 누르고 "advanced" 변수를 보기 위해 "T"를 눌러라. 그래서 CMake가 아무것도 찾지 않았다면, ccmake를 시작하고, 수동적으로 그것을 적용하라.
"T"를 누르고 "advanced" 변수를 보기 위해 "T"를 눌러라. 그래서 CMake가 아무것도 찾지 않았다면, ccmake를 시작하고, 수동적으로 그것을 적용하라.
:''You should run "ccmake ../kdelibs" at least once so that you get an impression which variables CMake uses.  Press "T" to see also the "advanced" variables.  So, if CMake didn't find something, start ccmake and adjust it manually.''


==== 커맨드 라인 변수들 ====
==== 커맨드 라인 변수들 ====
당신이 설정하기 원할 수 있는 cmake 커맨드라인 변수들:
*'''CMAKE_INSTALL_PREFIX''': cmake ../kdelibs -DCMAKE_INSTALL_PREFIX=/opt/kde4은 ./configure --prefix=/opt/kde4와 같은 역할을 한다.
*'''CMAKE_INSTALL_PREFIX''': cmake ../kdelibs -DCMAKE_INSTALL_PREFIX=/opt/kde4은 ./configure --prefix=/opt/kde4와 같은 역할을 한다.
* '''CMAKE_BUILD_TYPE''': 당신이 원하는 빌드 타입을 결정한다. 당신은 "debugfull","debug","profile", "relwithdebinfo, "release" 사이에서 고를 수 있다. 기본 값은 "relwithdebinfo" (-O2 -g)이다. 더 자세한 사항을 원한다면, FindKDE4Internal.cmake를 살펴보라.  
* '''CMAKE_BUILD_TYPE''': 원하는 빌드 타입을 결정한다. "debugfull","debug","profile", "relwithdebinfo, "release" 사이에서 고르면 되며 기본 값은 "relwithdebinfo" (-O2 -g)이다. 더 자세한 사항은 FindKDE4Internal.cmake를 살펴보면 된다.
* '''KDE4_BUILD_TESTS=ON''': 테스트 프로그램으로 Makefile을 생성하고 'test' 목적파일을 제공한다.
* '''KDE4_BUILD_TESTS=ON''': 테스트 프로그램으로 Makefile을 생성하고 'test' 목적파일을 제공한다.
* '''KDE4_TEST_OUTPUT=xml''': QTestLib 프레임워크를 사용하는 유닛 테스트가 xml 포맷의 로그 파일들을 생성할 것이다.
* '''KDE4_TEST_OUTPUT=xml''': QTestLib 프레임워크를 사용하는 유닛 테스트가 xml 포맷의 로그 파일들을 생성할 것이다.
Line 157: Line 117:
* '''BUILD_foo=OFF''': 서브 디렉토리 'foo' 안의 프로젝트를 위한 빌드를 비활성화 시킨다.
* '''BUILD_foo=OFF''': 서브 디렉토리 'foo' 안의 프로젝트를 위한 빌드를 비활성화 시킨다.
* '''WITH_foo''': 예를 들어 WITH_CUPS나 WITH_Jasper와 같은 몇몇 옵션이 존재한다. 만약 그것들이 비활성화된다면, cmake는 이 패키지를 찾기위한 시도를 하지 않을 것이다. 만약 활성화되어 있다면, 이것을 찾으려고 시도할 것이다. 만약 이것에 실패했다면, 당신은 위에 설명한 것과 같이 이것을 수동적으로 적용시킬 수 있다.
* '''WITH_foo''': 예를 들어 WITH_CUPS나 WITH_Jasper와 같은 몇몇 옵션이 존재한다. 만약 그것들이 비활성화된다면, cmake는 이 패키지를 찾기위한 시도를 하지 않을 것이다. 만약 활성화되어 있다면, 이것을 찾으려고 시도할 것이다. 만약 이것에 실패했다면, 당신은 위에 설명한 것과 같이 이것을 수동적으로 적용시킬 수 있다.
:''Some cmake command line variables you may want to set:
* '''CMAKE_INSTALL_PREFIX''': cmake ../kdelibs -DCMAKE_INSTALL_PREFIX=/opt/kde4 is the equivalent to ./configure --prefix=/opt/kde4
* '''CMAKE_BUILD_TYPE''': decide which type of build you want. You can chose between "debugfull", "debug", "profile", "relwithdebinfo" and "release". The default is "relwithdebinfo" (-O2 -g). See FindKDE4Internal.cmake for details.
* '''KDE4_BUILD_TESTS=ON''': creates Makefiles with build test programs and also provides 'test' targets
* '''KDE4_TEST_OUTPUT=xml''': Unit tests using the QTestLib framework will create xml formatted logfiles.
* '''KDE4_DISABLE_MULTIMEDIA=ON''': Build KDE without any multimedia (audio and video) support.
* '''RPATH_STYLE''': This is not available anymore. By default everything will be built with RPATH set correctly. If you don't want RPATH at all, set CMAKE_SKIP_RPATH to TRUE.
* '''BUILD_foo=OFF''': disables the build for the project in subdirectory 'foo'.
* '''WITH_foo''': there are several options, e.g. WITH_CUPS or WITH_Jasper. If you disable them, cmake will not even try to find this package. If it is enabled, cmake will try to find it. If it fails with this, you can still adjust it manually as described above.''


=== 환경 변수들 ===
=== 환경 변수들 ===
만약 cmake가 찾지 못하는 비 표준 위치(예 를들어 Mac OSX의 fink가 /sw에 설치되었다면)에 설치된 헤더와 라이브러리를 가지고 있다면, 환경변수로써 다음과 같은 것들을 설정한다. 비슷한 네이밍 규약임에도 불구하고, cmake 커맨드라인에서 인자처럼 동작하지 않을 것이다. :
만약 cmake가 찾지 못하는 비 표준 위치(예 를들어 Mac OSX의 fink가 /sw에 설치되었다면)에 설치된 헤더와 라이브러리를 가지고 있다면, 환경변수로써 다음과 같은 것들을 설정한다. 비슷한 네이밍 규약임에도 불구하고, cmake 커맨드라인에서 인자처럼 동작하지 않을 것이다.
If you have headers and libraries installed in non-standard locations that cmake cannot find (e.g., fink on Mac OSX installs to /sw), then set the following as environment variables.  Despite the similar naming convention, these will not work as arguments on the cmake command line:


* '''CMAKE_INCLUDE_PATH''', eg. export CMAKE_INCLUDE_PATH=/sw/include
* '''CMAKE_INCLUDE_PATH''', eg. export CMAKE_INCLUDE_PATH=/sw/include
Line 175: Line 125:


대하여 더 많은 정보를 얻으려면, [http://www.cmake.org/Wiki/CMake_Useful_Variables this cmake.org 위키 페이지]를 살펴보라.
대하여 더 많은 정보를 얻으려면, [http://www.cmake.org/Wiki/CMake_Useful_Variables this cmake.org 위키 페이지]를 살펴보라.
For more information on variables, see [http://www.cmake.org/Wiki/CMake_Useful_Variables this cmake.org wiki page]


=== Going Further ===
=== 더 나아가서 ===
만약 cmake가 "Generating done"메세지와 함께 완료되었다면, 에러가 존재하지 않는다.
만약 cmake가 "Generating done"메세지와 함께 완료되었다면, 에러가 존재하지 않는다.
그러나 만약 "Configuring done" 메세지로 완료되었다면, 당신이 고쳐야할 에러가 존재한다.
그러나 만약 "Configuring done" 메세지로 완료되었다면, 당신이 고쳐야할 에러가 존재한다.
cmake가 성공적으로 종료하면, (예를 들어, make, KDevelop, XCode 또는 MSVC) 빌드 툴을 실행하고 빌드하라
cmake가 성공적으로 종료하면, (예를 들어, make, KDevelop, XCode 또는 MSVC) 빌드 툴을 실행하고 빌드하라
그리고 끝날 때까지 기다려라. 그리고 "make install"하라.
그리고 끝날 때까지 기다려라. 그리고 "make install"하라.
:''If cmake finishes with "Generating done" then there was no errors, but if it finishes with "Configuring done" then there was errors that you have to fix.  Once cmake finishes successfully, run your buildtool (i.e. make, KDevelop, XCode or MSVC) and build and wait until it has finished.  Then "make install". ''


만약 다음과 같은 실패를 얻었다면
만약 다음과 같은 실패를 얻었다면
:''If you got a failure that says something like''
:''If you got a failure that says something like''
<code>
<syntaxhighlight lang="text">
CMake Error: This project requires some variables to be set,
CMake Error: This project requires some variables to be set,
and cmake can not find them.
and cmake can not find them.
Please set the following variables:
Please set the following variables:
X11_XTest_LIB (ADVANCED)
X11_XTest_LIB (ADVANCED)
</code>
</syntaxhighlight>
당신은 빠진 라이브러리(또는 다른 의존성)를 갖을 것이다. 어떤 라이브러리인지 찾기 위해, cmake/modules 디렉토리에서 cmake가 찾을 수 없는 변수를 검색하라. 위의 예제의 경우, 이것은:
당신은 빠진 라이브러리(또는 다른 의존성)를 갖을 것이다. 어떤 라이브러리인지 찾기 위해, cmake/modules 디렉토리에서 cmake가 찾을 수 없는 변수를 검색하라. 위의 예제의 경우, 이것은
:''then you may have a missing library (or other dependency). To find
<syntaxhighlight lang="text">
out which library, search in the cmake/modules directory for
the variable that cmake can't find. In the example above, it is''
<code>
FIND_LIBRARY(X11_XTest_LIB Xtst ${X11_LIB_SEARCH_PATH})
FIND_LIBRARY(X11_XTest_LIB Xtst ${X11_LIB_SEARCH_PATH})
</code>
</syntaxhighlight>
그러므로 빠진 라이브러리는 Xtst이다. 이것을 찾을 필요가 있으며(아마 libXtst-devel 라이브러리로 설치된다.) , cmake를 재실행해야한다.
그러므로 빠진 라이브러리는 Xtst이다. 이것을 찾을 필요가 있으며(아마 libXtst-devel 라이브러리로 설치된다.) , cmake를 재실행해야한다.
:''So the missing library is Xtst. You then need to find it (perhaps installing a libXtst-devel library) and re-run cmake.''


== 간단한 어플리케이션을 위한 CMake 사용하기 ==
== 간단한 어플리케이션을 위한 CMake 사용하기 ==
여기 가장 간단한 CMakeList.txt파일이 있다.:
여기 가장 간단한 CMakeList.txt파일이 있다.
:''Here's the most simple CMakeLists.txt:''
<syntaxhighlight lang="text">
<code>
add_executable(hello main.cpp)
add_executable(hello main.cpp)
</code>
</syntaxhighlight>


이것은 소스파일인 main.cpp에서 "hello"(윈도우에서는 "hello.exe")라는 실행 파일을 생성한다. 당신이 원하는 C와 C++ 파일을 섞을 수 있다. 당신은 하나의 CMakeList.txt 파일 안에서 여러 개의 실행파일과 라이브러리를 가질 수 있다. 같은 소스 파일은 다양한 타겟에서 사용가능하다. 그리고 이것은 각각의 타겟을 위해 다른 타겟과는 독립적으로 컴파일되어질 것이다. 아마도 cmake의 가장 중요한 부분은 변수들이다.:
이것은 소스파일인 main.cpp에서 "hello"(윈도우에서는 "hello.exe")라는 실행 파일을 생성한다. 당신이 원하는 C와 C++ 파일을 섞을 수 있다. 당신은 하나의 CMakeList.txt 파일 안에서 여러 개의 실행파일과 라이브러리를 가질 수 있다. 같은 소스 파일은 다양한 타겟에서 사용가능하다. 그리고 이것은 각각의 타겟을 위해 다른 타겟과는 독립적으로 컴파일되어질 것이다. 아마도 cmake의 가장 중요한 부분은 변수들이다.
:''This will create an executable named "hello" (or "hello.exe" under Windows) from the source file main.cpp. You can mix C and C++ files as you want.  You can have multiple executables and libraries in one CMakeLists.txt.  The same source file can be used in multiple targets, it will be compiled for each target independently from the other targets.  Probably the most important part of the cmake language are the variables:''
<syntaxhighlight lang="text">
<code>
SET( MY_SOURCES main.cpp widget.cpp)
SET( MY_SOURCES main.cpp widget.cpp)
MESSAGE(STATUS "my sources: ${MY_SOURCES}")
MESSAGE(STATUS "my sources: ${MY_SOURCES}")
</code>
</syntaxhighlight>
그러므로 변수의 값을 설정하기 위해 SET() 명령어를 사용할 수 있다. 만약 하나의 문자열보다 더 많이 목록화한다면, 그 변수는 하나의 리스트가 될 것이다. 하나의 리스트는 세미콜론(;)에 의해 나누어지는 문자열의 리스트이다. 만약 단지 하나의 아이템을 설정하였다면, 이것은 단지 값이 될 것이다. 변수의 값을 얻기 위해 ${VAR}를 사용한다. FOREACH()랄 사용하여 리스트를 iterate가 가능하다.
그러므로 변수의 값을 설정하기 위해 SET() 명령어를 사용할 수 있다. 만약 하나의 문자열보다 더 많이 목록화한다면, 그 변수는 하나의 리스트가 될 것이다. 하나의 리스트는 세미콜론(;)에 의해 나누어지는 문자열의 리스트이다. 만약 단지 하나의 아이템을 설정하였다면, 이것은 단지 값이 될 것이다. 변수의 값을 얻기 위해 ${VAR}를 사용한다. FOREACH()랄 사용하여 리스트를 iterate가 가능하다.
:''So, use the SET() command to set the value of a variable. If you list more than one string, the variable will be a list.  A list is a list of strings separated by semicolons. If you set it to only one item, it will have just that value. To get the value of a variable, use ${VAR}.
<syntaxhighlight lang="text">
You can iterate over a list using FOREACH():''
<code>
FOREACH(next_ITEM ${MY_SOURCES})
FOREACH(next_ITEM ${MY_SOURCES})
   MESSAGE(STATUS "next item: ${next_ITEM}")
   MESSAGE(STATUS "next item: ${next_ITEM}")
ENDFOREACH(next_ITEM ${MY_SOURCES})
ENDFOREACH(next_ITEM ${MY_SOURCES})
</code>
</syntaxhighlight>
CMake의 명령어들은 대소문자를 구분하지 않아도된다. 변수의 이름과 파라미터의 이름은 대소문자를 구별해야 한다.
CMake의 명령어들은 대소문자를 구분하지 않아도된다. 변수의 이름과 파라미터의 이름은 대소문자를 구별해야 한다.
:''The commands in CMake are case-insensitive.  Names of variables and names of parameter are case-sensitive.''
:''The commands in CMake are case-insensitive.  Names of variables and names of parameter are case-sensitive.''
Line 228: Line 168:
또한 당신은 다양한 것들을 위한 테스트를 할 수 있다.:
또한 당신은 다양한 것들을 위한 테스트를 할 수 있다.:
:''You can also test for various things:''
:''You can also test for various things:''
<code>
<syntaxhighlight lang="text">
IF (UNIX)
IF (UNIX)
   MESSAGE(STATUS "This is UNIX (including OS X and CygWin)")
   MESSAGE(STATUS "This is UNIX (including OS X and CygWin)")
Line 236: Line 176:
   SET(MY_SRCS ${MY_SRCS} winextra.cpp)
   SET(MY_SRCS ${MY_SRCS} winextra.cpp)
ENDIF (MSVC)
ENDIF (MSVC)
</code>
</syntaxhighlight>
이 두번째 예제에서는 리스트로 아이템을 어떻게 추가하는지 보여준다.
이 두번째 예제에서는 리스트로 아이템을 어떻게 추가하는지 보여준다.
:''In this second example  you can see also how to append items to a list.''
:''In this second example  you can see also how to append items to a list.''
Line 247: Line 187:
여기에 하나의 작은 KDE 4 프로젝트를 빌드하는 기본 CMakeList 파일이 있다.
여기에 하나의 작은 KDE 4 프로젝트를 빌드하는 기본 CMakeList 파일이 있다.
:''Here's a basic CMakeList file that builds a small KDE 4 project:''
:''Here's a basic CMakeList file that builds a small KDE 4 project:''
<code>
<syntaxhighlight lang="text">
PROJECT(kde4project)
PROJECT(kde4project)
FIND_PACKAGE(KDE4 REQUIRED)
FIND_PACKAGE(KDE4 REQUIRED)
Line 257: Line 197:


TARGET_LINK_LIBRARIES(kde4project ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS} )
TARGET_LINK_LIBRARIES(kde4project ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS} )
</code>
</syntaxhighlight>
변수, 매크로, KDE에서 다른 유용한 특정 정보들은 [[Development/KDE and CMake Together (ko)]] 페이지에서 찾을 수 있다.
변수, 매크로, KDE에서 다른 유용한 특정 정보들은 [[Development/CMake/Addons for KDE]] 페이지에서 찾을 수 있다.
:''Variables, macros and other useful information specific to KDE can be found at the [[Development/KDE and CMake Together]] page.''
:''Variables, macros and other useful information specific to KDE can be found at the [[Development/CMake/Addons for KDE]] page.''


== CMake 확장 ==
== CMake 확장 ==
Line 270: Line 210:
kdesdk/cmake/ 안에서 am2cmake 스크립트를 찾을 수 있을 것이다. 이것은 루비 스크립트이므로, 루비가 설치되어야 할 필요가 있다. am2cmake를 소스 디렉토리의 최상위 디렉토리에서 실행하자.
kdesdk/cmake/ 안에서 am2cmake 스크립트를 찾을 수 있을 것이다. 이것은 루비 스크립트이므로, 루비가 설치되어야 할 필요가 있다. am2cmake를 소스 디렉토리의 최상위 디렉토리에서 실행하자.
:''In kdesdk/cmake/ you can find a script am2cmake . This is a ruby script, so you need to have ruby installed. Run am2cmake in the toplevel directory of your sources:''
:''In kdesdk/cmake/ you can find a script am2cmake . This is a ruby script, so you need to have ruby installed. Run am2cmake in the toplevel directory of your sources:''
<code>
<syntaxhighlight lang="text">
$ cd src/mykooltool/
$ cd src/mykooltool/
$ am2cmake --kde4
$ am2cmake --kde4
</code>
</syntaxhighlight>
"--kde4" 스위치를 잊지마라", 그렇지 않으면 KDE4 소프트웨어를 위한 적절한 파일을 생성하지 않을 것이다. 변환 파일은 그것들과 같이 '동적할 것이다.' 그러나 복잡한 프로젝트는 몇몇 추가적인 수정이 필요하다.
"--kde4" 스위치를 잊지마라", 그렇지 않으면 KDE4 소프트웨어를 위한 적절한 파일을 생성하지 않을 것이다. 변환 파일은 그것들과 같이 '동적할 것이다.' 그러나 복잡한 프로젝트는 몇몇 추가적인 수정이 필요하다.
:''Don't forget the switch "--kde4", otherwise it won't generate files suitable for KDE 4 software. The converted files 'may' work as they are, but complicated projects will require some additional editing.''
:''Don't forget the switch "--kde4", otherwise it won't generate files suitable for KDE 4 software. The converted files 'may' work as they are, but complicated projects will require some additional editing.''


You may have to:
당신은 아래와 같은 것들을 해야 할 것이다.:
:''You may have to:''
* INCLUDE_DIRECTORIES()를 사용하여, include 디렉토리들을 더 추가하라.
* TARGET_LINK_LIBRARIES()를 사용하여, 링크 라이브러리를 더 추가하라.
* ADD_DEFINITIONS()를 사용하여, 몇몇 컴파일 스위치를 추가하라.
* [http://www.cmake.org/Wiki/CMake_HowToDoPlatformChecks 플랫폼 검사를 수행하는 방법] and [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware 설치된 소프트웨어를 찾는 방법]을 보고, 몇몇 "configure" 검사를 추가하라.
* 특히 이전의 libtool의 편리한 라이브러리에 주의하라. 이것은 cmake에서 지원하지 않는다. 대신 ConvenceLibs.cmake 파일이 생성될 것이다. 이 파일은 이 convenience lib를 위한 모든 소스파일을 포함한 모든 convinience lib 변수를 찾을 것이다. 이 convenience lib를 링크하기 위해 소스에 변수를 추가하라.
* 파일 AdditionInfo.txt가 생성될 것이다. 여기에서 당신의 프로젝트의 모든 *.in과 *.in.in 파일를 볼 수 있을 것이다. 이 파일에서 수행된 것들을 cmake에서 수동적으로 전환해야 할 것이다.
 
* add more include direcories, using INCLUDE_DIRECTORIES()
* add more include direcories, using INCLUDE_DIRECTORIES()
* add more link libraries, using TARGET_LINK_LIBRARIES()
* add more link libraries, using TARGET_LINK_LIBRARIES()
Line 292: Line 240:


=== 나는 빌드 중에 몇몇 파일들을 생성하는 것이 필요합니다. 어떻게 해야 합니까? ===
=== 나는 빌드 중에 몇몇 파일들을 생성하는 것이 필요합니다. 어떻게 해야 합니까? ===
:ADD_CUSTOM_COMMAN()를 사용하라. 이것은 CMake 위키 안의[http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_generate_a_source_file_during_the_build.3F  빌드하는 동안 어떻게 소스파일을 생성할 수 있는 방법]
:ADD_CUSTOM_COMMAN()를 사용하라. 이것은 CMake 위키 안의[http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_generate_a_source_file_during_the_build.3F  빌드하는 동안 어떻게 소스파일을 생성할 수 있는 방법] 섹션에서 설명되어진다.
섹션에서 설명되어진다.
:''Use ADD_CUSTOM_COMMAND(). It's explained here in the CMake wiki: [http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_generate_a_source_file_during_the_build.3F  How can I generate a source file during the build]''
:''Use ADD_CUSTOM_COMMAND(). It's explained here in the CMake wiki: [http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_generate_a_source_file_during_the_build.3F  How can I generate a source file during the build]''


=== I need to build an executable which is used later on during the build to generate files. How do I do this ? ===
=== 파일을 생성하기 위한 빌드하는 동안에 나중에 사용하는 실행 파일을 빌드하는 것이 필요하다. 어떻게 해야 합니까? ===
Let's say the executable is called genembed. Then use KDE4_ADD_EXECUTABLE(foo RUN_UNINSTALLED ${fooSources})to create the executable. The RUN_UNINSTALLED option is important, because the executable has to run from the build dir and has to link to the libraries in the builddir. To achieve this, the executable is compiled with RPATH set accordingly and a wrapper shell script, named just like the executable but with the suffix ".sh" is created. This shell scripts sets up LD_LIBRARY_PATH and the calls the actual executable.
;=== I need to build an executable which is used later on during the build to generate files. How do I do this ? ===
Use this wrapper shell script in the ADD_CUSTOM_COMMAND() as described above.
 
You can find out the name and exact location by querying the property WRAPPER_SCRIPT. Here's a full example taken from kdelibs/kstyles/keramik/ :
실행파일을 genembed라고 하자. 실행파일을 생성하기 위해서는 KDE4_ADD_EXCUTABLE(foo RUN_UNINSTALLED ${fooSources})를 사용하라. RUN_UNINSTALL 옵션은 중요하다. 실행파일은 builddir에서 실행되어야하며, builddir 안의 라이브러리를 링크해야만 하기 때문이다. 이것을 위해서는 실행파일이 적당히 설정된 RPATH과 실행파일과 같은 이름붙여지고, 뒤에 ".sh"가 붙는 래퍼 쉘스크립트로 컴파일되어져야 한다. 이 쉘 스크립트는 LD_LIBARARY_PATH를 설정하고, 실질적인 실행파일을 호출한다.
<code>
:''Let's say the executable is called genembed. Then use KDE4_ADD_EXECUTABLE(foo RUN_UNINSTALLED ${fooSources})to create the executable. The RUN_UNINSTALLED option is important, because the executable has to run from the build dir and has to link to the libraries in the builddir. To achieve this, the executable is compiled with RPATH set accordingly and a wrapper shell script, named just like the executable but with the suffix ".sh" is created. This shell scripts sets up LD_LIBRARY_PATH and the calls the actual executable.''
 
위에서 묘사한 ADD_CUSTOM_COMMAND() 안의 이 래퍼 쉘 스크립트를 사용하라.
:''Use this wrapper shell script in the ADD_CUSTOM_COMMAND() as described above.''
 
WRAPPER_SCRIPT 속성을 질의함으로써(by querying) 이름과 정확한 위치를 찾을 수 있다. 여기 kdelibs/kstyles/keramik/에서 가져온 전체 예제가 있다.:
:''You can find out the name and exact location by querying the property WRAPPER_SCRIPT. Here's a full example taken from kdelibs/kstyles/keramik/ :''
<syntaxhighlight lang="text">
# build the executable
# build the executable
KDE4_ADD_EXECUTABLE(genembed RUN_UNINSTALLED ${genembed_SRCS})
KDE4_ADD_EXECUTABLE(genembed RUN_UNINSTALLED ${genembed_SRCS})
Line 313: Line 267:
   DEPENDS genembed ${keramikPics}
   DEPENDS genembed ${keramikPics}
)
)
</code>
</syntaxhighlight>


As you can see genembed is also listed as a dependency, this means cmake knows that it has to build the executable genembed before executing this rule.
보는 것과 같이 genembed는 의존성에서도 리스트되어진다. 이것은 cmake가 genembed 실행파일을 이전에 빌드해야만 한다는 사실을 알고 있다는 것을 의미한다.
:''As you can see genembed is also listed as a dependency, this means cmake knows that it has to build the executable genembed before executing this rule.


=== I don't want to set the -DCMAKE_INSTALL_PREFIX command line option. Does cmake support the KDEDIR environment variable? ===
=== -DCMAKE_INSTALL_PREFIX 커맨드 라인 옵션을 설정하는 것을 원하지 않는다. cmake에서 KDEDIR 환경 변수를 지원하는가? ===
No.  $KDEDIR is deprecated in KDE 4.
아니오. $KDEDIR은 KDE4에서 반대되어지고 있다.
:''No.  $KDEDIR is deprecated in KDE 4.''


=== Why do i get compile errors like /usr/lib/qt4/include/QtCore/qstring.h:536: undefined reference to `QString::fromLatin1_helper(char const*, int)'? ===
=== /usr/lib/qt4/include/QtCore/qstring.h:536: undefined reference to 'QString::fromLatin1_helper(char const*, int)'와 같은 에러가 나는가? ===
A: If you have an old Qt4 version in your qt/lib directory you must delete the old (4.0.1) files.
만약 qt/lib 디렉토리에 오래된 Qt4 버전을 가졌다면, 당신은 오래된 버전(4.0.1)을 지워야한다.
:''A: If you have an old Qt4 version in your qt/lib directory you must delete the old (4.0.1) files.''


=== How do I tell cmake to create noisy makefiles? I want to see the exact commands that are run during the make process. ===
=== 시끄러운 makefile을 생성하기 위해서는 어떻게 cmake를 사용해야 하는가? 나는 make과정 중에 실행되는 정확한 명령어들을 볼 수 있기를 원한다.===
Pass the VERBOSE variable to make, i.e.
make할때 VERBOSE 변수를 포함하라. 예를 들어:
<code>
:''Pass the VERBOSE variable to make, i.e.''
<syntaxhighlight lang="text">
% make VERBOSE=1
% make VERBOSE=1
</code>
</syntaxhighlight>
or
or
<code>
<syntaxhighlight lang="text">
% VERBOSE=1 make
% VERBOSE=1 make
</code>
</syntaxhighlight>


For more details see the CMake wiki: [http://www.cmake.org/Wiki/CMake_FAQ#Is_there_an_option_to_produce_more_.27verbose.27_compiling.3F Is there an option to produce more 'verbose' compiling?]
좀 더 자세한 사항은 CMake 위키를 살펴보라.
[http://www.cmake.org/Wiki/CMake_FAQ#Is_there_an_option_to_produce_more_.27verbose.27_compiling.3F Is there an option to produce more 'verbose' compiling?]
:''For more details see the CMake wiki: ''
[http://www.cmake.org/Wiki/CMake_FAQ#Is_there_an_option_to_produce_more_.27verbose.27_compiling.3F Is there an option to produce more 'verbose' compiling?]


=== There is no 'make distclean' target in the generated Makefiles. How do I clean up everything, including the cache files? ===
=== 생성된 Makefile에 'make distclean'이 존재하지 않는다. cache파일을 포함하여 모든 것을 지우려면 어떻게 해야 하는가? ===
Simply remove the build directory, or just the contents of the build directory.
간단하게 빌드 디렉토리를 지우거나 혹은 빌드 디렉토리의' 컨텐츠를 지워라.
:'Simply remove the build directory, or just the contents of the build directory.''


[[Category:Programming]]
[[Category:Programming]]
[[Category:Tutorial]]
[[Category:Tutorial]]
[[Category:FAQs]]
[[Category:FAQs]]

Latest revision as of 15:52, 14 July 2012

소개

CMake는 스크립트 파일을 읽고, 그것이 실행되는 플랫폼의 native 빌드 시스템의 위해 input 파일들을 생성한다. 이것은 GNU Makefile, KDevelop 프로젝트파일, XCode 프로젝트 파일, 그리고 Visual Studio 프로젝트 파일을 생성할수 있다.

CMake는 자유 소프트웨어이고, BSD-style 라이센스 한에서 릴리즈된다. 이것은 Kitware Inc.에 의해 개발되었다.

아래의 링크들은 일반적으로 CMake에 대해 배울수 있는 몇몇 괜찮은 곳들이다.

또한 CMake 메일링 리스트에 가입하는 것을 고려해보라.

왜 CMake를 사용하는가

CMake는 2006년 3월에 결정된 KDE 4 release의 공식적인 도구이다. 첫번째로 오래된 KDE 도구 automake와 unsermake와 비교하여 기술적인 장점때문이다.:

  • CMake는 KDE와 독립적으로 개발되었다. 이것은 다른 프로젝트에서도 잘 사용되어질 수 있다.
  • 컴파일 시간이 훨신 빠른데, 대개 더이상 libtool을 사용하지 않아도 되기 때문이다.
  • 빌드 파일들을 작성하기 더 쉬워졌다.

CMake를 사용하여 KDE를 어떻게 컴파일하는가

CMake를 얻고 설치하기

Linux, BSD, and other Unix Systems

[1]에서 CMake의 최신판을 검색한다.

내려받아 압축을 풀고, 컴파일한다.

$ mkdir cmake-build
$ cd cmake-build
$ ../bootstrap
$ make
$ make install

CMake는 소스에서 직접 컴파일해 설치하는 경우 기본적으로 /user/local 안에 설치된다. 다른 곳에 설치하고 싶다면 ../bootstrap을 실행할 때 뒤에 '--prefix=경로'를 붙여 주면 된다.

현재 개발버전을 사용하고 싶다면 here에 위치한 설명에 따르면 된다.

Windows

1. [2]에서 CMake 최신판을 찾는다.

2. 내려받아 cmake 인스톨러를 실행한다.

기본적으로 이것은 C:\Program Files\CMake 2.4에 설치될 것이다. 그러므로 당신의 실행 경로에 <installpath>\bin를 추가시켜야 한다.

By default, this will install CMake in C:\Program Files\CMake 2.4, so make sure to have <installpath>\bin in your execute path.

만약 현재 개발 버전을 사용하기를 원한다면, here의 설명에 따르라.

Please follow the instructions at here if you would like to use the current development version.

CMake 실행하기

Linux, BSD, and other Unix Systems

당신의 시스템을 위해 빌드 파일들을 생성하기 위해서는 CMake를 실행해야 한다. in-source(소스 안에서)와 out-of-source(소스 밖에서) 둘 다 CMake에 의해 지원된다. 그러나 현재 in-source(소스 안에서) 빌드는 KDE 구현에 의하여 막혀져 있다.

그러므로 ~/src/kdelibs/ 안에 kdelibs/를 가지고 있다고 한다면, 다음을 수행한다.

$ ls
kdelibs/
$ mkdir kdelibs-build
$ cd kdelibs-build
$ cmake ../kdelibs

이것은 kdelibs-build/ 안에 kdelibs의 빌드를 위해 Makefile을 생성할 것이다.

Windows

당신의 시스템을 위해 빌드 파일들을 생성하기 위해서는 CMake를 실행해야 한다. in-source(소스 안에서)와 out-of-source(소스 밖에서) 둘 다 CMake에 의해 지원된다. 그러나 현재 in-source(소스 안에서) 빌드는 KDE 구현에 의하여 막혀져 있다.

c:\daten\kde4 안에 kdelib\를 가지고 있다고 한다면, 다음을 수행한다.:

c:\daten\kde4> cd kdelibs\win
c:\daten\kde4> cmake
c:\daten\kde4> make 
c:\daten\kde4> make install
c:\daten\kde4> cd ..
c:\daten\kde4> mkdir kdelibs-build
c:\daten\kde4> cd kdelibs-build
c:\daten\kde4\kdelibs-build> cmake ..\kdelibs

이것은 kdelibs-build/ 안에 kdelibs의 빌드를 위해 Makefile을 생성할 것이다. 윈도우에서 KDE 컴파일에 관한 정보를 얻고 싶다면, KDE on Windows를 참고하라.

KDevelop 프로젝트 파일

만약 (기본적으로 KDevelop를 위한 몇몇 파일에 의해 Makefile이 동반되는)KDevelop를 위한 프로젝트 파일을 좋아한다면, 이것과 같이 실행하라.

$ cmake ../kdelibs -GKDevelop3

CMake가 지원하는 것과 다른 옵션을 찾기 위해 'cmake -h'를 사용하라.

CMake와 Qt4

Qt 4에 위치한 곳을 찾아내기 위해, CMake는 당신의 실행 경로에서 qmake를 찾는다. CMake는 QTDIR 환경 변수를 사용하지 않는다. 그러므로, 실행 경로에서 찾은 처음 qmake가 사용하기 원하는 것인지 확인하라.

더 자세한 세부사항

CMake가 종료되었을 때, "CMakeCache.txt"라는 파일이 생성될 것이다. 이것은 당신의 시스템에서 CMake가 찾은 모든 설정을 포함한다. 만약 다른 생성 프로그램으로 CMake를 수행하기를 원하거나, CMake가 모든 것을 다시 찾기를 원한다면 이 파일을 지워라.

만약 CMake가 무언가를 찾지 않았지만, 당신이 이것이 당신의 상자의 어딘가에 있다는 것을 안다면, 당신은 CMake에게 찾을 곳을 수동적으로 알려줄 수 있다. CMake는 이 정보를 저장하는 변수를 사용한다. 이 변수들은 이미 언급된 CMakeCache.txt 파일에 캐시된다. 이 변수들을 수동적으로 적용하기 위해 3가지 방법이 있다.

  • 커맨드 라인 하에서 올바른 값을 CMake에게 말하기 : cmake ../kdelibs -DNAME_OF_THE_VARIABLE=value
  • CMake 변수를 정용하기 위해 GUI 기반의 커서를 제공하는 ccmake를 사용하기(실행: ccmake ../kdelibs)
  • CMakeCache.txt를 직접 수정(추천하는 길은 아니다)

당신은 최소한 한번은 "ccmake ../kdelibs"를 실행해야 한다. 그래서 CMake가 사용하는 변수의 결과물을 얻는다. "T"를 누르고 "advanced" 변수를 보기 위해 "T"를 눌러라. 그래서 CMake가 아무것도 찾지 않았다면, ccmake를 시작하고, 수동적으로 그것을 적용하라.

커맨드 라인 변수들

  • CMAKE_INSTALL_PREFIX: cmake ../kdelibs -DCMAKE_INSTALL_PREFIX=/opt/kde4은 ./configure --prefix=/opt/kde4와 같은 역할을 한다.
  • CMAKE_BUILD_TYPE: 원하는 빌드 타입을 결정한다. "debugfull","debug","profile", "relwithdebinfo, "release" 사이에서 고르면 되며 기본 값은 "relwithdebinfo" (-O2 -g)이다. 더 자세한 사항은 FindKDE4Internal.cmake를 살펴보면 된다.
  • KDE4_BUILD_TESTS=ON: 테스트 프로그램으로 Makefile을 생성하고 'test' 목적파일을 제공한다.
  • KDE4_TEST_OUTPUT=xml: QTestLib 프레임워크를 사용하는 유닛 테스트가 xml 포맷의 로그 파일들을 생성할 것이다.
  • KDE4_DISABLE_MULTIMEDIA=ON: 어떠한 멀티미디어(오디오 또는 비디오) 지원 없이 KDE를 빌드한다.
  • RPATH_STYLE: 이것은 더이상 사용가능하지 않다. 기본적으로 모든 것은 RPATH로 올바르게 설정되어 빌드 될 것이다. 만약 RPATH를 전혀 원하지 않는다면, CMAKE_SKIP_RPATH를 TRUE로 설정하라
  • BUILD_foo=OFF: 서브 디렉토리 'foo' 안의 프로젝트를 위한 빌드를 비활성화 시킨다.
  • WITH_foo: 예를 들어 WITH_CUPS나 WITH_Jasper와 같은 몇몇 옵션이 존재한다. 만약 그것들이 비활성화된다면, cmake는 이 패키지를 찾기위한 시도를 하지 않을 것이다. 만약 활성화되어 있다면, 이것을 찾으려고 시도할 것이다. 만약 이것에 실패했다면, 당신은 위에 설명한 것과 같이 이것을 수동적으로 적용시킬 수 있다.

환경 변수들

만약 cmake가 찾지 못하는 비 표준 위치(예 를들어 Mac OSX의 fink가 /sw에 설치되었다면)에 설치된 헤더와 라이브러리를 가지고 있다면, 환경변수로써 다음과 같은 것들을 설정한다. 비슷한 네이밍 규약임에도 불구하고, cmake 커맨드라인에서 인자처럼 동작하지 않을 것이다.

  • CMAKE_INCLUDE_PATH, eg. export CMAKE_INCLUDE_PATH=/sw/include
  • CMAKE_LIBRARY_PATH, eg. export CMAKE_LIBRARY_PATH=/sw/lib

대하여 더 많은 정보를 얻으려면, this cmake.org 위키 페이지를 살펴보라.

더 나아가서

만약 cmake가 "Generating done"메세지와 함께 완료되었다면, 에러가 존재하지 않는다. 그러나 만약 "Configuring done" 메세지로 완료되었다면, 당신이 고쳐야할 에러가 존재한다. cmake가 성공적으로 종료하면, (예를 들어, make, KDevelop, XCode 또는 MSVC) 빌드 툴을 실행하고 빌드하라 그리고 끝날 때까지 기다려라. 그리고 "make install"하라.

만약 다음과 같은 실패를 얻었다면

If you got a failure that says something like
CMake Error: This project requires some variables to be set,
and cmake can not find them.
Please set the following variables:
X11_XTest_LIB (ADVANCED)

당신은 빠진 라이브러리(또는 다른 의존성)를 갖을 것이다. 어떤 라이브러리인지 찾기 위해, cmake/modules 디렉토리에서 cmake가 찾을 수 없는 변수를 검색하라. 위의 예제의 경우, 이것은

FIND_LIBRARY(X11_XTest_LIB Xtst ${X11_LIB_SEARCH_PATH})

그러므로 빠진 라이브러리는 Xtst이다. 이것을 찾을 필요가 있으며(아마 libXtst-devel 라이브러리로 설치된다.) , cmake를 재실행해야한다.

간단한 어플리케이션을 위한 CMake 사용하기

여기 가장 간단한 CMakeList.txt파일이 있다.

add_executable(hello main.cpp)

이것은 소스파일인 main.cpp에서 "hello"(윈도우에서는 "hello.exe")라는 실행 파일을 생성한다. 당신이 원하는 C와 C++ 파일을 섞을 수 있다. 당신은 하나의 CMakeList.txt 파일 안에서 여러 개의 실행파일과 라이브러리를 가질 수 있다. 같은 소스 파일은 다양한 타겟에서 사용가능하다. 그리고 이것은 각각의 타겟을 위해 다른 타겟과는 독립적으로 컴파일되어질 것이다. 아마도 cmake의 가장 중요한 부분은 변수들이다.

SET( MY_SOURCES main.cpp widget.cpp)
MESSAGE(STATUS "my sources: ${MY_SOURCES}")

그러므로 변수의 값을 설정하기 위해 SET() 명령어를 사용할 수 있다. 만약 하나의 문자열보다 더 많이 목록화한다면, 그 변수는 하나의 리스트가 될 것이다. 하나의 리스트는 세미콜론(;)에 의해 나누어지는 문자열의 리스트이다. 만약 단지 하나의 아이템을 설정하였다면, 이것은 단지 값이 될 것이다. 변수의 값을 얻기 위해 ${VAR}를 사용한다. FOREACH()랄 사용하여 리스트를 iterate가 가능하다.

FOREACH(next_ITEM ${MY_SOURCES})
   MESSAGE(STATUS "next item: ${next_ITEM}")
ENDFOREACH(next_ITEM ${MY_SOURCES})

CMake의 명령어들은 대소문자를 구분하지 않아도된다. 변수의 이름과 파라미터의 이름은 대소문자를 구별해야 한다.

The commands in CMake are case-insensitive. Names of variables and names of parameter are case-sensitive.

또한 당신은 다양한 것들을 위한 테스트를 할 수 있다.:

You can also test for various things:
IF (UNIX)
   MESSAGE(STATUS "This is UNIX (including OS X and CygWin)")
ENDIF (UNIX)

IF (MSVC)
   SET(MY_SRCS ${MY_SRCS} winextra.cpp)
ENDIF (MSVC)

이 두번째 예제에서는 리스트로 아이템을 어떻게 추가하는지 보여준다.

In this second example you can see also how to append items to a list.

cmake 위키에 튜트리얼가 존재한다. 이것은 KDE 4 소프트웨어를 어떻게 빌드하는지에 대하여 설명한다. 읽는 것을 추천한다.

In the cmake Wiki there is also a tutorial on using cmake to build KDE 4 software. It is recommended reading.

KDE 프로젝트를 위한 CMake 사용하기

여기에 하나의 작은 KDE 4 프로젝트를 빌드하는 기본 CMakeList 파일이 있다.

Here's a basic CMakeList file that builds a small KDE 4 project:
PROJECT(kde4project)
FIND_PACKAGE(KDE4 REQUIRED)
INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} )

SET(KDE4ProjectSources kde4mainapp.cpp someclass.cpp someotherclass.cpp)

KDE4_ADD_EXECUTABLE(kde4project ${KDE4ProjectSources} )

TARGET_LINK_LIBRARIES(kde4project ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS} )

변수, 매크로, KDE에서 다른 유용한 특정 정보들은 Development/CMake/Addons for KDE 페이지에서 찾을 수 있다.

Variables, macros and other useful information specific to KDE can be found at the Development/CMake/Addons for KDE page.

CMake 확장

CMake는 cmake 스크립트를 사용하여 확장할 수 있다. CMake는 많은 스크립트를 가지고 있다.; 유닉스 아래에서 그것들은 /usr/local/share/CMake/Modules/에 기본적으로 설치된다. 또한 KDE 라이브러리들은 share/apps/cmake/modules/ 안에 cmake 모듈들을 인스톨한다. 시스템 적역 cmake 모듈 경로에서 우선적인 하나에 파일은 위치시킨다. 소프트웨어를 검색하기 위한 것은 FindFOO.cmake 파일에 존재한다. 좀더 자세한 사항을 위해서는 여기를 살펴보라. 이것은 당신이 소프트웨어를 빌드하는데 필요할 대부분의 것들을 하기 위해 충분히 강력하다. 그러나 이것들은 일반 프로그래밍 언어에서 사용되도록 의도되어진 것은 아니다.

CMake can be extended using cmake scripts. CMake comes with a number of scripts; under UNIX they are by default installed to /usr/local/share/CMake/Modules/. The KDE libraries install also a set of cmake modules into share/apps/cmake/modules/. The files located there will be preferred over the ones in the system global cmake module path.

For detecting software packages there are FindFOO.cmake files, see here for more information. You can also write macros in CMake. They are powerful enough to do most things you will need to build software, but they are not intended to be used as a general purpose programming language.

CMake로 autotools 기반의 KDE 소프트웨어를 변환하기

kdesdk/cmake/ 안에서 am2cmake 스크립트를 찾을 수 있을 것이다. 이것은 루비 스크립트이므로, 루비가 설치되어야 할 필요가 있다. am2cmake를 소스 디렉토리의 최상위 디렉토리에서 실행하자.

In kdesdk/cmake/ you can find a script am2cmake . This is a ruby script, so you need to have ruby installed. Run am2cmake in the toplevel directory of your sources:
$ cd src/mykooltool/
$ am2cmake --kde4

"--kde4" 스위치를 잊지마라", 그렇지 않으면 KDE4 소프트웨어를 위한 적절한 파일을 생성하지 않을 것이다. 변환 파일은 그것들과 같이 '동적할 것이다.' 그러나 복잡한 프로젝트는 몇몇 추가적인 수정이 필요하다.

Don't forget the switch "--kde4", otherwise it won't generate files suitable for KDE 4 software. The converted files 'may' work as they are, but complicated projects will require some additional editing.

당신은 아래와 같은 것들을 해야 할 것이다.:

You may have to:
  • INCLUDE_DIRECTORIES()를 사용하여, include 디렉토리들을 더 추가하라.
  • TARGET_LINK_LIBRARIES()를 사용하여, 링크 라이브러리를 더 추가하라.
  • ADD_DEFINITIONS()를 사용하여, 몇몇 컴파일 스위치를 추가하라.
  • 플랫폼 검사를 수행하는 방법 and 설치된 소프트웨어를 찾는 방법을 보고, 몇몇 "configure" 검사를 추가하라.
  • 특히 이전의 libtool의 편리한 라이브러리에 주의하라. 이것은 cmake에서 지원하지 않는다. 대신 ConvenceLibs.cmake 파일이 생성될 것이다. 이 파일은 이 convenience lib를 위한 모든 소스파일을 포함한 모든 convinience lib 변수를 찾을 것이다. 이 convenience lib를 링크하기 위해 소스에 변수를 추가하라.
  • 파일 AdditionInfo.txt가 생성될 것이다. 여기에서 당신의 프로젝트의 모든 *.in과 *.in.in 파일를 볼 수 있을 것이다. 이 파일에서 수행된 것들을 cmake에서 수동적으로 전환해야 할 것이다.
  • add more include direcories, using INCLUDE_DIRECTORIES()
  • add more link libraries, using TARGET_LINK_LIBRARIES()
  • add some compile switches, using ADD_DEFINITIONS()
  • add some "configure" checks, see How To Do Platform Checks and How To Find Installed Software
  • take special care of former libtool convenience libraries. They are not supported by cmake, instead there will be a file ConvenienceLibs.cmake created. In this file you will find for every convenience lib a variable, which contains all source files of this convenience lib. For the targets which linked to this convenience lib, just add the variable to the sources.
  • a file AdditionalInfo.txt will be created. There you will see all *.in and *.in.in files of your project. The stuff done in these files will have to be converted manually to cmake.

자주묻는 질문들

CMake 문법과 들여쓰기에 대해 내가 좋아하는 에디터에 어떻게 설정할 수 있습니까?

CMake 위키의 CMake 에디터 지원 섹션을 읽어라. 이것은 Emacs(XEmacs도 동작한다.), VIM, Kate, KWrite, 그리고 KDevelop에서 어떻게 설정하는지에 대해 설명한다.

Read the CMake Wiki section CMake Editors Support. It describes how to setup Emacs (XEmacs works too), VIM, Kate, KWrite, and KDevelop.

나는 빌드 중에 몇몇 파일들을 생성하는 것이 필요합니다. 어떻게 해야 합니까?

ADD_CUSTOM_COMMAN()를 사용하라. 이것은 CMake 위키 안의빌드하는 동안 어떻게 소스파일을 생성할 수 있는 방법 섹션에서 설명되어진다.
Use ADD_CUSTOM_COMMAND(). It's explained here in the CMake wiki: How can I generate a source file during the build

파일을 생성하기 위한 빌드하는 동안에 나중에 사용하는 실행 파일을 빌드하는 것이 필요하다. 어떻게 해야 합니까?

=== I need to build an executable which is used later on during the build to generate files. How do I do this ? ===

실행파일을 genembed라고 하자. 실행파일을 생성하기 위해서는 KDE4_ADD_EXCUTABLE(foo RUN_UNINSTALLED ${fooSources})를 사용하라. RUN_UNINSTALL 옵션은 중요하다. 실행파일은 builddir에서 실행되어야하며, builddir 안의 라이브러리를 링크해야만 하기 때문이다. 이것을 위해서는 실행파일이 적당히 설정된 RPATH과 실행파일과 같은 이름붙여지고, 뒤에 ".sh"가 붙는 래퍼 쉘스크립트로 컴파일되어져야 한다. 이 쉘 스크립트는 LD_LIBARARY_PATH를 설정하고, 실질적인 실행파일을 호출한다.

Let's say the executable is called genembed. Then use KDE4_ADD_EXECUTABLE(foo RUN_UNINSTALLED ${fooSources})to create the executable. The RUN_UNINSTALLED option is important, because the executable has to run from the build dir and has to link to the libraries in the builddir. To achieve this, the executable is compiled with RPATH set accordingly and a wrapper shell script, named just like the executable but with the suffix ".sh" is created. This shell scripts sets up LD_LIBRARY_PATH and the calls the actual executable.

위에서 묘사한 ADD_CUSTOM_COMMAND() 안의 이 래퍼 쉘 스크립트를 사용하라.

Use this wrapper shell script in the ADD_CUSTOM_COMMAND() as described above.

WRAPPER_SCRIPT 속성을 질의함으로써(by querying) 이름과 정확한 위치를 찾을 수 있다. 여기 kdelibs/kstyles/keramik/에서 가져온 전체 예제가 있다.:

You can find out the name and exact location by querying the property WRAPPER_SCRIPT. Here's a full example taken from kdelibs/kstyles/keramik/ :
# build the executable
KDE4_ADD_EXECUTABLE(genembed RUN_UNINSTALLED ${genembed_SRCS})

# get the name of the generated wrapper script (which sets up LD_LIBRARY_PATH)
GET_TARGET_PROPERTY(GENEMBED_EXECUTABLE genembed WRAPPER_SCRIPT)

# and the custom command
ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/keramikrc.h
  COMMAND ${GENEMBED_EXECUTABLE} --file ${CMAKE_CURRENT_BINARY_DIR}/keramikPics.txt > \
  ${CMAKE_CURRENT_BINARY_DIR}/pixmaps.keramik
  DEPENDS genembed ${keramikPics}
)

보는 것과 같이 genembed는 의존성에서도 리스트되어진다. 이것은 cmake가 genembed 실행파일을 이전에 빌드해야만 한다는 사실을 알고 있다는 것을 의미한다.

As you can see genembed is also listed as a dependency, this means cmake knows that it has to build the executable genembed before executing this rule.

-DCMAKE_INSTALL_PREFIX 커맨드 라인 옵션을 설정하는 것을 원하지 않는다. cmake에서 KDEDIR 환경 변수를 지원하는가?

아니오. $KDEDIR은 KDE4에서 반대되어지고 있다.

No. $KDEDIR is deprecated in KDE 4.

왜 /usr/lib/qt4/include/QtCore/qstring.h:536: undefined reference to 'QString::fromLatin1_helper(char const*, int)'와 같은 에러가 나는가?

만약 qt/lib 디렉토리에 오래된 Qt4 버전을 가졌다면, 당신은 오래된 버전(4.0.1)을 지워야한다.

A: If you have an old Qt4 version in your qt/lib directory you must delete the old (4.0.1) files.

시끄러운 makefile을 생성하기 위해서는 어떻게 cmake를 사용해야 하는가? 나는 make과정 중에 실행되는 정확한 명령어들을 볼 수 있기를 원한다.

make할때 VERBOSE 변수를 포함하라. 예를 들어:

Pass the VERBOSE variable to make, i.e.
% make VERBOSE=1

or

% VERBOSE=1 make

좀 더 자세한 사항은 CMake 위키를 살펴보라. Is there an option to produce more 'verbose' compiling?

For more details see the CMake wiki:

Is there an option to produce more 'verbose' compiling?

생성된 Makefile에 'make distclean'이 존재하지 않는다. cache파일을 포함하여 모든 것을 지우려면 어떻게 해야 하는가?

간단하게 빌드 디렉토리를 지우거나 혹은 빌드 디렉토리의' 컨텐츠를 지워라.

'Simply remove the build directory, or just the contents of the build directory.