Avec cmake, comment pouvez-vous désactiver à la source s'appuie?
Je veux interdire à des gens de s'encombrer notre source arbre généré avec CMake fichiers... et, plus important encore, de les empêcher de marcher sur de l'existant Makefiles
qui ne font pas partie du même processus de construction, nous sommes en utilisant CMake pour. (mieux de ne pas demander)
La façon que j'ai trouver pour faire ceci est de faire quelques lignes au dessus de mes CMakeLists.txt
, comme suit:
if("${PROJECT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}")
message(SEND_ERROR "In-source builds are not allowed.")
endif("${PROJECT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}")
Cependant, cette façon de faire semble trop verbeux. En outre, si j'essaie une source de construire toujours crée la la CMakeFiles/
répertoire, et le CMakeCache.txt
fichier dans l'arborescence des sources avant de l'erreur est levée.
Ai-je raté une meilleure façon de le faire?
- Nous faisons exactement comme ça.
- C'est la meilleure solution que j'ai trouvé jusqu'à présent. Vous pourrait rendre le message plus instructif, cependant: message(FATAL_ERROR "À la source s'appuie ne sont pas autorisés. Faire un dossier séparé pour la construction:\nmkdir construire; cd build; cmake ..\nBefore qui, supprimer les fichiers déjà créés:\grn -rf CMakeCache.txt CMakeFiles")
Vous devez vous connecter pour publier un commentaire.
Je pense que j'aime votre façon. Le cmake liste de diffusion est un bon travail de répondre à ces types de questions.
Comme une note de côté: vous pouvez créer une "cmake" fichier exécutable dans le répertoire qui échoue. En fonction de si oui ou non "." est sur leur chemin (sur linux). Vous pourriez même lien symbolique de /bin/false.
Dans windows, je ne suis pas sûr si un fichier dans votre répertoire courant est trouvé en premier ou pas.
CMake a deux sans-papiers, options:
CMAKE_DISABLE_SOURCE_CHANGES
etCMAKE_DISABLE_IN_SOURCE_BUILD
-
/home/selivanov/cmake-2.8.8/Source/cmMakefile.cxx
Inclure une fonction comme cette une. Il est similaire à ce que vous faites avec ces différences:
Il est encapsulé dans une fonction, qui est appelée lorsque le
PreventInSourceBuilds.cmake
module. Vos principales CMakeLists.txt doit inclure:Il utilise get_filename_component() avec REALPATH paramètre qui résout des liens symboliques avant de comparer les chemins.
Dans le cas où le lien github changements, voici le module de code source (qui doit être placé dans un
PreventInSouceBuilds.cmake
, dans un répertoire appeléCMake
, dans l'exemple ci-dessus):J'ai un
cmake()
fonction shell dans mon.bashrc
/.zshrc
similaire à ceci:Je préfère cette faible cérémonie de solution. Il s'est débarrassé de mes collègues plus grande plainte lorsque nous sommes passés à CMake, mais il n'empêche pas les gens qui vraiment voulez faire une source de/en haut de l'arbre de construire le faire, ils peuvent se contenter d'invoquer
/usr/bin/cmake
directement (ou ne pas utiliser la fonction wrapper à tous). Et c'est stupide simple.Vous pouvez configurer votre .bashrc fichier comme cette une
Regarder les fonctions cmakekde et kdebuild. Jeu de CONSTRUIRE et SRC env. variables et modifier ces fonctions selon vos besoins. Cela permettra de ne construire que dans buildDir plutôt que srcDir
Pour ceux qui sont sur Linux:
ajouter à haut-niveau CMakeLists.txt:
créer un fichier 'dotme" dans de niveau supérieur ou de l'ajouter à votre .bashrc (globalement):
exécuter:
lorsque vous essayez de lancer cmake dans le niveau supérieur de l'arborescence source:
Pas CMakeFiles/ou CMakeCache.txt est généré.
Quand fais-de-la source de construire et vous avez besoin de lancer cmake première fois, il suffit d'appeler le réel de l'exécutable:
Il suffit de faire le répertoire en lecture seule par le peuple et les processus de faire le construit. Avoir un processus distinct qui vérifie le répertoire à partir de la source de contrôle (vous utilisez un contrôle de source, non?), ensuite, il rend en lecture seule.