Проблемы с созданием RPM-пакетов в Red Hat Enterprise Linux

Проблемы с созданием RPM-пакетов в Red Hat Enterprise Linux

Я пытаюсь создать пакет RPM с некоторыми базовыми примерами файлов C и C++, прежде чем попытаться создать пакет с помощью программного обеспечения на моей работе, работающего на Red Hat Enterprise Linux 6, но при этом возникают проблемы.

Вот мой пример программы на языке C:

// main.c - file for testing rpm packages
#include <stdio.h>

void functionone() {
    printf("C function one!\n\n");
}

void functiontwo() {
    printf("C function two!\n\n");
}

int main()
{
    printf("\nBegin...\n\n");

    functionone();
    functiontwo();

    printf("End...\n\n");

    return 0;
}

А вот makefile, который я использую:

all: main

c: main

main:
    gcc main.c -o c

clean:
    rm c

Программа на языке C и makefile Я создаю zip-файл с именем «c.tar.gz»

А вот файл спецификации, который я пытаюсь использовать:

Name:           c
Version:        0.1
Release:        1
Summary:        Example C application for testing rpm packaging

License: GPLv3        
URL: https://example.com/%{name}           
Source0: c.tar.gz

BuildRequires: make      

%description
Example C program for rpm package

%prep
%setup -q

%build
make

%install
%make_install

%files
SOURCES/main.c
SOURCES/makefile
SOURCES/c

 %changelog
 * Mon Mar 9 2020 Michael G. Workman <[email protected]>
 - first c program package

Затем я ввожу следующую команду в каталог SPECS:

rpmbuild -ba c.spec

Затем я получаю следующий вывод этой команды:

+ umask 022
+ cd /net/users/mworkman/rpm/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ cd /net/users/mworkman/rpm/BUILD
+ rm -rf c-0.1
+ /usr/bin/gzip -dc /net/users/mworkman/rpm/SOURCES/c.tar.gz
+ /bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd c-0.1
/net/users/mworkman/rpm/tmp/rpm-tmp.Lhyj19: line 38: no such file or directory
error: Bad exit status from /net/users/mworkman/rpm/tmp/rpm-tmp.Lhyj19 (%prep)
   Bad exit status from /net/users/mworkman/rpm/tmp/rpm-tmp.Lhyj19 (%prep)

Теперь, глядя на этот вывод, похоже, что он удаляет c-0.1 и его содержимое, а затем пытается перейти в него с помощью cd после удаления, поэтому я не уверен, почему он это делает: либо папка c-0.1 вообще не создается, либо она создается, а затем удаляется.

Однако когда я запускаю эту команду в командной строке для создания файла RPM, ошибки не возникает:

rpm -bs c.spec

вывод этой команды:

Wrote: /net/users/mworkman/rpm/SRPMS/c-0.1-1.src.rpm

Затем выполните эту команду в командной строке из каталога rpm/SRPMS:

rpm -ivh c-0.1-1.src.rpm

И затем получите такой вывод:

1:c             ################################ [100%]

Однако я не могу найти исполняемый файл с именем c после запуска этой операции, я пытаюсь установить пример программы как простую программу на C, затем скомпилировать файл main.c в исполняемый файл, но это, похоже, не работает как пакет rpm, однако программа C прекрасно компилируется при запуске make непосредственно на файле main.c и правильно создает исполняемый файл, но я не могу сделать это с пакетом rpm. Я думаю, что я упускаю что-то действительно простое. Спасибо за помощь.

решение1

Ваша первая ошибка в том, что %setupожидает некоторую структуру. Вы можете либо изменить способ создания tarball (см.https://rpm-packaging-guide.github.io/#подготовка-исходного-кода-для-упаковки) или изменить поведение %setup с помощью аргументов (см.http://ftp.rpm.org/max-rpm/s1-rpm-inside-macros.html).

В вашей же части вы создалиисточникpackage. Который содержит только spec и tarball (попробуйте запустить rpm -qpl /net/users/mworkman/rpm/SRPMS/c-0.1-1.src.rpm). It get installed intoкаталог ~/rpmbuild/`, и он не будет отслеживаться в rpmdb.

Связанный контент