(작성중) yocto
2026. 4. 15. 16:03CMakeLists.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파일과