[CMake] Variable target name visible at the top level

Vyacheslav Karamov ubuntulist at yandex.ru
Fri Oct 26 05:29:18 EDT 2012


26.10.2012 12:16, Eric Noulard пишет:
> 2012/10/26 Vyacheslav Karamov <ubuntulist at yandex.ru>:
>> Hi All!
>>
>> I have project with the structure similar to this
>>
>> worker
>>   |     |
>>   |     chatterbox
>>   |     |    |
>>   |     |    CMakeLists.txt
>>   |     |
>>   |     externals
>>   |     |    |
>>   |     |    sndlib
>>   |     |       |
>>   |     |       CMakeLists.txt
>>   |     CMakeLists.txt
>>   |
>>   CMakeLists.txt
>>
>>
>>
>> $ cat worker/CMakeLists.txt
>>
>> cmake_minimum_required(VERSION 2.6)
>>
>> add_subdirectory(externals)
>> add_subdirectory(chatterbox)
>>
>> If I set sndlib target as a variable
>>
>> set (snd_lib "sndlib")
>> add_library(${snd_lib} SHARED ...)
>>
>> variable ${snd_lib} is undefined at the parent scope, i.e. I can't use
>> ${snd_lib} in chatterbox/ CMakeLists.txt
>>
>> target_link_libraries(chatterbox  ${snd_lib})  # ${snd_lib} is empty!
> >From your description this is strange because 'chatterbox'
> is a subdir of 'worker' where snd_lib has been defined so it should be
> visible, I guess...
>
> unless you define the snd_lib var AFTER you
> add_subdirectory(chatterbox)
>
> since add_subdirectory process subdir first you must define
> variable you need before "add_subdirectory".
I have added "externals" before "chatterbox", so

${snd_lib} should be defined in chatterbox.

>> How to handle this situation in a proper way?
> Define it at the scope it ought to be ?
> or use
>   set (snd_lib "sndlib" PARENT_SCOPE)
>
> but again I think your problems comes from the fact
> your defined your var after add_subdirectory.
>
PARENT_SCOPE variable is visible only in a parent scope, not in a 
current one. But I need it in current scope, parent scope and scope 
above parent.



More information about the CMake mailing list