78

Some libraries follow different conventions for their filenames, such as the PAM libs -- pam_unix.so, not libpam_unix.so.

How do you override the target library filename in CMake to get something like new_thing.so instead of the default libnew_thing.so?

CivFan
  • 13,560
  • 9
  • 41
  • 58

2 Answers2

121

You can change the Prefix, Output Name and Suffix using the set_target_properties() function and the PREFIX / OUTPUT_NAME / SUFFIX property in the following way:

Prefix:

    set_target_properties(new_thing PROPERTIES PREFIX "")

Output Name:

    set_target_properties(new_thing PROPERTIES OUTPUT_NAME "better_name")

Suffix:

    set_target_properties(new_thing PROPERTIES SUFFIX ".so.1")
CivFan
  • 13,560
  • 9
  • 41
  • 58
tamas.kenez
  • 7,301
  • 4
  • 24
  • 34
  • 9
    Note that this also works with generator expressions. So, you can use `set_target_properties(new_thing PROPERTIES OUTPUT_NAME "new_thing$<$:d>"` to add a `d` to `new_thing` for the `Debug` build of a multi-configuration project. – Adrian W Jun 27 '18 at 15:44
22

Since this has to do with the filename, you might think to look at install for the answer. (And sure enough, there's a RENAME clause, but that's a red herring.)

Instead, change the target, using the set_target_properties command.

Library targets have the built-in property, PREFIX. The other relevant one is SUFFIX. These two properties get tacked on to the target name to decide the final filename at install.

For the OQ:

# By default, the library filename will be `libnew_thing.so`
add_library(new_thing ${NEW_THING_SRCS})

# This changes the filename to `new_thing.so`
set_target_properties(new_thing PROPERTIES PREFIX "")

Let's say you also wanted the filename to have the version:

# This then changes the filename to `new_thing.so.1`,
# if the version is set to "1".
set_target_properties(new_thing
        PROPERTIES PREFIX ""
                   SUFFIX ".so.${NEW_THING_VER}"
        )
CivFan
  • 13,560
  • 9
  • 41
  • 58