Skip to content

Commit

Permalink
Standard library incompatibility fix by packaging libc++
Browse files Browse the repository at this point in the history
  • Loading branch information
fpelliccioni committed Jul 29, 2024
1 parent 217ad91 commit 931ef83
Show file tree
Hide file tree
Showing 15 changed files with 298 additions and 39 deletions.
111 changes: 88 additions & 23 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@ jobs:
cd fmt
cmake -S . -B ./build -D FMT_DOC=OFF -D FMT_TEST=OFF -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} -DCMAKE_CXX_COMPILER=${{ steps.setup-cpp.outputs.cxx }} -DCMAKE_C_COMPILER=${{ steps.setup-cpp.outputs.cc }}
N_CORES=$(nproc 2>/dev/null || echo 1)
cmake --build ./build --config ${{ matrix.build-type }} --parallel $N_CORES
cmake --build ./build --config ${{ matrix.build-type }} --parallel $N_CORES
cmake --install ./build --prefix ./install
fmt_root=$(pwd)/install
if [[ ${{ runner.os }} == 'Windows' ]]; then
fmt_root=$(echo "$fmt_root" | sed 's/\\/\//g')
Expand Down Expand Up @@ -135,9 +135,9 @@ jobs:
fi
cmake -S . -B ./build -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} -DCMAKE_CXX_COMPILER=${{ steps.setup-cpp.outputs.cxx }} -DCMAKE_C_COMPILER=${{ steps.setup-cpp.outputs.cc }}
N_CORES=$(nproc 2>/dev/null || echo 1)
cmake --build ./build --config ${{ matrix.build-type }} --parallel $N_CORES
cmake --build ./build --config ${{ matrix.build-type }} --parallel $N_CORES
cmake --install ./build --prefix ./install
duktape_root=$(pwd)/install
if [[ ${{ runner.os }} == 'Windows' ]]; then
duktape_root=$(echo "$duktape_root" | sed 's/\\/\//g')
Expand All @@ -159,12 +159,12 @@ jobs:
git config --global advice.detachedHead false
git clone https://github.com/GNOME/libxml2 --branch v2.12.6 --depth 1
cd libxml2
cmake -S . -B ./build -DCMAKE_BUILD_TYPE=Release -DLIBXML2_WITH_PROGRAMS=ON -DLIBXML2_WITH_FTP=OFF -DLIBXML2_WITH_HTTP=OFF -DLIBXML2_WITH_ICONV=OFF -DLIBXML2_WITH_LEGACY=OFF -DLIBXML2_WITH_LZMA=OFF -DLIBXML2_WITH_ZLIB=OFF -DLIBXML2_WITH_ICU=OFF -DLIBXML2_WITH_TESTS=OFF -DLIBXML2_WITH_HTML=ON -DLIBXML2_WITH_C14N=ON -DLIBXML2_WITH_CATALOG=ON -DLIBXML2_WITH_DEBUG=ON -DLIBXML2_WITH_ISO8859X=ON -DLIBXML2_WITH_MEM_DEBUG=OFF -DLIBXML2_WITH_MODULES=ON -DLIBXML2_WITH_OUTPUT=ON -DLIBXML2_WITH_PATTERN=ON -DLIBXML2_WITH_PUSH=ON -DLIBXML2_WITH_PYTHON=OFF -DLIBXML2_WITH_READER=ON -DLIBXML2_WITH_REGEXPS=ON -DLIBXML2_WITH_SAX1=ON -DLIBXML2_WITH_SCHEMAS=ON -DLIBXML2_WITH_SCHEMATRON=ON -DLIBXML2_WITH_THREADS=ON -DLIBXML2_WITH_THREAD_ALLOC=OFF -DLIBXML2_WITH_TREE=ON -DLIBXML2_WITH_VALID=ON -DLIBXML2_WITH_WRITER=ON -DLIBXML2_WITH_XINCLUDE=ON -DLIBXML2_WITH_XPATH=ON -DLIBXML2_WITH_XPTR=ON -DCMAKE_CXX_COMPILER=${{ steps.setup-cpp.outputs.cxx || steps.parameters.outputs.clang-bin }} -DCMAKE_C_COMPILER=${{ steps.setup-cpp.outputs.cc || steps.parameters.outputs.clang-bin }}
N_CORES=$(nproc 2>/dev/null || echo 1)
cmake --build ./build --config ${{ matrix.build-type }} --parallel $N_CORES
cmake --build ./build --config ${{ matrix.build-type }} --parallel $N_CORES
cmake --install ./build --prefix ./install
libxml2_root=$(pwd)/install
if [[ ${{ runner.os }} == 'Windows' ]]; then
libxml2_root=$(echo "$libxml2_root" | sed 's/\\/\//g')
Expand All @@ -180,14 +180,22 @@ jobs:
echo -E "llvm-id=7a28a5b3" >> $GITHUB_OUTPUT
echo -E "llvm-build-preset=${{ runner.os == 'Windows' && 'release-win' || 'release-unix' }}" >> $GITHUB_OUTPUT
cd ..
llvm_root=$(pwd)/third-party/llvm-project/install
llvm_root=$(pwd)/third-party/llvm-project/install/llvm
if [[ ${{ runner.os }} == 'Windows' ]]; then
llvm_root=$(echo "$llvm_root" | sed 's/\\/\//g')
llvm_root=$(echo $llvm_root | sed 's|^/d/|D:/|')
echo "$llvm_root"
fi
echo -E "llvm-root=$llvm_root" >> $GITHUB_OUTPUT
libcxx_root=$(pwd)/third-party/llvm-project/install/libcxx
if [[ ${{ runner.os }} == 'Windows' ]]; then
libcxx_root=$(echo "$libcxx_root" | sed 's/\\/\//g')
libcxx_root=$(echo $libcxx_root | sed 's|^/d/|D:/|')
echo "$libcxx_root"
fi
echo -E "libcxx-root=$libcxx_root" >> $GITHUB_OUTPUT
- name: LLVM Binaries
id: llvm-cache
uses: actions/cache@v4
Expand All @@ -202,7 +210,7 @@ jobs:
run: |
# LLVM is be installed with the default compiler
set -x
# Shallow clone LLVM_HASH in ../third-party/llvm
cd ..
mkdir -p third-party/llvm-project
Expand All @@ -214,19 +222,19 @@ jobs:
git remote add origin https://github.com/llvm/llvm-project.git
git fetch --depth 1 origin ${{ steps.llvm-parameters.outputs.llvm-hash }}
git checkout FETCH_HEAD
# Copy presets
cp ../../mrdocs/third-party/llvm/CMakePresets.json ./llvm
cp ../../mrdocs/third-party/llvm/CMakeUserPresets.json.example ./llvm/CMakeUserPresets.json
# Build
cd llvm
llvm_root=$(pwd)
cmake --version
cmake -S . -B ./build --preset=${{ steps.llvm-parameters.outputs.llvm-build-preset }} -DCMAKE_CXX_COMPILER=${{ steps.setup-cpp.outputs.cxx }} -DCMAKE_C_COMPILER=${{ steps.setup-cpp.outputs.cc }}
if [[ ${{ runner.os }} == 'Linux' ]]; then
cmake --build ./build --target help
fi
fi
N_CORES=$(nproc 2>/dev/null || echo 1)
if [ ${{ runner.os }} != 'Windows' ]; then
cmake --build ./build --config Release --parallel $N_CORES
Expand All @@ -244,14 +252,71 @@ jobs:
curl -L -o "$llvm_archive_filename" "$llvm_url"
7z x "$llvm_archive_filename"
cd "Release"
mkdir -p "$llvm_project_root"/install
mv * "$llvm_project_root"/install
mkdir -p "$llvm_project_root"/install/llvm
mv * "$llvm_project_root"/install/llvm
cd ..
rm -rf "Release"
exit 0
fi
fi
cmake --install ./build --prefix "$llvm_project_root"/install
cmake --install ./build --prefix "$llvm_project_root"/install/llvm
- name: LibC++ Binaries
id: libcxx-cache
uses: actions/cache@v4
with:
path: ${{ steps.llvm-parameters.outputs.libcxx-root }}
key: libcxx-${{ runner.os }}-${{ matrix.compiler }}-${{ matrix.version }}-${{ steps.llvm-parameters.outputs.llvm-hash }}

