본문 바로가기
프로그래밍 ( Programming )/C++

[CMake] CMake란

by Jayce_choi 2023. 1. 14.
반응형

CMake는 빌드 파일을 생성 및 배포를 위한 패키지 생성에 이르는 과정을 모두 해주는 프로그램을 의미합니다.

즉, CMake를 통해서 프로젝트를 빌드하는 것이 아닌, CMake를 통해서 빌드 파일을 생성하는 단계까지 해주는 프로그램을 의미합니다. 빌드 파일을 만든다면 그 후 빌드 프로그램을 이용하여 프로젝트를 빌드하게 됩니다. 

 

좀 더 히스토리를 보겠습니다. 

Compile & Linking (컴파일과 링킹)

컴파일은 소스코드를 어셈블리어로 바꿔주는 과정이며 소스파일 (.c)에서 목적파일 (.o)를 생성하는 과정을 의미합니다. 그리고 링킹은 서로 다른 파일에 있는 목적파일들을 한 군데 묶어서 하나의 실행파일로 만드는 과정을 의미합니다.  

하지만 프로젝트가 커져서 만약 컴파일을 수행해야 할 파일들이 많아지게 된다면 일일이 gcc -c와 gcc -o과정을 통한 컴파일 및 링킹 과정을 모두 일일이 수행하는 것이 불가능해집니다. 더구나 쉘 스크립트를 이용하여 모든 명령어를 임의로 넣어서 자동화 과정을 만든다고 해도 한파일만 컴파일해도 되는 상황을 지나쳐서 모든 파일을 컴파일해 버리기 때문에 시간이 길어지게 됩니다. 

Window에서 비주얼 스튜디오를 사용한다면 컴파일 버튼을 누름으로써 컴파일을 할 수 있습니다. 하지만 리눅스 상에서는 컴파일을 하기 위해서는 어떤 파일을 컴파일해야 할지, 어떠한 방법으로 해야 할지 직접 컴파일러에게 지시를 내려야 합니다. 매번 명령어를 치면 문제가 없지만, 프로젝트의 크기가 커지면서 파일이 많아지게 되는데 매번 입력하는 것은 거의 불가능에 가깝습니다. 

make를 이용한 방법은 서로의 연관성을 적어줌으로써 빠르게 컴파일과 링킹을 수행하는 방법입니다.  Make를 실행 시 키위 해서는 위치와 파일 명이 필요합니다. 이때 Makefile을 필요로 하게 되며 다음과 같은 구성으로 이뤄집니다. 

  • Target: 빌드 대상, 명령어가 수행된 최종 결과를 저장하는 파일
  • Dependencies: 주어진 target을 make 할 때 필요한 파일 목록
  • Command: 실행할 명령어 

하지만 Make 방법 또한 프로젝트 크기가 커져서 관리해야 할 소스파일이 커져서 makefile을 작성하는데 문제가 발생합니다. 즉 소스코드를 수정해서 의존성이 바뀔 때마다 Makefile을 다시 수정해야 하며 연관성에 대해 명확하게 분석이 안 돼있을 시 빌드가 꼬이는 문제로 갈 수 있습니다..

 

CMake

CMake는 Make의 빌드 관리 시스템을 만들기 위한 오픈소스 프로젝트입니다. 

기능으로는 Makefile 자동생성 및 관리를 해주며 지정한 운영체제에 맞는 Makefile을 생성해줄수도 있기에 빌드가 편리하며 의존성 정보를 일일이 기술해주지 않아도 되기에 스크립트 관리에도 효율적입니다. 이 부분이 제일 큰 장점이자 차이점이며 소스파일 내부까지 들여다봐서 의존성 정보를 일일이 기술이 아닌 스스로 CMake가 파악한다는 점입니다. 예를 들면, 소스파일에 헤더파일을 추가하면 직후 빌드부터 의존성 관계변화가 자동으로 추적되어서 헤더 파일의 변화까지 추적하게 됩니다. 

