Neden her zaman ./configure; Yapmak; kurmak yapmak; 3 ayrı adım olarak?


118

Kaynaktan bir şeyi her derlediğinizde, aynı 3 adımdan geçersiniz:

$ ./configure
$ make
$ make install

Kurulum sürecini farklı adımlara bölmenin mantıklı olduğunu anlıyorum, ama anlamıyorum, neden bu gezegendeki her bir kodlayıcının tek bir işi bitirmek için aynı üç komutu tekrar tekrar yazmak zorunda kalması. Benim bakış açıma göre ./install.sh, aşağıdaki metni içeren kaynak koduyla otomatik olarak teslim edilen bir betiğe sahip olmak tamamen mantıklı olacaktır :

#!/bin/sh
./configure
make
make install

İnsanlar neden 3 adımı ayrı ayrı yapsın?


2
Derleme sistemi doğru yazıldıysa - ve genellikle öyle - ikinci adımı atlayabilirsiniz.
reinierpost

Sorunuz aptalca değil. Programınızı Linux ortamında oluşturabilir ve daha sonra bazı sanallaştırma uygulamaları ile kullanabilir veya mingw kullanarak doğrudan Windows ortamında oluşturabilirsiniz.
Mihai8

Yanıtlar:


121

Çünkü her adım farklı şeyler yapıyor

Bina için ortam hazırlayın (kurulum)

./configure

Bu komut dosyası, değiştirmeniz gereken birçok seçeneğe sahiptir. Gibi --prefixveya --with-dir=/foo. Bu, her sistemin farklı bir konfigürasyona sahip olduğu anlamına gelir. Ayrıca ./configureyüklenmesi gereken eksik kitaplıkları da denetler. Burada yanlış olan herhangi bir şey , uygulamanızı oluşturmamanıza neden olur . Bu nedenle dağıtımların farklı yerlere yüklenmiş paketleri vardır, çünkü her dağıtım belirli kitaplıkları ve dosyaları belirli dizinlere yüklemenin daha iyi olduğunu düşünür. Koşması söyleniyor ./configure, ama aslında onu her zaman değiştirmelisiniz.

Örneğin , Arch Linux paketleri sitesine bir göz atın . Burada herhangi bir paketin farklı bir configure parametresi kullandığını göreceksiniz (derleme sistemi için autotools kullandıklarını varsayın).

Sistemi kurmak

make

Bu aslında make allvarsayılan olarak. Ve her markanın yapacak farklı eylemleri vardır. Bazıları derleme yapar, bazıları oluşturduktan sonra testler yapar, bazıları ise harici SCM havuzlarından kullanıma alır. Genellikle herhangi bir parametre vermeniz gerekmez, ancak yine bazı paketler onları farklı şekilde çalıştırır.

Sisteme yükleyin

make install

Bu, paketi configure ile belirtilen yere yükler. İsterseniz ./configure, ana dizininize işaret etmeyi belirtebilirsiniz . Ancak, birçok yapılandırma seçeneği /usrveya işaretini gösteriyor /usr/local. Bu, o zaman gerçekten kullanmanız gerektiği anlamına gelir sudo make installçünkü yalnızca root dosyaları / usr ve / usr / local dizinlerine kopyalayabilir.


Artık her adımın bir sonraki adım için bir ön gereklilik olduğunu görüyorsunuz. Her adım, işlerin sorunsuz bir akış içinde yürümesi için bir hazırlıktır. Dağıtımcılar bu metaforu paketler (RPM, deb vb. Gibi) oluşturmak için kullanır.

Burada her adımın aslında farklı bir durum olduğunu göreceksiniz. Bu nedenle paket yöneticilerinin farklı sarmalayıcıları vardır. Aşağıda, tüm paketi tek adımda oluşturmanıza izin veren bir sarmalayıcı örneği bulunmaktadır. Ancak her uygulamanın farklı bir sarmalayıcıya sahip olduğunu unutmayın (aslında bu sarmalayıcıların spec, PKGBUILD, vb. Gibi bir adı vardır):

def setup:
... #use ./configure if autotools is used

def build:
... #use make if autotools is used

def install:
... #use make all if autotools is used

