diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt --- a/libcxx/CMakeLists.txt +++ b/libcxx/CMakeLists.txt @@ -415,6 +415,9 @@ set(LIBCXX_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH "Path where built libc++ runtime libraries should be installed.") +set(LIBCXX_SHARED_OUTPUT_NAME "c++" CACHE STRING + "Output name for the shared libc++ runtime library.") + if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}) set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1") @@ -457,6 +460,10 @@ set(LIBCXX_COMPILE_FLAGS "") set(LIBCXX_LINK_FLAGS "") set(LIBCXX_LIBRARIES "") +set(LIBCXX_ADDITIONAL_COMPILE_FLAGS "" CACHE STRING + "Additional Compile only flags which can be provided in cache") +set(LIBCXX_ADDITIONAL_LIBRARIES "" CACHE STRING + "Additional libraries libc++ is linked to which can be provided in cache") # Include macros for adding and removing libc++ flags. include(HandleLibcxxFlags) @@ -465,14 +472,13 @@ # These flags get added to CMAKE_CXX_FLAGS and CMAKE_C_FLAGS so that # 'config-ix' use them during feature checks. It also adds them to both # 'LIBCXX_COMPILE_FLAGS' and 'LIBCXX_LINK_FLAGS' -if(ZOS) - add_target_flags_if_supported("-fzos-le-char-mode=ebcdic") -endif() if (${CMAKE_SYSTEM_NAME} MATCHES "AIX") add_target_flags_if_supported("-mdefault-visibility-export-mapping=explicit") set(CMAKE_AIX_EXPORT_ALL_SYMBOLS OFF) endif() +add_compile_flags("${LIBCXX_ADDITIONAL_COMPILE_FLAGS}") +add_library_flags("${LIBCXX_ADDITIONAL_LIBRARIES}") # Configure compiler. include(config-ix) diff --git a/libcxx/cmake/caches/s390x-ibm-zos-ascii.cmake b/libcxx/cmake/caches/s390x-ibm-zos-ascii.cmake new file mode 100644 --- /dev/null +++ b/libcxx/cmake/caches/s390x-ibm-zos-ascii.cmake @@ -0,0 +1,22 @@ +# Common +set(CMAKE_BUILD_TYPE Release CACHE STRING "") + +set(LIBCXX_ENABLE_ABI_LINKER_SCRIPT OFF CACHE BOOL "") +set(LIBCXX_ENABLE_SHARED ON CACHE BOOL "") +set(LIBCXX_ENABLE_STATIC OFF CACHE BOOL "") +set(LIBCXX_INCLUDE_TESTS OFF CACHE BOOL "") +set(LIBCXX_INSTALL_HEADERS OFF CACHE BOOL "") +set(LIBCXX_INCLUDE_BENCHMARKS OFF CACHE BOOL "") + +set(LIBCXXABI_ENABLE_SHARED OFF CACHE BOOL "") +set(LIBCXXABI_ENABLE_STATIC OFF CACHE BOOL "") +set(LIBCXXABI_INCLUDE_TESTS OFF CACHE BOOL "") + +# Target Specific +set(LIBCXX_DLL_NAME CRTEQCXS CACHE STRING "") +set(LIBCXX_SHARED_OUTPUT_NAME "c++_a" CACHE STRING + "Output name for the shared libc++ runtime library.") +set(LIBCXX_CXX_ABI system-libcxxabi CACHE STRING "") + +set(LIBCXX_ADDITIONAL_COMPILE_FLAGS "-fzos-le-char-mode=ascii" CACHE STRING "") +set(LIBCXX_ADDITIONAL_LIBRARIES "-L../s390x-ibm-zos/lib -Wl,../s390x-ibm-zos/lib/libunwind.x" CACHE STRING "") diff --git a/libcxx/cmake/caches/s390x-ibm-zos.cmake b/libcxx/cmake/caches/s390x-ibm-zos.cmake new file mode 100644 --- /dev/null +++ b/libcxx/cmake/caches/s390x-ibm-zos.cmake @@ -0,0 +1,19 @@ +set(CMAKE_BUILD_TYPE Release CACHE STRING "") + +# Common +set(LIBCXX_ENABLE_ABI_LINKER_SCRIPT OFF CACHE BOOL "") +set(LIBCXX_ENABLE_SHARED ON CACHE BOOL "") +set(LIBCXX_ENABLE_STATIC OFF CACHE BOOL "") +set(LIBCXX_INCLUDE_TESTS ON CACHE BOOL "") + +set(LIBCXXABI_ENABLE_SHARED ON CACHE BOOL "") +set(LIBCXXABI_ENABLE_STATIC OFF CACHE BOOL "") +set(LIBCXXABI_INCLUDE_TESTS ON CACHE BOOL "") + +# Target Specific +set(LIBCXX_DLL_NAME CRTEQCXE CACHE STRING "") + +set(LIBCXXABI_DLL_NAME CRTEQCXA CACHE STRING "") + +set(LLVM_EXTERNAL_UNWIND_SOURCE_DIR "$ENV{LLVM_BASE}/zos-unwind" CACHE PATH "The path to the external unwind source directory.") +set(LIBCXXABI_ADDITIONAL_LIBRARIES "-Wl,lib/libunwind.x" CACHE STRING "") diff --git a/libcxx/cmake/caches/s390x32-ibm-zos-ascii.cmake b/libcxx/cmake/caches/s390x32-ibm-zos-ascii.cmake new file mode 100644 --- /dev/null +++ b/libcxx/cmake/caches/s390x32-ibm-zos-ascii.cmake @@ -0,0 +1,22 @@ +# Common +set(CMAKE_BUILD_TYPE Release CACHE STRING "") + +set(LIBCXX_ENABLE_ABI_LINKER_SCRIPT OFF CACHE BOOL "") +set(LIBCXX_ENABLE_SHARED ON CACHE BOOL "") +set(LIBCXX_ENABLE_STATIC OFF CACHE BOOL "") +set(LIBCXX_INCLUDE_TESTS OFF CACHE BOOL "") +set(LIBCXX_INSTALL_HEADERS OFF CACHE BOOL "") +set(LIBCXX_INCLUDE_BENCHMARKS OFF CACHE BOOL "") + +set(LIBCXXABI_ENABLE_SHARED OFF CACHE BOOL "") +set(LIBCXXABI_ENABLE_STATIC OFF CACHE BOOL "") +set(LIBCXXABI_INCLUDE_TESTS OFF CACHE BOOL "") + +# Target Specific +set(LIBCXX_DLL_NAME CRTEHCXS CACHE STRING "") +set(LIBCXX_SHARED_OUTPUT_NAME "c++_a" CACHE STRING + "Output name for the shared libc++ runtime library.") +set(LIBCXX_CXX_ABI system-libcxxabi CACHE STRING "") + +set(LIBCXX_ADDITIONAL_COMPILE_FLAGS "-fzos-le-char-mode=ascii" CACHE STRING "") +set(LIBCXX_ADDITIONAL_LIBRARIES "-L../s390x-ibm-zos/lib -Wl,../s390x32-ibm-zos/lib/libunwind.x" CACHE STRING "") diff --git a/libcxx/cmake/caches/s390x32-ibm-zos.cmake b/libcxx/cmake/caches/s390x32-ibm-zos.cmake new file mode 100644 --- /dev/null +++ b/libcxx/cmake/caches/s390x32-ibm-zos.cmake @@ -0,0 +1,19 @@ +# Common +set(CMAKE_BUILD_TYPE Release CACHE STRING "") + +set(LIBCXX_ENABLE_ABI_LINKER_SCRIPT OFF CACHE BOOL "") +set(LIBCXX_ENABLE_SHARED ON CACHE BOOL "") +set(LIBCXX_ENABLE_STATIC OFF CACHE BOOL "") +set(LIBCXX_INCLUDE_TESTS ON CACHE BOOL "") + +set(LIBCXXABI_ENABLE_SHARED ON CACHE BOOL "") +set(LIBCXXABI_ENABLE_STATIC OFF CACHE BOOL "") +set(LIBCXXABI_INCLUDE_TESTS ON CACHE BOOL "") + +# Target Specific +set(LIBCXX_DLL_NAME CRTEHCXE CACHE STRING "") + +set(LIBCXXABI_DLL_NAME CRTEHCXA CACHE STRING "") + +set(LLVM_EXTERNAL_UNWIND_SOURCE_DIR "$ENV{LLVM_BASE}/zos-unwind" CACHE PATH "The path to the external unwind source directory.") +set(LIBCXXABI_ADDITIONAL_LIBRARIES "-Wl,lib/libunwind.x" CACHE STRING "") diff --git a/libcxx/docs/BuildingLibcxx.rst b/libcxx/docs/BuildingLibcxx.rst --- a/libcxx/docs/BuildingLibcxx.rst +++ b/libcxx/docs/BuildingLibcxx.rst @@ -287,6 +287,24 @@ Path where target-specific libc++ headers should be installed. If a relative path, relative to ``CMAKE_INSTALL_PREFIX``. +.. option:: LIBCXX_SHARED_OUTPUT_NAME:STRING + + **Default**: ``c++`` + + Output name for the shared libc++ runtime library. + +.. option:: LIBCXX_ADDITIONAL_COMPILE_FLAGS:STRING + + **Default**: ```` + + Additional Compile only flags which can be provided in cache. + +.. option:: LIBCXX_ADDITIONAL_LIBRARIES:STRING + + **Default**: ```` + + Additional libraries libc++ is linked to which can be provided in cache. + .. _ABI Library Specific Options: @@ -330,6 +348,12 @@ Build and use the LLVM unwinder. Note: This option can only be used when libc++abi is the C++ ABI library used. +.. option:: LIBCXXABI_ADDITIONAL_LIBRARIES:STRING + + **Default**: ```` + + Additional libraries libc++abi is linked to which can be provided in cache. + libc++ Feature Options ---------------------- diff --git a/libcxx/src/CMakeLists.txt b/libcxx/src/CMakeLists.txt --- a/libcxx/src/CMakeLists.txt +++ b/libcxx/src/CMakeLists.txt @@ -204,7 +204,7 @@ PROPERTIES COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}" LINK_FLAGS "${LIBCXX_LINK_FLAGS}" - OUTPUT_NAME "c++" + OUTPUT_NAME "${LIBCXX_SHARED_OUTPUT_NAME}" VERSION "${LIBCXX_LIBRARY_VERSION}" SOVERSION "${LIBCXX_ABI_VERSION}" DEFINE_SYMBOL "" @@ -212,6 +212,16 @@ cxx_add_common_build_flags(cxx_shared) cxx_set_common_defines(cxx_shared) + if(ZOS) + add_custom_command(TARGET cxx_shared POST_BUILD + COMMAND + ${LIBCXX_SOURCE_DIR}/utils/zos_rename_dll_side_deck.sh + $ $ "${LIBCXX_DLL_NAME}" + COMMENT "Rename dll name inside the side deck file" + WORKING_DIRECTORY $ + ) + endif() + # Link against libc++abi if (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY) target_link_libraries(cxx_shared PRIVATE libcxx-abi-shared-objects) diff --git a/libcxx/utils/zos_rename_dll_side_deck.sh b/libcxx/utils/zos_rename_dll_side_deck.sh new file mode 100755 --- /dev/null +++ b/libcxx/utils/zos_rename_dll_side_deck.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +# +# Script to rename DLL name within side deck. +# + +# Stops execution if a command or pipeline has an error. +set -e + +sidedeck=$1 +old_dll_name=$2 +new_dll_name=$3 + +function error() { + printf "ERROR: %s\n" "$*" + exit 1 +} + +function usage() { +cat < : + [-h|--help] Display this help and exit. +EOF +} + +rename_dll_name_inside_side_deck() { + +if [[ -z "$sidedeck" || -z "$old_dll_name" || -z "$new_dll_name" ]]; then + usage + error "All 3 parameters must be specified." +fi + +[[ -f "$sidedeck" ]] || error "The '$sidedeck' file must exists." + +old_len=${#old_dll_name} +new_len=${#new_dll_name} + +if (( $new_len > $old_len )); then + error "New DLL name $new_dll_name must have $old_len characters or less." +fi + +if ((padding_len=$old_len-$new_len )); then + pad=$(printf "%*s" $padding_len "") +fi + +# Touch the temp. file and set the tag to 1047 first so the redirecting statement +# will write in 1047 and not 819 encoding. +touch $sidedeck.tmp; chtag -tc1047 $sidedeck.tmp +sed "/ IMPORT /s/'$old_dll_name/$pad'$new_dll_name/g" $sidedeck > $sidedeck.tmp +mv $sidedeck.tmp $sidedeck +} + +function main() { + rename_dll_name_inside_side_deck +} + +main "$@" + diff --git a/libcxxabi/CMakeLists.txt b/libcxxabi/CMakeLists.txt --- a/libcxxabi/CMakeLists.txt +++ b/libcxxabi/CMakeLists.txt @@ -228,6 +228,7 @@ set(LIBCXXABI_COMPILE_FLAGS "") set(LIBCXXABI_LINK_FLAGS "") set(LIBCXXABI_LIBRARIES "") +set(LIBCXXABI_ADDITIONAL_LIBRARIES "" CACHE STRING "Additional libraries libc++abi is linked to which can be provided in cache") # Include macros for adding and removing libc++abi flags. include(HandleLibcxxabiFlags) @@ -245,6 +246,7 @@ add_target_flags_if_supported("-mdefault-visibility-export-mapping=explicit") set(CMAKE_AIX_EXPORT_ALL_SYMBOLS OFF) endif() +add_library_flags("${LIBCXXABI_ADDITIONAL_LIBRARIES}") # Configure compiler. Must happen after setting the target flags. include(config-ix)