81 votes

Lister les répertoires include_dans CMake

J'ai une construction cmake dans laquelle je cherche 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 construire un fichier d'en-tête précompilé, mais pour ce faire, j'ai besoin de connaître tous les chemins ajoutés par ma commande include_directories appels. Comment puis-je obtenir une liste de ces répertoires (de préférence avec le bon format -I/path/to/directory) afin de pouvoir les ajouter à ma commande personnalisée ?

131voto

DLRdave Points 4757

Vous pouvez utiliser la commande get_property pour récupérer la valeur de la propriété "directory". 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 ont eu lieu 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 en arrivez là, vous pouvez envisager de remplacer la commande include_directories par votre propre fonction ou macro et suivre vous-même les valeurs qui lui sont passées. Ou bien, accumulez-les simplement dans une propriété globale ou une variable de cache interne à chaque appel à include_directories.

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

1voto

radam Points 11

Notre solution pour écrire les répertoires d'inclusion ajoutés par conan vers 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()

0voto

Guido Kanschat Points 171

Le code suggéré dans la réponse de DLRdave fonctionne, merci ! Aujourd'hui, j'ai eu le même problème, y compris les parenthèses de la question : (de préférence avec le format approprié -I/path/to/directory).

Je n'ai pas trouvé de solution directe malgré le fait que cmake est obligé de faire cela quelque part à l'intérieur. La meilleure chose que j'ai pu trouver est

get_directory_property (inc_dirs INCLUDE_DIRECTORIES)
list(TRANSFORM inc_dirs PREPEND "-I ")
list(JOIN inc_dirs " " INCLUDE_STRING)

Existe-t-il un moyen d'éviter la variable intermédiaire ???

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X