[CMake] Fwd: how do I test if a library target is static or shared?

Mike Jackson mike.jackson at bluequartz.net
Tue Sep 23 13:15:07 EDT 2008


That is basically what I do. Until someone tells me a better way.

Take a look at the following link:

http://www.bluequartz.net/viewvc/CTMD/MXATools/CMakeLists.txt?view=markup 

for an example of how I am doing things.

mike

Aleksander Demko wrote:
> I guess I'm looking for a way to automatically "relay" information
> between the main project B and one or more library projects A, etc. My
> projects tend to involve lots of sub libraries, so I need a way for
> this to work in a scalable manner.
>
> If I try to simply INCLUDE A in B, then all the relative source paths
> in the add_library call do not work. Is there a nice work around for
> this?
>
> My current solution involves that I, in executable B, do an
> ADD_SUBDIRECTORY on A. I then have a few (gross) macros that help me
> propagate the include dirs and defines in A up to B. The macros
> inspect and manipulate the COMPILE_FLAGS properties of the targets.
> Here is a short example (my macros are named I_*):
>
> ...
> ADD_SUBDIRECTORY(${DBA_SRC_PATH} dba)
> ...
> ADD_LIBRARY(wxdba wxdba/colour_fi...
> I_ADD_RELATIVE_INCLUDE(wxdba .)
> I_TARGET_LINK_LIBRARY(wxdba dba)
> I_ADD_COMPILE_FLAGS(wxdba /DwxUSE_UNICODE)
>
> Then sub executables can use wxdba and include all the cflags, include
> directories needed for both wxdba and its dependent project dba. The
> wxdba project also inherited any cflags/include directories that dba
> had via the I_TARGET... call.
>
> I was hoping for a more mainstream approach that requires less
> specialized macros.
>
> On Mon, Sep 22, 2008 at 7:41 PM, Mike Jackson
> <mike.jackson at bluequartz.net> wrote:
>   
>> Not totally sure what you are after BUT one possible implementation is
>> something like the following.
>>
>> If you have a Library A that you want to include in Executable B and Both
>> are there own projects based on CMake then there is "some" integration that
>> can happen.
>>
>> So for library A you have a normal CMakeLists.txt file for that project.
>> Then for the executable project you simply "include" the CMakeLists.txt file
>> from library A.
>>
>> If the "Library A" project you have:
>> add_library (A SHARED ${sources})
>>
>> Then in the executable project you have something like:
>>
>> add_executable (myexec ${sources} )
>> target_link_libraries(myexec A)
>>
>> When you build the executable project CMake will automatically build the "A"
>> library first. This is one way to achieve this. ( I do this in a few of my
>> projects ).
>>
>>
>>
>> Some helper code that might be handy:
>> # This code goes in the Executable projects CMakeLists.txt file
>> # --- Get the LibA Project by looking for a folder called "src" in the
>> LibraryA folder
>> GET_FILENAME_COMPONENT(CURRENT_SOURCE_PARENT ${CMAKE_CURRENT_SOURCE_DIR}
>> PATH)
>> FIND_PATH(A_SOURCE_DIR src
>>  "${CURRENT_SOURCE_PARENT}/LibraryA"
>> )
>> IF (NOT A_SOURCE_DIR)
>>    MESSAGE(FATAL_ERROR "Could not find LibraryA Directory. Please set the
>> directory")
>> ENDIF(NOT MXA_SOURCE_DIR)
>>
>> Now. if you can not do something like the above or you don't want to tie the
>> projects together like that then you can "configure" a header file from
>> LibraryA that can be used in the executable project to "relay" information
>> about the library, like if it was built as a shared or static library.
>> Again, this is also done in lots of projects.
>>
>> The last way to "relay" information would be to have CMake write the
>> information into a simple text file that the executable project can then
>> parse.
>>
>> Keep asking.. we'll help as much as we can.
>> ---
>> Mike Jackson - Principal Software Engineer
>> www.bluequartz.net
>>
>>
>>
>>
>> On Sep 22, 2008, at 5:46 PM, Aleksander Demko wrote:
>>
>>     
>>> Dang, that won't work for me. I'm in effect trying to make my own
>>> EXPORT like command (export doesn't maintain C flags or other stuff I
>>> need) so I need to be able to gleam a bunch of info from the library
>>> targets dynamically.
>>>
>>> Basically I want to quickly build one library in one cmake session,
>>> than import it in another (without have to write custom Find-.cmake
>>> files etc). Maybe this exists already in cmake, but I can't seem to
>>> find it.
>>>
>>>
>>> On Mon, Sep 22, 2008 at 4:32 PM, Mike Jackson
>>> <mike.jackson at bluequartz.net> wrote:
>>>       
>>>> You will probably have to set your own variable into the cache and then
>>>> check that variable later on in your scripts
>>>>
>>>>
>>>>
>>>> On Sep 22, 2008, at 5:23 PM, Aleksander Demko wrote:
>>>>
>>>>         
>>>>> On Mon, Sep 22, 2008 at 4:15 PM, Mike Jackson
>>>>> <mike.jackson at bluequartz.net> wrote:
>>>>>           
>>>>>> Assuming you mean a library that you are creating the default is
>>>>>> static.
>>>>>> If
>>>>>> you want a dynamic library then use the "SHARED" keyword:
>>>>>>
>>>>>> add_library (mylib SHARED libsource.cpp)
>>>>>>
>>>>>>             
>>>>> I understand that. But later in my script I want to check if mylib is
>>>>> shared or static with an IF command. I want the command to know if the
>>>>> add_library was the default static, shared or shared because
>>>>> BUILD_SHARE_LIBS is true.
>>>>>           
>>>



More information about the CMake mailing list