[CMake] Building all tests in parallel (whole subtrees)

wmknapik@gmail.com wmknapik at gmail.com
Thu Jan 24 06:43:02 EST 2013


Actually, scratch that. Option 2) is not so great, because it only allows me to build the tests from the top level (all of them), or from the "bottom" (just one test). And parallel builds still break.

So I guess I need a brand new idea, or another fix for that one...

----- Reply message -----
From: "wmknapik at gmail.com" <wmknapik at gmail.com>
To: <cmake at cmake.org>
Subject: Re: [CMake] Building all tests in parallel (whole subtrees)
Date: Thu, Jan 24, 2013 12:26


Could you describe your approach in more detail ? If I understand it correctly, it requires quite a bit of manual maintenance...

I've tried the following so far:
1) Created a "ut" target on top and for every unit test did add_dependency(ut that_ut). That works fine in parallel, but builds *all* the tests - not enough granularity.
2) Created a "ut" target at the top (with no dependencies) and set the global property ALLOW_DUPLICATE_CUSTOM_TARGETS and USE_SUBDIRS to true. In every directory with tests in it, I created a "ut" target that depends on building the test. That works exactly how I want it to, but breaks when building in parallel (race conditions in writing to files that are common dependencies). This approach would require zero maintenance, so it would be my preferred one, but I don't know if the parallelism issue can be fixed. Ideas ?
3) I managed to force ctest to build the tests in parallel, but when calling ctest with -j (multiple tests building in parallel), the same issues cropped up as in 2) and I prefer 2) anyway.

Hints on fixing 2) would be very much appreciated. Time is running out... ;)

Thanks,
WK----- Reply message -----
From: "Alan W. Irwin" <irwin at beluga.phys.uvic.ca>
To: "Matthew Woehlke" <matthew.woehlke at kitware.com>
Cc: <cmake at cmake.org>
Subject: [CMake] Building all tests in parallel (whole subtrees)
Date: Thu, Jan 24, 2013 05:52

On 2013-01-23 19:07-0500 Matthew Woehlke wrote:

> On 2013-01-23 18:08, Wojciech Knapik wrote:
>> I set up targets that build the unit test executables and
>> marked them with EXCLUDE_FROM_ALL, because I don't want to tie building
>> them to building the application code. Now I need a way to build and run
>> these tests en masse, since there are too many to do it one at a time.
>> 
>> Ideally I'd like to have a make target, that I could call to build all
>> unit tests in the current directory and below *in*parallel*.

@Wojciech: 
I do exactly what you describe for a number of build systems I am
maintaining, I create a whole system of custom test targets with all
the required file and target dependencies between them (and other
standard targets such as libraries and executables) with the
combination of add_custom_command/add_custom_target/add_dependencies
commands.  I also maintain a hierarchy of target dependencies using
the combination of add_custom_target/add_dependencies so that there is
one overall target (which I happen to call test_everything) which
depends on every other test target.

> I'm not sure if this is possible (or at least feasible)...

@Matthew and Wojciech:

Whether ordinary or custom targets can be built in parallel depends on
the back-end being used.  For the "Unix Makefiles" generator it is
simple;

make -j8 test_everything

gets the job done.  Other generators I have used with parallel-build
capability are "MSYS Makefiles" and "MinGW Makefiles" on Windows
(actually Wine in my case which I use as a convenient and free in both
senses test Windows platform under Linux). I haven't tried the ""NMake
Makefiles JOM" generator yet, but I plan to do so. The jom backend
(unlike nmake) does have parallel build capability (see
http://qt-project.org/wiki/jom project).  The jom application is part
of the ordinary Qt install for Windows (or Wine) so I plan to give the parallel
build capabilities of jom a try in the future.

> different generators may or may not have the concept of targets in directories.  I think 
you would need to create a uniquely named target per directory.

@Matthew: That should not be a concern.  Targets are a global concept
in CMake so are independent of which subdirectory they are created in.
So the test_everything target mentioned above runs test targets that have
been created in different subdirectories without issues.

Alan
__________________________
Alan W. Irwin

Astronomical research affiliation with Department of Physics and Astronomy,
University of Victoria (astrowww.phys.uvic.ca).

Programming affiliations with the FreeEOS equation-of-state
implementation for stellar interiors (freeeos.sf.net); the Time
Ephemerides project (timeephem.sf.net); PLplot scientific plotting
software package (plplot.sf.net); the libLASi project
(unifont.org/lasi); the Loads of Linux Links project (loll.sf.net);
and the Linux Brochure Project (lbproject.sf.net).
__________________________

Linux-powered Science
__________________________
--

Powered by www.kitware.com

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20130124/9fce9f9f/attachment-0001.htm>


More information about the CMake mailing list