Puncte:1

Poate un pachet .deb să includă surse care urmează să fie compilate de dpkg?

drapel us

Am un pachet cu ceva cod C++. În prezent, compilez o parte din codul c++ ca binar, altele ca bibliotecă și îl pot livra și implementa pe alte platforme.

Cu toate acestea, am și un driver acolo, pe care nu îl pot compila încrucișat din cauza dependenței sale de nucleu, ceea ce face ca fiecare nucleu să aibă nevoie de un binar diferit.

Deci, ceea ce vreau să am este un .deb unde voi stoca binarul sub /usr/bin (terminat), biblioteca sub /usr/lib (de asemenea, făcut) și codul sursă al driverului sub /opt/driver (presupun că ... Este acesta un loc legitim pentru asta?)

Împachetarea aceasta este partea ușoară, deoarece tot ce trebuie să fac este să o pun în spațiul meu de lucru și să sun dpkg-deb. Ceea ce nu sunt sigur sunt două lucruri

  1. Este legitim să împachetați codul sursă într-un .deb? (În terminologia python - este .deb un bdist (distribuție binară) sau poate fi, de asemenea, un sdist (distribuție sursă))
  2. Dacă este legitim, cum pot invoca comenzile make? Poate sa dpkg / apt sa faci asta pentru mine? Sau trebuie să fug dpkg -i pkg și apoi fugi face? [uitandu-ma la postinst dar nu sunt sigur dacă aceasta este calea corectă]

Sunt deschis la orice tip de sistem de construcție dacă poate rezolva acest lucru, deși în prezent folosesc cmake și aș prefera să rămân la el


POC-ul meu:

arbore bla_x86_64
bla_x86_64
âââ DEBIAN
â  âââ control
â  âââ postinst
âââ opt
â  âââ bla.cpp
âââ usr
    âââ coș
    â  âââ bla.bin
    âââ lib
        âââ bla.lib
cat bla_x86_64/DEBIAN/postinst 
#!/bin/sh

set -e

ecou salut lume!
echo compilare $(ls /opt/bla.cpp)
curățarea ecoului
rm -rvf /opt/bla.cpp
$ dpkg-deb --build --root-owner-group bla_x86_64/
dpkg-deb: construirea pachetului „bla” în „bla_x86_64.deb”.
$ sudo dpkg -i bla_x86_64.deb 
(Se citesc baza de date... 407519 fișiere și directoare instalate în prezent.)
Se pregătește despachetarea bla_x86_64.deb...
Despachetarea bla (4.0) peste (3.0)...
Configurarea bla (4.0)...
Salut Lume!
compilarea /opt/bla.cpp
curăță
eliminat „/opt/bla.cpp”
drapel ru
`dpkg` nu controlează nimic. Dacă utilizați corect DKMS, nu aveți nevoie de o comandă „make” în nicio parte în fișierul Debian. DKMS va compila automat lucrurile acolo unde trebuie - nu ar trebui să aveți nicăieri comenzi speciale `make`.
CIsForCookies avatar
drapel us
@ThomasWard Voi avea nevoie de comanda `dkms` totuși, nu-i așa? Deci, încă mă întreb dacă acest lucru este permis și, dacă da, există cineva care a făcut-o deja (am folosit `make` în întrebarea mea în loc de `dkms` pentru a simplifica, dar cred că doar a complicat lucrurile. ..)
Puncte:2
drapel cn

Din punct de vedere tehnic, nu există conținut „legitim” sau „ilegitim” al unui fișier .deb. Puteți împacheta orice doriți în el.

Un loc bun unde să vă puneți codul sursă pe sistemul țintă ar fi sub /usr/share/${packagename}.

A avea dpkg sau apt invocați comenzile make, plasați-le în pachetul dvs postinst scenariu. Asigurați-vă că declarați ca dependențe toate programele necesare procesului de construire, cum ar fi cmake, g++ și binutils, precum și antetele nucleului, altfel instalarea va eșua pe sistemele care nu au nici un compilator instalat. De asemenea, asigurați-vă că gestionați corect erorile în dvs postinst script pentru a evita redarea sistemului țintă neoperațional prin instalarea unui modul kernel prost ca urmare a unei compilări eșuate.

Rețineți că acest lucru rezolvă doar jumătate din problema dvs. Pe lângă compilarea driverului pentru nucleul utilizat atunci când pachetul este instalat, trebuie să vă asigurați că este recompilat pentru noul nucleu după fiecare actualizare a nucleului. Soluția pentru aceasta este DKMS, prescurtare pentru Dynamic Kernel Module Support. Așa că veți dori să analizați și compatibilitatea DKMS în pachetul dvs. .deb.

CIsForCookies avatar
drapel us
Se întâmplă să știți de pachete care fac așa ceva? (adică apelarea make / dkms de la postinst). Încerc să găsesc tipi care au făcut asta înaintea mea și să învăț de la ei
Tilman avatar
drapel cn
Nu de la îndemână. Dacă aș vrea să găsesc unul, probabil că m-aș uita la pachetele Linux de la producătorii de hardware care întrețin drivere în afara arborelui. Îmi vin în minte adaptoarele grafice.
CIsForCookies avatar
drapel us
l-am gasit. Nvidia interacționează cu dkms în scriptul lor postinst
CIsForCookies avatar
drapel us
Știți dacă un astfel de `.deb` (adică numai surse) ar trebui să aibă un `arch` special? Ar trebui să fie independent de arc, dar nu sunt sigur dacă acest lucru este posibil
Tilman avatar
drapel cn
Puteți seta `Arhitecture` la `all` pentru a indica un pachet independent de arhitectură. O abordare diferită, dacă pachetul dvs. conține într-adevăr _doar_ surse, ar fi să îl transformați într-un pachet sursă.
CIsForCookies avatar
drapel us
Nu sunt sigur. Sursele din pachet ar trebui să fie compilate într-un driver. Am citit despre pachetele sursă în https://wiki.debian.org/Packaging/SourcePackage, dar cred că, deoarece [citat] „Sursele sunt în mod normal **nu** instalate”, un pachet binar este cel mai bine - va conține sursele + comanda make din `postinst` și instalarea pachetului va `crea` sursele. Tu ce crezi?
Tilman avatar
drapel cn
Dacă vă gândiți să faceți din acesta un pachet sursă, ar trebui să citiți despre sistemul de compilare a pachetului deb. Acest lucru va clarifica și sensul propoziției pe care o citați. În caz contrar, rămâneți cu „Arhitectură: toate”.
CIsForCookies avatar
drapel us
Poți partaja un link? Am găsit o mulțime de date, dar niciuna nu pare ceea ce căutam
Tilman avatar
drapel cn
Vă sugerez să începeți de la https://wiki.debian.org/Packaging/Intro și să vă urcați de acolo.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.