Burada bir tane, aracı autotools kullanabilir ./configure, makeve make install. Ancak bir diğeri SCons, Python ile ilgili kurulum veya farklı bir şey kullanabilir.

Gördüğünüz gibi her durumu bölmek, özellikle paket bakımcıları ve dağıtımlar için bakım ve dağıtım için işleri çok daha kolaylaştırır.


23
Bunu yaklaşık bir yıl sonra tekrar okuduktan sonra, her şeyin mantıklı olduğunu ve yine de varsayılan yapılandırmalarıyla 3 adımı da gerçekleştiren tek bir komut çağrısı olabileceğini eklemeliyim. Hepsinin varsayılan bir yapılandırması vardır, aksi takdirde onları bağımsız değişkenler olmadan arayamazsınız.
erikbwork

Bazen yapmadan kurulum yapabiliyorum. Ne anlama geliyor? Make'i atlarsam, sadece make install yapabilir miyim?
CMCDragonkai

3
installbağlıdır allbu nedenle make installarayacakmake all

mükemmel yanıt, ancak neden bazen bir make yüklemesinin gerekli olduğunu ve diğer zamanlarda neden hayır olduğunu anlamıyorum (tek bir
yapım

make installsadece önceden tanımlanmış konuma çeşitli kaynaklar yükleyin. Yalnızca çalıştırılabilir dosya ile ilgileniyorsanız, çalıştırılabilir dosyayı yapı dizininden kullanabilir ve PATH'inize yapı dizini ekleyebilirsiniz.
jdhao

31

Birincisi, ./configure && make && make installher biri birincisinin başarısına bağlı olduğu için olmalıdır . Sebebin bir kısmı evrimdir ve bunun bir kısmı da geliştirme iş akışı için kolaylıktır.

Başlangıçta, çoğu Makefiles yalnızca bir programı derlemek için komutları içerirdi ve kurulum kullanıcıya bırakılırdı. Ekstra bir kural make install, derlenen çıktının doğru olabilecek bir yere yerleştirilmesine izin verir ; Sistem yöneticisi olmamak, hiç kurmak istememek dahil, bunu yapmak istemeyebilmeniz için hala birçok iyi neden var. Dahası, eğer yazılımı geliştiriyorsam, muhtemelen yüklemek istemiyorum. Bazı değişiklikler yapmak ve dizinimde bulunan sürümü test etmek istiyorum. Etrafta birden fazla versiyonum olacaksa, bu daha da belirgin hale geliyor.

./configureOrtamda neyin mevcut olduğunu ve / veya yazılımın nasıl oluşturulacağını belirlemek için kullanıcı tarafından arzu edildiğini gider ve algılar. Bu, çok sık değişmesi gereken bir şey değildir ve çoğu zaman biraz zaman alabilir. Yine, eğer bir geliştiriciysem, sürekli olarak yeniden yapılandırmaya zaman ayırmaya değmez. Daha da önemlisi, makemodülleri yeniden oluşturmak için zaman damgaları kullandığından, yeniden çalıştırırsam configurebayrakların değişme olasılığı vardır ve şimdi yapımdaki bazı bileşenlerin bir dizi bayrakla ve diğerlerinin de yol açabilecek farklı bir bayrak kümesiyle derlenmesi farklı, uyumsuz davranış. Yeniden çalıştırmadığım sürece, configurekaynaklarımı değiştirsem bile derleme ortamımın aynı kaldığını biliyorum. Yeniden yayınlarsam configure, yapmalıyımmake clean ilk olarak, nesnelerin tek tip olarak inşa edilmesini sağlamak için herhangi bir yerleşik kaynağı kaldırmak.

Üç komutun arka arkaya çalıştırıldığı tek durum, kullanıcıların programı kurması veya bir paketin oluşturulmasıdır (örn. Debian'ın debuild veya RedHat'ın rpmbuild'i). Ve bu, pakete düz bir şekilde verilebileceğini varsayar configure, ki bu genellikle paketleme için geçerli değildir, en azından --prefix=/usrarzu edilirse. Ve pacakgers, rolü yaparken sahte köklerle uğraşmak zorunda kalırlar make install. Pek çok istisna olduğu için ./configure && make && make install, kural koymak, bunu çok daha sık yapan pek çok insan için sakıncalı olacaktır!


2
İle tavsiye için teşekkürler &&!
erikbwork

4

İlk olarak ./configure her zaman ihtiyaç duyduğu her şeyi bulmaz veya diğer durumlarda ihtiyaç duyduğu her şeyi bulur ama kullanabileceği her şeyi bulamaz. Bu durumda, onu bilmek istersiniz (ve ./install.sh betiğiniz yine de başarısız olur!) Benim bakış açıma göre, istenmeyen sonuçlarla başarısız olmamanın klasik örneği, ffmpeg veya mplayer gibi büyük uygulamaları derlemektir. Bunlar, eğer mevcutlarsa kitaplıkları kullanacaklar, ancak olmasalar bile, bazı seçenekleri devre dışı bırakarak, yine de derleyecekler. Sorun şu ki, daha sonra herhangi bir format için destek olmadan derlendiğini keşfediyorsunuz, bu nedenle geri dönüp yeniden yapmanız gerekiyor.

./Configure'ın biraz etkileşimli olarak yaptığı başka bir şey de size uygulamanın sistemin neresinde kurulacağını özelleştirme seçeneği sunmaktır. Farklı dağıtımların / ortamların farklı kuralları vardır ve muhtemelen sisteminizin kurallarına bağlı kalmak isteyebilirsiniz. Ayrıca, yerel olarak da yüklemek isteyebilirsiniz (yalnızca kendiniz için). Geleneksel olarak ./configure ve make adımları kök olarak çalıştırılmazken, make install (yalnızca kendiniz için kurulmadıkça) kök olarak çalıştırılmalıdır.

Belirli dağıtımlar genellikle bu ./install.sh işlevselliğini dağıtıma duyarlı bir şekilde gerçekleştiren komut dosyaları sağlar - örneğin, kaynak RPM'ler + özellik dosyası + rpmbuild veya slackbuild'ler .

(Dipnot: Buna katılıyorum ./configure; make; make install; son derece sıkıcı olabilir.)


Hepsi anlaşılabilir, ancak benim gözümde, üç adımı birleştiren ek bir dosyanız varsa, bu olasılıkların hiçbiri yok olmaz. Örneğin, bazı yapılandırılmış stdout'u okumak istiyorsanız, bunun için hala grep yapabilir veya tüm stdout'u bir dosyaya koyabilir ve daha sonra okuyabilirsiniz.
erikbwork

3
Doğru, ama öyleyse neden bir dosya gerekli? Sadece bir takma ad kullanın ('confmakeins'den daha iyi / daha kısa bir isim düşünmeniz gerekse de, bugün ilham almadım!). takma ad confmakeins = '. / configure && make && sudo make install'; cd kaynak dizini; confmakeins;
Söz

Kulağa iyi geliyor. Ben de hiç takma ad yazmadım, bu yüzden bunu düşünmedim!
erikbwork

3

configure bağımlılıkların eksik olduğunu tespit ederse başarısız olabilir.

makeMakefile'da listelenen ilk hedef olan varsayılan bir hedefi çalıştırır. Genellikle bu hedef all, ancak her zaman değil. Yani make all installhedefin o olduğunu bilseydin yapabilirdin.

Yani ...

#!/bin/sh

if ./configure $*; then
  if make; then
    make install
  fi
fi

veya:

./configure $* && ./make && ./make install

Bu $*dahildir, çünkü çoğu zaman seçenekler sunmak zorundadır configure.

Ama neden insanların bunu kendilerinin yapmasına izin vermiyorsunuz? Bu gerçekten çok büyük bir kazanç mı?


1
Ölümcül derecede önemli değil, ama bizim programcıların ne yaptığıyla ilgili: bilgisayarın bizim için tekrar eden görevleri yapmasını sağlamak. Sağ?
erikbwork

1
Pekala ... configurebir tür Make eklentisi olan GNU Automake araç setinin bir parçasıdır. Make uzun yıllardır buralarda ve işini iyi yapıyor. Bununla birlikte, insanlar yapım sürecini idare etmenin başka yollarını buldular. Ant ve cmake'ın takipçileri var. Ancak, oluşturma işleminin bölümleri (yapılandırma, oluşturma ve yükleme gibi) yine de ayrı komutlardır.
ghoti
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.