- name: Install LibC++
id: libcxx-install
if: ${{ steps.libcxx-cache.outputs.cache-hit != 'true'}}
shell: bash
run: |
set -x
cd ..
llvm_project_root="$(pwd)/third-party/llvm-project"
if [ ! -d "$llvm_project_root/runtimes" ]; then
mkdir -p $llvm_project_root
cd $llvm_project_root
git config --global init.defaultBranch master
git config --global advice.detachedHead false
git init
git remote add origin https://github.com/llvm/llvm-project.git
git fetch --depth 1 origin ${{ steps.llvm-parameters.outputs.llvm-hash }}
git checkout FETCH_HEAD
fi
export CXX="$llvm_project_root/install/llvm/bin/clang++"
export CC="$llvm_project_root/install/llvm/bin/clang"
cd $llvm_project_root
if [ ${{ runner.os }} != 'Windows' ]; then
cmake -G Ninja \
-S runtimes \
-B build-libcxx \
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \
-DCMAKE_INSTALL_PREFIX="$llvm_project_root/install/libcxx"
ninja -C build-libcxx cxx cxxabi unwind
ninja -C build-libcxx install-cxx install-cxxabi install-unwind
else
cmake -G Ninja \
-S runtimes \
-B build-libcxx \
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \
-DCMAKE_INSTALL_PREFIX="$llvm_project_root/install/libcxx" \
-DLIBCXXABI_USE_LLVM_UNWINDER=OFF \
-DLIBCXXABI_ENABLE_SHARED=OFF \
-DLIBCXXABI_ENABLE_STATIC=ON \
-DLIBCXX_ENABLE_SHARED=OFF \
-DLIBCXX_NO_VCRUNTIME=ON \
-DCMAKE_CXX_FLAGS="-D__ORDER_LITTLE_ENDIAN__=1234 -D__ORDER_BIG_ENDIAN__=4321 -D__BYTE_ORDER__=__ORDER_LITTLE_ENDIAN__"
ninja -C build-libcxx cxx
ninja -C build-libcxx install-cxx
fi
- name: Install Node.js
uses: actions/setup-node@v3
Expand All @@ -278,7 +343,7 @@ jobs:
-D duktape_ROOT=${{ steps.duktape-install.outputs.duktape-root }}
-D Duktape_ROOT=${{ steps.duktape-install.outputs.duktape-root }}
-D fmt_ROOT=${{ steps.fmt-install.outputs.fmt-root }}
${{ (steps.libxml2-install.outputs.libxml2-root && format('-D libxml2_ROOT={0}', steps.libxml2-install.outputs.libxml2-root)) || '' }}
${{ (steps.libxml2-install.outputs.libxml2-root && format('-D libxml2_ROOT={0}', steps.libxml2-install.outputs.libxml2-root)) || '' }}
${{ (steps.libxml2-install.outputs.libxml2-root && format('-D LibXml2_ROOT={0}', steps.libxml2-install.outputs.libxml2-root)) || '' }}
export-compile-commands: true
run-tests: true
Expand Down Expand Up @@ -440,13 +505,13 @@ jobs:
export CXX
CC="${{ steps.setup-cpp.outputs.cc }}"
export CC
declare -a generators=(
"adoc"
"html"
"xml"
)
for variant in single multi; do
for generator in "${generators[@]}"; do
[[ $variant = multi ]] && multipage="true" || multipage="false"
Expand Down Expand Up @@ -500,15 +565,15 @@ jobs:
id: compare-demos
run: |
set -x
# Define URLs and directories
LOCAL_DEMOS_DIR="./demos/"
PREV_DEMOS_DIR="./demos-previous/"
DIFF_DIR="./demos-diff/"
# Create directories if they don't exist
mkdir -p $PREV_DEMOS_DIR $DIFF_DIR
# Iterate over the previous files and compare them with the corresponding local files
find $PREV_DEMOS_DIR -type f | while read previous_file; do
# Derive the corresponding local file path
Expand All @@ -526,7 +591,7 @@ jobs:
cat "$previous_file" >> "$diff_output"
fi
done
# Iterate over the local files to find new files
find $LOCAL_DEMOS_DIR -type f | while read local_file; do
previous_file="${PREV_DEMOS_DIR}${local_file#$LOCAL_DEMOS_DIR}"
Expand All @@ -537,7 +602,7 @@ jobs:
echo "NEW CONTENT OF THE FILE IS:" >> "$diff_output"
fi
done
# Check if the diff directory is empty
if [[ -z $(ls -A $DIFF_DIR) ]]; then
echo "No differences found."
Expand Down
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@
/test-files/**/*.adoc
/test-files/**/*.bad.xml
docs/node_modules
docs/build
docs/build
share/mrdocs/libcxx/
share/mrdocs/clang/
44 changes: 42 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,12 @@ elseif (LLVM_ROOT)
endif()
find_package(LLVM REQUIRED CONFIG)
find_package(Clang REQUIRED CONFIG)

