'Configure --prefix = DIR && make all install' CMake eşdeğeri nedir?


386

Ben yaparım cmake . && make all install. Bu çalışır, ancak yüklenir /usr/local.

Farklı bir önek için yüklemeniz gerekir (örneğin, için /usr).

Bunun yerine yüklenecek cmakeve makekomut satırı nedir ?/usr/usr/local


1
Bu, kurulum dizinini anında değiştirmek için harika bir soru, ancak bu neden bu kadar yaygın bir ihtiyaç? Benim bakış açımdan, cevap bir komut satırı seçeneği KULLANMAYIN, bunun yerine tabanı CMakeLists.txtayarlayabilmeniz ve unutabilmeniz için tabanı düzenlemelisiniz . Kurulum dizinini anında değiştirmek için yaygın bir kullanım durumu olmadığını söylemiyorum - açıkça oy sayısına göre değerlendiriliyor - CMake için oldukça yeni ve bu sorun ortaya çıktığında merak ediyorum.
CivFan

8
@CivFan, projeyi belirli bir konuma kurmak ve yüklemek isteyen, ancak projenin geliştiricileri / sürdürücüleriyle aynı kişiler olmayan kullanıcılara hitap etmek içindir.
David Röthlisberger

4
@CivFan Bir bakımcı olarak, benim make installkurulacak her şeyin, geliştirme makinemi bozmadan doğru yere kurulduğundan emin olmak için benim geçici bir yola gitmem benim için nadir değil . Sadece bir örnek. Başka bir örnek, başka bir mimari için çapraz derleme.
Daniel

5
@CivFan: Buna ihtiyacım var çünkü bir RPM paketi oluşturmak istiyorum. Eğer değiştirmek gerekirse CMakeLists.txt, o zaman orijinal kaynağı yama gerekir. Bir komut satırı seçeneğine sahip olmak, yolları doğrudan Fedora specdosyasında almamı sağlıyor .
Martin Ueding

1
@CivFan (ve bunu okuyan diğerleri) FYI, CMakeLists.txtyalnızca yazılım oluşturuyorsanız ve yüklüyorsanız dosyayı düzenlemek kötü bir fikir olarak kabul edilir - komut satırından veya ilk önbellek dosyasından değişkenleri geçersiz kılmak / ayarlamak vb. Tercih edilen "tüketici" dir. seçenekleri ayarlama yolu.
Ryan Pavlik

Yanıtlar:


444

Komut satırında herhangi bir CMake değişkenini iletebilir veya ccmake / cmake-gui'yi kullanarak önbelleğe alınmış değişkenleri düzenleyebilirsiniz. Komut satırında,

cmake -DCMAKE_INSTALL_PREFIX: PATH = / usr. && tüm yüklemeyi yap

Projeyi yapılandırır, tüm hedefleri oluşturur ve / usr önekine yükler. (PATH) türü kesinlikle gerekli değildir, ancak Qt tabanlı cmake-gui'nin dizin seçici iletişim kutusunu göstermesine neden olur.

Yorum olarak yapılan bazı küçük eklemeler, bazıları için basit bir denklik sağlamanın yeterli olmadığını açıkça ortaya koymaktadır. En iyi uygulama harici bir derleme dizini kullanmaktır, yani doğrudan kaynak değil. Ayrıca jeneratörü soyutlayan daha genel CMake sözdizimi kullanmak için.

mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX: PATH = / usr .. && cmake --build. --target install --config Sürümü

Biraz daha uzun sürdüğünü ve artık doğrudan eşdeğer olmadığını görüyorsunuz, ancak oldukça özlü bir biçimde en iyi uygulamalara daha yakın ... --config yalnızca göz ardı edilen çoklu yapılandırma jeneratörleri (örn. MSVC) tarafından kullanılıyor. diğerleri.


21
Merak ediyorum: PATH nedir? Cmake-gui için yararlıdır ve bu değişken için widget'ı seçmeye yardımcı olur. İçinde doc Bkz linux.die.net/man/1/cmake-gui (set bölümüne)
albfan

2
CMake GUI'ye belirtildiği gibi ipuçları veriyorlar, CMake'deki her şey etkili bir dizedir, ancak PATH, FILEPATH, STRING, BOOL vb.
Marcus D. Hanwell

