Ninja equivalent of Make's “build from this directory down” feature (with CMake)?

徘徊边缘 提交于 2019-11-30 13:17:49

ninja <DIR>/all works with recent versions of Ninja (1.7.2). Version 1.3.4 does not allow this.

I could not find a reference to this on the manual. However, CMake has this documented here:

Recent versions of the ninja program can build the project through the “all” target. An “install” target is also provided.

For each subdirectory sub/dir of the project, additional targets are generated:

  • sub/dir/all
    Depends on all targets required by the subdirectory.
  • sub/dir/install
    Runs the install step in the subdirectory, if any.
  • sub/dir/test
    Runs the test step in the subdirectory, if any.
  • sub/dir/package
    Runs the package step in the subdirectory, if any.

This worked for me:

cd <build-root>
DIRECTORY=<path-relative-to-build-root>
ninja -t targets all | egrep "^${DIRECTORY}/" | egrep CXX_EXECUTABLE_LINKER | \
    sed -e 's/:.*//g' | xargs ninja

ninja -t targets all - lists all targets (including target type)

egrep "^${DIRECTORY}/" - filters list of targets to only include those in desired directory

egrep CXX_EXECUTABLE_LINKER - limits the targets to just C++ executables. You can remove or tweak this to get the set of targets you're interested in.

sed -e 's/:.*//g' - removes the target type e.g. ": CXX_EXECUTABLE_LINKER"

xargs ninja - invokes ninja to build the targets

Good question. I would like to know the answer if you find it. I am just in the process of transitioning to cmake+ninja myself.

I found that I could not create targets with the same name at different levels (if there is a way I would be interested to know). So I adopted a naming convention for different targets E.g. name - builds program or library test.name - runs tests for the named program or library doxygen.name - build doxygen for the named program or library

For deeper hierarchies you can do something like: doxygen.subproject doxygen.subproject.name

Using this pattern you can control precisely what is built but you have to issue the command from the top-level build directory. I think after I get used to this I will find it more productive as there is no need to change directory before you build or run something and though there is sometimes a little extra typing required the shell history generally has it covered.

This is implemented under the hood by using add_custom_target() and adding appropriate dependencies. I use a macro to do this automatically so that a macro "add_doxygen()" will add the doxygen target for the program and make the doxygen target at each higher level depend on it using add_dependencies().

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!