[CMake] does cmake scripts execute sequentially?

Carlton Banks noflaco at gmail.com
Sat Oct 28 21:10:49 EDT 2017


> Den 29. okt. 2017 kl. 02.06 skrev J Decker <d3ck0r at gmail.com>:
> 
> I recently added externaproject_add() to download a library, but since it doesn't do the download until build, I had to put a conditional around the second part of the cmake that used the libraries it produced so it would do a cmake configure/generate, cmake build, cmake configure/generate and a final build and all was good... 
> 
Yes… that sound exactly like the problem I am currently facing..
> https://github.com/d3x0r/sack.vfs/blob/master/CMakeLists.gui.txt#L61 <https://github.com/d3x0r/sack.vfs/blob/master/CMakeLists.gui.txt#L61>
I am not sure I understand how your if statement fixes this?.. when does it download?
> 
> but I coudln't reference any directories that didn't exist yet in include_directories, or link_directories...until the project had been at least partially built.
> 
> On Sat, Oct 28, 2017 at 6:00 PM, Craig Scott <craig.scott at crascit.com <mailto:craig.scott at crascit.com>> wrote:
it still doesn’t work… 

I am bit unsure of what is being done here..  I need to include the libraryportaudio.a to include portaudio into the project. 

which causes an error as the download only occurs during build (make) and not during cmake. 

