web-dev-qa-db-ja.com

MacPortsによってインストールされたライブラリを探すようにCMakeに指示するにはどうすればよいですか?

Linuxのみで動作するように設計されたソフトウェアの一部をMacOS Xでビルドしようとしています。CMakeを使用しており、MacPortsをインストールしたため、CMakeを依存するサードパーティライブラリの一部と簡単に入手できます。

問題は、CMakeがデフォルトでMacPortsからライブラリを探すように見えないため、すべてのターゲットが/ opt/localにある依存関係を見つけることができないため、いくつかのターゲットが無効になっていることです。

MacPortsからインクルードとライブラリも検索するようにCMakeに指示するにはどうすればよいですか?

32
David Holm

Darwin」のツールチェーンファイルを追加し、必要なインクルードパスとライブラリパスを追加しました。もう少し自動化されたものを望んでいましたが、少なくとも問題は解決しました。

darwin.cmake

SET(CMAKE_SYSTEM_NAME Darwin)

# Add MacPorts
INCLUDE_DIRECTORIES(/opt/local/include)
LINK_DIRECTORIES(/opt/local/lib)
15
David Holm

CMakeLists.txtファイルでcmakeによって検索されたパスのセットに、/ opt/local/libとその他のインストールパスを追加します。

_set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} /opt/local/lib)
_

これにより、cmakeがライブラリを検索するパスのセットに/ opt/local/libが追加されます。この CMAKE_LIBRARY_PATH テクニックは、変数を設定した後のすべての_find_library_コマンドに影響します。

より外科的な、ライブラリごとのアプローチのために、個々のfind_libraryコマンドを変更します。

_find_library(Foo foo
    PATHS /opt/local/lib)
_

これは、ライブラリを探す唯一の場所として/ opt/local/libをハードコードnotすることに注意してください。むしろ、ライブラリを検索する場所のセットに/ opt/local/libを追加するだけです。私はよく、そのような多くのパスを追加して、私が知っているすべてのマシンで観察された場所をカバーします。このテーマのその他のバリエーションについては、 find_library documentation を参照してください。

find_file()およびfind_path()コマンドの動作に影響する CMAKE_INCLUDE_PATH を変更することもできます。

32

CMakeは、DYLD_LIBRARY_PATH環境変数を尊重する必要があります。これは、LinuxのLD_LIBRARY_PATH環境変数と同等です。 DYLD_LIBRARY_PATHには、MacPortsによってインストールされたライブラリを見つけるための適切なパスが必要です。

6
Hank Gay

@ Nerdling's "Do NOT hardcode"承認されたソリューションに関するコメントごとに、MacPortsプレフィックスパスを検出するための提案があります。

MyModule.cmake

# Detect if the "port" command is valid on this system; if so, return full path
EXECUTE_PROCESS(COMMAND which port RESULT_VARIABLE DETECT_MACPORTS OUTPUT_VARIABLE MACPORTS_PREFIX ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)

IF (${DETECT_MACPORTS} EQUAL 0)
    # "/opt/local/bin/port" doesn't have libs, so we get the parent directory
    GET_FILENAME_COMPONENT(MACPORTS_PREFIX ${MACPORTS_PREFIX} DIRECTORY)

    # "/opt/local/bin" doesn't have libs, so we get the parent directory
    GET_FILENAME_COMPONENT(MACPORTS_PREFIX ${MACPORTS_PREFIX} DIRECTORY)

    # "/opt/local" is where MacPorts lives, add `/lib` suffix and link
    LINK_DIRECTORIES(${LINK DIRECTORIES} ${MACPORTS_PREFIX}/lib)

    MESSAGE("WINNING!: ${MACPORTS_PREFIX}/lib")
ENDIF()

# Recommendation, also add a "brew --prefix" custom command to detect a homebrew build environment
2
tresf