[cmake-developers] Supported targets with the ninja generator ?

Alexander Neundorf neundorf at kde.org
Wed Apr 4 12:36:04 EDT 2012


On Wednesday 04 April 2012, Nicolas Desprès wrote:
> On Tue, Apr 3, 2012 at 10:03 PM, Alexander Neundorf <neundorf at kde.org> 
wrote:
> > On Tuesday 03 April 2012, Alexander Neundorf wrote:
> >> On Tuesday 03 April 2012, Alexander Neundorf wrote:
> >> > Hi,
> >> > 
> >> > which "additional" targets are supported with the ninja generator ?
> >> > 
> >> > The "help" target does not seem to be supported. This would be nice.
> >> > 
> >> > With Makefiles, for every target foo there is also a target foo/fast.
> >> > This seems to be not supported currently. Is it planned ?
> 
> If I remember well the /fast version is to skip dependency checking
> right? If we consider that Ninja is fast enough do we need them?

I thought the same, but I wanted to raise the question nevertheless.

> >> > With Makefiles, there are targets to
> >> > - compile a single source file foo.c -> foo.o
> >> > - preprocess a single source file foo.c -> foo.i
> >> > - assemble (actually compile but do not assemble) a single source file
> >> > 
> >> >          foo.c -> foo.s
> >> > 
> >> > Those also seem not to be supported currently.
> >> > Is this planned ? It would be nice.
> 
> I think both could be implemented but there is no plan.
> 
> ninja foo.o should already work I think.

Doesn't look like it:

~/src/CMake/build dir/build-Ninja$ ninja cmake.o
ninja: ERROR: unknown target 'cmake.o', did you mean 'cmake'?
~/src/CMake/build dir/build-Ninja$ ninja Source/cmake.o
ninja: ERROR: unknown target 'Source/cmake.o'
~/src/CMake/build dir/build-Ninja$ 

> ninja foo.i and ninja foo.s could be added without to much effort I think.
> 
> >> cmGlobalNinjaGenerator.h contains:
> >> 
> >> virtual const char* GetCleanTargetName()         const { return "clean";
> >> }
> >> 
> >> but there actually no "clean" target:
> >> tests/build-hello-eclipse-ninja$ ninja clean
> >> ninja: ERROR: unknown target 'clean', did you mean 'ninja -t clean'?
> >> 
> >> 
> >> Maybe it shouldn't return a valid string, since it does not really have
> >> a "clean" target ?
> 
> I think it will never have a clean target since the clean tool is
> quite more powerful and faster in the sense that it uses only the
> dependency graph and does not require any logic in the generator.

I didn't check where GetCleanTargetName() is used, but this sounds like for 
ninja it currently does not return what one would expect.

> > And one more comment: a nice feature of the makefile generators is that
> > they don't only have one global "clean" target, but you can clean
> > per-directory (via make clean in a subdir), and even per target
> > (cmake -P CMakeFiles/foo.dir/cmake_clean.cmake).
> > 
> > Having these per-target clean scripts available would be really nice.
> 
> Ninja clean tool support per-target and per-rule cleaning. See:
> http://martine.github.com/ninja/manual.html#_extra_tools
> 
> So for instance if you want to remove all files generated using the
> CXX_EXECUTABLE_LINKER rule (which will basically remove all files
> produced by a link) you can do: ninja -t clean -r
> CXX_EXECUTABLE_LINKER
>
> You can also remove all files generated a given target (i.e. any
> output of the dependency graph) by doing: ninja -t clean <target>

Ah, that's nice.

Alex



More information about the cmake-developers mailing list