[CMake] Problems with parallel builds

Denis Scherbakov denis_scherbakov at yahoo.com
Thu Nov 18 13:08:20 EST 2010


Here is a sample CMakeLists.txt to illustrate that two custom targets cannot depend on each other:

PROJECT(BUG C)

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

ADD_CUSTOM_COMMAND(
  OUTPUT  "${CMAKE_CURRENT_BINARY_DIR}/fileOne"
  COMMAND "${CMAKE_COMMAND}"
     ARGS "-E"
          "touch"
          "${CMAKE_CURRENT_BINARY_DIR}/fileOne")

ADD_CUSTOM_TARGET(targetFileOne DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/fileOne")

ADD_CUSTOM_COMMAND(
  OUTPUT  "${CMAKE_CURRENT_BINARY_DIR}/fileOne-s"
  COMMAND "${CMAKE_COMMAND}"
     ARGS "-E"
          "touch"
          "${CMAKE_CURRENT_BINARY_DIR}/fileOne-s")

ADD_CUSTOM_TARGET(targetFileOneS ALL DEPENDS targetFileOne "${CMAKE_CURRENT_BINARY_DIR}/fileOne-s")

$ gmake
Scanning dependencies of target targetFileOne
[  0%] Generating fileOne
[ 50%] Built target targetFileOne
Scanning dependencies of target targetFileOneS
gmake[2]: *** No rule to make target `targetFileOne', needed by `CMakeFiles/targetFileOneS'.  Stop.
gmake[1]: *** [CMakeFiles/targetFileOneS.dir/all] Error 2
gmake: *** [all] Error 2

So I am back to my problem that I cannot compile my project in parallel.
The question is: How to implement mutexes in CMake scripts?

Denis

--- On Thu, 11/18/10, David Cole <david.cole at kitware.com> wrote:

> From: David Cole <david.cole at kitware.com>
> Subject: Re: [CMake] Problems with parallel builds
> To: "Denis Scherbakov" <denis_scherbakov at yahoo.com>
> Cc: cmake at cmake.org
> Date: Thursday, November 18, 2010, 6:43 AM
> Try:
> ADD_CUSTOM_TARGET(MyHeaders ALL DEPENDS MyFile.hh)
> 
> Without the "ALL" your target is not included in the set of
> targets
> built by a "make" or a "make all" -- without your target
> included in
> "make" there is nothing for the subsequent targets to
> depend on.
> Perhaps we should add a warning to add_dependencies if
> expressing a
> dependency on something not in "all" by default....
> 
> 
> On Thu, Nov 18, 2010 at 9:33 AM, Denis Scherbakov
> <denis_scherbakov at yahoo.com>
> wrote:
> > Hi, David,
> >
> > I did as you suggested:
> >
> > ADD_CUSTOM_COMMAND(OUTPUT MyFile.hh ...)
> > ADD_CUTSOM_TARGET(MyHeaders DEPENDS MyFile.hh)
> >
> > ADD_LIBRARY(MYLIB ${MYLIB_SRCS})
> > ADD_DEPENDENCIES(MYLIB  MyHeaders)
> >
> > ADD_LIBRARY(MYLIBpic ${MYLIB_SRCS})
> > ADD_DEPENDENCIES(MYLIBpic  MyHeaders)
> >
> > Didn't work. Target "MyHeaders" is build two times
> when I do "gmake -j2"
> > I see two "Generating MyFile.hh" lines and MyFile.hh
> has duplicate lines.
> >
> > Denis
> >
> >> David Cole wrote:
> >>
> >> The easiest way to make this work is to have a
> separate
> >> custom target
> >> that depends on the output of the custom command,
> and then
> >> to have the
> >> two libraries depend on that custom target with
> >> add_dependencies...
> >>
> >
> >
> >
> >
> 


      


More information about the CMake mailing list