반응형

CMakeLists.txt에서 install()을 제거하고, bb파일의 do_install에서 직접 처리하는 버전입니다.
B — CMakeLists.txt (install 제거)
cmake_minimum_required(VERSION 3.10)
project(libB VERSION 1.0)

add_library(B SHARED src_b.c)

set_target_properties(B PROPERTIES
    VERSION   ${PROJECT_VERSION}
    SOVERSION 1
    PUBLIC_HEADER libB.h
)

target_include_directories(B PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
)

# install() 없음
recipe-b_1.0.bb (do_install 직접 처리)
SUMMARY = "Shared library B (CMake)"
DESCRIPTION = "Shared library B built with CMake"
LICENSE = "CLOSED"

SRC_URI = "file://CMakeLists.txt \
           file://src_b.c \
           file://libB.h \
          "

S = "${WORKDIR}"

inherit cmake

EXTRA_OECMAKE += "-DCMAKE_BUILD_TYPE=Release"

# cmake --build 결과물은 ${B} 디렉토리에 생성됨
# ${B} = ${WORKDIR}/build (cmake 클래스 기본값)

do_install() {
    # .so 설치
    install -d ${D}${libdir}
    install -m 0755 ${B}/libB.so.1.0.0       ${D}${libdir}/
    ln -sf libB.so.1.0.0  ${D}${libdir}/libB.so.1
    ln -sf libB.so.1      ${D}${libdir}/libB.so

    # 헤더 설치
    install -d ${D}${includedir}
    install -m 0644 ${S}/libB.h              ${D}${includedir}/

    # A의 find_package(B)를 위한 cmake config 파일 수동 생성
    install -d ${D}${libdir}/cmake/B
    install -m 0644 ${WORKDIR}/BConfig.cmake ${D}${libdir}/cmake/B/
    install -m 0644 ${WORKDIR}/BTargets.cmake ${D}${libdir}/cmake/B/
}

PACKAGES = "${PN}-dev ${PN}"

FILES:${PN} = "\
    ${libdir}/libB.so.1 \
    ${libdir}/libB.so.1.0.0 \
"

FILES:${PN}-dev = "\
    ${libdir}/libB.so \
    ${includedir}/libB.h \
    ${libdir}/cmake/B/ \
"

INSANE_SKIP:${PN}-dev = "dev-so"
BConfig.cmake (수동 작성)
find_package(B)가 동작하려면 cmake config 파일이 여전히 필요합니다.
CMakeLists.txt의 install(EXPORT ...)가 없으므로 수동으로 작성합니다.
files/BConfig.cmake
# B 라이브러리 경로 설정
get_filename_component(_B_ROOT "${CMAKE_CURRENT_LIST_DIR}/../../.." ABSOLUTE)

add_library(B::B SHARED IMPORTED)

set_target_properties(B::B PROPERTIES
    IMPORTED_LOCATION             "${_B_ROOT}/libB.so.1"
    IMPORTED_SONAME               "libB.so.1"
    INTERFACE_INCLUDE_DIRECTORIES "${_B_ROOT}/../include"
)
files/BTargets.cmake
# BConfig.cmake에서 직접 처리하므로 내용 없이 존재만 해도 됨
# (A의 CMakeLists.txt에서 BTargets.cmake를 include하는 경우에만 필요)
BConfig.cmake 하나로 B::B 타겟을 정의했으므로 BTargets.cmake는 사실상 불필요합니다. recipe-a의 CMakeLists.txt에서 find_package(B REQUIRED)만 호출하면 동작합니다.
핵심 변경 포인트
항목
cmake install() 사용
do_install 직접 처리
심볼링크 생성
cmake가 자동 생성
ln -sf로 수동 생성
cmake config
install(EXPORT)로 자동 생성
BConfig.cmake 수동 작성
.so 파일명
cmake가 버전 suffix 자동 처리
${B}/libB.so.1.0.0 직접 명시
유지보수
CMakeLists.txt 수정으로 일원화
bb파일과

반응형