How to check if find_package found the package (boost)

cmake

Solution

The `FindXXX` scripts are supposed to set a variable `<Packagename>_FOUND` to `TRUE`if the package was found. So in your case, it will set `Boost_FOUND` if boost was found.

When compiling your `Boost.cxx`, I assume that you will need Boost headers as well, so you should adjust your include directories as well.*

look for Boost before creating your executable. Furhtermore, you need to set your include directories before adding the executable.

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: Since you use the `REQUIRED` flag when looking for Boost (since you only need it on Unix platform) it is even sufficient to use the optional-source-files-in-a-variable trick.

(*) Thanks to your question, I just found out that it doesn't matter whether `include_directories(...)` is called before or after creating the target with `ADD_EXECUTABLE` or `ADD_LIBRARY` since the directories are added to all targets in the same project.

Problem

I want to not add boost.cxx if cmake find_package found no boost installed. Does find_package return something that I can wrap in condition to compile boost.cxx or not. Here is my current cmake file: ``` 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) ```

Original source