05 марта 2026 № 1 (2026)

ROSARIUM

газета советского программиста

SPDX и указание в SPEC

Формат SPDX, операторы AND/OR/WITH, указание лицензии в SPEC-файле.

На этой странице

SPDX (Software Package Data Exchange) — стандартный формат записи лицензий. Используйте его в теге License: вместо произвольных строк.

Формат SPDX

Простая лицензия

License:        MIT
License:        GPL-3.0-or-later
License:        Apache-2.0

Операторы

ОператорЗначениеПример
ANDОбе лицензии применяются одновременноMIT AND BSD-3-Clause
ORПользователь выбирает одну изMIT OR Apache-2.0
WITHЛицензия с исключениемGPL-2.0-or-later WITH Classpath-exception-2.0

Примеры реальных пакетов

# Проект полностью под MIT
License:        MIT

# Основной код — GPL, один файл — BSD
License:        GPL-3.0-or-later AND BSD-2-Clause

# Двойная лицензия (Rust crates часто так)
License:        MIT OR Apache-2.0

# GCC runtime library
License:        GPL-3.0-or-later WITH GCC-exception-3.1

# Сложный проект с bundled-зависимостями
License:        Apache-2.0 AND MIT AND BSD-3-Clause AND ISC

Скобки

Для сложных выражений используйте скобки:

License:        (MIT OR Apache-2.0) AND GPL-3.0-or-later

Как определить лицензию

Шаг 1: Найти файлы лицензий

tar xf myproject-1.0.tar.gz
find myproject-1.0 -iname 'LICENSE*' -o -iname 'COPYING*' -o -iname 'NOTICE*'

Шаг 2: Прочитать и определить тип

cat myproject-1.0/LICENSE
# Если видите "MIT License" → MIT
# Если "GNU General Public License" → GPL
# Если "Apache License, Version 2.0" → Apache-2.0

Шаг 3: Проверить все компоненты

В больших проектах разные файлы могут быть под разными лицензиями:

# Поиск лицензионных заголовков в исходниках
grep -rn "Copyright\|License\|SPDX-License-Identifier" myproject-1.0/src/ | head -20

Современные проекты часто содержат SPDX-идентификаторы прямо в файлах:

// SPDX-License-Identifier: MIT

Шаг 4: Проверить bundled-зависимости

# Лицензии в каталогах third_party/vendor
find myproject-1.0/vendor -name 'LICENSE*' -exec echo {} \; -exec head -1 {} \;

SPDX License List

Полный список идентификаторов: spdx.org/licenses

Частые идентификаторы:

SPDXЛицензия
MITMIT License
BSD-2-ClauseBSD 2-Clause
BSD-3-ClauseBSD 3-Clause
Apache-2.0Apache License 2.0
GPL-2.0-onlyGNU GPL v2 only
GPL-2.0-or-laterGNU GPL v2 or later
GPL-3.0-onlyGNU GPL v3 only
GPL-3.0-or-laterGNU GPL v3 or later
LGPL-2.1-onlyGNU LGPL v2.1 only
LGPL-2.1-or-laterGNU LGPL v2.1 or later
LGPL-3.0-onlyGNU LGPL v3 only
MPL-2.0Mozilla Public License 2.0
ISCISC License
Zlibzlib License
UnlicenseThe Unlicense

%license в %files

Всегда указывайте файлы лицензий:

%files
%license LICENSE
%license COPYING
%license NOTICE

Для подпакетов — каждый подпакет должен содержать лицензию:

%files
%license LICENSE

%files devel
%license LICENSE

%files doc
%license LICENSE

Типичные ошибки

Неправильный SPDX-идентификатор

# НЕПРАВИЛЬНО
License:        GPLv3+
License:        GPL
License:        BSD

# ПРАВИЛЬНО
License:        GPL-3.0-or-later
License:        GPL-3.0-only
License:        BSD-3-Clause

Лицензия не соответствует исходникам

# В SPEC
License:        MIT

# В исходниках — файл COPYING с текстом GPL-2.0

Всегда проверяйте реальное содержимое файлов лицензий.

Забыли bundled-зависимости

Если проект bundled zlib (BSD-подобная) и json-c (MIT):

# НЕПРАВИЛЬНО — указана только лицензия основного кода
License:        GPL-3.0-or-later

# ПРАВИЛЬНО — учтены все компоненты
License:        GPL-3.0-or-later AND Zlib AND MIT

Проверьте понимание

  1. Чем AND отличается от OR в SPDX?
  2. Как определить лицензию проекта по его исходникам?
  3. Зачем %license вместо %doc для файлов лицензий?
  4. Почему нужно учитывать лицензии bundled-зависимостей?

Далее: Аудит лицензий проекта