[CMake] build step is not thread-safe for CMake

Eric Doenges doenges at mvtec.com
Tue Feb 11 06:48:12 EST 2020


Am 10.02.20 um 14:23 schrieb Kyle Edwards via CMake:
> On Mon, 2020-02-10 at 12:49 +0000, hex wrote:
>> hello,
>>
>> My build step is not thread-safe (the instruction in the COMMAND
>> part). Every build step depends on one source file:
>>
>> add_custom_command(
>>          DEPENDS on_source.file
>>          OUTPUT
>>                  object_file_for_source_file
>>          COMMAND not-thread-safe-compiler --build on_source.file
>>          COMMENT
>>                  "Building Source object"
>> )
>>
>> add_custom_target DEPENDS on OUTPUT from all custom command's, but in
>> order to prevent parallel execution when cmake is called:
>>
>> cmake --build . --target all -j30
>>
>> I need to build each step in any order, but still not as a dependency
>> as this would trigger unnecessary recompilation. Using
>> MAIN_DEPENDENCY defines hierarchical dependency, but this won't help
>> in this situation.
>>
>> I cannot figure out how to prevent parallel execution of COMMAND in
>> CMake. The only option I see is a single command
>>
>> add_custom_target(tgt
>>          DEPENDS on_all_source.files
>>          COMMAND not-thread-safe-compiler --build on_source1.file
>>          COMMAND not-thread-safe-compiler --build on_source2.file
>>          COMMAND not-thread-safe-compiler --build on_source3.file
>>          . . .
>>          COMMENT
>>                  "Building target"
>> )
>>
>> this would rebuild every source, though.
>>
>> How do I set this up?
>>
>> thank you
> It sounds like you want order-only dependencies: dependencies the
> command waits for before building, but whose changes do not actually
> trigger a rebuild. As far as I know, add_custom_command() doesn't have
> support for this - perhaps it could be added.

Actually, I think it kind of does, at least with the Ninja generator. If 
you do something like

add_custom_output(OUTPUT fileA COMMAND ...)
add_custom_target(fileA_target DEPENDS fileA)

add_custom_output(OUTPUT fileB DEPENDS fileA COMMAND ...)
add_custom_output(OUTPUT fileC DEPENDS fileA_target COMMAND ...)

then both fileB and fileC will depend on fileA existing, but fileC will 
not be rebuilt if fileA changes, while fileB will be.

Disclaimer - I couldn't find this behavior described in the 
documentation, but it is what I've observed after spending extensive 
amounts of time messing about with add_custom_command() and 
add_custom_target() to build the documentation to our product with CMake 
3.16. Also, I've only tested this with the Ninja generator, so it may 
behave differently with other generators.

With kind regards,
Eric Dönges

*Dr. Eric Dönges*
Senior Software Engineer

MVTec Software GmbH | Arnulfstr. 205 | 80634 Munich | Germany
doenges at mvtec.com <mailto:doenges at mvtec.com> | Tel: +49 89 457 695-0 | 
www.mvtec.com <http://www.mvtec.com>

Find our privacy policy here <https://www.mvtec.com/imprint>.

Sign up <https://www.mvtec.com/newsletter> for our MVTec Newsletter!

Geschäftsführer: Dr. Olaf Munkelt
Amtsgericht München HRB 114695

MVTec Software GmbH Logo
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20200211/0217657e/attachment.html>


More information about the CMake mailing list