Как проверить, нашел ли find_package пакет (boost)

Я хочу не добавлять boost.cxx, если cmake find_package не нашел никакого повышения. Возвращает ли find_package то, что я могу обернуть при условии компиляции boost.cxx или нет. Вот мой текущий файл cmake:

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)

Ответ 1

Сценарии FindXXX должны установить переменную <Packagename>_FOUND в TRUE, если пакет был найден. Таким образом, в вашем случае он установит Boost_FOUND, если boost был найден.

При компиляции вашего Boost.cxx, я предполагаю, что вам понадобятся заголовки Boost, поэтому вы также должны настроить каталоги включений. *

найдите Boost перед созданием исполняемого файла. Furhtermore, перед добавлением исполняемого файла вам нужно установить свои каталоги include.

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: поскольку вы используете флаг REQUIRED при поиске Boost (так как вам это нужно только на платформе Unix), достаточно даже использовать тэг опционально-source-files-in-a-variable.

(*) Благодаря вашему вопросу, я только выяснил, что не имеет значения, вызывается ли include_directories(...) до или после создания цели с помощью ADD_EXECUTABLE или ADD_LIBRARY, поскольку каталоги добавляются ко всем целям в тот же проект.

Ответ 2

Да, он устанавливает переменную 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()

Ответ 3

Да, если find_package(Boost COMPONENTS system filesystem REQUIRED) преуспеет, Boost_FOUND будет правдой.

Кроме того, будут версии для компонентов, поэтому Boost_date_time_FOUND, Boost_filesystem_FOUND и т.д.

Для получения дополнительной информации запустите

cmake --help-module FindBoost