CMakeで「configure --prefix = DIR && make all install」に相当するものは何ですか?


386

しますcmake . && make all install。これは機能しますが、にインストールされ/usr/localます。

別のプレフィックス(たとえば/usr)にインストールする必要があります。

何がcmakemakeにインストールするコマンドライン/usrの代わりには/usr/local


1
これは、インストールディレクトリをオンザフライで変更するのに最適な質問ですが、なぜこれが明らかに一般的なニーズなのでしょうか。私の観点からは、答えはコマンドラインオプションを使用しCMakeLists.txtないでください。代わりにベースを編集して、設定して忘れることができます。オンザフライでインストールディレクトリを変更する一般的な使用例がないとは言っていません-明らかに投票数で判断します-私はCMakeにかなり慣れていないので、この問題が発生したときは気になります。
CivFan

8
@CivFanは、プロジェクトをビルドして特定の場所にインストールしたいが、プロジェクトの開発者/保守者とは異なるユーザーに対応するためのものです。
DavidRöthlisberger2016年

4
@CivFanメンテナとして、make installインストールする必要のあるすべてのものを確認するために一時的なパスに自分をテストして、開発マシンを台無しにすることなく正しい場所にインストールされることは珍しくありません。ほんの一例。別のケースは、別のアーキテクチャ用のクロスコンパイルです。
Daniel

5
@CivFan:RPMパッケージをビルドしたいので、これが必要です。を変更する必要がある場合はCMakeLists.txt、元のソースにパッチを適用する必要があります。コマンドラインオプションがあるだけで、Fedora specファイルのパスを正しく取得できます。
Martin Ueding、2016年

1
@CivFan(およびこれを読んでいる他の人)参考までに、CMakeLists.txtソフトウェアをビルドしてインストールしているだけの場合は、ファイルを編集することは一般に悪い考えと考えられます。コマンドラインや初期キャッシュファイルなどから変数を上書き/設定することをお勧めします。オプションの設定方法。
Ryan Pavlik

回答:


444

コマンドラインで任意のCMake変数を渡すか、ccmake / cmake-guiを使用してキャッシュされた変数を編集できます。コマンドラインで、

cmake -DCMAKE_INSTALL_PREFIX:PATH = / usr。&&すべてインストールする

プロジェクトを構成し、すべてのターゲットをビルドして、/ usrプレフィックスにインストールします。タイプ(PATH)は厳密には必要ありませんが、Qtベースのcmake-guiにディレクトリ選択ダイアログを表示させます。

コメントとしてのいくつかのマイナーな追加は、単純な等価を提供するだけでは十分でないことを明らかにしています。ベストプラクティスは、ソースではなく外部ビルドディレクトリを使用することです。また、ジェネレータを抽象化するより一般的なCMake構文を使用します。

mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX:PATH = / usr .. && cmake --build。--target install --config Release

かなり長くなり、直接同等ではなくなりましたが、かなり簡潔な形式でベストプラクティスに近づいています... --configは、マルチ構成ジェネレーター(つまり、MSVC)によってのみ使用され、無視されます他人による。


21
:PATHとは何ですか?cmake-guiに役立ち、その変数のウィジェットを選択するのに役立ちます。linux.die.net/man/1/cmake-guiのドキュメントを参照してください(設定セクション)
albfan

2
前述のように、CMake GUIにヒントを提供します。CMakeのすべては事実上文字列ですが、PATH、FILEPATH、STRING、BOOLなどの設定はGUIがより適切なウィジェットを表示するのに役立ちます。
マーカスD.ハンウェル2013年

13
「cmake --build --target install」を使用することもできます。作る代わりに。
RobertJMaynard、2013

2
/ usrの後のドットは何ですか?/usr .
bodacydo 2014年

5
@bodacydo生成元のCMakeLists.txtがあるフォルダーの場所。
Kamiccolo 2014


29

CMakeとAutotoolsの両方で、必ずしも構成時にインストールパスを設定する必要はありません。次のように、インストール時にDESTDIRを使用できます(ここ参照)。

make DESTDIR=<installhere> install

DESTDIRとPREFIXの微妙な違いを説明するこの質問も参照してください。

これは、段階的なインストールを目的としており、たとえば/etc/alternativesシンボリックリンクを介して、プログラムが実行される場所とは異なる場所にプログラムを格納できるようにするためのものです。

ただし、パッケージが再配置可能で、ハードコーディングされた(プレフィックス)パスが設定ステージで設定されている必要がない場合、スキップすることができます。だから代わりに:

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

あなたは走るでしょう:

cmake . && make DESTDIR=/usr all install

user7498341が指摘するように、これはPREFIXを実際に使用する必要がある場合には適切ではないことに注意してください。


9
の使用法を示すのが好きですDESTDIR。しかし、実際にはこれは間違っています。cmake docs cmake.org/cmake/help/v3.0/variable/CMAKE_INSTALL_PREFIX.html ... make DESTDIR=/home/john installを参照する必要があります。これにより、関連するソフトウェアがインストールプレフィックスを使用してインストールされます。最終的には「/ home / john / usr / local」になります。
Joakim

