[CMake] Config.cmake.in: Conditionally serve static or shared library

Kim Walisch kim.walisch at gmail.com
Wed Feb 14 15:47:24 EST 2018


Thanks, I got it working!

Unfortunately I could not make the generator expression work inside
PrimesieveConfig.cmake.in, here is the error message:

CMake Error:
  Error evaluating generator expression:
    $<BUILD_SHARED_LIBS:libprimesieve>
  Expression did not evaluate to a known generator expression

Note that in my main CMakeLists.txt the generator expression worked
fine. But I figured out I don't actually need the generator expression,
the following code inside my PrimesieveConfig.cmake.in does the trick:

if(BUILD_SHARED_LIBS)
        add_library(Primesieve::Primesieve INTERFACE IMPORTED)
        set_target_properties(Primesieve::Primesieve PROPERTIES
                INTERFACE_LINK_LIBRARIES "Primesieve::libprimesieve")
else()
        add_library(Primesieve::Primesieve INTERFACE IMPORTED)
        set_target_properties(Primesieve::Primesieve PROPERTIES
                INTERFACE_LINK_LIBRARIES "Primesieve::libprimesieve-static")
endif()

This trick is also used by the c-ares library:
https://github.com/gjasny/c-ares/blob/fec405a420597180244e6c66912f09ae84b31123/c-ares-config.cmake.in

The trick was already discussed on the cmake mailing list before:
https://cmake.org/pipermail/cmake-developers/2017-June/030115.html

It would be really nice though if CMake would support library aliases for
import targets, then I could achieve the same using much nicer code.

Kim

On Wed, Feb 14, 2018 at 7:08 PM, Kim Walisch <kim.walisch at gmail.com> wrote:

> CMake currently does not allow alias libraries for import targets:
>
> $ cmake ..
> CMake Error at /usr/local/lib/cmake/primesieve/PrimesieveConfig.cmake:7
> (add_library):
>   add_library cannot create ALIAS target "my_libprimesieve" because target
>   "Primesieve::libprimesieve-static" is IMPORTED.
> Call Stack (most recent call first):
>   CMakeLists.txt:6 (find_package)
>
> -- Configuring incomplete, errors occurred!
>
> Kim
>
>
> On Wed, Feb 14, 2018 at 5:34 PM, ThePhD <jm3689 at columbia.edu> wrote:
>
>> I think you can use what's called an "Alias Library":
>> https://cmake.org/cmake/help/latest/command/add_li
>> brary.html#alias-libraries
>>
>> if (BUILD_SHARED_LIBS)
>>      add_library(my_libprimesieve ALIAS libprimesieve)
>> else
>>      add_library(my_libprimesieve ALIAS libprimesieve-static)
>> endif(BUILD_SHARED_LIBS)
>>
>> Then, set it properly to Primesieve::Primesieve and it should work.
>>
>>
>> On Wed, Feb 14, 2018 at 10:21 AM, Kim Walisch <kim.walisch at gmail.com>
>> wrote:
>>
>>> Hi,
>>>
>>> My primesieve project builds as both a static and a shared library, hence
>>> there are 2 targets in my main CMakeLists.txt:
>>>
>>> 1) libprimesieve (shared library)
>>> 2) libprimesieve-static
>>>
>>> I am now trying to add support for find_package(Primesieve). Ideally I
>>> would like that users can link against libprimesieve as follows:
>>>
>>> find_package(Primesieve REQUIRED)
>>> target_link_libraries(user_library Primesieve::Primesieve)
>>>
>>> And I want Primesieve::Primesieve to be an alias for
>>> Primesieve::libprimesieve if BUILD_SHARED_LIBS=ON (in the user's
>>> CMakeLists.txt) and and alias for Primesieve::libprimesieve-static if
>>> BUILD_SHARED_LIBS=OFF (or if it is not set).
>>>
>>> Is this possible?
>>> Do you know any library that has already implemented this?
>>>
>>> Thanks,
>>> Kim
>>>
>>> --
>>>
>>> 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:
>>> https://cmake.org/mailman/listinfo/cmake
>>>
>>>
>>
>> --
>>
>> 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:
>> https://cmake.org/mailman/listinfo/cmake
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20180214/3716c117/attachment-0001.html>


More information about the CMake mailing list