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