Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .clang-format
Original file line number Diff line number Diff line change
Expand Up @@ -227,3 +227,7 @@ IncludeCategories:
# Comments
FixNamespaceComments: true
CommentPragmas: '^ clang-format'

---
Language: Json
BasedOnStyle: llvm
22 changes: 8 additions & 14 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -261,15 +261,6 @@ if (NOT EXISTS "${LIBCXX_DIR}")
"Please provide a LLVM with libc++ enabled\n")
endif()

set(STDLIB_INCLUDE_DIR "${LLVM_BINARY_DIR}/lib/clang/${Clang_VERSION_MAJOR}/include"
CACHE PATH "Path to the clang headers include directory")
message(STATUS "STDLIB_INCLUDE_DIR: ${STDLIB_INCLUDE_DIR}")
if (NOT EXISTS "${STDLIB_INCLUDE_DIR}")
message(FATAL_ERROR
"STDLIB_INCLUDE_DIR (${STDLIB_INCLUDE_DIR}) does not exist.\n"
"Missing clang headers\n")
endif()

list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}")
include(HandleLLVMOptions)
add_definitions(${LLVM_DEFINITIONS})
Expand Down Expand Up @@ -388,6 +379,7 @@ if (WIN32)
mrdocs-core
PUBLIC
/permissive- # strict C++
/Zc:__cplusplus # report C++ standard support
/W4 # enable all warnings
/MP # multi-processor compilation
/EHs # C++ Exception handling
Expand All @@ -411,6 +403,13 @@ if (MRDOCS_DOCUMENTATION_BUILD)
return()
endif()

# Replicate the clang resource directory structure within our own build,
# so that libclang will find it when executing directly from the build directory.
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib/clang")
set(RESOURCE_DIR "lib/clang/${Clang_VERSION_MAJOR}")
file(CREATE_LINK "${LLVM_BINARY_DIR}/${RESOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/${RESOURCE_DIR}" SYMBOLIC)

#-------------------------------------------------
#
# Tool
Expand Down Expand Up @@ -490,7 +489,6 @@ if (MRDOCS_BUILD_TESTS)
"--addons=${CMAKE_SOURCE_DIR}/share/mrdocs/addons"
--generator=${testgenerator}
"--stdlib-includes=${LIBCXX_DIR}"
"--stdlib-includes=${STDLIB_INCLUDE_DIR}"
"--libc-includes=${CMAKE_SOURCE_DIR}/share/mrdocs/headers/libc-stubs"
--log-level=warn
)
Expand All @@ -505,7 +503,6 @@ if (MRDOCS_BUILD_TESTS)
"--addons=${CMAKE_SOURCE_DIR}/share/mrdocs/addons"
--generator=${testgenerator}
"--stdlib-includes=${LIBCXX_DIR}"
"--stdlib-includes=${STDLIB_INCLUDE_DIR}"
"--libc-includes=${CMAKE_SOURCE_DIR}/share/mrdocs/headers/libc-stubs"
--log-level=warn
DEPENDS mrdocs-test
Expand Down Expand Up @@ -703,9 +700,6 @@ if (MRDOCS_INSTALL)
install(DIRECTORY ${LIBCXX_DIR}/
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/mrdocs/headers/libcxx
FILES_MATCHING PATTERN "*")
install(DIRECTORY ${STDLIB_INCLUDE_DIR}/
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/mrdocs/headers/clang
FILES_MATCHING PATTERN "*")
install(DIRECTORY ${CMAKE_SOURCE_DIR}/share/mrdocs/headers/libc-stubs/
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/mrdocs/headers/libc-stubs
FILES_MATCHING PATTERN "*")
Expand Down
2 changes: 1 addition & 1 deletion docs/modules/ROOT/pages/usage.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ It's also common for libraries to depend on the C++ standard library, the C stan

That means unless `-nostdinc` is defined, all systems include paths are included. This is what allows the user to also use headers like `<Windows.h>` or `<linux/version.h>` without explicitly including anything else, even though they are not part of the C standard library. This is often seen as a convenience but can lead to portability issues.

