Makefiles'ın neden "yükleme" hedefi olması gerekir?


18

C ve C ++ dünyasından gelen çoğu yapı sisteminin bir installhedefi vardır, özellikle Makefiles ( örneğin GNU tarafından tavsiye edilir ) veya CMake . Bu hedef, işletim sisteminde çalışma zamanı dosyalarını (yürütülebilir dosyalar, kitaplıklar, ...) kopyalar (örneğin, C:\Program Files\Windows'ta).

Bu gerçekten çılgınca hissediyor, çünkü benim için programları kurmak , aslında işletim sisteminin / paket yöneticisinin sorumluluğu olan derleme sisteminin sorumluluğu değil . Ayrıca, derleme sistemi veya derleme betiği yüklü değişkenlerin ortam değişkenleri, kayıt defteri değişkenleri, sembolik bağlantılar, izinler vb.

En iyi durumda, derleme sistemleri releaseyüklenebilir bir program (örneğin .debveya .msi) çıkaracak bir hedefe sahip olmalı ve işletim sisteminden bu programı yüklemesini rica etmelidir. Ayrıca kullanıcının yazmak zorunda kalmadan kaldırmasına da izin verir make uninstall.

Öyleyse sorum: Yapı sistemi neden genellikle bir installhedefe sahip olmayı öneriyor ?


7
"Kurulum yap" ın bir derleme sisteminin sorumluluğu altında olmadığını, ancak kurulabilir bir paket oluşturma konusunda çok daha ilgili ve platforma özgü sorumluluğunu taşıdığınızı savunuyorsunuz.
pmf

2
Neyse: bazen bir uygulamayı yüklemek istediğiniz değil (ki paket yöneticisi vb kullanarak çözmek imkansız çakışmasına neden olur bağımlılıkları sahip olduğundan) OS / paket yöneticisi tarafından ele. make installgenellikle "çekirdek işletim sistemi / paket yönetim sistemi" tarafından ele alınmayan dizinler /usr/local(hatta çiftler) altına kurulur /opt. Windows'un benzer bir konvansiyona sahip olup olmadığı hakkında hiçbir fikrim yok.
Kasım'da Bakuriu

11
"Bu gerçekten acayip geliyor." Peki, C / C ++ dünyasından ne bekliyordunuz? ;-)
Mason Wheeler

1
make installÇapraz derleme hakkında konuştuğumuzda bunun mantıklı olmadığını unutmayın
Hagen von Eitzen

1
@HagenvonEitzen ile yapıyor DESTDIR.
Nax 'vi-vim-nvim'

Yanıtlar:


23

Pek çok derleme komut dosyası veya Makefile'ın bir yükleme hedefi vardır çünkü paket yöneticileri var olmadan önce oluşturulmuştur ve bugün bile birçok sistemde paket yöneticisi yoktur. Artı, sistemler vardır make installaslında olan paketlerin yönetimini tercih edilen yolu.


make installTercih edilen sistemleri merak ediyorum . Bunun dışında, makefiles yüklenebilir paketleri oluşturmak gerektiğini söylediğimde program yöneticisi demek istedim. Sanırım neredeyse tüm işletim sistemleri yüklü programları yönetmenin bir yolu ile geliyor? Örneğin, Windows'un paket yöneticisi yoktur (mağaza dışında), ancak yüklü programları yönetmenin bir yolu vardır ( .msiörnekler için paketler aracılığıyla )
Synxis

2
@Synxis BSD, Linux, Unix hepsi makefiles kullanıyor. Bunları kurulum için kullanmanın tercih edilip edilmediğini bilmiyorum, ancak sıklıkla bu yeteneğe sahipsiniz make install.
Rob

1
Debian olarak en azından kullanmayı tercih ediyor checkinstallüzerinde make installiki nedenden dolayı: "Kolayca bir adımla paketi çıkarması" ve "Ortaya çıkan paketi birden çok makineye kurabilirsiniz." - checkinstall bir .deb oluşturup yüklediğinden, paket yöneticisini kullanır ...
Aaron Hall

1
@Synxis - Paket yöneticisinin tar dosyasını indirerek programları yüklediği, sıkıştırmasını make install
açıp

1
@AaronHall Yanlışsam beni düzeltin, ancak bir checkinstallçağrının aslında paket oluşturma için eylemlerini kullanacağı make install ve izleyeceği izlenimine kapıldım .
cmaster - eski haline monica

5

