How do I list the defined make targets from the command line?

Cmake

Cmake Problem Overview


I feel almost silly for asking this but I couldn't find anything on this...

Suppose I have a cmake project containing a number of targets (libraries, executables, external targets, etc). How do I list them using the cmake command line interface?

I want a list of things that are valid to substitute for $target in the following command line:

cmake . && cmake --build . --target $target

Lot's of bonus points for a solution that uses neither grep nor find nor python nor perl nor... you get the idea.

Cmake Solutions


Solution 1 - Cmake

For Makefile generator build environments you could use

cmake --build . --target help

And there is the graphical output solution (example found here):

cmake --graphviz=test.graph 
dotty test.graph

See also Generating Dependency Graphs with CMake and CMake Graphviz Output Cleaner.

If you don't have dotty installed, you can still make the target dependencies visible with enabling GLOBAL_DEPENDS_DEBUG_MODE in your CMakeLists.txt:

set_property(GLOBAL PROPERTY GLOBAL_DEPENDS_DEBUG_MODE 1)

The disadavantage here is that you can't trigger it from the command line. It will always show on stderr when generating the make environment.

References

Solution 2 - Cmake

I think you might be looking for the command make help.

When I run make help (after running cmake ..) I get the following output:

The following are some of the valid targets for this Makefile:
... all (the default if no target is provided)
... clean
... depend
etc

You could also read the Makefile that cmake auto-generates for you.

Solution 3 - Cmake

We may get all targets of the generated Makefile, as @Florian and @Olivia Stork answered.

However, people may just looking for explicitly declared targets in CMakeLists.txt . Targets like "all" and "clean" may not be what people is interested in.

Thus, they can simply query "Built target" in the output of make.

i.e.

cd ~/work/my_project
mkdir build && cd build && cmake ..
make -j4 > log.txt 2>&1
grep 'Built target' log.txt | awk '{print $4}'

Solution 4 - Cmake

Answer by @Florian is correct. Just to give some context to it, the command

cmake --build . --target help is assuming your build directory is at current directory, as indicated by the "dot".

If you set your build directory to another directory other than current directory, let say, /build, then you should specify it as cmake --build build --target help.

Alternatively, you can also

cd build
make help

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionHolgerView Question on Stackoverflow
Solution 1 - CmakeFlorianView Answer on Stackoverflow
Solution 2 - CmakeOlivia StorkView Answer on Stackoverflow
Solution 3 - CmakeChrisZZView Answer on Stackoverflow
Solution 4 - CmakekenView Answer on Stackoverflow