[CMake] Get native build command with CMake 3+

Petr Kmoch petr.kmoch at gmail.com
Fri Dec 5 05:46:03 EST 2014


Hi all.

I'm converting a small Makefile-based project to CMake. The project is not
mine, so I am trying to match its existing buildsystem as closely as
possible.

One of the rules in the original Makefile is (simplified) as follows:

examples: all
  make -C example_dir all

This gives a target 'examples' in the top-level Makefile, which is not
included in 'all', but can be used to build all examples. I would like to
achieve something similar with CMake.

I added example_dir/CMakeLists.txt, which includes a project() command and
defines all the targets for example executables. In the toplevel CMakeList,
I did this:

# Add the subdirectory but don't include its targets by default
add_subdirectory(example_dir EXCLUDE_FROM_ALL)

# Add a custom target to build all examples
add_custom_target(examples ???)

I'm stuck at the custom target. What I need for its command is a
generator-agnostic equivalent for 'make -C example_dir all' (or 'make -f
example_dir/Makefile all').

I tried 'cmake --build ${CMAKE_CURRENT_BINARY_DIR}/example_dir ...', but
this complains that example_dir does not contain a CMakeCache.txt (which is
correct of course, it's not the toplevel directory). Then I remembered that
build_command() can be used to get a command line to build a project;
unfortunately, in 3.0 and later, this just returns 'cmake --build ...' and
so is unusable in my situation.

Is there a way to query CMake for the native command line (or something
else) I could use to build the CMake-generated buildsystem in the
subdirectory? I thought a bit about CMAKE_MAKE_PROGRAM, but that doesn't
tell me anything about what arguments I should pass, and it's not even set
on Visual Studio generators.

As a workaround, I thought of not doing add_subdirectory() at all and
instead adding a custom target with 'ctest --build-and-test ...', but I
would prefer to configure & generate the two directories together. I plan
to eventually add install() rules for the examples as well, and the
examples also use one of the targets from the toplevel cmakelist in
add_custom_command(OUTPUT ...), so I would really like to keep them as one
CMake system. Is there a way to do so?

Petr
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20141205/234537ca/attachment.html>


More information about the CMake mailing list