[CMake] Build several targets using cmake --build <dir>

J Decker d3ck0r at gmail.com
Fri Mar 15 07:44:47 EDT 2013


My ugly macro looks like...  Build project macro creates targets
'build${PROJECT}' which can be depended on each other...

It writes to a output batch file, and then calls that batch.  The batch
file contains a cmake execution for that target, and then
${CMAKE_MAKE_PROGRAM} command.

-----------------------------------

macro( BuildProject PROJECT SOLUTION PROJECT_SOURCE INSTALL_RESULT )

  set( LAST_TARGET Build${PROJECT} )
  if( CMAKE_BINARY_DIR MATCHES ${CMAKE_BUILD_TYPE}_solution\$ )
    set( INSTALL ${CMAKE_BINARY_DIR}/../${CMAKE_BUILD_TYPE}_out/${PROJECT} )
    set( BUILD
${CMAKE_BINARY_DIR}/../${CMAKE_BUILD_TYPE}_solution/${PROJECT} )
  else()
    set( INSTALL ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}_out/${PROJECT} )
    set( BUILD ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}_solution/${PROJECT}
)
  endif( CMAKE_BINARY_DIR MATCHES ${CMAKE_BUILD_TYPE}_solution\$ )
  set( ${INSTALL_RESULT} ${INSTALL} )

  FILE( MAKE_DIRECTORY ${BUILD} )

  if( MSVC )
    if( NOT EXISTS ${BUILD}/${SOLUTION}.sln )
      FILE( WRITE ${BUILD}/${SOLUTION}.sln )
    endif()
    if( ${CMAKE_MAKE_PROGRAM} MATCHES .*[Mm][Ss][Bb]uild.* )
      build_command( BUILD_COMMAND CONFIGURATION ${CMAKE_BUILD_TYPE}
PROJECT_NAME ${SOLUTION} TARGET INSTALL )
          SET( MORE_ARGS /m:4 /v:m )
    else()
    build_command( BUILD_COMMAND CONFIGURATION ${CMAKE_BUILD_TYPE}
PROJECT_NAME ${SOLUTION} TARGET INSTALL.vcxproj )
    endif()
    SEPARATE_ARGUMENTS( BUILD_COMMAND WINDOWS_COMMAND ${BUILD_COMMAND} )
    SET( BUILD_COMMAND ${BUILD_COMMAND} ${MORE_ARGS} )
    SET( ADD_SOURCES  SOURCES ${BUILD}/${SOLUTION}.sln )
  else( MSVC )
    build_command( BUILD_COMMAND CONFIGURATION ${CMAKE_BUILD_TYPE}
PROJECT_NAME ${SOLUTION} TARGET install )
    SEPARATE_ARGUMENTS( BUILD_COMMAND UNIX_COMMAND ${BUILD_COMMAND} )
  endif( MSVC )

  if( CMAKE_TOOLCHAIN_FILE )
    set( TOOLCHAIN -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} )
  endif( CMAKE_TOOLCHAIN_FILE )

  set( FAKE_ARGN1 ${ARGN})
  string (REPLACE ";" " " FAKE_ARGN2 "${FAKE_ARGN1}")
  FILE( WRITE  ${BUILD}/makeit.bat "\"${CMAKE_COMMAND}\" -G
\"${CMAKE_GENERATOR}\" ${TOOLCHAIN} \"${PROJECT_SOURCE}\"
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${INSTALL}
${FAKE_ARGN2}\n" )
  string (REPLACE ";" " " FAKE_BUILD_COMMAND "${BUILD_COMMAND}")
  FILE( APPEND ${BUILD}/makeit.bat ${FAKE_BUILD_COMMAND} )

  add_custom_target( Build${PROJECT} ALL
          COMMAND makeit.bat
  WORKING_DIRECTORY ${BUILD}
          ${ADD_SOURCES}
  )
endmacro( BuildProject )
-----------------
usage is something like


set( PROJECT intershell )
set( EXTRA_FLAGS  -DSACK_SDK_ROOT_PATH=${SACK_SDK_ROOT_PATH} )
BuildProject( ${PROJECT} ${PROJECT}
${CMAKE_CURRENT_LIST_DIR}/../src/InterShell INTERSHELL_SDK_ROOT_PATH
${EXTRA_FLAGS} )
Add_custom_command( TARGET Build${PROJECT}
COMMAND
${INTERSHELL_SDK_ROOT_PATH}/intershell_deploy${CMAKE_EXECUTABLE_SUFFIX} -nr
WORKING_DIRECTORY ${INTERSHELL_SDK_ROOT_PATH}
)
add_dependencies( ${LAST_TARGET} Buildcore )

-----------------

Above sourced from

https://code.google.com/p/c-system-abstraction-component-gui/source/browse/cmake_all/CMakeLists.txt
and
https://code.google.com/p/c-system-abstraction-component-gui/source/browse/cmake_all/CMakeBuild.txt

--------------------


On Fri, Mar 15, 2013 at 4:37 AM, J Decker <d3ck0r at gmail.com> wrote:

> If the dependencies are already satisfied, and the cmake_make_program can
> run mutliple in parallel, then it works great.
>
> I have a cmake script that builds other cmake top level projects; and this
> ends up building in parallel on visual studio.
>
> can't do it with any other compiler I use for windows (make can be aliased
> on linux to include a /j4).
>
>
> On Fri, Mar 15, 2013 at 1:37 AM, Gregoire Aujay <gaujay at movea.com> wrote:
>
>> Hello,
>>
>> Thanks for your replies. I understand that I can only 'cmake --build' one
>> target at a time.
>> I think that the solutions you propose do not benefit from tools, like
>> ninja, that have parallel build capabilities.
>>
>> I'll file a feature request.
>>
>> Regards,
>> Greg
>>
>> -----Original Message-----
>> From: Nick Overdijk [mailto:nick at astrant.net]
>> Sent: jeudi 14 mars 2013 19:10
>> To: John Drescher
>> Cc: Gregoire Aujay; cmake at cmake.org
>> Subject: Re: [CMake] Build several targets using cmake --build <dir>
>>
>> You can only 'cmake' a single-target. If you want to have more targets,
>> create more directories: for each target one.
>>
>> On 2013-14-03, at 19:07:36 , John Drescher wrote:
>>
>> >> I use cmake 2.8.10 on windows.
>> >>
>> >>
>> >>
>> >> I would like to build several targets with cmake --build <dir> so
>> >> the underlying build tool to do parallel jobs.
>> >>
>> >>
>> >>
>> >> Currently it only seems to be possible to build one target at a time,
>> >> using --target .
>> >> (http://www.cmake.org/cmake/help/v2.8.10/cmake.html#opt:--builddir)
>> >>
>> >>
>> >>
>> >> Can someone tell me how I could achieve that with current cmake
>> version?
>> >>
>> >>
>> > I execute more than 1 cmake --build at the same time on windows. I
>> > actually do this in a program called runjobs
>> >
>> > http://www.codeproject.com/Articles/25810/Run-All-Jobs-at-Once-Utility
>> >
>> > John
>> > --
>> >
>> > 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
>>
>>
>>
>> --
>>
>> 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/20130315/ec62a2e0/attachment-0001.htm>


More information about the CMake mailing list