[CMake] how to force assign sequence in multi-thread in cmake

Micha Hergarden micha.hergarden at gmail.com
Tue Sep 16 07:57:54 EDT 2014


Hello Yu,

That is because of the following lines:

AUX_SOURCE_DIRECTORY(. DIR_TARGET)
ADD_LIBRARY (relfiles ${DIR_TARGET})

I think you may be misusing the aux_source_directory command. I have
tested your setup on a linux machine with -j8 and it still builds. Did
you take a look at the openchemistry setup?

Regards,
Micha

On 09/16/2014 01:42 PM, Yu Jing wrote:
> Hello Micha,
> It seems still not work….
>
> On Sep 16, 2014, at 17:36, Micha Hergarden <micha.hergarden at gmail.com
> <mailto:micha.hergarden at gmail.com>> wrote:
>
>> Hello Yu,
>>
>> It seems I too needed another trick to make it work:
>> set_property(TARGET CRFPP_EX_PROJ PROPERTY EXCLUDE_FROM_ALL TRUE)
>> set_property(TARGET LEVELDB_EX_PROJ PROPERTY EXCLUDE_FROM_ALL TRUE)
>>
>> ADD_DEPENDENCIES(cmake_sample iniparser_static CRFPP_EX_PROJ
>> LEVELDB_EX_PROJ)
>>
>> By default the ExternalProject_Add will add that target to the ALL
>> target, and that confuses the Make dependency checker. I have removed
>> those dependencies in my project. On the whole I agree with Marcel
>> Loose and Petr Kmoch however. Combining their solution makes for a
>> 'cleaner' project. To be honest, I am halfway of migrating my project
>> to a superbuild as well. Take a look at the openchemistry project if
>> you would like to see an example of that:
>> https://github.com/OpenChemistry/openchemistry
>>
>> Regards,
>> Micha Hergarden
>>
>>
>> On 09/16/2014 11:04 AM, Marcel Loose wrote:
>>> Hi Yu,
>>>
>>> I think you need to add an explicit dependency of main.cc
>>> <http://main.cc> on the "generated" (well, not really generated, but
>>> installed) header file crfpp.h. CMake has no clue as to what files
>>> are being compiled/installed by your external project, so you have
>>> to make this explicit.
>>>
>>> HTH,
>>> Marcel Loose.
>>>
>>>
>>> On 16/09/14 10:41, Yu Jing wrote:
>>>> Hello  Micha ,
>>>>
>>>> It seems doesn’t work.
>>>> I updated code , and move the external project to src , and it
>>>> still not work.
>>>>
>>>> what should be noticed is :
>>>> 1. If I just use 
>>>> $ make
>>>> as make command ,all styles are work
>>>> 2. If I use in multi jobs
>>>> $ make -j8
>>>> It will run abnormal (not desired sequence) .
>>>>
>>>>
>>>> On Sep 16, 2014, at 15:27, Micha Hergarden
>>>> <micha.hergarden at gmail.com <mailto:micha.hergarden at gmail.com>> wrote:
>>>>
>>>>> It may be that you have line 63 and 64 the wrong way around:
>>>>> ADD_SUBDIRECTORY(src)
>>>>> ADD_SUBDIRECTORY(lib)
>>>>>
>>>>> The externalproject is added in lib, but you add a dependency on
>>>>> it in src. CMake will descend in the subdirectories in the order
>>>>> you supply them.
>>>>> Does reversing the directories help?
>>>>>
>>>>> Regards,
>>>>> Micha
>>>>>
>>>>> On 09/16/2014 09:17 AM, Yu Jing wrote:
>>>>>> I am in OSX 10.9.4 , a sample in  github is
>>>>>> : https://github.com/yujing5b5d/cmake_sample
>>>>>> after git clone this project , a operation like this :
>>>>>> ------------------------------------------------------------------------------------------------------------
>>>>>>
>>>>>> *yu:cmake_sample yu$ mkdir build*
>>>>>> *yu:cmake_sample yu$ cd build/*
>>>>>> *yu:build yu$ cmake ..*
>>>>>> …. # skip some useless output
>>>>>> -- Configuring done
>>>>>> -- Generating done
>>>>>> -- Build files have been written to:
>>>>>> /Users/yu/Workspace/res/cmake_sample/build
>>>>>> *yu:build yu$ make -j8 ### <<<<<<<<<<<<<<<*
>>>>>> Scanning dependencies of target LEVELDB_EX_PROJ
>>>>>> Scanning dependencies of target iniparser
>>>>>> Scanning dependencies of target relfiles
>>>>>> Scanning dependencies of target CRFPP_EX_PROJ
>>>>>> Scanning dependencies of target iniparser_static
>>>>>> [ 15%] [ 15%] [ 20%] [ 20%] [ 25%] Building C object
>>>>>> lib/iniparser/CMakeFiles/iniparser_static.dir/ini.c.o
>>>>>> Creating directories for 'CRFPP_EX_PROJ'
>>>>>> Creating directories for 'LEVELDB_EX_PROJ'
>>>>>> Building C object lib/iniparser/CMakeFiles/iniparser.dir/ini.c.o
>>>>>> Building CXX object src/CMakeFiles/relfiles.dir/main.cc.o
>>>>>> [ 30%] [ 35%] Performing download step (git clone) for
>>>>>> 'LEVELDB_EX_PROJ'
>>>>>> Performing download step (git clone) for 'CRFPP_EX_PROJ'
>>>>>> /Users/yu/Workspace/res/cmake_sample/src/main.cc
>>>>>> <http://main.cc/>:3:10: fatal error: 'crfpp.h' file not found
>>>>>> #include "crfpp.h" // crfpp
>>>>>>          ^
>>>>>> Cloning into 'CRFPP_EX_PROJ'...
>>>>>> Cloning into 'LEVELDB_EX_PROJ'...
>>>>>> Linking C static library ../libiniparser.a
>>>>>> Linking C shared library ../libiniparser.dylib
>>>>>> [ 35%] [ 35%] Built target iniparser_static
>>>>>> Built target iniparser
>>>>>> Scanning dependencies of target cmake_sample
>>>>>> [ 40%] Building CXX object src/CMakeFiles/cmake_sample.dir/main.cc.o
>>>>>> /Users/yu/Workspace/res/cmake_sample/src/main.cc
>>>>>> <http://main.cc/>:3:10: fatal error: 'crfpp.h' file not found
>>>>>> #include "crfpp.h" // crfpp
>>>>>>          ^
>>>>>> 1 error generated.
>>>>>> 1 error generated.
>>>>>> make[2]: *** [src/CMakeFiles/relfiles.dir/main.cc.o] Error 1
>>>>>> make[2]: *** [src/CMakeFiles/cmake_sample.dir/main.cc.o] Error 1
>>>>>> make[1]: *** [src/CMakeFiles/relfiles.dir/all] Error 2
>>>>>> make[1]: *** Waiting for unfinished jobs....
>>>>>> make[1]: *** [src/CMakeFiles/cmake_sample.dir/all] Error 2
>>>>>> ….
>>>>>> ------------------------------------------------------------------------------------------------------------
>>>>>>
>>>>>> BE CAREFUL OF THIS LINE :
>>>>>> *>> yu:build yu$ make -j8*
>>>>>> *
>>>>>> *
>>>>>> the ExternalProject CRFPP_EX_PROJ’s result contains copy a
>>>>>> crfpp.h  header to a special path, after this process , we can
>>>>>> use #include “crfpp.h" ,and If I use 
>>>>>> make -j8
>>>>>> this means 8 jobs can be running at the same time, I can not
>>>>>> constraints and let my compiler compile my main.cc
>>>>>> <http://main.cc/> after CRFPP_EX_PROJ finished.
>>>>>>
>>>>>> Of course , I’m not sure is this my misuse this project .
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Sep 16, 2014, at 14:55, Micha Hergarden
>>>>>> <micha.hergarden at gmail.com <mailto:micha.hergarden at gmail.com>> wrote:
>>>>>>
>>>>>>> Hello all,
>>>>>>>
>>>>>>> I do use the ExternalProject to prebuild some binaries, without
>>>>>>> the 'superproject' setup, and it does seem to work. Using the
>>>>>>> add_dependencies, I can make sure some third party libs are
>>>>>>> prebuild before I start to build my project. I have seen some
>>>>>>> issues with ExternalProject (failing to extract, or build), but
>>>>>>> they are too rare to pinpoint and create a bugreport.
>>>>>>>
>>>>>>> What exactly does not work? Is the external project not build at
>>>>>>> all, or just not in time?
>>>>>>>
>>>>>>> Regards,
>>>>>>> Micha
>>>>>>>
>>>>>>> On 09/16/2014 08:30 AM, Petr Kmoch wrote:
>>>>>>>> Hi.
>>>>>>>>
>>>>>>>> I've never worked with ExternalProject myself, so I can't
>>>>>>>> comment with certainty, but from what I understand, the correct
>>>>>>>> way of using ExternalProject is to add your own project as an
>>>>>>>> ExternalProject as well. Basically, the toplevel CMakeList
>>>>>>>> becomes a superbuild which *only* does ExternalProject_Add()
>>>>>>>> calls and does not add any libraries/executables directly.
>>>>>>>> After you build the superbuild once to get all the dependencies
>>>>>>>> correct, you switch to the "external" project of your own code
>>>>>>>> and work with that normally.
>>>>>>>>
>>>>>>>> Petr
>>>>>>>>
>>>>>>>> On Mon, Sep 15, 2014 at 4:13 PM, Yu Jing <yujing5b5d at gmail.com
>>>>>>>> <mailto:yujing5b5d at gmail.com>> wrote:
>>>>>>>>
>>>>>>>>     I had asked in http://stackoverflow.com/questions/25841602 
>>>>>>>>     , someone told me maybe here is a better place to ask.
>>>>>>>>
>>>>>>>>     I am writing a project base on crfpp , a external project.
>>>>>>>>     I use cmake to integerate this project as follow .
>>>>>>>>
>>>>>>>>     firstly , I add a extenal project like this:
>>>>>>>>
>>>>>>>>     |EXTERNALPROJECT_ADD(
>>>>>>>>                 CRFPP_EX_PROJ
>>>>>>>>                 GIT_REPOSITORY git at github.com:yujing5b5d/crfpp.git
>>>>>>>>                 PREFIX ${CMAKE_CURRENT_BINARY_DIR}
>>>>>>>>                 CONFIGURE_COMMAND ./configure
>>>>>>>>                 BUILD_COMMAND make -j8
>>>>>>>>                 BUILD_IN_SOURCE 1
>>>>>>>>                 INSTALL_COMMAND cp .libs/libcrfpp.a ${PROJECT_BINARY_DIR}/lib && cp crfpp.h ${PROJECT_BINARY_DIR}/include 
>>>>>>>>         )|
>>>>>>>>
>>>>>>>>     this will generate some .a file and copy a header
>>>>>>>>     file |crfpp.h| to folder |${PROJECT_BINARY_DIR}/include| ,
>>>>>>>>     which is included in my project.
>>>>>>>>
>>>>>>>>     and then , use the |${PROJECT_BINARY_DIR}/include| as
>>>>>>>>     include path as follow .
>>>>>>>>
>>>>>>>>     |INCLUDE_DIRECTORIES(
>>>>>>>>         ${PROJECT_SOURCE_DIR}/include
>>>>>>>>         ${PROJECT_BINARY_DIR}/include
>>>>>>>>     )|
>>>>>>>>
>>>>>>>>     finally , when I compile the main project , code like this :
>>>>>>>>
>>>>>>>>     |ADD_EXECUTABLE(cmake_sample main.cc)
>>>>>>>>     ADD_DEPENDENCIES(cmake_sample CRFPP_EX_PROJ)
>>>>>>>>     TARGET_LINK_LIBRARIES(cmake_sample crfpp)|
>>>>>>>>
>>>>>>>>     In general , if I just build a build folder, compile like
>>>>>>>>     this :
>>>>>>>>
>>>>>>>>     |cmake .
>>>>>>>>     .
>>>>>>>>      <
>>>>>>>>     /span>
>>>>>>>>     make|
>>>>>>>>
>>>>>>>>     It may works fine, compile the external project first , and
>>>>>>>>     copy the header file to desired place , and then continue
>>>>>>>>     compile main.cc <http://main.cc/> in my project . But if I
>>>>>>>>     use compile command as multi-thread like this :
>>>>>>>>
>>>>>>>>     |cmake 
>>>>>>>>      .
>>>>>>>>     .
>>>>>>>>     make -j8|
>>>>>>>>
>>>>>>>>     It will not works because my main.cc <http://main.cc/> and
>>>>>>>>     the external project are processed at same time, so it
>>>>>>>>     report a error like this :
>>>>>>>>
>>>>>>>>     |/Users/yu/Workspace/res/cmake_sample/src/main.cc:3:10: fatal error: 'crfpp.h' file not found
>>>>>>>>     #include "crfpp.h" // crfpp
>>>>>>>>              ^
>>>>>>>>     1 error generated.|
>>>>>>>>
>>>>>>>>     This |crfpp.h| will generated after |CRFPP_EX_PROJ| , but
>>>>>>>>     in multi-thread environment , the sequence is quite different .
>>>>>>>>
>>>>>>>>     My Question is : Is it possible that force let my project
>>>>>>>>     compile after these external projects all finished . BE
>>>>>>>>     CAREFUL , I'm not sure is this the problem of my use
>>>>>>>>     of |ADD_DEPENDENCIES| , I also wrote
>>>>>>>>
>>>>>>>>     |ADD_DEPENDENCIES(
>>>>>>>>     <
>>>>>>>>     span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background-color:transparent;background-repeat:initial initial">cmake_sample CRFPP_EX_PROJ)|
>>>>>>>>
>>>>>>>>     but it seems not works ?
>>>>>>>>
>>>>>>>>     Thanks for any help.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>     --
>>>>>>>>
>>>>>>>>     Powered by www.kitware.com <http://www.kitware.com/>
>>>>>>>>
>>>>>>>>     Please keep messages on-topic and check the CMake FAQ at:
>>>>>>>>     http://www.cmake.org/Wiki/CMake_FAQ
>>>>>>>>
>>>>>>>>     Kitware offers various services to support the CMake
>>>>>>>>     community. For more information on each offering, please visit:
>>>>>>>>
>>>>>>>>     CMake Support: http://cmake.org/cmake/help/support.html
>>>>>>>>     CMake Consulting: http://cmake.org/cmake/help/consulting.html
>>>>>>>>     CMake Training Courses:
>>>>>>>>     http://cmake.org/cmake/help/training.html
>>>>>>>>
>>>>>>>>     Visit other Kitware open-source projects at
>>>>>>>>     http://www.kitware.com/opensource/opensource.html
>>>>>>>>
>>>>>>>>     Follow this link to subscribe/unsubscribe:
>>>>>>>>     http://public.kitware.com/mailman/listinfo/cmake
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>
>> -- 
>>
>> Powered by www.kitware.com <http://www.kitware.com>
>>
>> Please keep messages on-topic and check the CMake FAQ at:
>> http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Kitware offers various services to support the CMake community. For
>> more information on each offering, please visit:
>>
>> CMake Support: http://cmake.org/cmake/help/support.html
>> CMake Consulting: http://cmake.org/cmake/help/consulting.html
>> CMake Training Courses: http://cmake.org/cmake/help/training.html
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Follow this link to subscribe/unsubscribe:
>> http://public.kitware.com/mailman/listinfo/cmake
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20140916/f8b46b64/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: OpenPGP digital signature
URL: <http://public.kitware.com/pipermail/cmake/attachments/20140916/f8b46b64/attachment-0001.sig>


More information about the CMake mailing list