if (LLVM_ROOT)
set(LIBCXX_DIR "${LLVM_ROOT}/../libcxx/include/c++/v1/")
set(CLANG_STDLIB_INCLUDE_DIR "${LLVM_ROOT}/lib/clang/${Clang_VERSION_MAJOR}/include/")
endif()

list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}")
include(HandleLLVMOptions)
add_definitions(${LLVM_DEFINITIONS})
Expand Down Expand Up @@ -284,11 +290,11 @@ if (MRDOCS_BUILD_TESTS)
endif ()
target_compile_definitions(mrdocs-test PRIVATE -DMRDOCS_TEST_FILES_DIR="${CMAKE_CURRENT_SOURCE_DIR}/test-files")
add_test(NAME mrdocs-unit-tests COMMAND mrdocs-test --unit=true)
add_test(NAME mrdocs-golden-tests COMMAND mrdocs-test --unit=false --action=test "${PROJECT_SOURCE_DIR}/test-files/golden-tests" --addons="${CMAKE_SOURCE_DIR}/share/mrdocs/addons")
add_test(NAME mrdocs-golden-tests COMMAND mrdocs-test --unit=false --action=test "${PROJECT_SOURCE_DIR}/test-files/golden-tests" --addons="${CMAKE_SOURCE_DIR}/share/mrdocs/addons" --stdlib-path="${LIBCXX_DIR}")
foreach (action IN ITEMS create update)
add_custom_target(
mrdocs-${action}-test-fixtures
COMMAND mrdocs-test --unit=false --action=${action} "${PROJECT_SOURCE_DIR}/test-files/golden-tests" --addons="${CMAKE_SOURCE_DIR}/share/mrdocs/addons"
COMMAND mrdocs-test --unit=false --action=${action} "${PROJECT_SOURCE_DIR}/test-files/golden-tests" --addons="${CMAKE_SOURCE_DIR}/share/mrdocs/addons" --stdlib-path="${LIBCXX_DIR}"
DEPENDS mrdocs-test
)
endforeach ()
Expand Down Expand Up @@ -392,6 +398,40 @@ endif ()
#-------------------------------------------------