> Ah, sorry. This particular problem has been fixed <https://gitlab.kitware.com/cmake/cmake/merge_requests/1264> on CMake master, but it won't be in the 3.10 release (in release candidate stage), so that isn't going to help you right now. Possibly you might be able to modify the relevant target property directly rather than using target_include_directories() - again this is untested, but worth a try:
> 
> set_property(TARGET portaudio APPEND PROPERTY
>     INTERFACE_INCLUDE_DIRECTORIES ${SOURCE_DIR}/include
> )
> 
> If that doesn't work, then I guess modifying your original method to use the correct path may be an alternative workaround:
> 
> target_include_directories(record PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE_DIR}/include)
> 
> 
> 
> 
> On Sun, Oct 29, 2017 at 11:47 AM, Carlton Banks <noflaco at gmail.com <mailto:noflaco at gmail.com>> wrote:
> 
>> Den 29. okt. 2017 kl. 02.29 skrev Craig Scott <craig.scott at crascit.com <mailto:craig.scott at crascit.com>>:
>> 
>> 
>> 
>> On Sun, Oct 29, 2017 at 11:26 AM, Carlton Banks <noflaco at gmail.com <mailto:noflaco at gmail.com>> wrote:
>> CMake Error at src/include/record/CMakeLists.txt:28 (target_include_directories):
>>   Cannot specify include directories for imported target "portaudio".
>> 
>> 
>> is the problem that externalProject_add only is executed when make is executed and not when cmake is executed’?
>> what is `portaudio` here referring to?
>> 
>> The name "portaudio" is the target defined by the add_library() call in my example (the imported target that represents what the ExternalProject_Add() is going to create at build time).
> 
> 	ok.
> 
>> Did you also try the INTERFACE IMPORTED alternative?
> 
> Still the same.. 
> 
>> It would be more useful if you showed the full CMakeLists.txt rather than just the error message.
>> 
> 
> The submodule cmakelist: 
> 
> https://pastebin.com/x2WNhK56 <https://pastebin.com/x2WNhK56>
> 
> tree structure
> 
> https://pastebin.com/xhPNCkN2 <https://pastebin.com/xhPNCkN2>
> 
> The outer cmakelist includes the inner directories. 
> 
>> 
>>  
>>> Den 29. okt. 2017 kl. 02.19 skrev Craig Scott <craig.scott at crascit.com <mailto:craig.scott at crascit.com>>:
>>> 
>>> 
>>> 
>>> On Sun, Oct 29, 2017 at 10:36 AM, Carlton Banks <noflaco at gmail.com <mailto:noflaco at gmail.com>> wrote:
>>> I seem to have some problems executing one of my submodules cmakelist.
>>> 
>>> MESSAGE(“In record CMAKELIST”)
>>> 
>>> # Include externalproject {portaudio} if lib/portaudio don't exist.
>>> MESSAGE(“Download external project”)
>>> 
>>> INCLUDE(ExternalProject)
>>> ExternalProject_Add(project_portaudio
>>>     GIT_REPOSITORY      https://git.assembla.com/portaudio.git <https://git.assembla.com/portaudio.git>
>>>     PREFIX              lib/portaudio
>>>     CONFIGURE_COMMAND   <SOURCE_DIR>/configure
>>>     BUILD_IN_SOURCE     1
>>>     BUILD_COMMAND       make
>>>     INSTALL_COMMAND     sudo make install
>>> )
>>> ExternalProject_Get_Property(project_portaudio BINARY_DIR)
>>> ExternalProject_Get_Property(project_portaudio SOURCE_DIR)
>>> 
>>> SET(portaudio_lib_dir "${BINARY_DIR}/lib/.libs")
>>> SET(portaudio_inc_dir "${SOURCE_DIR}/include")
>>> 
>>> add_library(record STATIC record.cpp record.h)
>>> add_library(libaudio libportaudio.a PATHS ${portaudio_lib_dir})
>>> 
>>> What is this second add_library() command intended to do? I'm guessing you probably instead want to be doing something like this (untested, but hopefully in the ballpark):
>>> 
>>> add_library(portaudio STATIC IMPORTED)
>>> set_target_properties(portaudio PROPERTIES
>>>     IMPORTED_LOCATION ${BINARY_DIR}/lib/.libs/libportaudio.a
>>> )
>>> target_include_directories(portaudio INTERFACE
>>>     ${SOURCE_DIR}/include
>>> )
>>> add_dependencies(portaudio project_portaudio)     # Not sure if this is allowed for imported targets though
>>> 
>>> I don't recall off the top of my head whether STATIC IMPORTED or INTERFACE IMPORTED would be the right way to call add_library() in the above, so try the latter if the former doesn't work for you. 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> #
>>> # this makes sure we have compiler flags that allow class::class() = default (>= C++11)
>>> target_compile_features(record PUBLIC cxx_defaulted_functions)
>>> 
>>> 
>>> 
>>> 
>>> target_include_directories(record PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${project_portaudio})
>>> 
>>> You won't need this if you define the portaudio imported library as per my example above.
>>> 
>>>  
>>> 
>>> 
>>> It cannot find libportaudio.a as externalproject_add() is not being executed, the command it executes add_library, which fails as the project has not been downloaded…
>>> 
>>> 
>>> what is wrong here?
>>> 
>>> The reason for this specific problem is that there's no dependency relationship between the project_portaudio target defined by the ExternalProject_Add() call and the record target. Such a relationship is only created through a suitable call to target_link_libraries() or add_dependencies(), or through arguments like DEPENDS for commands that offer such features (e.g. add_custom_target() and add_custom_command()).
>>> 
>>> 
>>> -- 
>>> Craig Scott
>>> Melbourne, Australia
>>> https://crascit.com <https://crascit.com/>
>> 
>> 
>> 
>> 
>> -- 
>> Craig Scott
>> Melbourne, Australia
>> https://crascit.com <https://crascit.com/>
> 
> 
> 
> 
> -- 
> Craig Scott
> Melbourne, Australia
> https://crascit.com <https://crascit.com/>
> 
> --
> 
> 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 <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 <http://cmake.org/cmake/help/support.html>
> CMake Consulting: http://cmake.org/cmake/help/consulting.html <http://cmake.org/cmake/help/consulting.html>
> CMake Training Courses: http://cmake.org/cmake/help/training.html <http://cmake.org/cmake/help/training.html>
> 
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html <http://www.kitware.com/opensource/opensource.html>
> 
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/cmake <http://public.kitware.com/mailman/listinfo/cmake>
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20171029/bfe4df4e/attachment-0001.html>


More information about the CMake mailing list