GPLv2
GNU Compiler Collection
) : 프로젝트에 사용되는 것에 의존적임GPLv2
, GPLv2.1
, GPLv3
우선 위 3가지 모두 임데디드 디바이스를 위한 리눅스 운영체제 스택인 경우, 해당된다.
제품에 오픈소스 SW가 사용됐음을 인지시켜야한다. 소스 코드 포함 방식에 대한 라이선스 텍스트와 정보를 최종 사용자가 이용할 수 있어야한다.
라이선스와 소스 코드 정보는 장치에 포함되거나 다른 방식으로 제공될 수 있다.
About Device
메뉴에 있는 Legal Information
항목을 통해 라이선스를 확인할 수 있다. 라이선스 정보와 텍스트는 장치에 저장될 수 있다. 특별히 연결되는 장치의 경우, 하이퍼 링크를 통해 라이선스 정보가 보이는 웹사이트로 최종 사용자를 안내할 수도 있다. 최소한의 텍스트 표시가 가능한 사용자 인터페이스를 가진 장치가 편리하며, 이런 인터페이스가 없는 장치를 위해 제조사의 웹사이트 등에 사용자 도큐먼와 함께 라이선스 정보를 제공할 수도 있다.Yocto는 170개 이상의 일반 라이선스를 가지고 있다. 주요한 라이선스는 오픈소스 라이선스지만, 또한 일부 소프트웨어 패키지들을 위한 상업 라이선스도 있다. 일부 오픈소스 소프트웨어 개발자들은 자신들의 라이선스를 사용하는데, 이 것이 법적으로 적절하지는 않으므로 더 복잡한 문제를 일으 킬 수 도 있다.
오픈소스 이니셔티프(OSI, Open Source Initiative)는 오픈소스 정의를 준수하기 위한 라이선스 검토 과정으로 라이선스들을 검토한다. OSI 웹 사이트에는 조직체의 라이선스 검토 과정을 통과하고 오픈소스 정의에 따라 승인된 약 70개의 오픈소스 라이선스가 목록화 되어 있다.
이를 더 복잡하게 만드는 이슈는 단일 오픈소스 프로젝트가 사실상 여러 라이선스를 사용할 수 있다는 것이ㅏㄷ.
라이선스 지정은 텍스트 문자열이 될 수 있으나 공백을 포함하면 안된다. 표준 라이선스의 경우 meta/files/common-license
에 공통 라이선스 파일명을 사용하거나 라이선스 지정으로 meta/conf/licenses.conf
에 정의된 SPDX(Software Package Data Exchange) 라이선스 플래그 명을 사용한다. SPDX는 S PDX 작업 그룹에 의해 생성되고 유지되는 라이선스 정보의 표준 형식이다.
SPDX-FileCopyrightText: © {$year_of_file_creation} {$name_of_copyright_holder} <{$contact}>
SPDX-License-Identifier: {$SPDX_license_name}
SPDX-FileCopyrightText: © 2020 Matija Šuklje <matija@suklje.name>
SPDX-License-Identifier: BSD-3-Clause
저작권 표시
LICENSE
LICENSE : 패키지가 릴리스됐던 라이선스를 기술한다.
LIC_FILES_CHKSUM
meta/files/common-licenses/
에 있다.COPYING
, LICENSE
와 같은 파일을 가지고 있는 경우gstreamer1.0-plugin-ugly
패키지를 살펴보자.COPYING
;md5='md5sum값'
tests/check/elements/xingmux.c
;beginline=1;endline=21;md5='md5sum값'
LIC_FILES_CHKSUM
에 기술한다. (둘다 내용은 LGPL-2.1-or-later 같음)LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343 \
file://tests/check/elements/xingmux.c;beginline=1;endline=21;md5=4c771b8af188724855cb99cadd390068"
LICENSE = "LGPL-2.1-or-later & GPL-2.0-or-later"
LIC_FILES_CHKSUM
+ LICENSE
-> ${DEPLOY_DIR}/licenses/${PN}
에 copy 되어, 체크섬을 수행한다.gstreamer1.0-plugin-ugly
의 경우 LICENSE_FLAGS += "commercial"로 한다local.conf
에 필요한 특별한 라이선스의 화이트리스트를 적어야한다.deprecated
)gstreamer ugly plugin
에서 이 패키지만 설치되길 원한다면LICENSE_FLAGS_WHITELIST_pn-gstreamer1.0-plugins-ugly = "commercial"
다른 레시피의 commercial 배제하지만 gstreamer1.0-plugins-ugly
는 허용한다.build/conf/local.conf
에# LICENSE_FLAGS_WHITELIST = "commercial" (deprecated)
LICENSE_FLAGS_ACCEPTED = "commercial"
를 명시하자.카피레프트 규약을 지키기 위한 포키의 사용
다른 라이선스를 가진 패키지를 사용해 리눅스 기반 시스템 제품을 생산 시, 필요한 법적 측면을 이해할 시간
라이선스 검사
카피레프트 규약을 지키는 데 도움을 주기 위해 포키는 이미지가 빌드되는 동안 build/tmp/deploy/license/<image_name-machine_name_datestamp>/
디렉토리에 라이선스 목록을 만든다.
image_license.manifest
: 레시피 이름, 버전, 라이선스, build/tmp/deploy/image/<machine>
에서 사용할 수 잇는 패키지의 파일을 열거하지만 rootfs
에 설치되지는 않는다. 가장 많이 사용되는 예제는 부트로더, 리눅스 커널 이미지, dtb 파일이다.package.manifest
: 이미지의 모든 패키지들 목록이 있다.license.manifest
: 모든 패키지의 이름, 버전, 레시피 이름, 라이선스의 목록. 이 파일은 카피레프트 규약을 검사하는 데 사용된다.DL_DIR
내용을 공유함으로써 이미지를 사용하는 모든 프로젝트의 소스코드를 제공하는 데 도움을 주는 것이다. 그러나 이 접근 방법은 한가지 위험성이 있다. 내용물을 그대로 공유하는 경우 상용화 코드가 DL_DIR
안에 있다면 이것도 함께 공유된다. 추가적으로 이런 접근 방식은 카피레프트 규정에 의해 요구하지 않은 것을 포함한 소스코드도 공유한다.또다른 방식은 포키가 소스코드의 집합을 생성하고 결과로 나오는 것을 결정하게 설정하는 것이다. 이때 archiver
클래스를 사용한다. 이 클래스는 아키텍처(allarch-poky-linux
, arm-poky-linux-gnueabi
, x86_64-linux
)와 라이선스에 의해 분리돼 build/tmp/deploy
디렉토리에 잇는 각 패키지의 소스코드를 카피한다.
arm-poky-linux-gnueabi
의 패키지는 build/tmp/deploy/sources/arm-poky-linux-gnueabi/GPLv3/package-name
디렉토리에 있는 GPLv3로 릴리스 한다.포키는 마지막 이미지를 만들기 전에 소스코드를 묶는 환경설정을 해야한다. 이 것을 하기 위해 local.conf
에 다음과 같이 설정한다.
INHERIT += "archiver"
ARCHIVER_MODE[src] = "original"
build/tmp/deploy/sources
를 공유하면 불필요한 상용화 코드가 공유된다는 점을 명심해야 한다. 공유 가능한 곳 또는 어떤 다른 라이선스 조합에서 필요한 공유 전략에 따라, GPLv3
또는 MIT
의 라이선스를 가진 패키지만 복사할 수 있다.GPL 라이선스를 가진 모든 패키지를 복사하기 위해 사용되는 복사 명령어의 예는 다음과 같다.
(http://www.yoctoproject.org/docs/2.4/dev-manual/dev-manual.html)
# Script to archive a subset of packages matching specific license(s)
# Source and license files are copied into sub folders of package foler
# Must be run from build folder
#!/bin/bash
src_release_dir="source-release"
mkdir -p $src_release_dir
for a in tmp/deploy/sources/*; do
for d in $a/*; do
Get package name from path
p=`basename $d`
p=${p%-*}
p=${p%-*}
# Only archive GPL packages (update *GPL* regex for your license check)
numfiles=`ls tmp/deploy/licenses/$p/*GPL* 2> /dev/null | wc -l`
if [ $numfiles -gt 1 ]; then
echo Archiving $p
mkdir -p $src_release_dir/$p/$source
cp $d/* $src_release_dir/$p/source 2> /dev/null
mkdir -p $src_release_dir/$p/$license
cp tmp/deploy/licenses/$p/* $src_release_dir/$p/license 2> /dev/null
fi
done
done
라이선스에서 주의를 해야하는 사항에 대해 포키의 도움을 받고 싶다면 ARCHIVER_MODE[filter] ?= "yes" 코드를 local.conf에 추가한다.
기본 환경 설정은 모든 프로젝트마다 소스코드를 갖고 있는 것이다. 즉, 필터가 없는 것이다.
그러나 COPYLEFT_LICENSE_INCLUDE 프로젝트의 소스코드만 갖고 있는 것을 선호한다면 필터를 사용할 수 있다.
COPYLEFT_LICENSE_INCLUDE 변수는 현재 GPL 또는 LGPL 로 시작되는 모든 라이선스를 포함한다. 또 다른 라이선스 또는 변화를 포함하기 결정하길 원한다면 이 변수를 local.conf
에 덮어 쓰면 된다.
컴파일 스크립트와 수정된 소스코드 제공
ARCHIVER_MODE[src] = "patched"
만 추가하면 된다. 이 방법으로 포키는 do_patch
작업 후 프로젝트 소스코드를 묶을 수 있다. 레시피 또는 bbappend 파일의 수정을 포함한다.do_configure
작업 후 설정된 프로젝트를 공유해야한다.local.conf
에 다음을 추가할 수 있다.ARCHIVER_MODE[src] = "configured"
ARCHIVER_MODE[srpm] = "1"
을 local.conf
에 추가하는 것이다. 결과 파일은 SRPM
패키지가 될 것이다.local.conf
에 다음을 추가한다.COPY_LIC_MANIFEST = "1"
COPY_LIC_DIRS = "1"
이렇게 하면 라이선스 파일은 루트 파일 시스템에서 /usr/share/common-licenses/
에 위치할 것이다.
libubootenv_0.3.2.bb
의 경우, 1개의 레시피 파일을 지정해서 md5sum을 체크하는데, 오픈소스에서 자체 Licenses
디렉토리를 두고, 많은 license를 사용하며, Licenses/README
를 가지는 경우.u-boot-common.inc
레시피(설정) 파일을 예제로 설명한다.LICENSE
= "라이선스 지정"LIC_FILES_CHKSUM
= "file://
위 LICENSE에서 지정한 라이선스 파일
;md5=....."
${LICENSE}
의 파일 지정 및 체크섬MIT
라면,LIC_FILES_CHKSUM="file://${COMMON_LICENSE_DIR}/MIT;md5=......."
${COMMON_LICENSE_DIR}
md5
는 md5sum
의 값