if (MRDOCS_INSTALL)
# install(CODE "
# message(STATUS \"Creating directories and copying libc++ and clang headers...\")
# file(MAKE_DIRECTORY ${MRDOCS_SHARE_LIBCXX_DIR})
# file(MAKE_DIRECTORY ${MRDOCS_SHARE_CLANG_DIR})
# file(COPY ${LIBCXX_DIR}/ DESTINATION ${MRDOCS_SHARE_LIBCXX_DIR})
# file(COPY ${CLANG_STDLIB_INCLUDE_DIR}/ DESTINATION ${MRDOCS_SHARE_CLANG_DIR})
# ")

#-------------------------------------------------
# Setup custom commands for copying headers
#-------------------------------------------------
set(MRDOCS_SHARE_LIBCXX_DIR "${CMAKE_INSTALL_PREFIX}/share/mrdocs/libcxx")
set(MRDOCS_SHARE_CLANG_DIR "${CMAKE_INSTALL_PREFIX}/share/mrdocs/clang")

add_custom_command(
OUTPUT ${MRDOCS_SHARE_LIBCXX_DIR}/.done
COMMAND ${CMAKE_COMMAND} -E make_directory ${MRDOCS_SHARE_LIBCXX_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBCXX_DIR}/ ${MRDOCS_SHARE_LIBCXX_DIR}
COMMAND ${CMAKE_COMMAND} -E touch ${MRDOCS_SHARE_LIBCXX_DIR}/.done
COMMENT "Copying libc++ headers to ${MRDOCS_SHARE_LIBCXX_DIR}"
)
add_custom_command(
OUTPUT ${MRDOCS_SHARE_CLANG_DIR}/.done
COMMAND ${CMAKE_COMMAND} -E make_directory ${MRDOCS_SHARE_CLANG_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CLANG_STDLIB_INCLUDE_DIR}/ ${MRDOCS_SHARE_CLANG_DIR}
COMMAND ${CMAKE_COMMAND} -E touch ${MRDOCS_SHARE_CLANG_DIR}/.done
COMMENT "Copying Clang headers to ${MRDOCS_SHARE_CLANG_DIR}"
)

