web-dev-qa-db-ja.com

CMakeの 'configure --prefix = DIR&make all install'と同じ意味は何ですか?

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

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

/usrの代わりに/usr/localにインストールするcmakeおよびmakeコマンドラインは何ですか?

347
Andrei

コマンドラインで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リリース

あなたはそれがかなり長くなるのを見ることができます、そしてもう直接同等ではありません、しかしかなり簡潔な形でベストプラクティスに近いです... --configはマルチコンフィギュレーションジェネレータ(すなわちMSVC)によってのみ使用され、無視他人によって。

399

受け入れられた回答の ":PATH"の部分は省略することができます。この構文はもっと記憶に残るかもしれません:

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

...ここで答え で使われているように

36
user2023370

CMakeと Autotools の両方で、設定時に常にインストールパスを設定する必要はないことに注意してください。次のように、インストール時に DESTDIR を使用できます( here も参照)。

make DESTDIR=<installhere> install

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

これは、段階的なインストールを目的としており、プログラムが実行されている場所とは異なる場所にプログラムを保存できるようにします。 /etc/alternativesシンボリックリンク経由。

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

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

あなたは実行します:

cmake . && make DESTDIR=/usr all install

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

24
Bruce Adams

私がプラットフォーム間で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行目は、前の行で構成されたbuildsystemを使用して.で構成されたプロジェクトをビルドします。必要な場合はすべての必要な依存ターゲットもビルドしてからCMAKE_INSTALL_PREFIX(この場合は./project-root/build/stage)にコピーするinstallターゲットが実行されます。VisualStudioのような複数構成ビルドの場合は、次のように指定することもできます。オプションの--config <config>フラグを持つ設定.
  • cmake --buildコマンドを使用するときの良いところは、異なるコマンドを必要とせずにすべてのジェネレータ(つまりmakefileとVisual Studio)に対して機能することです。

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

13
toeb

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

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

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

それを説明するためのメイクファイルセグメント:

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など)。

4
user7498341

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

  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
    

この方法に従うと、ジェネレータ固有のコマンドを覚えなくても、ジェネレータを簡単に切り替えることができます(例:Ninjaの_ -GNinja)。

2
Florian Wolters