Bir hedef makefileolmayabilir installve daha da önemlisi, kurulabilir olması gerekmeyen programlara sahip olabilirsiniz (örn. Derleme dizinlerinden çalıştırılmaları veya herhangi bir yere yüklenebilmeleri nedeniyle). installHedef sadece bir kongre zamanki için makefile-s.

Ancak, birçok programın çalıştırılması için harici kaynaklar gerekir (örneğin: yazı tipleri, veritabanları, yapılandırma dosyaları, vb.). Ve yürütülebilirleri genellikle bu kaynaklar hakkında bazı hipotezler yapar. Örneğin, bashkabuk genellikle bazı başlatma dosyası okurdum /etc/bash.bashrcvs .... Bu kaynaklar dosya sisteminde genellikle (bkz hier (7) için sözleşmeler dosya hiyerarşisi hakkında) ve varsayılan dosya yolu sizin yürütülebilir inşa edilmiştir.

Sisteminizin çoğu yürütülebilir dosyasında dizeleri (1) kullanmaya çalışın . Hangi dosya yollarının bilindiğini öğreneceksiniz.

BTW, kullanan birçok GNU programı için root olmadan autoconfçalışabilirsiniz make install DESTDIR=/tmp/destdir/. Sonra /tmp/destdir/daha sonra paketlenmesi gereken dosyalar ile doldurulur.

FWIW, bismon (GPLv3 + lisanslı) programımın ( bismon-chariot-doc.pdf raporumda açıklandığı gibi ) “kurulamayacağına” inanıyorum; Bunu kanıtlayamayacağımdan emin değilim ve bu programı nasıl yüklenebilir hale getirebileceğimi hayal bile edemiyorum.


2
DESTDIR veya diğer önekler çok sık unutulur. En kısa sürede bu tür dinamik kütüphaneleri gibi dış kaynakların dahil olduğu sürece sadece mümkün değildir inşa o olacak nereye bilmeden yazılım yüklü . Ayrıca standart olmayan yerlere, örneğin /optveya içine kurulum için de harikadır $HOME. Farklı öneklerden kaçınmanın tek yolu kapsayıcı kullanmaktır, ancak bu elbette Linux'a özgü bir çözümdür.
amon

2
Birden fazla paket gördüm ki DESTDIR = / tmp / destdir denediyseniz, DESTDIR yol oluşturmada kullanıldığından normal yere kurulduktan sonra çalışmaz.
Joshua

@ amon: Kapsayıcıları Linux'a özgü olarak tanımlayacağımdan emin değilim. Linux konteynerizasyon için ortak bir hedef platform olabilir, ancak çoğu modern işletim sisteminde bir çeşit konteyner teknolojisi vardır.
Kevin

1
@Joshua Bu olmamalı, DESTDIR sadece kurulum aşamasında alakalı olmalıdır. Yapabilmeniz gerekir: ./configure --prefix="/opt/foo" && make && DESTDIR=/tmp/foo make install ve /opt/fooherhangi bir sorun olmadan paketi yeniden konumlandırabilirsiniz .
Nax 'vi-vim-nvim'

3

Akla gelen birkaç neden var.

  • Birçok paket oluşturma yazılımı - örneğin Debian derleme sistemi ve IIRC rpm - zaten bina komut dosyasından programı bazı özel alt dizinlere "kurmayı" bekler. Bu nedenle her iki yönde geriye dönük uyumluluk tarafından yönlendirilir.
  • Bir kullanıcı yazılımı $HOMEdizinde olduğu gibi yerel bir alana yüklemek isteyebilir . Tüm paket yöneticileri desteklemez.
  • Yine de paketi olmayan ortamlar olabilir.

Soruyu biraz yeniden yazdım, makefiles'in yüklenebilir paketler oluşturması gerektiğini söylediğimde program yöneticisi demek istedim.
Synxis

1

Bahsetmediğiniz nedenlerden biri, yazılımın geçerli sürümünü veya yazılımın değiştirilmiş bir sürümünü kullanmamanızdır. Özel bir paket oluşturmaya çalışmak sadece daha fazla iş değil, aynı zamanda oluşturulmuş ve dağıtılmış paketlerle çakışabilir. Açık kaynak kodunda, özellikle kullanmakta olduğunuz gelecekteki sürümlerde değişiklikler kırılırsa bu çok fazla olur.

