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

ROSARIUM

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

Проверка качества и тестовая установка

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

Шаг 6: Проверка качества

rpmlint ~/rpmbuild/RPMS/x86_64/fmt-10.1.1-*.rpm
rpmlint ~/rpmbuild/RPMS/x86_64/fmt-devel-10.1.1-*.rpm

Шаг 7: Проверка содержимого пакетов

# Основной пакет:
rpm -qlp ~/rpmbuild/RPMS/x86_64/fmt-10.1.1-*.x86_64.rpm

Ожидаемый вывод:

/usr/lib64/libfmt.so.10
/usr/lib64/libfmt.so.10.1.1
/usr/share/doc/fmt/ChangeLog.md
/usr/share/doc/fmt/README.md
/usr/share/licenses/fmt/LICENSE
# -devel пакет:
rpm -qlp ~/rpmbuild/RPMS/x86_64/fmt-devel-10.1.1-*.x86_64.rpm

Ожидаемый вывод:

/usr/include/fmt/args.h
/usr/include/fmt/chrono.h
/usr/include/fmt/color.h
/usr/include/fmt/compile.h
/usr/include/fmt/core.h
/usr/include/fmt/format-inl.h
/usr/include/fmt/format.h
/usr/include/fmt/os.h
/usr/include/fmt/ostream.h
/usr/include/fmt/printf.h
/usr/include/fmt/ranges.h
/usr/include/fmt/std.h
/usr/include/fmt/xchar.h
/usr/lib64/cmake/fmt/fmt-config-version.cmake
/usr/lib64/cmake/fmt/fmt-config.cmake
/usr/lib64/cmake/fmt/fmt-targets-relwithdebinfo.cmake
/usr/lib64/cmake/fmt/fmt-targets.cmake
/usr/lib64/libfmt.so
/usr/lib64/pkgconfig/fmt.pc

Полная карта файлов

Основной пакет (fmt):
  /usr/lib64/libfmt.so.10.1.1           ← реальный бинарный файл
  /usr/lib64/libfmt.so.10               ← SONAME-ссылка

Подпакет -devel (fmt-devel):
  /usr/lib64/libfmt.so                  ← ссылка для линковщика
  /usr/include/fmt/*.h                  ← заголовочные файлы
  /usr/lib64/cmake/fmt/*.cmake          ← CMake config (для find_package)
  /usr/lib64/pkgconfig/fmt.pc           ← pkgconfig (для pkg-config)

Шаг 8: Тестовая установка и проверка

sudo dnf install ~/rpmbuild/RPMS/x86_64/fmt-10.1.1-*.x86_64.rpm \
                 ~/rpmbuild/RPMS/x86_64/fmt-devel-10.1.1-*.x86_64.rpm

Проверка через pkg-config

pkg-config --modversion fmt
# Ожидаемый вывод: 10.1.1

pkg-config --libs fmt
# Ожидаемый вывод: -lfmt

pkg-config --cflags fmt
# Ожидаемый вывод: -I/usr/include

Проверка: компиляция тестовой программы

Создайте файл test_fmt.cpp:

#include <fmt/core.h>
#include <fmt/color.h>

int main() {
    fmt::print("Hello from fmt version {}.{}.{}!\n",
               FMT_VERSION / 10000,
               FMT_VERSION / 100 % 100,
               FMT_VERSION % 100);

    fmt::print(fg(fmt::color::green), "This should be green.\n");

    std::string name = "ROSA Linux";
    fmt::print("Building packages for {}.\n", name);

    return 0;
}

Скомпилируйте и запустите:

# Способ 1: через pkg-config
g++ test_fmt.cpp $(pkg-config --cflags --libs fmt) -o test_fmt
./test_fmt

# Способ 2: напрямую
g++ test_fmt.cpp -lfmt -o test_fmt
./test_fmt

Ожидаемый вывод:

Hello from fmt version 10.1.1!
This should be green.
Building packages for ROSA Linux.

Проверка через CMake (как это делают реальные проекты)

Создайте каталог test_cmake/ с двумя файлами.

test_cmake/CMakeLists.txt:

cmake_minimum_required(VERSION 3.14)
project(test_fmt)

find_package(fmt REQUIRED)

add_executable(test_fmt main.cpp)
target_link_libraries(test_fmt fmt::fmt)

test_cmake/main.cpp:

#include <fmt/core.h>

int main() {
    fmt::print("find_package(fmt) works!\n");
    return 0;
}

Сборка и запуск:

cd test_cmake
cmake -B build
cmake --build build
./build/test_fmt

Ожидаемый вывод:

find_package(fmt) works!

Если CMake config files не были бы включены в -devel, этот тест упал бы на строке find_package(fmt REQUIRED).

Очистка

sudo dnf remove fmt fmt-devel
rm -rf test_fmt test_fmt.cpp test_cmake/