[CMake] Adding a custom line to CMake's makefiles?
Mike Wittman
michael.wittman at headwave.com
Fri Sep 9 17:24:35 EDT 2011
Yes, but only when setting MAKEFLAGS from within a Makefile. It appears
the rules do not apply when MAKEFLAGS is set by the invoking shell.
(And actually, current GNU make handles parallel execution differently
on Linux, using a job server that all make subprocesses use to
coordinate execution -- the documentation below is from 1998.)
If you still don't believe :) try putting the following in a Makefile
and running MAKEFLAGS=j3 make
all: r1 r2 r3
r1 r2 r3:
echo rule $@; sleep 5
-Mike
On 09/09/2011 02:55 PM, Jean-Christophe Fillion-Robin wrote:
> Reading through make documentation, seems setting -jx to MAKEFLAGS is
> a no-op.
>
> /"The `-j' option is a special case (see section Parallel Execution
> <http://theory.uwinnipeg.ca/localfiles/infofiles/make/make_47.html#SEC46>).
> If you set it to some numeric value, `-j 1' is always put into
> |MAKEFLAGS| instead of the value you specified. This is because if the
> `-j' option were passed down to sub-|make|s, you would get many more
> jobs running in parallel than you asked for. If you give `-j' with no
> numeric argument, meaning to run as many jobs as possible in parallel,
> this is passed down, since multiple infinities are no more than one. "/
>
> Source: http://theory.uwinnipeg.ca/localfiles/infofiles/make/make_53.html
>
> Jc
>
> On Fri, Sep 9, 2011 at 3:37 PM, Mike Wittman
> <michael.wittman at headwave.com <mailto:michael.wittman at headwave.com>>
> wrote:
>
> 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 bywww.kitware.com <http://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
>
>
> _______________________________________________
> Powered by www.kitware.com <http://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
>
>
>
>
> --
> +1 919 869 8849
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20110909/4ea3ac68/attachment.htm>
More information about the CMake
mailing list