Quando si crea un progetto utilizzando CMake e Make, è possibile eseguire make
da una sottodirectory del proprio albero di compilazione (ovvero da una directory di seguito qualsiasi directory contiene il primo livello Makefile
) e make
(per quanto posso dire) costruire tutti gli obiettivi in corrispondenza o al di sotto di quella directory. Ciò è dovuto al fatto che CMake genera un Makefile
per ogni directory che contiene obiettivi, quindi quando si è in una directory con destinazioni, make
trova Makefile
per la costruzione di tali destinazioni.Ninja equivalente di Make "build from this directory down" (con CMake)?
Quando CMake genera file Ninja, tuttavia, genera solo unobuild.ninja
file, che si trova al livello superiore della struttura di costruzione. Quindi chiamare ninja
da una directory diversa dalla directory di livello superiore non riesce (anche l'opzione -f
non funziona perché ninja
non riesce a trovare il file rules.ninja
).
Esiste un modo per emulare il comportamento di tipo "make-like" di creare target in corrispondenza di una directory? Per quanto posso dire, non ci sono bersagli Ninja che corrispondono a "tutti i bersagli a e sotto una particolare directory". (Questo potrebbe essere emulato usando obiettivi fasulli denominati dopo ogni directory che dipendono da tutti i target in e sotto quella directory, ma CMake non genera tali target per impostazione predefinita.)
Gli obiettivi in Ninja non sono gerarchici, motivo per cui devono essere denominati in modo univoco. Utilizziamo uno script di compilazione personalizzato per garantire che CMake e Ninja vengano sempre eseguiti dalla stessa directory e utilizziamo sempre anche una directory di compilazione separata dalla nostra directory di origine. Ciò rende le build completamente pulite robuste e facili e ci consente di costruire per più piattaforme. –
Sembra che tu abbia risposto alla domanda OP lì. Sto passando per la generazione di makefile per prima cosa dove non si applica. È stato utile mantenere la struttura originale (mantenendo le build di origine) come nella fase intermedia. Ci sarebbe bello aggiungere bersagli con lo stesso nome per ogni livello. Non sono del tutto sicuro se lo stesso cmake non lo consenta. Dopo tutto è possibile eseguire make make, make clean e fare test solo sulla sottostruttura in cui ci si trova. –
I am the OP. Comunque, no, non credo che * CMake * non consenta nomi di obiettivi non univoci, sto solo spiegando perché Ninja lo fa. –