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

Micha Hergarden micha.hergarden at gmail.com
Tue Sep 16 05:36:26 EDT 2014


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 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
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>>
>>
>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20140916/b0591308/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/b0591308/attachment-0001.sig>


More information about the CMake mailing list