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

Nicolas Desprès nicolas.despres at gmail.com
Thu Apr 5 05:42:46 EDT 2012


2012/4/4 Alexander Neundorf <neundorf at kde.org>:
> 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$
>

Well we can get the list of all available target (i.e. all output file
in the graph) by doing: ninja -t targets all (see the manual for all
options supported by the target tool)

$ ninja -t targets all | grep cmake.cxx.o
Source/CMakeFiles/CMakeLib.dir/cmake.cxx.o: CXX_COMPILER
Source/CMakeFiles/ccmake.dir/CursesDialog/ccmake.cxx.o: CXX_COMPILER

So you will have to do:
$ ninja Source/CMakeFiles/CMakeLib.dir/cmake.cxx.o
or
$ ninja '../Source/cmake.cxx^'

see ninja -h for the last example.

(note: ninja -t targets all is used in the beginning of zsh completion
implementation for ninja in misc/zsh-completion)

There were a request to be able to build only targets under a given
sub-directory as it is possible with recursive Makefiles. I think it
should be implemented more or less the same way 'target^' is
implemented. Ninja can do it itself based on the dependency graph it
has without requiring any logic in the generator. Also some benchmark
as proven than ninja -t clean is faster than make clean since it
actually does not do any call to stat(2) or complex things. It just
load the dependency graph, walk through it and remove generated files.

>> 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.

I don't know what it should return then.

[...]

Cheers,
Nico



More information about the cmake-developers mailing list