petalinux
- 사용자 Layer 경로 설정
- petalinux-config 명령을 통해 user layer 0에 위치를 설정한다.
petalinux-config 명령을 통해 user layer 0에 위치를 설정한다.Yocto Settings --->User Layers --->( ) user layer 0
${PROOT}는 petalinux 프로젝트 생성 폴더를 말한다.(petalinux-create -t project -n myZynq --template zynq 명령을 통해 생성된 myZynq 폴더)
내용을 저장하고 나오면 아래와 같이 오류메시지가 나온다. 아직 user layer 위치에 아무것도 없기때문에 나오는 메시지다
[INFO] sourcing bitbake
ERROR: Failed to source bitbake
ERROR: Failed to config project.
- 사용자 공간 Layer 작업
- 위에서 설정한 경로의 폴더를 아래와 같이 구성한다.
- 각 폴더의 필요한 파일들을 아래와 같이 구성한다.
- 각 폴더의 내용은 아래와 같다.
- layer.conf
# We have a conf and classes directory, add to BBPATH BBPATH .= ":${LAYERDIR}" # We have recipes-* directories, add to BBFILES BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \ ${LAYERDIR}/recipes-*/*/*.bbappend" BBFILE_COLLECTIONS += "libcalculator" BBFILE_PATTERN_libcalculator = "^${LAYERDIR}/" BBFILE_PRIORITY_libcalculator = "6"
- libcalculator_1.0.bb
# # This file was derived from the 'libcalculator!' example recipe in the # Yocto Project Development Manual. # DESCRIPTION = "Simple libcalculator application" SECTION = "libs" DEPENDS = "" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=96af5705d6f64a88e035781ef00e98a8" # This tells bitbake where to find the files we're providing on the local filesystem FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}-${PV}:" # Use local tarball SRC_URI = "file://libcalculator-${PV}.tar.gz" # Make sure our source directory (for the build) matches the directory structure in the tarball S = "${WORKDIR}/libcalculator-${PV}" PACKAGE_ARCH = "${MACHINE_ARCH}" PROVIDES = "calculator" TARGET_CC_ARCH += "${LDFLAGS}" do_install() { install -d ${D}${libdir} install -d ${D}${includedir} oe_libinstall -so libcalculator ${D}${libdir} install -d -m 0655 ${D}${includedir}/CALCULATOR install -m 0644 ${S}/*.h ${D}${includedir}/CALCULATOR/ } FILES_${PN} = "${libdir}/*.so.* ${includedir}/*" FILES_${PN}-dev = "${libdir}/*.so"
- 동적 라이브러리 코드 구현
- 동적 라이브러 위치, 폴더 구성 및 파일은 아래와 같다.
- 각 파일 내용은 아래를 참고
- LICENSE
The MIT License (MIT) Copyright (c) 2014 Dynamic Devices Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
LICENSE파일의 경우 libcalculator_1.0.bb파일에서 LIC_FILES_CHKSUM으로 검사하기 때문에 한문자, 한 공백까지도 동일해야 한다. 동일하지 않을경우 컴파일 실패가 발생하며 이럴경우 md5sum명령으로 CHKSUM값을 확인하여 libcalculator_1.0.bb파일에 LIC_FILES_CHKSUM의 값을 변경할 필요가 있다. 즉 LIC_FILES_CHKSUM값과 md5sum LICENSE 결과는 동일해야 한다.
- Makefile
APP = calculator LIBSOURCES=*.c OUTS = *.o NAME := calculator MAJOR = 1.0 MINOR = 1 VERSION = $(MAJOR).$(MINOR) all: lib$(NAME).so lib$(NAME).so.$(VERSION): $(OUTS) $(CC) $(LDFLAGS) $(OUTS) -shared -Wl,-soname,lib$(NAME).so.$(MAJOR) -o lib$(NAME).so.$(VERSION) lib$(NAME).so: lib$(NAME).so.$(VERSION) rm -f lib$(NAME).so.$(MAJOR) lib$(NAME).so ln -s lib$(NAME).so.$(VERSION) lib$(NAME).so.$(MAJOR) ln -s lib$(NAME).so.$(MAJOR) lib$(NAME).so %.o: %.c $(CC) $(CFLAGS) -c -fPIC $(LIBSOURCES) clean: rm -rf *.o *.so *.so.*
- add.c
/* * add.c * * Created on: 2020. 8. 13. * Author: pcw1029 */ #include "add.h" int add(int val1, int val2) { return val1+val2; }
- add.h
/* * add.h * * Created on: 2020. 8. 13. * Author: pcw1029 */ #ifndef ADD_H_ #define ADD_H_ int add(int val1, int val2); #endif /* ADD_H_ */
- make명령을 실행하여 정상적으로 동적라이브러리가 만들어 지는지 확인한다.
- make clean으로 생성된 동적 라이브러리 파일과 오브젝트 파일을 삭제하고 폴더를 압축한다.
최종 폴더 구성및 위치, 파일 구성 및 위치가 아래와 같다.
- {}project-spec/meta-user/recipes-core/images/petalinux-image.bbappend 파일에 내용 아래 와같이 내용을 추가한다. 기존에 peekpoke, gpio-demo가 자동으로 들어가 있는게 일반적인데 없더라도 신경쓸거없다. 우리는 위리가 추가한 libcalculator만 잘 넣으면 된다.
#Note: Mention Each package in individual line # cascaded representation with line breaks are not valid in this file. IMAGE_INSTALL_append = " peekpoke" IMAGE_INSTALL_append = " gpio-demo" IMAGE_INSTALL_append = " libcalculator"
- petalinux-config -c rootfs명령으로 추가된 libcalculator을 enable시켜준다.
user packages --->
- petalinux-build명령을 실행하여 해당 동적라이브러리를 컴파일 한다.
- 정상적으로 빌드가 끝나면 ./build/tmp/sysroots/plnx_arm/usr/lib 아래 정적라이브러리 파일이 생성된다.