2013-04-18 8 views
27

一部の内部テストでは、ユーザーが明示的に上書きしない限り、インストールプレフィックスをデフォルトでビルドディレクトリのサブディレクトリにします。私は、ユーザーがインストールによって接頭辞を指定することができます知っている:コマンドラインで明示的に指定されていない場合は、インストール先のプレフィクスを自動的にカスタムパスに設定します。

$ cmake -DCMAKE_INSTALL_PREFIX=/foo/bar .. 

しかし、ユーザーがないをした場合、それは、例えばにデフォルトで設定される必要があり、これを指定します${PWD}/installed

変数CMAKE_INSTALL_PREFIXは既に/usr/localに設定されていますので、設定する前に未設定/空であるかどうかを確認するだけではありません。

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() 

私の質問

は次のとおりです:

私の現在のソリューションは、ユーザーがCMAKE_INSTALL_PREFIX変数が尊重されることを指定するには、起動するために持っているカスタムスイッチを追加することです

(a)のいずれかの問題があります上記と、CMAKE_INSTALL_PREFIXに影響を与えるには、CMakeに渡す必要がある余分なフラグの迷惑を超えて?

(b)上記を達成するには、より良い、よりクリーンで、より堅牢で、より慣用的な、そして/またはより厄介な方法がありますか?

ありがとうございました。

答えて

45

CMakeは、CMAKE_INSTALL_PREFIXが明示的に指定されておらず、デフォルト設定に初期化されている場合、ブール変数CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULTを設定します。

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

パーフェクト!ありがとう! – Jeet

+0

数日前に私はこの記事を見つけて、私の頭を抜いて、適切なことをするために複数のExternalProject依存関係を取得しようとしていたらいいと思います。ありがとう! – KarateSnowMachine

2

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

など。

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にインストールする必要があることを手動で指定することができるということです。窓の上に私は、ビルドディレクトリにinstallディレクトリを作成するには、次を使用します。 NSISインストーラで私のツールを配布するので、これは問題ではありません(私にとって)。

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

+0

Unixでは、 "^/usr/local"をマッチングに使用します。正規表現にマッチするのではなく、 'STREQUAL '/ usr/local' 'を使用してください。 – thiagowfx

関連する問題