In this context, MrDocs provides the `use-system-stdlib` and `use-system-libc` options. Both are set as `false` by default, meaning MrDocs will compile the code as if the `-nostdinc&plus;&plus; -nostdlib&plus;&plus;` and `-nostdinc` flags were passed to Clang. Additionally:
In this context, MrDocs provides the `use-system-stdlib` and `use-system-libc` options. Both are set as `true` by default; setting both to `false` results in MrDocs compiling the code as if the `-nostdinc&plus;&plus; -nostdlib&plus;&plus;` and `-nostdinc` flags were passed to Clang. Additionally:

- When `use-system-stdlib` is `false`, MrDocs will use the bundled libc&plus;&plus; headers available in `<mrdocs-root>/share/mrdocs/headers/libcxx` and `<mrdocs-root>/share/mrdocs/headers/clang`. These paths can be adjusted with the `stdlib-includes` option.
- When `use-system-libc` is `false`, MrDocs will use the bundled libc stubs available in `<mrdocs-root>/share/mrdocs/headers/libc-stubs`. This path can be adjusted with the `libc-includes` option.
Expand Down
7 changes: 3 additions & 4 deletions docs/mrdocs.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -531,8 +531,7 @@
},
"stdlib-includes": {
"default": [
"<mrdocs-root>/share/mrdocs/headers/libcxx",
"<mrdocs-root>/share/mrdocs/headers/clang"
"<mrdocs-root>/share/mrdocs/headers/libcxx"
],
"description": "When `use-system-stdlib` is disabled, the C++ standard library headers are available in these paths.",
"items": {
Expand All @@ -557,7 +556,7 @@
"type": "string"
},
"use-system-libc": {
"default": false,
"default": true,
"description": "To achieve reproducible results, MrDocs bundles the LibC headers with its definitions. To use the C standard library available in the system instead, set this option to true.",
"enum": [
true,
Expand All @@ -567,7 +566,7 @@
"type": "boolean"
},
"use-system-stdlib": {
"default": false,
"default": true,
"description": "To achieve reproducible results, MrDocs bundles the LibC++ headers. To use the C++ standard library available in the system instead, set this option to true.",
"enum": [
true,
Expand Down
1 change: 0 additions & 1 deletion docs/website/snippets/sqrt.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#include <type_traits>
#include <stdexcept>

/** Computes the square root of an integral value.

Expand Down
3 changes: 2 additions & 1 deletion src/lib/AST/ASTVisitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2378,7 +2378,8 @@ extractSFINAEInfo(clang::QualType const T)
Result.Type = resultType->getAsType();
for (std::size_t I = 0; I < Args.size(); ++I)
{
if (SFINAEControl->ControllingParams[I])
if (I < SFINAEControl->ControllingParams.size()
&& SFINAEControl->ControllingParams[I])
{
MRDOCS_SYMBOL_TRACE(Args[I], context_);
clang::TemplateArgument ArgsI = Args[I];
Expand Down
9 changes: 4 additions & 5 deletions src/lib/ConfigOptions.json
Original file line number Diff line number Diff line change
Expand Up @@ -493,16 +493,15 @@
"brief": "Use the system C++ standard library",
"details": "To achieve reproducible results, MrDocs bundles the LibC++ headers. To use the C++ standard library available in the system instead, set this option to true.",
"type": "bool",
"default": false
"default": true
},
{
"name": "stdlib-includes",
"brief": "C++ Standard Library include paths",
"details": "When `use-system-stdlib` is disabled, the C++ standard library headers are available in these paths.",
"type": "list<path>",
"default": [
"<mrdocs-root>/share/mrdocs/headers/libcxx",
"<mrdocs-root>/share/mrdocs/headers/clang"
"<mrdocs-root>/share/mrdocs/headers/libcxx"
],
"relative-to": "<config-dir>",
"must-exist": false,
Expand All @@ -513,7 +512,7 @@
"brief": "Use the system C standard library",
"details": "To achieve reproducible results, MrDocs bundles the LibC headers with its definitions. To use the C standard library available in the system instead, set this option to true.",
"type": "bool",
"default": false
"default": true
},
{
"name": "libc-includes",
Expand Down Expand Up @@ -672,4 +671,4 @@
}
]
}
]
]
9 changes: 6 additions & 3 deletions src/lib/MrDocsCompilationDatabase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,10 @@ adjustCommandLine(
cmdLineCStrs.data(),
cmdLineCStrs.data() + cmdLineCStrs.size());

auto const systemIncludeFlag = is_clang_cl ? "-external:I" : "-isystem";
char const* systemIncludeFlag = is_clang_cl ? "-external:I" : "-isystem";
// FIXME: No CL equivalent, but not really needed there?
char const* afterIncludeFlag = is_clang_cl ? "-external:I" : "-idirafter";


// ------------------------------------------------------
// Supress all warnings
Expand Down Expand Up @@ -406,10 +409,10 @@ adjustCommandLine(

if (!(*config)->useSystemLibc)
{
new_cmdline.emplace_back("-nostdinc");
new_cmdline.emplace_back(is_clang_cl ? "-X" : "-nostdlibinc");
for (auto const& inc : (*config)->libcIncludes)
{
new_cmdline.emplace_back(systemIncludeFlag);
new_cmdline.emplace_back(afterIncludeFlag);
new_cmdline.emplace_back(inc);
}
}
Expand Down
8 changes: 5 additions & 3 deletions src/lib/MrDocsSettingsDB.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#include "MrDocsSettingsDB.hpp"
#include <mrdocs/Support/Path.hpp>
#include <llvm/Support/Program.h>


namespace mrdocs {
Expand Down Expand Up @@ -60,17 +61,18 @@ MrDocsSettingsDB::MrDocsSettingsDB(ConfigImpl const& config)
});
}

llvm::ErrorOr<std::string> clangPath = llvm::sys::findProgramByName(
"clang");

for (auto const& pathName: sourceFiles)
{
// auto fileName = files::getFileName(pathName);
auto parentDir = files::getParentDir(pathName);

std::vector<std::string> cmds;
cmds.emplace_back("clang");
cmds.emplace_back(clangPath ? *clangPath : "clang");
cmds.emplace_back("-fsyntax-only");
cmds.emplace_back("-std=c++23");
cmds.emplace_back("-pedantic-errors");
cmds.emplace_back("-Werror");
cmds.emplace_back("-x");
cmds.emplace_back("c++");
cmds.emplace_back(pathName);
Expand Down
5 changes: 4 additions & 1 deletion src/test/TestRunner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,10 @@ handleFile(

auto parentDir = files::getParentDir(filePath);
std::unordered_map<std::string, std::vector<std::string>>
defaultIncludePaths;
defaultIncludePaths = {
{ "clang", { MRDOCS_TEST_FILES_DIR "/include" } },
{ "clang-cl", { MRDOCS_TEST_FILES_DIR "/include" } },
};

// Test normally
{
Expand Down
3 changes: 1 addition & 2 deletions test-files/golden-tests/config/sfinae/redeclare.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,4 @@ void f(std::enable_if_t<std::is_class_v<T>>);

template <typename T>
void f(std::enable_if_t<std::is_class_v<T>>)
{
}
{}
2 changes: 2 additions & 0 deletions test-files/golden-tests/config/sfinae/redeclare.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
warn-if-doc-error: false
warn-no-paramdoc: false
2 changes: 2 additions & 0 deletions test-files/golden-tests/config/sfinae/return-based.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
warn-if-doc-error: false
warn-no-paramdoc: false
2 changes: 2 additions & 0 deletions test-files/golden-tests/core/libcxx.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
use-system-stdlib: false
use-system-libc: false
1 change: 0 additions & 1 deletion test-files/golden-tests/snippets/sqrt.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#include <type_traits>
#include <stdexcept>

/** Computes the square root of an integral value.

Expand Down
2 changes: 1 addition & 1 deletion test-files/golden-tests/snippets/sqrt.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<template>
<tparam name="T" class="type"/>
<function name="sqrt" requires="std::is_integral_v&lt;T&gt;" id="Ys2WHtLDVIke+oa2xBB2ekE+xds=">
<file short-path="sqrt.cpp" source-path="sqrt.cpp" line="15" class="def"/>
<file short-path="sqrt.cpp" source-path="sqrt.cpp" line="14" class="def"/>
<return>
<type name="T"/>
</return>
Expand Down
2 changes: 2 additions & 0 deletions test-files/golden-tests/snippets/sqrt.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
warn-if-doc-error: false
warn-no-paramdoc: false
1 change: 0 additions & 1 deletion test-files/golden-tests/symbols/function/sfinae.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#include <type_traits>
#include <stdexcept>

/// Enabled via return type
template <class T>
Expand Down
Loading
Loading