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

Yu Jing yujing5b5d at gmail.com
Tue Sep 16 04:41:37 EDT 2014


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> 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: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: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 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> 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> 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 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 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
>>>> 
>>>> 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/28c94a93/attachment-0001.html>


More information about the CMake mailing list