[CMake] Force rebuild of external project with Ninja
Jamie Hanlon
jamieh at xmos.com
Fri Sep 11 13:02:24 EDT 2015
Dear all,
I thought I would post this here before filing a bug, to see if anyone else has encountered this problem.
The 'BUILD_ALWAYS 1' option for 'ExternalProject_Add' does not run the install command when used with Ninja. This behaviour can be demonstrated with the following project:
CMakeLists.txt (1)
foo/
CMakeLists.txt (2)
Where CMakeLists.txt (1) contains:
cmake_minimum_required(VERSION 3.2)
include(ExternalProject)
ExternalProject_Add(foo
SOURCE_DIR foo
CONFIGURE_COMMAND ""
BUILD_COMMAND echo "building foo"
INSTALL_COMMAND "installing foo"
BUILD_ALWAYS 1)
And CMakeLists.txt (2) is empty.
In the top level directory, initialising CMake, then running 'ninja':
$ cmake . -DCMAKE_GENERATOR=Ninja
...
$ ninja
[6/8] Performing build step for 'foo'
building foo
[7/8] Performing install step for 'foo'
installing foo
[8/8] Completed 'foo'
$ ninja
[1/3] Performing build step for 'foo'
building foo
$ ninja
[1/3] Performing build step for 'foo'
building foo
$ ninja
[1/3] Performing build step for 'foo'
building foo
Causes the build and install step to run the first time, but only the build step to run after.
With Make, the build and install steps are always run, as I would expect:
$ cmake . -DCMAKE_GENERATOR='Unix Makefiles'
...
$ make
Scanning dependencies of target foo
[ 12%] Creating directories for 'foo'
[ 25%] No download step for 'foo'
[ 37%] No patch step for 'foo'
[ 50%] No update step for 'foo'
[ 62%] No configure step for 'foo'
[ 75%] Performing build step for 'foo'
building foo
[ 87%] Performing install step for 'foo'
installing foo
[100%] Completed 'foo'
[100%] Built target foo
$ make
[ 12%] Performing build step for 'foo'
building foo
[ 25%] Performing install step for 'foo'
installing foo
[ 37%] Completed 'foo'
[100%] Built target foo
$ make
[ 12%] Performing build step for 'foo'
building foo
[ 25%] Performing install step for 'foo'
installing foo
[ 37%] Completed 'foo'
[100%] Built target foo
Similarly, with CMakeLists.txt (1) this time containing an 'ExternalProject_Add_Step' and 'ALWAYS 1':
cmake_minimum_required(VERSION 3.2)
include(ExternalProject)
ExternalProject_Add(foo
SOURCE_DIR foo
CONFIGURE_COMMAND ""
BUILD_COMMAND echo "building foo"
INSTALL_COMMAND echo "installing foo"
)
ExternalProject_Add_Step(foo force_rebuild DEPENDERS build ALWAYS 1)
Make works as above, but this time, Ninja does not run the build or install steps after the first run:
$ cmake . -DCMAKE_GENERATOR=Ninja
...
$ ninja
[7/9] Performing build step for 'foo'
building foo
[8/9] Performing install step for 'foo'
installing foo
[9/9] Completed 'foo'
$ ninja
[1/4] No force_rebuild step for 'foo'
$ ninja
[1/4] No force_rebuild step for 'foo'
In these examples, I'm using CMake 3.3.1, Ninja 1.3.4 and Make 3.81.
Cheers,
Jamie
More information about the CMake
mailing list