Debian용 CMake 구성 요소 패키징

Debian용 CMake 구성 요소 패키징

두 개의 바이너리 데비안 패키지로 패키징하려는 cmake를 사용하는 업스트림 소스 패키지가 있습니다.

$ tree proj
proj/
├── app1.c
├── app2.c
└── CMakeLists.txt

업스트림은 CMakeLists.txt이를 염두에 두고 작성되었습니다. COMPONENTS 매개변수를 사용합니다.install

$ cat proj/CMakeLists.txt
include(GnuInstallDirs)

add_executable(app1 app1.c)
install(
  TARGETS app1 
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  COMPONENT app1)

add_executable(app2 app2.c)
install(
  TARGETS app2
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  COMPONENT app2)

로컬로 컴파일/설치하는 방법은 매우 간단합니다.

$ mkdir build && cd build
$ cmake ../proj -DCMAKE_INSTALL_PREFIX=/usr/local  # Configure
$ cmake --build .                                  # Build
$ cmake -DCOMPONENT=app1 -P cmake_install.cmake    # Install app1 component
$ cmake -DCOMPONENT=app2 -P cmake_install.cmake    # Install app2 component

debian/rules하지만 이를 위한 파일을 만드는 방법은 무엇입니까 ?

답변1

표준 debhelper debain/rules파일은 다음과 같습니다(빌드 시스템은 최신 호환성 수준에서 cmake를 자동으로 감지합니다).

%:
        dh $@    # --buildsystem=cmake  <-- older compat levels may need this

이것은 효율적으로 실행됩니다 make install DESTDIR=debian/tmp. 하지만 이렇게 하면 모든 것이 하나의 대상에 저장되므로 debian/*.install파일을 분할하기 위해 파일을 수동으로 작성해야 합니다(참조:dh_install(1)). 이는 단일 cmake 소스 코드를 여러 바이너리로 변환하는 일반적인 방법입니다. 데비안 매뉴얼에 좋은 가이드가 있습니다.여기.

그러나 업스트림에서는 구성 요소 설치를 정의하여 이미 이 작업을 수행합니다.

이를 활용하려면 고유한 설치 방법을 재정의하여 패키지/구성 요소 연결을 지정하십시오.

include /usr/share/dpkg/architecture.mk

%:
        dh $@

override_dh_auto_install:
        sed -i -e 's/\-P/\-DCOMPONENT\=app1\ \-P/g' obj-$(DEB_HOST_MULTIARCH)/Makefile
        dh_auto_install --destdir=debian/app1

        sed -i -e 's/\-DCOMPONENT\=app1/\-DCOMPONENT\=app2/g' obj-$(DEB_HOST_MULTIARCH)/Makefile
        dh_auto_install --destdir=debian/app2

루트는 이 바이너리 패키지에 debian/<binary_package_name>표시됩니다 ./

나는 이 명령에 약간 실망했습니다 sed. -- -DCOMPONENT=app1dh_auto_install 디렉토리에 전달하여 이 작업을 수행하고 싶습니다 . 대신 이 명령은 cmake에 의해 자동으로 생성된 Makefile을 편집합니다. 이 솔루션은 를 사용하고 있고 설치 명령에 make고유 -P문자열이 있을 것이라고 가정합니다(지금까지 확인한 프로젝트의 경우인 것 같습니다). 이 답변에 대한 편집 내용을 수락하고 더 나은 솔루션을 제공하게 되어 기쁘게 생각합니다.

참고: Kitware(cmake 개발자)는 새로운 debhelper 확장을 개발 중입니다.dh-cmake이렇게 하면 더 쉬워질 것 같습니다. 그러나 Debian 10(buster)에서는 아직 사용할 수 없습니다.

관련 정보