Boost logo

Boost :

Subject: [boost] cmake target and binary name mangling (was: Re: CMake Announcement from Boost Steering Committee)
From: Niall Douglas (s_sourceforge_at_[hidden])
Date: 2017-07-23 10:42:34


>> As I already mentioned in another post, specifying the entire
>> configuration in the target name is exactly the right way to implement
>> modern cmake 3.
>
> Wouldn't this, if taken to its logical conclusion, amount to a (poor?)
> reimplementation of Boost.Build in CMake? I mean, once you have
> target-<variant>debug-<link>static that's pretty much what it is.

Why fix something that's broke? Closely replicating the Boost.Build
design will make replacing Boost.Build with cmake so much easier. All
the dependent tooling etc will "just work".

Besides, John Maddock is 100% right that ABI requirements ought to be
encoded into the shared library name. Saves so much time and hassle and
confusion, plus consumers can easily REGEX out the link requirements if
needed.

Here are the cmake targets which my quickcpplib tooling autogenerates
for AFIO v2 based on inspection of the environment (apologies for the
long list in advance):

```
ned_at_lyta:~/windocs/boostish/afio/build_posix$ make help | sort
... afio-asan
... afio_dl
... afio_dl-asan
... afio_dl-asan-atuple
... afio_dl-asan-coverage_main
... afio_dl-asan-execinfo_win64
... afio_dl-asan-file_handle_create_close
... afio_dl-asan-file_handle_lock_unlock
... afio_dl-asan-map_handle_create_close
... afio_dl-asan-open_hash_index
... afio_dl-asan-packed_backtrace
... afio_dl-asan-ringbuffer_log
... afio_dl-asan-section_handle_create_close
... afio_dl-asan-shared_fs_mutex
... afio_dl-asan-spinlock_tribool
... afio_dl-asan-test_guard
... afio_dl-asan-test_import
... afio_dl-asan-test_message
... afio_dl-asan-type_traits
... afio_dl--atuple
... afio_dl--coverage_main
... afio_dl--execinfo_win64
... afio_dl--file_handle_create_close
... afio_dl--file_handle_lock_unlock
... afio_dl--map_handle_create_close
... afio_dl-msan
... afio_dl-msan-atuple
... afio_dl-msan-coverage_main
... afio_dl-msan-execinfo_win64
... afio_dl-msan-file_handle_create_close
... afio_dl-msan-file_handle_lock_unlock
... afio_dl-msan-map_handle_create_close
... afio_dl-msan-open_hash_index
... afio_dl-msan-packed_backtrace
... afio_dl-msan-ringbuffer_log
... afio_dl-msan-section_handle_create_close
... afio_dl-msan-shared_fs_mutex
... afio_dl-msan-spinlock_tribool
... afio_dl-msan-test_guard
... afio_dl-msan-test_import
... afio_dl-msan-test_message
... afio_dl-msan-type_traits
... afio_dl--open_hash_index
... afio_dl--packed_backtrace
... afio_dl--ringbuffer_log
... afio_dl--section_handle_create_close
... afio_dl--shared_fs_mutex
... afio_dl--spinlock_tribool
... afio_dl--test_guard
... afio_dl--test_import
... afio_dl--test_message
... afio_dl-tsan
... afio_dl-tsan-atuple
... afio_dl-tsan-coverage_main
... afio_dl-tsan-execinfo_win64
... afio_dl-tsan-file_handle_create_close
... afio_dl-tsan-file_handle_lock_unlock
... afio_dl-tsan-map_handle_create_close
... afio_dl-tsan-open_hash_index
... afio_dl-tsan-packed_backtrace
... afio_dl-tsan-ringbuffer_log
... afio_dl-tsan-section_handle_create_close
... afio_dl-tsan-shared_fs_mutex
... afio_dl-tsan-spinlock_tribool
... afio_dl-tsan-test_guard
... afio_dl-tsan-test_import
... afio_dl-tsan-test_message
... afio_dl-tsan-type_traits
... afio_dl--type_traits
... afio_dl-ubsan
... afio_dl-ubsan-atuple
... afio_dl-ubsan-coverage_main
... afio_dl-ubsan-execinfo_win64
... afio_dl-ubsan-file_handle_create_close
... afio_dl-ubsan-file_handle_lock_unlock
... afio_dl-ubsan-map_handle_create_close
... afio_dl-ubsan-open_hash_index
... afio_dl-ubsan-packed_backtrace
... afio_dl-ubsan-ringbuffer_log
... afio_dl-ubsan-section_handle_create_close
... afio_dl-ubsan-shared_fs_mutex
... afio_dl-ubsan-spinlock_tribool
... afio_dl-ubsan-test_guard
... afio_dl-ubsan-test_import
... afio_dl-ubsan-test_message
... afio_dl-ubsan-type_traits
... afio_docs
... afio_hl-asan-atuple
... afio_hl-asan-coverage_main
... afio_hl-asan-execinfo_win64
... afio_hl-asan-file_handle_create_close
... afio_hl-asan-file_handle_lock_unlock
... afio_hl-asan-map_handle_create_close
... afio_hl-asan-open_hash_index
... afio_hl-asan-packed_backtrace
... afio_hl-asan-ringbuffer_log
... afio_hl-asan-section_handle_create_close
... afio_hl-asan-shared_fs_mutex
... afio_hl-asan-spinlock_tribool
... afio_hl-asan-test_guard
... afio_hl-asan-test_import
... afio_hl-asan-test_message
... afio_hl-asan-type_traits
... afio_hl--atuple
... afio_hl--coverage_main
... afio_hl--execinfo_win64
... afio_hl--file_handle_create_close
... afio_hl--file_handle_lock_unlock
... afio_hl--map_handle_create_close
... afio_hl-msan-atuple
... afio_hl-msan-coverage_main
... afio_hl-msan-execinfo_win64
... afio_hl-msan-file_handle_create_close
... afio_hl-msan-file_handle_lock_unlock
... afio_hl-msan-map_handle_create_close
... afio_hl-msan-open_hash_index
... afio_hl-msan-packed_backtrace
... afio_hl-msan-ringbuffer_log
... afio_hl-msan-section_handle_create_close
... afio_hl-msan-shared_fs_mutex
... afio_hl-msan-spinlock_tribool
... afio_hl-msan-test_guard
... afio_hl-msan-test_import
... afio_hl-msan-test_message
... afio_hl-msan-type_traits
... afio_hl--open_hash_index
... afio_hl--packed_backtrace
... afio_hl--ringbuffer_log
... afio_hl--section_handle_create_close
... afio_hl--shared_fs_mutex
... afio_hl--spinlock_tribool
... afio_hl--test_guard
... afio_hl--test_import
... afio_hl--test_message
... afio_hl-tsan-atuple
... afio_hl-tsan-coverage_main
... afio_hl-tsan-execinfo_win64
... afio_hl-tsan-file_handle_create_close
... afio_hl-tsan-file_handle_lock_unlock
... afio_hl-tsan-map_handle_create_close
... afio_hl-tsan-open_hash_index
... afio_hl-tsan-packed_backtrace
... afio_hl-tsan-ringbuffer_log
... afio_hl-tsan-section_handle_create_close
... afio_hl-tsan-shared_fs_mutex
... afio_hl-tsan-spinlock_tribool
... afio_hl-tsan-test_guard
... afio_hl-tsan-test_import
... afio_hl-tsan-test_message
... afio_hl-tsan-type_traits
... afio_hl--type_traits
... afio_hl-ubsan-atuple
... afio_hl-ubsan-coverage_main
... afio_hl-ubsan-execinfo_win64
... afio_hl-ubsan-file_handle_create_close
... afio_hl-ubsan-file_handle_lock_unlock
... afio_hl-ubsan-map_handle_create_close
... afio_hl-ubsan-open_hash_index
... afio_hl-ubsan-packed_backtrace
... afio_hl-ubsan-ringbuffer_log
... afio_hl-ubsan-section_handle_create_close
... afio_hl-ubsan-shared_fs_mutex
... afio_hl-ubsan-spinlock_tribool
... afio_hl-ubsan-test_guard
... afio_hl-ubsan-test_import
... afio_hl-ubsan-test_message
... afio_hl-ubsan-type_traits
... afio-msan
... afio_sl
... afio_sl-asan
... afio_sl-asan-atuple
... afio_sl-asan-coverage_main
... afio_sl-asan-execinfo_win64
... afio_sl-asan-file_handle_create_close
... afio_sl-asan-file_handle_lock_unlock
... afio_sl-asan-map_handle_create_close
... afio_sl-asan-open_hash_index
... afio_sl-asan-packed_backtrace
... afio_sl-asan-ringbuffer_log
... afio_sl-asan-section_handle_create_close
... afio_sl-asan-shared_fs_mutex
... afio_sl-asan-spinlock_tribool
... afio_sl-asan-test_guard
... afio_sl-asan-test_import
... afio_sl-asan-test_message
... afio_sl-asan-type_traits
... afio_sl--atuple
... afio_sl--coverage_main
... afio_sl--execinfo_win64
... afio_sl--file_handle_create_close
... afio_sl--file_handle_lock_unlock
... afio_sl--map_handle_create_close
... afio_sl-msan
... afio_sl-msan-atuple
... afio_sl-msan-coverage_main
... afio_sl-msan-execinfo_win64
... afio_sl-msan-file_handle_create_close
... afio_sl-msan-file_handle_lock_unlock
... afio_sl-msan-map_handle_create_close
... afio_sl-msan-open_hash_index
... afio_sl-msan-packed_backtrace
... afio_sl-msan-ringbuffer_log
... afio_sl-msan-section_handle_create_close
... afio_sl-msan-shared_fs_mutex
... afio_sl-msan-spinlock_tribool
... afio_sl-msan-test_guard
... afio_sl-msan-test_import
... afio_sl-msan-test_message
... afio_sl-msan-type_traits
... afio_sl--open_hash_index
... afio_sl--packed_backtrace
... afio_sl--ringbuffer_log
... afio_sl--section_handle_create_close
... afio_sl--shared_fs_mutex
... afio_sl--spinlock_tribool
... afio_sl--test_guard
... afio_sl--test_import
... afio_sl--test_message
... afio_sl-tsan
... afio_sl-tsan-atuple
... afio_sl-tsan-coverage_main
... afio_sl-tsan-execinfo_win64
... afio_sl-tsan-file_handle_create_close
... afio_sl-tsan-file_handle_lock_unlock
... afio_sl-tsan-map_handle_create_close
... afio_sl-tsan-open_hash_index
... afio_sl-tsan-packed_backtrace
... afio_sl-tsan-ringbuffer_log
... afio_sl-tsan-section_handle_create_close
... afio_sl-tsan-shared_fs_mutex
... afio_sl-tsan-spinlock_tribool
... afio_sl-tsan-test_guard
... afio_sl-tsan-test_import
... afio_sl-tsan-test_message
... afio_sl-tsan-type_traits
... afio_sl--type_traits
... afio_sl-ubsan
... afio_sl-ubsan-atuple
... afio_sl-ubsan-coverage_main
... afio_sl-ubsan-execinfo_win64
... afio_sl-ubsan-file_handle_create_close
... afio_sl-ubsan-file_handle_lock_unlock
... afio_sl-ubsan-map_handle_create_close
... afio_sl-ubsan-open_hash_index
... afio_sl-ubsan-packed_backtrace
... afio_sl-ubsan-ringbuffer_log
... afio_sl-ubsan-section_handle_create_close
... afio_sl-ubsan-shared_fs_mutex
... afio_sl-ubsan-spinlock_tribool
... afio_sl-ubsan-test_guard
... afio_sl-ubsan-test_import
... afio_sl-ubsan-test_message
... afio_sl-ubsan-type_traits
... afio-tsan
... afio-ubsan
... all (the default if no target is provided)
... _asan
... clean
... Continuous
... ContinuousBuild
... ContinuousConfigure
... ContinuousCoverage
... ContinuousMemCheck
... ContinuousStart
... ContinuousSubmit
... ContinuousTest
... ContinuousUpdate
... depend
... _dl
... _docs
... edit_cache
... Experimental
... ExperimentalBuild
... ExperimentalConfigure
... ExperimentalCoverage
... ExperimentalMemCheck
... ExperimentalStart
... ExperimentalSubmit
... ExperimentalTest
... ExperimentalUpdate
... _hl
... install
... install/local
... install/strip
... kerneltest_docs
... list_install_components
... _msan
... Nightly
... NightlyBuild
... NightlyConfigure
... NightlyCoverage
... NightlyMemCheck
... NightlyMemoryCheck
... NightlyStart
... NightlySubmit
... NightlyTest
... NightlyUpdate
... quickcpplib_docs
... rebuild_cache
... _sl
The following are some of the valid targets for this Makefile:
... _tsan
... _ubsan
```

