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

Robert Maynard robert.maynard at kitware.com
Thu Feb 15 11:39:59 EST 2018


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.

3.11 will include support for aliasing import targets, as long as the
import target was marked with GLOBAL visibility.

On Wed, Feb 14, 2018 at 3:47 PM, Kim Walisch <kim.walisch at gmail.com> wrote:
> 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_library.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
>>>
>>
>
>
> --
>
> 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
>


More information about the CMake mailing list