web-dev-qa-db-ja.com

コマンドラインで明示的に指定されていない場合、インストールプレフィックスをカスタムパスに自動的に設定する

一部の内部テストでは、ユーザーによって明示的にオーバーライドされない限り、インストールプレフィックスをデフォルトでビルドディレクトリのサブディレクトリに設定します。ユーザーがインストールプレフィックスを指定できるのは次のとおりです。

$ cmake -DCMAKE_INSTALL_PREFIX=/foo/bar ..

しかし、ユーザーがnotを指定した場合、これをデフォルトにする必要があります。 ${PWD}/installed

変数CMAKE_INSTALL_PREFIXはすでに/usr/localに設定されているため、設定する前に、変数が未設定/空かどうかを確認することはできません。

現在の解決策は、CMAKE_INSTALL_PREFIX変数が尊重されるように指定するためにユーザーが呼び出す必要があるカスタムスイッチを追加することです。

option(ENABLE_INSTALL_PREFIX "Install build targets to system (path given by '-DCMAKE_INSTALL_PREFIX' or '${CMAKE_INSTALL_PREFIX}' if not specified)." OFF)
if ( ENABLE_INSTALL_PREFIX )
    set (CMAKE_INSTALL_PREFIX installed CACHE PATH "Installation root")
else()
    set (CMAKE_INSTALL_PREFIX installed CACHE PATH "Installation root" FORCE)
endif()

私の質問は:

(a)CMAKE_INSTALL_PREFIXを有効にするためにCMakeに渡す必要がある追加のフラグの煩わしさを超えて、上記の問題はありますか?

(b)上記を達成するための、より優れた、よりクリーンで、より堅牢で、より慣用的な、および/またはそれほど煩わしくない方法はありますか?

ありがとう。

33
Jeet

CMakeは、CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULTが明示的に指定されておらず、デフォルト設定に初期化されている場合、ブール変数CMAKE_INSTALL_PREFIXを設定します。次の方法でオーバーライドできます。

if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/installed" CACHE PATH "default install path" FORCE )
endif()
52
sakra

数年前、私は同じことを試みたかったのです。残念ながら、私は完全に満足のいく解決策を見つけることができませんでした。代わりに、正規表現を使用してCMAKE_INSTALL_PREFIXがデフォルトと一致するかどうかを確認することにしました。

例えば。 Windowsでは、次のコマンドを使用して、ビルドディレクトリにinstall dirを作成します。

if ( CMAKE_INSTALL_PREFIX MATCHES "^C:/Program Files" )
    # Override to an "Install" directory in the current build-dir
    message( STATUS "    Install-prefix was at default -> forcing it to the build-dir" )
    message( STATUS "        'set( CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install )'" )
    set( CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install )
endif ( CMAKE_INSTALL_PREFIX MATCHES "^C:/Program Files" )

この構成の最大の問題は、CMakeがC:\Program Filesにインストールするように手動で指定できることです。私はNSISインストーラーでツールを配布しているので、これは問題ではありません(私にとって)。

おそらく、Unixで同様のことを試すことができます。

2
André