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

Marcel Loose loose at astron.nl
Tue Sep 16 05:04:14 EDT 2014


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 ..
>>>>>     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/3049c3a7/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: loose.vcf
Type: text/x-vcard
Size: 292 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/cmake/attachments/20140916/3049c3a7/attachment-0001.vcf>


More information about the CMake mailing list