13
Ayrıca şunları kullanabilirsiniz: "cmake --build --target install." yapmak yerine.
RobertJMaynard

2
After / usr için nokta nedir? /usr .
bodacydo

5
@bodacydo CMakeLists.txt ile oluşturduğumuz klasörün yeri.
Kamiccolo


29

Hem CMake hem de Autotools'ta kurulum yolunu her zaman yapılandırma zamanında ayarlamanız gerekmediğini unutmayın. DESTDIR'i yükleme zamanında kullanabilirsiniz (ayrıca buraya bakın ):

make DESTDIR=<installhere> install

Ayrıca DESTDIR ve PREFIX arasındaki ince farkı açıklayan bu soruya bakın .

Bu, aşamalı yüklemeler ve programların çalıştırıldıkları yerden farklı bir yerde, örneğin /etc/alternativessembolik bağlantılar aracılığıyla depolanmasına izin vermek için tasarlanmıştır .

Paket relocatable ve yapılandırmak aşamasında üzerinden ayarlanır herhangi bir sabit kodlanmış (önek) yolları ihtiyacı yoksa Ancak, olabilir o atlamak mümkün. Yani yerine:

cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install

koşacaktın:

cmake . && make DESTDIR=/usr all install

User7498341'in belirttiği gibi, bunun gerçekten PREFIX kullanmanız gereken durumlar için uygun olmadığını unutmayın.


9
Kullanımını göstermeyi seviyorum DESTDIR. Ama aslında bu yanlış. DmakDIR değeri ile ekli “/ usr / local” kurulum önekini kullanarak ilgili yazılımı yükleyecek cmake.org cmake.org/cmake/help/v3.0/variable/CMAKE_INSTALL_PREFIX.html ... adresine başvurmalısınız. make DESTDIR=/home/john installve nihayet “/ home / john / usr / local” veriyor.
Joakim

1
Bunun çelişkili olduğunu düşünmüyorum. Paketiniz yeniden konumlandırılabilirse CMAKE_INSTALL_PREFIX'e ihtiyacınız yoktur, ya da daha doğrusu her iki yöntemi de seçebilirsiniz. Yapmazsanız, CMAKE_INSTALL_PREFIX oluşturma sırasında bir yerde pişirileceğinden.
Bruce Adams

jeneratörünüz Makefile olduğunu biliyorsanız ... cmake --build build --target install -- DESTDIR=/usrnotu tercih ederim : bu Ninja jeneratörü ile de çalışmalıdır (kurallar içeriyor gibi görünüyor $ENV{DESTDIR})
Mizux

@ CMAKE_INSTALL_PREFIX'i kullanmak istediğim kadar, bu da derlenmiş dosyalara kurulum yolunu gömdü. Olduğu gibi, sadece bir .rpm paketi inşa ediyordum, bu yüzden yapmazdım. DESTDIR, işleri inşaa etmek için bir cazibe gibi çalıştı.
Bay Redstoner

18

CMake projeleri çapraz platformunu oluşturma şeklim şudur:

