[CMake] Adding a custom line to CMake's makefiles?

Mike Wittman michael.wittman at headwave.com
Fri Sep 9 15:37:55 EDT 2011


If you are building on Linux, try
     MAKEFLAGS=j8 make distcheck

I have successfully used the MAKEFLAGS environment variable to propagate 
parallel build invocations through scripts that invoke make with fixed 
options.

-Mike

On 09/09/2011 09:21 AM, Clifford Yapp wrote:
> I can finally give a good concrete case where I might need to do this 
> (or need some other very clever solution).
>
> I have created a distcheck command for BRL-CAD that has a lot of 
> responsibilities, including doing a complete configure and build of 
> BRL-CAD from a source archive expanded from a CPack tarball.  The 
> distcheck rule uses cmake to fire off the build (this is to try and be 
> future proof against using other tools than Make to do a distcheck) 
> but I need to pass the parallel build setting -j from Make down to the 
> ${CMAKE_COMMAND} build launched by the distcheck rule, and there 
> doesn't seem to be any way to do it.
>
> This is the subset of the distcheck rule (somewhat edited for clarity):
>
>    ADD_CUSTOM_TARGET(distcheck
>       COMMAND ${CMAKE_COMMAND} -E echo "Stage 1:  Create source tgz, 
> tbz2 and zip archives from toplevel archive."
>       COMMAND cpack --config 
> ${CMAKE_CURRENT_BINARY_DIR}/CPackSourceConfig.cmake
>       COMMAND ${CMAKE_COMMAND} -E echo "Stage 2:  Expand tgz archive 
> and prepare to build from archive sources."
>       COMMAND ${CMAKE_COMMAND} -E tar xvzf 
> ${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz
>       COMMAND ${CMAKE_COMMAND} -E make_directory 
> _${CPACK_SOURCE_PACKAGE_FILE_NAME}-build
>       COMMAND ${CMAKE_COMMAND} -E make_directory 
> _${CPACK_SOURCE_PACKAGE_FILE_NAME}-install
>       COMMAND ${CMAKE_COMMAND} -E chdir 
> _${CPACK_SOURCE_PACKAGE_FILE_NAME}-build ${CMAKE_COMMAND} 
> ../${CPACK_SOURCE_PACKAGE_FILE_NAME} 
> -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/_${CPACK_SOURCE_PACKAGE_FILE_NAME}-install
>       COMMAND ${CMAKE_COMMAND} -E echo "Stage 3:  Compile using source 
> from tgz archive."
>       COMMAND ${CMAKE_COMMAND} --build 
> _${CPACK_SOURCE_PACKAGE_FILE_NAME}-build
>       )
>
> This can be successfully fired off by "make distcheck", which is the 
> desired behavior.  However, the --build option doesn't respect 
> (naturally) any -jN options fed to make, since they aren't specified 
> at CMake time when the distcheck Makefile target is being generated.
>
> Perversely enough, if I'm understanding the issue correctly I won't be 
> able to use the -jN value itself in any case, even if the Makefile can 
> be taught to do something smart: 
> http://old.nabble.com/MAKEFLAGS-var-does-not-show-%22-j%22-param-----td15983337.html
>
> The best idea I can come up with so far is for the CMake generated 
> Makefile to write out a variable containing some CPU related variable 
> (e.g. make CPUS=8 and write the value of $(CPUS) to 
> CMakeFiles/make_cpu_flag or some such) and then convert the distcheck 
> commands above into a series of EXECUTE_PROCESS lines in a 
> rundistcheck.cmake file that is launched by the distcheck rule with a 
> ${CMAKE_COMMAND}.  In rundistcheck.cmake, I can check for the presence 
> of the make_cpu_flag file and if found add the -j parallel flag to the 
> --build line before running it.  That will mean a parallel distcheck 
> will have to use a different make syntax than the standard make -j, 
> but at least it would be something.  Unfortunately, that means I still 
> need the Makefile to let me know what was passed in up front, which 
> means tweaking the CMake generated output somehow (not really sure how 
> yet).
>
> Does anybody else have a mechanism for passing parallel build 
> instructions from make down to child ${CMAKE_COMMAND} --build instances?
>
> Cheers,
> CY
>
>
> On Wed, Feb 2, 2011 at 4:32 PM, Michael Hertling <mhertling at online.de 
> <mailto:mhertling at online.de>> wrote:
>
>     On 02/02/2011 03:34 PM, Clifford Yapp wrote:
>     > Is there any way to customize the Makefile output from CMake to
>     > include user-defined lines (say, something like "#include
>     > Makefile.inc") at the end of each Make file?
>
>
>  [snip]
>
>     However, this approach is neither portable nor clean
>     nor <your-expectation-here>, so I would ask Eric's questions, too. ;)
>
>     Regards,
>
>     Michael
>
>
>
> _______________________________________________
> 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/20110909/149d66c1/attachment.htm>


More information about the CMake mailing list