마찬가지로 Makefile에서 빌드 중간 생성물인 Object파일들까지 이전에는 기술해야 했으나 CMake에서는 CMakeLists.txt에 최종 빌드 결과물 및 준비물들인 소스 파일들만 명시해 줌으로써 좀 더 직관적이고 편리하게 작업을 진행할 수 있습니다. 

 

CMake를 이용한 프로젝트 빌드과정은 아래와 같습니다. 

CMakeLists.txt는 Makefile을 만들기 위해서 필요한 정보들이 포함되어 있습니다. 예시로 아래와 같은 내용들이 들어가게 됩니다. 

# CMakeLists.txt안에 들어가는 예제 내용

cmake_minimum_required (VERSION 2.9) #cmake 최소 요구 버전
project(test) #프로젝트 이름: test
add_excutable(Tutorial test_cmake.cpp)

CMakeLists.txt 최상단에는 cmake_minimum_required를 이용하여서 해당 프로젝트에서 사용할 CMake의 최소버전을 명시해 줍니다. 

project항목에는 프로젝트 이름뿐만 아니라 Version, Description, Hompage URL, Languages와 같은 다른 정보들도 추가로 입력해 줄 수 있습니다. Languages는 입력을 안 하면 디폴트 값으로 C와 CXX가 설정됩니다. 

add_excutable은 생성할 실행 파일을 추가하는 명령입니다. Tutorial은 프로젝트이름이며 실행 파일의 이름입니다. 때문에 먼저 기입을 해주고 해당 실행파일을 만드는데 필요한 소스인 test_cmake.cpp를 기입해 줍니다 (add_excutable에서 대소문자를 구분하지 않고 실행이 가능하기 때문에 같은 알파벳만 사용되었다면 문제없습니다)

 

 

Example (간단한 프로젝트 빌드 및 실행)

예제를 하나 해보겠습니다. 먼저 위에서 언급한 내용대로 CMakeLists.txt와 타깃 하는 파일이 필요합니다. 

test_cmake.cpp
0.00MB

먼저 위의 test_cmake.cpp를 다운로드합니다. 내용은 아래와 같습니다. 

#include<cmath>
#include<cstdlib>
#include<iostream>
#include<string>

int main(int argc, char* argv[])
{
    if (argc < 2) {
        std::cout << "Usage: " << argv[0] << " number" << std::endl;
        return 1;
    }
    const double inputValue = atof(argv[1]);

    const double outputValue = sqrt(inputValue);
    std::cout << "The square root of " << inputValue << " is " << outputValue
        << std::endl;
    return 0;
}

 

두 번째로 필요한 파일은 CMakeLists.txt입니다. CMake가 빌드를 위해서 읽어야 하는 일종의 가이드라인입니다. 내용은 아래와 같습니다 (txt 파일이기 때문에 메모장에 밑의 내용을 그대로 입력하고 저장하면 됩니다)

cmake_minimum_required(VERSION 3.10)

project(Tutorial)

add_executable(Tutorial test_cmake.cpp)

여기서 중요한 점은 Project명은 Tutorial와 같이 작명을 원하는 방향으로 작성하셔도 되지만 add_excutable 명령어의 끝에는 타깃 하는 파일의 이름이 정확하게 들어가야 합니다. 

 

 

이제 타깃 하는 파일과 CMakeLists.txt가 준비되었습니다. 이제 build라는 폴더를 하나 새로 만들어줍니다. 

build 파일을 만들어주는 이유는 CMake과정을 통해서 여러 가지 파일들이 생성되게 되는데 이때 빌드에 사용되었던 파일들과는 따로 분리를 시키기 위해서 폴더를 제작합니다. 

 

이제 build 폴더로 들어가서 아래의 명령어를 실행하면 됩니다. 

 

저는 cmake 명령어를 윈도에서 Powershell를 이용하였으며 아래와 같은 많은 문장들이 나올 것입니다.  

끝나서 build 폴더를 확인해 보시면 아래와 같이 친숙한 파일들이 보이게 됩니다. 몇몇 개의 파일들은 Visual Studio로 build 하였을 때 나오는 결과물과 동일합니다. 

Tutorial.sln을 실행시켜 보면 동일한 프로젝트를 확인할 수 있었습니다. 

 

반응형

댓글