web-dev-qa-db-fra.com

Liste des répertoires include_dans CMake

J'ai une build cmake dans laquelle je recherche un tas de dépendances, c'est-à-dire que j'ai de nombreuses instances de:

FIND_PACKAGE(SomePackage)
if(SOMEPACKAGE_FOUND)
  include_directories(${SOMEPACKAGE_INCLUDE_DIR})
  link_libraries(${SOMEPACKAGE_LIBRARIES})
endif(SOMEPACKAGE_FOUND)

Maintenant, je veux ajouter une commande personnalisée pour créer un fichier d'en-tête précompilé, mais pour ce faire, je dois connaître tous les chemins ajoutés par mon include_directories appels. Comment puis-je obtenir une liste de ces répertoires (de préférence avec le format -I/path/to/directory approprié) afin de pouvoir les ajouter à ma commande personnalisée?

52
rcv

Vous pouvez utiliser la commande get_property pour récupérer la valeur de la propriété de répertoire INCLUDE_DIRECTORIES

Quelque chose comme ça:

get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
foreach(dir ${dirs})
  message(STATUS "dir='${dir}'")
endforeach()

La valeur de cette propriété de répertoire ne suit que les commandes include_directories qui se sont produites précédemment dans le même fichier CMakeLists, ou qui ont été héritées d'occurrences précédentes dans un fichier CMakeLists parent. Si vos commandes find_package et include_directories sont dispersées dans de nombreux sous-répertoires, cela devient un problème difficile.

Si vous arrivez à ce point, vous pouvez envisager de remplacer la commande include_directories par votre propre fonction ou macro et de suivre vous-même les valeurs qui lui sont transmises. Ou, accumulez-les simplement dans une propriété globale ou une variable de cache interne à côté de chaque appel pour inclure les répertoires.

Voir la documentation ici:

http://cmake.org/cmake/help/v2.8.8/cmake.html#command:get_property

http://cmake.org/cmake/help/v2.8.8/cmake.html#prop_dir:INCLUDE_DIRECTORIES

88
DLRdave

Notre solution pour écrire inclut des répertoires ajoutés par conan dans un fichier

function(output_conan_include_dirs)
    set(include_dir_str "")
    foreach(DIR ${CONAN_INCLUDE_DIRS})
        set(include_dir_str "${include_dir_str}${DIR}\n")
    endforeach()

    set(pth "${CMAKE_BINARY_DIR}/conan-includes.txt")
    file(WRITE "${pth}" "${include_dir_str}")
    message(STATUS "Conan include directories written to: ${pth}")
endfunction()

output_conan_include_dirs()
1
radam