/project-root> mkdir build
/project-root> cd build
/project-root/build> cmake -G "<generator>" -DCMAKE_INSTALL_PREFIX=stage ..
/project-root/build> cmake --build . --target=install --config=Release
  • İlk iki satır, kaynak dışı derleme dizini oluşturur
  • Üçüncü satır, kurulum sonucunu nereye koyacağımı belirten derleme sistemini oluşturur (her zaman yerleştirdiğimde ./project-root/build/stage- yol her zaman geçerli dizine göre mutlak değilse dikkate alınır)
  • Dördüncü satır, daha .önce satırda yapılandırılmış yapı sistemiyle yapılandırılmış projeyi oluşturur . installOluşturulmaları gerekiyorsa, tüm gerekli bağımlı hedefleri de oluşturan hedefi yürütür ve dosyaları CMAKE_INSTALL_PREFIX(bu durumda ./project-root/build/stage. isteğe bağlı --config <config>bayrak.
  • cmake --buildKomutu kullanırken iyi tarafı, farklı komutlara ihtiyaç duymadan tüm jeneratörler (makefiles ve Visual Studio) için çalışmasıdır.

Daha sonra paketleri oluşturmak veya diğer projelere dahil etmek için yüklü dosyaları kullanıyorum ...


Adım adım açıklama için teşekkürler! IMO bu tek yoldur, aksi takdirde cmake (platform bağımsızlığı) bütün noktası atılır ...
helmesjo

1
3. satıra kaynaklara (../) giden yolu eklemeyi unuttunuz mu? BTW bu kabul edilen cevap olmalıdır.
Slava

1
LIne 3 olmalıcmake -G "<generator>" -DCMAKE_INSTALL_PREFIX=stage ..
codenamezero

1
Ek bir not olarak, pragmatik olarak, insanlar make -j $(nproc), yapı iş parçacığı sayısını belirtmek için kullanır , cmake --build . --target=install --config=Release -- -j 8Makefile oluşturucu veya cmake --build . --target=install --config=Release -- /m:88 iş parçacıklı Visual Studio oluşturucu için. Aslında, herhangi bir komut satırı parametresini sonradan aktarabilirsiniz--
Cloud

1
@MrRedstoner -jcmake için bir bayrak değil, tüm bayraklar --altta yatan inşa sistemine geçiyor ...
Cloud

4

Bruce Adams cevabı hakkında:

Cevabınız tehlikeli bir karışıklık yaratıyor. DESTDIR, kök ağaçtan kurulumlar için tasarlanmıştır. DESTDIR belirtilmemişse, kök ağacına neyin yükleneceğini görmenize izin verir. PREFIX, gerçek kurulumun dayandığı temel dizindir.

Örneğin, PREFIX = / usr / local bir paketin son hedefinin / usr / local olduğunu gösterir. DESTDIR = $ HOME kullanıldığında dosyalar $ HOME kök (/) gibi yüklenecektir. DESTDIR diyelim ki / tmp / destdir, 'make install'in neyi etkileyeceğini görebilirsiniz. Bu ruhla DESTDİR asla inşa edilen nesneleri etkilememelidir.

Bunu açıklamak için bir makefile segmenti:

install:
    cp program $DESTDIR$PREFIX/bin/program

Programlar, PREFIX'in son (yani üretim) dizininin temel dizini olduğunu varsaymalıdır. DESTDIR = / bir şeye kurulmuş bir programa sembolik bağlanma olasılığı, programın PREFIX tabanlı dosyalara sadece çalışmadığı için erişmediği anlamına gelir. cat (1) (en basit haliyle) her yerden çalışabilecek bir programdır. İşte olmayacak bir örnek:

prog.pseudo.in:
    open("@prefix@/share/prog.db")
    ...

prog:
    sed -e "s/@prefix@/$PREFIX/" prog.pseudo.in > prog.pseudo
    compile prog.pseudo

install:
    cp prog $DESTDIR$PREFIX/bin/prog
    cp prog.db $DESTDIR$PREFIX/share/prog.db

Prog $ PREFIX / bin / prog dışında bir yerden çalıştırmayı denediyseniz, prog.db beklenen konumda olmadığı için asla bulunamaz.

Son olarak, / etc / alternatifleri gerçekten bu şekilde çalışmaz. Kök ağacında kurulu programlara sembolik bağlar vardır (örn. Vi -> / usr / bin / nvi, vi -> / usr / bin / vim, vb.).



2

CMakemake kullanılıyorsa gerçek jeneratörü (örneğin üzerinden ) çağırmak kötü bir uygulama olarak kabul edilir . Bunu böyle yapmanız şiddetle tavsiye edilir:

  1. Aşama yapılandır:

    cmake -Hfoo -B_builds/foo/debug -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_DEBUG_POSTFIX=d -DCMAKE_INSTALL_PREFIX=/usr
    
  2. Derleme ve Kurulum aşamaları

    cmake --build _builds/foo/debug --config Debug --target install
    

Bu yaklaşımı izlerken, jeneratöre özgü komutları hatırlamak zorunda kalmadan jeneratör kolayca değiştirilebilir (örn -GNinja. Ninja için ).


1
Kullanılan tüm argümanlara ve neden kullanıldığına dair açıklama yapılırsa cevap daha iyi olabilirdi. Özellikle, --configargümanın amacı nedir?
Dmitry Kabanov

2

CMake 3.15'ten başlayarak, bunu başarmanın doğru yolu aşağıdakileri kullanmak olacaktır:

cmake --install <dir> --prefix "/usr"

Resmi Belgeler

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.