1
それは矛盾しないと思います。パッケージが再配置可能であれば、CMAKE_INSTALL_PREFIXは必要ありません。どちらかを選択できます。そうでない場合は、ビルド時にCMAKE_INSTALL_PREFIXがどこかでベイク処理されるためです。
Bruce Adams

ジェネレーターがMakefileであることがわかっている場合...私はcmake --build build --target install -- DESTDIR=/usr注意します。これはNinjaジェネレーターでも動作するはずです(ルールにはが含まれているようです$ENV{DESTDIR}
Mizux

@Joakimは、CMAKE_INSTALL_PREFIXを使用したいのと同じくらい多く、そうすることで、コンパイルされたファイルにインストールパスが埋め込まれました。たまたま、私は単に.rpmパッケージをビルドしていただけなので、それはできませんでした。DESTDIRは、物をbuildrootに入れるための魅力のように機能しました。
Redstoner氏

18

CMakeプロジェクトクロスプラットフォームを構築する方法は次のとおりです。

/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
  • 最初の2行は、ソース外のビルドディレクトリを作成します
  • 3行目は、インストール結果を配置する場所を指定するビルドシステムを生成します(これは常に配置し./project-root/build/stageます。絶対パスでない場合、パスは常に現在のディレクトリからの相対パスと見なされます)。
  • 4行目は、.前の行で構成されたビルドシステムで構成されたプロジェクトをビルドします。installビルドが必要な場合、必要な依存ターゲットもすべてビルドするターゲットを実行し、ファイルをCMAKE_INSTALL_PREFIX(この場合はです)にコピーします./project-root/build/stage。VisualStudioのようなマルチ構成ビルドの場合は、オプションの--config <config>フラグ。
  • cmake --buildコマンドを使用する際の良い点は、異なるコマンドを必要とせずにすべてのジェネレーター(つまり、メイクファイルとVisual Studio)で機能することです。

その後、インストールしたファイルを使用してパッケージを作成するか、他のプロジェクトに含めます...


ステップバイステップの説明をありがとう!IMOこれが唯一の方法であり、それ以外の場合、cmake(プラットフォームの独立)のポイント全体が破棄されます...
helmesjo

1
ソースへのパス(../)を3行目に含めるのを忘れましたか?ところでこれは受け入れられた答えであるはずです。
スラバ

1
ライン3はcmake -G "<generator>" -DCMAKE_INSTALL_PREFIX=stage ..
codenamezero

1
追加の注記として、実用的には、make -j $(nproc)ビルドスレッドの数を指定するcmake --build . --target=install --config=Release -- -j 8ために、Makefileジェネレーターまたはcmake --build . --target=install --config=Release -- /m:88スレッドのVisual Studioジェネレーターに対してを使用します。実際には、次のコマンドラインパラメータを渡すことができます--
Cloud

1
@MrRedstoner -jはcmakeのフラグではありません。すべてのフラグ--は、基礎となるビルドシステムに渡された後に発生します...
クラウド

4

ブルース・アダムスの回答について:

あなたの答えは危険な混乱を引き起こします。DESTDIRは、ルートツリーからのインストールを対象としています。DESTDIRを指定しなかった場合、ルートツリーに何がインストールされるかを確認できます。PREFIXは、実際のインストールのベースとなるベースディレクトリです。

たとえば、PREFIX = / usr / localは、パッケージの最終的な宛先が/ usr / localであることを示します。DESTDIR = $ HOMEを使用すると、$ HOMEがルート(/)であるかのようにファイルがインストールされます。たとえば、DESTDIRが/ tmp / destdirだった場合、「make install」が何に影響するかがわかります。その精神において、DESTDIRは構築されたオブジェクトに影響を与えるべきでありません。

それを説明するmakefileセグメント:

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

プログラムは、PREFIXが最終(つまり、実動)ディレクトリーのベース・ディレクトリーであると想定する必要があります。DESTDIR = / somethingにインストールされたプログラムをシンボリックリンクする可能性は、単に機能しないため、プログラムがPREFIXに基づいてファイルにアクセスしないことを意味します。cat(1)は、(最も単純な形式で)どこからでも実行できるプログラムです。以下はそうしない例です:

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

$ PREFIX / bin / prog以外の場所からprogを実行しようとした場合、prog.dbは予期された場所にないため、見つかりません。

最後に、/ etc / alternativesは実際にはこの方法では機能しません。ルートツリーにインストールされているプログラムへのシンボリックリンクがあります(たとえば、vi-> / usr / bin / nvi、vi-> / usr / bin / vimなど)。



2

CMakemakeを使用する場合、実際のジェネレーターを(たとえばを介して)呼び出すことは悪い習慣と見なされています。次のようにすることを強くお勧めします。

  1. 構成フェーズ:

    cmake -Hfoo -B_builds/foo/debug -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_DEBUG_POSTFIX=d -DCMAKE_INSTALL_PREFIX=/usr
    
  2. ビルドインストールの段階

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

このアプローチを、以下の場合には、発電機は、簡単に(例えば切り替えることができる-GNinjaために忍者任意の発電機固有のコマンドを覚えていなくても、)。


1
使用されたすべての議論とそれらが使用された理由について説明が提供された場合、答えはより良いかもしれません。特に、--config議論のポイントは何ですか?
Dmitry Kabanov

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.