Conan: C/C++ 전용 오픈소스 패키지 관리 도구 소개
Conan은 크로스플랫폼, 분산형, 그리고 커뮤니티 기반의 C 및 C++ 라이브러리 관리를 위한 강력한 도구입니다. 이 문서는 Conan의 기본 구조와 구성 요소를 중심으로 실질적인 사용 방법을 설명합니다.
기본 프로젝트 구조
Conan 패키지를 개발하거나 사용할 때 일반적으로 따라야 할 디렉터리 구조는 다음과 같습니다:
.
├── conanfile.py # 패키지 메타정보 및 빌드 정의
├── conanexports.txt # 내보낼 파일 목록 (옵션)
├── src/ # 소스 코드 저장 폴더
│ └── main.cpp
├── test_package/ # 패키지 테스트용 예제 프로젝트
│ ├── conanfile.py
│ └── main_test.cpp
└── README.md # 프로젝트 설명 문서
이 구조는 패키지 생성, 빌드, 테스트, 배포를 효율적으로 수행하기 위한 표준입니다.
핵심 구성 요소: conanfile.py
conanfile.py는 모든 작업의 중심이 되는 설정 파일이며, 파이썬 스크립트 형식으로 작성됩니다. 이 파일은 패키지의 속성과 빌드 로직을 정의합니다.
주요 구성 항목
- name: 패키지 이름 (예:
jsoncpp) - version: 버전 정보 (예:
1.9.0) - license: 라이선스 유형 (예:
MIT,Apache-2.0) - url: 공식 홈페이지 또는 리포지토리 주소
- description: 간단한 설명
의존성 설정
패키지가 다른 라이브러리에 의존하는 경우, requires를 통해 선언합니다:
requires = "zlib/1.2.11", "openssl/1.1.1k"
환경 설정 (settings)
빌드 환경을 지정하여 다양한 플랫폼에서 호환성을 확보합니다:
settings = "os", "arch", "compiler", "build_type"
os: Windows, Linux, macOS 등arch: x86, x86_64, armv7, aarch64 등compiler: gcc, clang, msvc 등build_type: Debug, Release 등
컴파일 옵션 (options)
사용자가 선택적으로 활성화할 수 있는 기능을 정의할 수 있습니다:
options = {"shared": [True, False], "fPIC": [True, False]}
default_options = {"shared": False, "fPIC": True}
빌드 로직 (build() 메서드)
실제 빌드 프로세스를 정의합니다. CMake를 사용하는 경우:
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
패키징 (package() 메서드)
빌드된 결과물 중 필요한 파일만 포함하여 패키지로 묶습니다:
def package(self):
self.copy("*.h", dst="include", src="src")
self.copy("*.a", dst="lib", keep_path=False)
self.copy("*.so*", dst="lib", keep_path=False)
패키지 정보 (package_info())
빌드 시스템(예: CMake, Make)이 사용할 수 있도록 링크 정보를 제공합니다:
def package_info(self):
self.cpp_info.libs = ["mypkg"]
self.cpp_info.includedirs = ["include"]
self.cpp_info.libdirs = ["lib"]
빠른 시작: 새 패키지 생성
명령줄에서 새로운 패키지를 생성하려면 다음 명령어를 사용합니다:
conan new mylib/1.0@user/testing
이 명령어는 위의 구조를 자동으로 생성하고, 기본적인 conanfile.py와 test_package도 함께 만듭니다.
주요 명령어 활용
| 명령어 | 설명 |
|---|---|
conan install . |
의존성 설치 및 빌드 환경 준비 |
conan build . |
현재 디렉터리의 패키지 빌드 |
conan package . |
패키지 생성 (빌드 후 실행) |
conan upload <package> -r=remote |
원격 저장소에 업로드 |