The target graphs are REGEXable via the pattern
"<lib>_<hl|sl|dl>-<special>-<binary>" where:

* hl = header only library
* sl = static library
* dl = shared library

... and <special> is anything affecting the link requirements of the
binary, so here QuickCppLib auto detected the code sanitisers
asan,msan,tsan,ubsan all of which require to be linked like-with-like,
and hence needed a separate <special> category.

Group-level targets also exist, so "afio_sl-tsan" means "all the static
library AFIO targets with Thread Sanitiser", "_tsan" means "all the
targets with Thread Sanitiser" and so on.

Almost the entire graph above is marked with EXCLUDE_FROM_ALL, so it is
NOT built unless you specifically request it at the command line.

The above is just the mangling for cmake targets which must always be
unique within a given cmake build else cmake will refuse to work, hence
mangling systematically according to a strict REGEX pattern makes a ton
of sense (and using TARGET ALIAS to a more convenient to type target
name like "boost::afio").

The actual binaries generated by the build are further mangled again
according to this REGEXable pattern:

```
if(CMAKE_GENERATOR MATCHES "Visual Studio")
  set_target_properties(${PROJECT_NAME}_dl PROPERTIES
    OUTPUT_NAME
"${PROJECT_NAME}_dl-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}-$<PLATFORM_ID>-$(Platform)-$<CONFIG>"
  )
elseif(CMAKE_GENERATOR MATCHES "Xcode")
  set_target_properties(${PROJECT_NAME}_dl PROPERTIES
    OUTPUT_NAME
"${PROJECT_NAME}_dl-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}-$<PLATFORM_ID>-${CMAKE_SYSTEM_PROCESSOR}-$<CONFIG>"
  )
else()
  set_target_properties(${PROJECT_NAME}_dl PROPERTIES
    OUTPUT_NAME
"${PROJECT_NAME}_dl-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_BUILD_TYPE}"
  )
endif()
```

This will generate library binaries of the pattern:

afio_dl-2.0-Linux-x64-Release.so
afio_dl-2.0-FreeBSD-x64-MinSizeRel.so
afio_dl-2.0-Win32-x86-RelWithDebInfo.dll

... and so on, correctly handling if the user selects different build
configs in Visual Studio or XCode which cmake doesn't know anything about.

So, all in all, very like Boost.Build currently does. And that's because
it's the correct design and approach to take. So we should do that in
any cmake of Boost too.

Niall

-- 
ned Productions Limited Consulting
http://www.nedproductions.biz/ http://ie.linkedin.com/in/nialldouglas/

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk