Doxygen support (#43)
* init doxygen * fix format * use readme as main file * don't generate LaTeX * automatically use correct project version and update html settings * minify Doxyfile * add documentation * add workflow to publish documentation * remove mac comment * formatting * fix typo * grammar
This commit is contained in:
parent
fa77b5371f
commit
032e506c12
7 changed files with 144 additions and 13 deletions
27
.github/workflows/documentation.yaml
vendored
Normal file
27
.github/workflows/documentation.yaml
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
name: Documentation
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build and publish documentation
|
||||||
|
runs-on: macos-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
|
||||||
|
- name: Install doxygen
|
||||||
|
run: brew install doxygen
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
cmake -Hdocumentation -Bbuild
|
||||||
|
cmake --build build --target GenerateDocs
|
||||||
|
|
||||||
|
- name: Publish
|
||||||
|
uses: peaceiris/actions-gh-pages@v3
|
||||||
|
with:
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
publish_dir: ./build/doxygen/html
|
|
@ -23,7 +23,7 @@ include(cmake/CPM.cmake)
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME PackageProject.cmake
|
NAME PackageProject.cmake
|
||||||
GITHUB_REPOSITORY TheLartians/PackageProject.cmake
|
GITHUB_REPOSITORY TheLartians/PackageProject.cmake
|
||||||
VERSION 1.2
|
VERSION 1.2.1
|
||||||
)
|
)
|
||||||
|
|
||||||
# ---- Add source files ----
|
# ---- Add source files ----
|
||||||
|
|
43
README.md
43
README.md
|
@ -25,7 +25,8 @@ This template is the result of learnings from many previous projects and should
|
||||||
- Code formatting enforced by [clang-format](https://clang.llvm.org/docs/ClangFormat.html) via [Format.cmake](https://github.com/TheLartians/Format.cmake)
|
- Code formatting enforced by [clang-format](https://clang.llvm.org/docs/ClangFormat.html) via [Format.cmake](https://github.com/TheLartians/Format.cmake)
|
||||||
- Reproducible dependency management via [CPM.cmake](https://github.com/TheLartians/CPM.cmake)
|
- Reproducible dependency management via [CPM.cmake](https://github.com/TheLartians/CPM.cmake)
|
||||||
- Installable target with versioning information via [PackageProject.cmake](https://github.com/TheLartians/PackageProject.cmake)
|
- Installable target with versioning information via [PackageProject.cmake](https://github.com/TheLartians/PackageProject.cmake)
|
||||||
- Support for [sanitizer tools and more](#additional-tools)
|
- Automatic documentation generation with [Doxygen](https://www.doxygen.nl)
|
||||||
|
- Support for [sanitizer tools, and more](#additional-tools)
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
@ -81,14 +82,36 @@ cmake --build build/test --target fix-format
|
||||||
|
|
||||||
See [Format.cmake](https://github.com/TheLartians/Format.cmake) for more options.
|
See [Format.cmake](https://github.com/TheLartians/Format.cmake) for more options.
|
||||||
|
|
||||||
|
### Build the documentation
|
||||||
|
|
||||||
|
The documentation is automatically built and updated after every [release](https://help.github.com/en/github/administering-a-repository/managing-releases-in-a-repository).
|
||||||
|
To manually build documentation, call the following command.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmake -Hdocumentation -Bbuild/doc
|
||||||
|
cmake --build build/doc --target GenerateDocs
|
||||||
|
# view the docs
|
||||||
|
open build/doc/doxygen/html/index.html
|
||||||
|
```
|
||||||
|
|
||||||
### Additional tools
|
### Additional tools
|
||||||
|
|
||||||
The test and standalone subprojects include the [tools.cmake](cmake/tools.cmake) file which is used to import additional tools on-demand through CMake configuration arguments.
|
The test and standalone subprojects include the [tools.cmake](cmake/tools.cmake) file which is used to import additional tools on-demand through CMake configuration arguments.
|
||||||
The following are currently supported.
|
The following are currently supported.
|
||||||
|
|
||||||
- **Sanitizers**, by setting `-DUSE_SANITIZER=<Address | Memory | MemoryWithOrigins | Undefined | Thread | Leak | 'Address;Undefined'>`.
|
#### Sanitizers
|
||||||
- **Static Analyzers**, by setting `-DUSE_STATIC_ANALYZER=<clang-tidy | iwyu | cppcheck>`, or a combination of those in quotation marks, separated by semicolons. Arguments can be passed to the analyzers by setting the `CLANG_TIDY_ARGS`, `IWYU_ARGS` or `CPPCHECK_ARGS` variables.
|
|
||||||
- **Ccache**, by setting `-DUSE_CCACHE=<ON | OFF>`.
|
Sanitizers can be enabled by configuring CMake with `-DUSE_SANITIZER=<Address | Memory | MemoryWithOrigins | Undefined | Thread | Leak | 'Address;Undefined'>`.
|
||||||
|
|
||||||
|
#### Static Analyzers
|
||||||
|
|
||||||
|
Static Analyzers can be enabled by setting `-DUSE_STATIC_ANALYZER=<clang-tidy | iwyu | cppcheck>`, or a combination of those in quotation marks, separated by semicolons.
|
||||||
|
By default, analyzers will automatically find configuration files such as `.clang-format`.
|
||||||
|
Additional arguments can be passed to the analyzers by setting the `CLANG_TIDY_ARGS`, `IWYU_ARGS` or `CPPCHECK_ARGS` variables.
|
||||||
|
|
||||||
|
#### Ccache
|
||||||
|
|
||||||
|
Ccache can be enabled by configuring with `-DUSE_CCACHE=<ON | OFF>`.
|
||||||
|
|
||||||
## FAQ
|
## FAQ
|
||||||
|
|
||||||
|
@ -97,9 +120,15 @@ The following are currently supported.
|
||||||
Yes, however you will need to change the library type to an `INTERFACE` library as documented in the [CMakeLists.txt](CMakeLists.txt).
|
Yes, however you will need to change the library type to an `INTERFACE` library as documented in the [CMakeLists.txt](CMakeLists.txt).
|
||||||
See [here](https://github.com/TheLartians/StaticTypeInfo) for an example header-only library based on the template.
|
See [here](https://github.com/TheLartians/StaticTypeInfo) for an example header-only library based on the template.
|
||||||
|
|
||||||
> I don't need a standalone target. How can I get rid of it?
|
> I don't need a standalone target / documentation. How can I get rid of it?
|
||||||
|
|
||||||
Simply remove the standalone directory and github workflow file.
|
Simply remove the standalone / documentation directory and according github workflow file.
|
||||||
|
|
||||||
|
> Can I build the standalone and tests at the same time?
|
||||||
|
|
||||||
|
To keep the template modular, projects have been separated into their own CMake modules.
|
||||||
|
However it's easy to create a new directory, say `all`, that uses `CPMAddProject` to add both the standalone and the tests as well as any other subprojects to a single build.
|
||||||
|
Note, that it's not recommended to include the standalone or tests from the main CMakeLists, as it will make the project more difficult for others to use as a library.
|
||||||
|
|
||||||
> I see you are using `GLOB` to add source files in CMakeLists.txt. Isn't that evil?
|
> I see you are using `GLOB` to add source files in CMakeLists.txt. Isn't that evil?
|
||||||
|
|
||||||
|
@ -108,7 +137,7 @@ Glob is considered bad because any changes to the source file structure [might n
|
||||||
|
|
||||||
> I want create additional targets that depend on my library. Should I modify the main CMakeLists to include them?
|
> I want create additional targets that depend on my library. Should I modify the main CMakeLists to include them?
|
||||||
|
|
||||||
Always avoid including derived projects from the libraries CMakeLists (even though it is a common sight in the C++ world), as this effectively inverts the dependency tree and makes the build system hard to reason about.
|
Avoid including derived projects from the libraries CMakeLists (even though it is a common sight in the C++ world), as this effectively inverts the dependency tree and makes the build system hard to reason about.
|
||||||
Instead, create a new directory or project with a CMakeLists that adds the library as a dependency (e.g. like the [standalone](standalone/CMakeLists.txt) directory).
|
Instead, create a new directory or project with a CMakeLists that adds the library as a dependency (e.g. like the [standalone](standalone/CMakeLists.txt) directory).
|
||||||
Depending type it might make sense move these components into a separate repositories and reference a specific commit or version of the library.
|
Depending type it might make sense move these components into a separate repositories and reference a specific commit or version of the library.
|
||||||
This has the advantage that individual libraries and components can be improved and updated independently.
|
This has the advantage that individual libraries and components can be improved and updated independently.
|
||||||
|
|
36
documentation/CMakeLists.txt
Normal file
36
documentation/CMakeLists.txt
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(GreeterDocs)
|
||||||
|
|
||||||
|
# ---- Dependencies ----
|
||||||
|
|
||||||
|
include(../cmake/CPM.cmake)
|
||||||
|
|
||||||
|
CPMAddPackage(
|
||||||
|
NAME Greeter
|
||||||
|
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/..
|
||||||
|
)
|
||||||
|
|
||||||
|
CPMAddPackage(
|
||||||
|
NAME StableCoder-cmake-scripts
|
||||||
|
GITHUB_REPOSITORY StableCoder/cmake-scripts
|
||||||
|
GIT_TAG 3d2d5a9fb26f0ce24e3e4eaeeff686ec2ecfb3fb
|
||||||
|
)
|
||||||
|
|
||||||
|
# ---- Doxygen ----
|
||||||
|
|
||||||
|
set(BUILD_DOCUMENTATION ON CACHE INTERNAL "")
|
||||||
|
include(${StableCoder-cmake-scripts_SOURCE_DIR}/doxygen.cmake)
|
||||||
|
|
||||||
|
# set Doxyfile variables
|
||||||
|
set(DOXYGEN_PROJECT_NAME Greeter)
|
||||||
|
set(DOXYGEN_PROJECT_VERSION ${Greeter_VERSION})
|
||||||
|
set(DOXYGEN_PROJECT_ROOT "${CMAKE_CURRENT_LIST_DIR}/..")
|
||||||
|
|
||||||
|
# see https://github.com/StableCoder/cmake-scripts#doxygen-doxygencmake for additional options
|
||||||
|
build_docs(
|
||||||
|
TARGET_NAME GenerateDocs
|
||||||
|
DOXYFILE_PATH ${CMAKE_CURRENT_LIST_DIR}/Doxyfile
|
||||||
|
OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/doxygen
|
||||||
|
PROCESS_DOXYFILE ON
|
||||||
|
)
|
25
documentation/Doxyfile
Normal file
25
documentation/Doxyfile
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
# Configuration for Doxygen for use with CMake
|
||||||
|
# Only options that deviate from the default are included
|
||||||
|
# To create a new Doxyfile containing all available options, call `doxygen -g`
|
||||||
|
|
||||||
|
# Get Project name and version from CMake
|
||||||
|
PROJECT_NAME = @DOXYGEN_PROJECT_NAME@
|
||||||
|
PROJECT_NUMBER = @DOXYGEN_PROJECT_VERSION@
|
||||||
|
|
||||||
|
# Add sources
|
||||||
|
INPUT = @DOXYGEN_PROJECT_ROOT@/README.md @DOXYGEN_PROJECT_ROOT@/include @DOXYGEN_PROJECT_ROOT@/source
|
||||||
|
EXTRACT_ALL = YES
|
||||||
|
RECURSIVE = YES
|
||||||
|
|
||||||
|
# We don't want local paths in the documentation
|
||||||
|
FULL_PATH_NAMES = NO
|
||||||
|
|
||||||
|
# Use the README as a main page
|
||||||
|
USE_MDFILE_AS_MAINPAGE = @DOXYGEN_PROJECT_ROOT@/README.md
|
||||||
|
|
||||||
|
# Create nicer looking HTML
|
||||||
|
HTML_DYNAMIC_SECTIONS = YES
|
||||||
|
GENERATE_TREEVIEW = YES
|
||||||
|
|
||||||
|
# We don't need LaTeX generation
|
||||||
|
GENERATE_LATEX = NO
|
|
@ -4,13 +4,27 @@
|
||||||
|
|
||||||
namespace greeter {
|
namespace greeter {
|
||||||
|
|
||||||
|
/** Language codes to be used with the Greeter class */
|
||||||
enum class LanguageCode { EN, DE, ES, FR };
|
enum class LanguageCode { EN, DE, ES, FR };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class for saying hello in multiple languages
|
||||||
|
*/
|
||||||
class Greeter {
|
class Greeter {
|
||||||
std::string name;
|
std::string name;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* Creates a new greeter
|
||||||
|
* @param name the name to greet
|
||||||
|
*/
|
||||||
Greeter(std::string name);
|
Greeter(std::string name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a localized string containing the greeting
|
||||||
|
* @param lang the language to greet in
|
||||||
|
* @return a string containing the greeting
|
||||||
|
*/
|
||||||
std::string greet(LanguageCode lang = LanguageCode::EN) const;
|
std::string greet(LanguageCode lang = LanguageCode::EN) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -4,10 +4,10 @@
|
||||||
TEST_CASE("Greeter") {
|
TEST_CASE("Greeter") {
|
||||||
using namespace greeter;
|
using namespace greeter;
|
||||||
|
|
||||||
Greeter greeter("World");
|
Greeter greeter("Tests");
|
||||||
|
|
||||||
CHECK(greeter.greet(LanguageCode::EN) == "Hello, World!");
|
CHECK(greeter.greet(LanguageCode::EN) == "Hello, Tests!");
|
||||||
CHECK(greeter.greet(LanguageCode::DE) == "Hallo World!");
|
CHECK(greeter.greet(LanguageCode::DE) == "Hallo Tests!");
|
||||||
CHECK(greeter.greet(LanguageCode::ES) == "¡Hola World!");
|
CHECK(greeter.greet(LanguageCode::ES) == "¡Hola Tests!");
|
||||||
CHECK(greeter.greet(LanguageCode::FR) == "Bonjour World!");
|
CHECK(greeter.greet(LanguageCode::FR) == "Bonjour Tests!");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue