【问题标题】:CMake: Check if a target is a SHARED library inside a generator expressionCMake:检查目标是否是生成器表达式中的共享库
【发布时间】:2021-09-27 11:55:45
【问题描述】:

在标题中,我希望能够检查 TARGET Foo 是否是共享库(或静态库),因此我需要将其添加到 .csproj 生成的文件中(使用生成器表达式)。

类似这样的:

CMakeLists.txt:

...
file(GENERATE
  OUTPUT .../$<CONFIG>/foo.csproj
  INPUT foo.csproj.in)
...

foo.csproj.in:

...
<Content Include="$<TARGET_FILE:Bar>$<$<BOOL:$<TARGET_PROPERTY:Foo:BUILD_SHARED_LIBS>>:;$<TARGET_SONAME_FILE:Foo>>">
      <PackagePath>runtimes/@RUNTIME_IDENTIFIER@/native/%(Filename)%(Extension)</PackagePath>
      <Pack>true</Pack>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
...

预期输出

  • 如果Foo 是共享库(例如option(BUILD_SHARED_LIBS "Build shared libraries (.so or .dyld)." ON)
    我想要:

foo.csproj

...
<Content Include="build/lib/Bar.so;build/lib/Foo.so">
      <PackagePath>runtimes/linux-x64/native/%(Filename)%(Extension)</PackagePath>
      <Pack>true</Pack>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
...
  • 如果Foo 是静态库(例如-DBUILD_SHARED_LIBS=OFF
    我想要:

foo.csproj

...
<Content Include="build/lib/Bar.dll">
      <PackagePath>runtimes/win-x64/native/%(Filename)%(Extension)</PackagePath>
      <Pack>true</Pack>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
...

【问题讨论】:

标签: cmake


【解决方案1】:

经过几次测试(正如@Tsyvarev 发现的那样):

$<$<STREQUAL:$<TARGET_PROPERTY:Foo,TYPE>,SHARED_LIBRARY>:;$<TARGET_SONAME_FILE:Foo>>

旁注:必须使用SHARED_LIBRARY(不带引号)和 "SHARED_LIBRARY"

源代码: https://cmake.org/cmake/help/latest/prop_tgt/TYPE.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    相关资源
    最近更新 更多