add_custom_target(copy_headers
DEPENDS ${MRDOCS_SHARE_LIBCXX_DIR}/.done ${MRDOCS_SHARE_CLANG_DIR}/.done
)
add_dependencies(mrdocs copy_headers)

#-------------------------------------------------
# bin
#-------------------------------------------------
Expand Down
6 changes: 6 additions & 0 deletions include/mrdocs/Config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,12 @@ class MRDOCS_DECL
/// from CMakeLists.txt
std::string cmake;

/// True if the compiler has to use just the system's standard library
bool useSystemStdLib = false;

/// Standard Library include paths
std::vector<std::string> stdLibPaths;

/// Additional defines passed to the compiler
std::vector<std::string> defines;

Expand Down
2 changes: 2 additions & 0 deletions include/mrdocs/ConfigOptions.inc
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ COMMON_OPTION (compilationDatabase , compilation-database , Path to the c
// Build options
COMMON_OPTION (cmake , cmake , CMake arguments when generating the compilation database from CMakeLists.txt)
COMMON_OPTION (defines , defines , Additional defines passed to the compiler)
COMMON_OPTION (useSystemStdLib , use-system-stdlib , True if the compiler has to use just the system standard library)
COMMON_OPTION (stdLibPaths , stdlib-path , Standard Library include paths)

// Generators
COMMON_OPTION (generate , generate , Documentation generator. Supported generators are: adoc/html/xml)
Expand Down
6 changes: 6 additions & 0 deletions share/cmake/MrDocs.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,12 @@ function(add_mrdocs MRDOCS_TARGET_NAME)
set(MRDOCS_TARGET_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/mrdocs)
endif()

#-------------------------------------------------
# LibC++ paths
#-------------------------------------------------
if (NOT DEFINED MRDOCS_LIBCXX_PATHS)
set(MRDOCS_LIBCXX_PATHS ${CMAKE_SOURCE_DIR}/share/libcxx)
endif()

#-------------------------------------------------
# Custom target
Expand Down
Loading

0 comments on commit 931ef83

Please sign in to comment.