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

Micha Hergarden micha.hergarden at gmail.com
Tue Sep 16 03:27:01 EDT 2014


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 ..
>>>     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/a8d026da/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/a8d026da/attachment-0001.sig>


More information about the CMake mailing list