xref: /openbsd-src/gnu/llvm/libcxx/lib/abi/CMakeLists.txt (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
146035553Spatrick
276d0caaeSpatrick# This function generates a "unique" identifier based on various properties
376d0caaeSpatrick# given as arguments. The idea is to encode all ABI-affecting properties
476d0caaeSpatrick# in that identifier, so that we can store ABI information and associate it
576d0caaeSpatrick# to a specific ABI configuration.
676d0caaeSpatrick#
776d0caaeSpatrick# Right now, this is done by using the ABI identifier as the filename containing
876d0caaeSpatrick# the list of symbols exported by libc++ for that configuration, however we could
976d0caaeSpatrick# make it more sophisticated if the number of ABI-affecting parameters grew.
1076d0caaeSpatrickfunction(cxx_abi_list_identifier result triple abi_library abi_version unstable exceptions new_delete_in_libcxx)
1176d0caaeSpatrick  set(abi_properties)
1276d0caaeSpatrick
1376d0caaeSpatrick  if ("${triple}" MATCHES "darwin")
1446035553Spatrick    # Ignore the major, minor, and patchlevel versions of darwin targets.
1576d0caaeSpatrick    string(REGEX REPLACE "darwin[0-9]+\\.[0-9]+\\.[0-9]+" "darwin" triple "${triple}")
1676d0caaeSpatrick  elseif("${triple}" MATCHES "freebsd")
1746035553Spatrick    # Ignore the major and minor versions of freebsd targets.
1876d0caaeSpatrick    string(REGEX REPLACE "freebsd[0-9]+\\.[0-9]+" "freebsd" triple "${triple}")
1946035553Spatrick  endif()
2076d0caaeSpatrick  list(APPEND abi_properties "${triple}")
2176d0caaeSpatrick  list(APPEND abi_properties "${abi_library}")
2276d0caaeSpatrick  list(APPEND abi_properties "v${abi_version}")
2376d0caaeSpatrick  if (${unstable})
2476d0caaeSpatrick    list(APPEND abi_properties "unstable")
2576d0caaeSpatrick  else()
2676d0caaeSpatrick    list(APPEND abi_properties "stable")
2776d0caaeSpatrick  endif()
2876d0caaeSpatrick  if (${exceptions})
2976d0caaeSpatrick    list(APPEND abi_properties "exceptions")
3076d0caaeSpatrick  else()
3176d0caaeSpatrick    list(APPEND abi_properties "noexceptions")
3276d0caaeSpatrick  endif()
3376d0caaeSpatrick  if (${new_delete_in_libcxx})
34*4bdff4beSrobert    list(APPEND abi_properties "new")
3576d0caaeSpatrick  else()
36*4bdff4beSrobert    list(APPEND abi_properties "nonew")
3746035553Spatrick  endif()
3846035553Spatrick
3976d0caaeSpatrick  list(JOIN abi_properties "." tmp)
4076d0caaeSpatrick  set(${result} "${tmp}" PARENT_SCOPE)
4176d0caaeSpatrickendfunction()
4276d0caaeSpatrick
43*4bdff4beSrobertif (CMAKE_CXX_COMPILER_TARGET)
44*4bdff4beSrobert  set(triple "${CMAKE_CXX_COMPILER_TARGET}")
45*4bdff4beSrobertelse()
46*4bdff4beSrobert  set(triple "${LLVM_DEFAULT_TARGET_TRIPLE}")
47*4bdff4beSrobertendif()
4876d0caaeSpatrickcxx_abi_list_identifier(abi_list_identifier
49*4bdff4beSrobert  "${triple}"
50*4bdff4beSrobert  "${LIBCXX_CXX_ABI}"
5176d0caaeSpatrick  "${LIBCXX_ABI_VERSION}"
5276d0caaeSpatrick  "${LIBCXX_ABI_UNSTABLE}"
5376d0caaeSpatrick  "${LIBCXX_ENABLE_EXCEPTIONS}"
5476d0caaeSpatrick  "${LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS}"
5576d0caaeSpatrick)
5676d0caaeSpatrick
5776d0caaeSpatrickif (TARGET cxx_shared)
5876d0caaeSpatrick  set(abi_list_file "${CMAKE_CURRENT_SOURCE_DIR}/${abi_list_identifier}.abilist")
5976d0caaeSpatrick
6076d0caaeSpatrick  if (EXISTS "${abi_list_file}")
6146035553Spatrick    add_custom_target(check-cxx-abilist
6276d0caaeSpatrick      "${Python3_EXECUTABLE}" "${LIBCXX_SOURCE_DIR}/utils/sym_diff.py"
6376d0caaeSpatrick          --only-stdlib-symbols
6476d0caaeSpatrick          --strict "${abi_list_file}"
6576d0caaeSpatrick          $<TARGET_FILE:cxx_shared>
6646035553Spatrick      DEPENDS cxx_shared
6776d0caaeSpatrick      COMMENT "Testing libc++'s exported symbols against the ABI list")
6846035553Spatrick  else()
6976d0caaeSpatrick    message(STATUS "ABI list file not generated for configuration ${abi_list_identifier}, `check-cxx-abilist` will not be available.")
7076d0caaeSpatrick  endif()
7176d0caaeSpatrick
7276d0caaeSpatrick  add_custom_target(generate-cxx-abilist
7376d0caaeSpatrick    COMMAND "${Python3_EXECUTABLE}" "${LIBCXX_SOURCE_DIR}/utils/generate_abi_list.py"
7476d0caaeSpatrick            --output "${abi_list_file}"
7576d0caaeSpatrick            "$<TARGET_FILE:cxx_shared>"
7676d0caaeSpatrick    DEPENDS cxx_shared
7776d0caaeSpatrick    COMMENT "Generating the ABI list file for configuration ${abi_list_identifier}")
7876d0caaeSpatrickelse()
7976d0caaeSpatrick  message(STATUS "Not building a shared library for libc++ -- the ABI list targets will not be available.")
8046035553Spatrickendif()
81