Diyelim ki şu anda 2.0.1 sürümünde olan açık kaynak kodlu FOO projesini ve 1.3.0 sürümünü kullanıyorsunuz. Bunun üzerinde hiçbir şey kullanmak istemezsiniz, çünkü 2.0.0 sürümü şu anda yaptığınız şeyle uyumsuzdur, ancak 2.0.1'de umutsuzca ihtiyacınız olan tek bir hata düzeltmesi vardır. Seçeneğe sahip olmak, make installdeğiştirilmiş 1.3.0 yazılımını bir paket oluşturmak ve sisteminize kurmak zorunda kalmadan kurmanıza izin verir.


1

Linux dağıtımları genellikle program bakımını paket bakımından ayırır. Paket üretimini entegre eden bir derleme sistemi, program sahiplerini de paket bakımını yapmaya zorlar.

Bu genellikle kötü bir fikirdir. Dağıtımlar, iç tutarlılığı doğrulamak, birden fazla hedef platform için ikili dosyalar sağlamak, sistemin geri kalanıyla daha iyi bütünleşmek için küçük değişiklikler yapmak ve hataları bildiren kullanıcılara tutarlı bir deneyim sağlamak için birçok altyapıya sahiptir.

Paketleri doğrudan bir derleme sisteminden oluşturmak için, tüm bu altyapıyı entegre etmeniz veya atlamanız gerekir. Entegre edilmesi, şüpheli yarar için çok fazla iş olurdu ve onu atlamak daha kötü bir kullanıcı deneyimi sağlayacaktır.

Bu, çok partili sistemlerde tipik olan "besin zincirinin tepesi" sorunlarından biridir. Birden fazla karmaşık sisteminiz varsa, diğer sistemin koordinasyonundan hangi sistemin sorumlu olduğu net bir hiyerarşisi olmalıdır.

Yazılım yükleme yönetimi durumunda, paket yöneticisi bu bileşendir ve paketin derleme sistemini çalıştırır, ardından çıktıyı uygun bir arabirimden ("yükleme adımından sonra bir dizindeki dosyalar") alır, bir paket oluşturur ve hazırlar bir depoya yüklemek için.

Paket yöneticisi, burada yapı sistemi ile depo arasında ortada durur ve her ikisiyle de bütünleşecek en iyi konumdadır.

Orada JavaScript sadece birkaçıdır aracılığıyla kullanılabilir paketler fark etmiş olabilirsiniz npmaracılığıyla da kullanılabilir aptbu JavaScript insanlar olduğuna karar esas nedeni - npmve ilişkili depo imkansız yakın yaptım onların besin zincirinin en üst olacaktı bu paketleri Debian paketleri olarak gönderir.

Debian Developer şapkamla: açık kaynaklı yazılım çıkarırsanız, lütfen ambalajı dağıtım koruyucularına bırakın. Hem sizi hem de işimizi çok kurtarır.


Neden bir kurulum hedefi olduğu hakkında hiçbir şey söylemediniz ve bana yazdığınız şeylerin çoğunun da buna uygulanacağı anlaşılıyor ...
curiousdannii

1
@curiousdannii, derleme sistemi ve paket yöneticisi arasında bazı arayüzler olması gerekir ve bu en basit olanı olur, bu yüzden kazandı.
Simon Richter

1

Uygulama geliştiricileri, her dosyanın nereye gitmesi gerektiğini bilenlerdir. Bunu belgelerde bırakabilirler ve paket yöneticilerinin bunu okumasını ve her paket için bir komut dosyası oluşturmasını sağlayabilirler. Belki paket sahipleri belgeleri yanlış yorumlayacak ve çalışana kadar kodda hata ayıklamak zorunda kalacaklar. Bu verimsiz. Uygulama geliştiricisinin yazdığı uygulamayı düzgün bir şekilde yüklemek için bir komut dosyası yazması daha iyidir.

Rasgele bir adla bir kurulum komut dosyası yazabilir veya belki de başka bir komut dosyasının prosedürünün bir parçası olabilir. Bununla birlikte, standart bir yükleme komutuna make install(paket yöneticilerinden önce gelen bir kural) sahip olmak, paketleri yapmak gerçekten kolay hale gelir. Archlinux paketleri yapmak için PKGBUILD şablonuna bakarsanız, aslında paketleyen işlevin sadece bir işlev gördüğünü görebilirsiniz make DESTDIR="$pkgdir/" install. Bu muhtemelen paketlerin çoğu için ve muhtemelen biraz değişiklikle işe yarar. Sayesinde make(ve Autotools) olmak standardı, ambalajlama gerçekten kolay, gerçekten.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.