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 <[email protected] >> <mailto:[email protected]>> 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 >>>> <[email protected] <mailto:[email protected]>> 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 <[email protected] >>>>>> <mailto:[email protected]>> 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 [email protected]: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 >>>>>> >>>>>> >>>>>> >>>>>> >>>>> >>>> >>> >> >> >> > > >
signature.asc
Description: OpenPGP digital signature
-- 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
