2012-04-19 24 views
11

cmake find_packageにboostがインストールされていないことがわかったらboost.cxxを追加しません。 find_packageは、boost.cxxをコンパイルするかどうかを条件としてラップできるものを返しますか?ここに私の現在のcmakeファイルがあります。find_packageがパッケージを見つけたかどうかを確認する方法(boost)

add_executable (complex complex.cxx lexer.cxx boost.cxx ../../src/lili.cxx ../../src/lilu.cxx) 

# Make sure the compiler can find all include files 
include_directories (../../src) 
include_directories (.) 

# Make sure the linker can find all needed libraries 
# rt: clock_gettime() 
target_link_libraries(complex rt) 

# Install example application 
install (TARGETS complex 
     RUNTIME DESTINATION bin) 

IF(UNIX) 
    find_package(Boost COMPONENTS system filesystem REQUIRED) 

    ## Compiler flags 
    if(CMAKE_COMPILER_IS_GNUCXX) 
     set(CMAKE_CXX_FLAGS "-O2") 
     set(CMAKE_EXE_LINKER_FLAGS "-lsqlite3 -lrt -lpthread") 
    endif() 

    target_link_libraries(complex 
     ${Boost_FILESYSTEM_LIBRARY} 
     ${Boost_SYSTEM_LIBRARY} 
     #${PROTOBUF_LIBRARY} 
    ) 
ENDIF(UNIX) 

答えて

8

を実行FindXXXスクリプトがあればTRUEに変数<Packagename>_FOUNDを設定することになっている、更なる情報については

コンポーネント固有のバージョン、そうBoost_date_time_FOUNDBoost_filesystem_FOUND、などがあるだろうパッケージが見つかりました。したがって、あなたの場合、ブーストが見つかった場合はBoost_FOUNDと設定されます。

あなたBoost.cxxをコンパイルし、私はあなたが同様にディレクトリを含める調整する必要がありますので、あなたは、同様にブーストヘッダが必要になることを前提としています。*あなたの実行可能ファイルを作成する前に、ブースト用

表情。さらに、実行可能ファイルを追加する前にインクルードディレクトリを設定する必要があります。

IF(UNIX) 
    find_package(Boost COMPONENTS system filesystem REQUIRED) 
    # IF(Boost_FOUND) # checking this variable isnt even necessary, since you added 
         # REQUIRED to your call to FIND_PACKAGE 
     SET(BOOST_SRC_FILES boost.cxx) 
     INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) # you could move this down as well 
                # as ${Boost_INCLUDE_DIRS} will be 
                # empty if Boost was not found 
    # ENDIF() 
ENDIF() 

add_executable (complex complex.cxx lexer.cxx ${BOOST_SRC_FILES} ../../src/lili.cxx ../../src/lilu.cxx) 

# Make sure the compiler can find all include files 
include_directories (../../src) 
include_directories (.) 
# INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) # alternative location to 
               # add include dirs, see above 

# Make sure the linker can find all needed libraries 
# rt: clock_gettime() 
target_link_libraries(complex rt) 

# Install example application 
install (TARGETS complex 
     RUNTIME DESTINATION bin) 

IF(UNIX) 

    ## Compiler flags 
    if(CMAKE_COMPILER_IS_GNUCXX) 
     set(CMAKE_CXX_FLAGS "-O2") 
     set(CMAKE_EXE_LINKER_FLAGS "-lsqlite3 -lrt -lpthread") 
    endif() 

    target_link_libraries(complex 
     ${Boost_FILESYSTEM_LIBRARY} 
     ${Boost_SYSTEM_LIBRARY} 
     #${PROTOBUF_LIBRARY} 
    ) 
ENDIF(UNIX) 

Afternote:あなたは(あなたが唯一のUnixプラットフォーム上でそれを必要とするため)ブーストを探してREQUIREDフラグを使用することがオプションのソース・ファイル・イン・変数トリックを使用するのにも十分なものであるので、 。

(*)あなたの質問のおかげで、私はちょうどinclude_directories(...)前またはADD_EXECUTABLEやディレクトリが同じプロジェクト内のすべてのターゲットに追加されているのでADD_LIBRARYとターゲットを作成した後に呼ばれているかどうかは問題ではないことが分かりました。

+1

恐ろしい!あなたはこのすべての仕事を私のために作った、ありがとう! – Cynede

+2

注意 - Libname_FOUND変数は大文字と小文字を区別し、一部のライブラリでは大文字と小文字を区別します。例えば。 find_package(GTest)が成功しても、GTest_FOUNDは設定されません。代わりにGTEST_FOUNDが設定されます(cmake 3.0.2を使用)。 –

5

はい、それは変数Boost_FOUNDを設定します。 FindBoost.cmakeから例:

== Using actual libraries from within Boost: == 
# 
# set(Boost_USE_STATIC_LIBS  ON) 
# set(Boost_USE_MULTITHREADED  ON) 
# set(Boost_USE_STATIC_RUNTIME OFF) 
# find_package(Boost 1.36.0 COMPONENTS date_time filesystem system ...) 
# 
# if(Boost_FOUND) 
#  include_directories(${Boost_INCLUDE_DIRS}) 
#  add_executable(foo foo.cc) 
#  target_link_libraries(foo ${Boost_LIBRARIES}) 
# endif() 
4

find_package(Boost COMPONENTS system filesystem REQUIRED)が成功した場合は、[はい、Boost_FOUNDはtrueになります。

また、

cmake --help-module FindBoost 
関連する問題