diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..b7abf4e9f6 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,263 @@ +name: CI + +on: + pull_request: + branches: [ main ] + workflow_dispatch: + +env: + BUILDCACHE_ACCURACY: STRICT + BUILDCACHE_COMPRESS_FORMAT: ZSTD + BUILDCACHE_DEBUG: -1 + BUILDCACHE_LOG_FILE: "" + +jobs: + cpp_python: + name: ${{ matrix.name }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - name: 'Windows static - C++/Python' + os: windows-latest + bindings_python: ON + build_shared: OFF + unit_tests: ON + set_path: $env:Path="C:\libxml2\bin;C:\zlib\bin;"+$env:Path + additional_cmake_options: -DLIBXML2_INCLUDE_DIR="C:\libxml2\include\libxml2" -DLIBXML2_LIBRARY="C:\libxml2\lib\libxml2.lib" -DZLIB_INCLUDE_DIR="C:\zlib\include" -DZLIB_LIBRARY="C:\zlib\lib\z_dll.lib" + - name: 'Windows shared - C++/Python' + os: windows-latest + bindings_python: ON + build_shared: ON + unit_tests: ON + set_path: $env:Path="C:\libxml2\bin;C:\zlib\bin;"+$env:Path + additional_cmake_options: -DLIBXML2_INCLUDE_DIR="C:\libxml2\include\libxml2" -DLIBXML2_LIBRARY="C:\libxml2\lib\libxml2.lib" -DZLIB_INCLUDE_DIR="C:\zlib\include" -DZLIB_LIBRARY="C:\zlib\lib\z_dll.lib" + - name: 'Linux static - C++ (build only)' + os: ubuntu-latest + bindings_python: OFF + build_shared: OFF + unit_tests: OFF + - name: 'Linux shared - C++/Python' + os: ubuntu-latest + bindings_python: ON + build_shared: ON + unit_tests: ON + - name: 'macOS static - C++ (Intel)' + os: macos-13 + bindings_python: OFF + build_shared: OFF + unit_tests: ON + - name: 'macOS shared - C++/Python (Intel)' + os: macos-13 + bindings_python: ON + build_shared: ON + unit_tests: ON + - name: 'macOS static - C++ (ARM)' + os: macos-latest + bindings_python: OFF + build_shared: OFF + unit_tests: ON + - name: 'macOS shared - C++/Python (ARM)' + os: macos-latest + bindings_python: ON + build_shared: ON + unit_tests: ON + steps: + - name: Check out libCellML + uses: actions/checkout@v4 + - name: Install Python (if needed) + if: ${{ matrix.bindings_python == 'ON' }} + uses: actions/setup-python@v5 + with: + python-version: '3.13' + - name: Install CMake and Ninja + uses: lukka/get-cmake@latest + - name: Install buildcache + uses: mikehardy/buildcache-action@v2 + with: + cache_key: ${{ matrix.os }}-${{ matrix.build_shared }} + - name: Configure MSVC (Windows only) + if: ${{ runner.os == 'Windows' }} + uses: ilammy/msvc-dev-cmd@v1 + - name: Install libxml2 (Windows only) + if: ${{ runner.os == 'Windows' }} + run: | + Invoke-WebRequest -UseBasicParsing https://github.com/cellml/gha/releases/download/gha/libxml2.zip -OutFile libxml2.zip + Expand-Archive -LiteralPath libxml2.zip -DestinationPath C:\ + - name: Install SWIG (macOS only and if needed) + if: ${{ runner.os == 'macOS' && matrix.bindings_python == 'ON' }} + run: | + brew install swig + - name: Install zlib (Windows only) + if: ${{ runner.os == 'Windows' }} + run: | + Invoke-WebRequest -UseBasicParsing https://github.com/cellml/gha/releases/download/gha/zlib.zip -OutFile zlib.zip + Expand-Archive -LiteralPath zlib.zip -DestinationPath C:\ + - name: Configure libCellML + run: | + mkdir build + cd build + ${{ matrix.set_path }} + cmake -G Ninja -DBINDINGS_PYTHON=${{ matrix.bindings_python }} -DBUILD_SHARED=${{ matrix.build_shared }} -DCOVERAGE=OFF -DLLVM_COVERAGE=OFF -DMEMCHECK=OFF -DUNIT_TESTS=${{ matrix.unit_tests }} ${{ matrix.additional_cmake_options }} .. + - name: Build libCellML + run: | + cd build + ninja + - name: Unit testing + if: ${{ matrix.unit_tests == 'ON' }} + run: | + cd build + ninja test + javascript: + name: JavaScript + runs-on: macos-latest + strategy: + fail-fast: false + env: + LIBCELLML_WASM_DIR: wasm + LIBXML2_VERSION: 2.9.10 + ZLIB_VERSION: 1.2.3 + steps: + - name: Check out libCellML + uses: actions/checkout@v4 + - name: Install CMake and Ninja + uses: lukka/get-cmake@latest + - name: Install buildcache + uses: mikehardy/buildcache-action@v2 + - name: Install Emscripten + run: | + brew install --overwrite emscripten + - name: Set up the build directory + run: | + mkdir build + - name: Build zlib + run: | + cd build + ZLIB_BUILD_DIR=zlib-wasm + git clone https://github.com/OpenCMISS-Dependencies/zlib.git -b v${ZLIB_VERSION} + mkdir ${ZLIB_BUILD_DIR} + emcmake cmake -G Ninja -S zlib -B ${ZLIB_BUILD_DIR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=~/${LIBCELLML_WASM_DIR} -DBUILD_SHARED_LIBS=OFF + cmake --build ${ZLIB_BUILD_DIR} + cmake --install ${ZLIB_BUILD_DIR} + - name: Build libxml2 + run: | + cd build + LIBXML2_BUILD_DIR=libxml2-wasm + git clone https://github.com/OpenCMISS-Dependencies/libxml2.git -b v${LIBXML2_VERSION} + mkdir ${LIBXML2_BUILD_DIR} + emcmake cmake -G Ninja -S libxml2 -B ${LIBXML2_BUILD_DIR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=~/${LIBCELLML_WASM_DIR} -DZLIB_DIR=~/${LIBCELLML_WASM_DIR}/lib/cmake/ZLIB-${ZLIB_VERSION} -DBUILD_SHARED_LIBS=OFF -DLIBXML2_WITH_ICONV=OFF -DLIBXML2_WITH_LZMA=OFF -DLIBXML2_WITH_PYTHON=OFF -DLIBXML2_WITH_TESTS=OFF -DLIBXML2_WITH_PROGRAMS=OFF + cmake --build ${LIBXML2_BUILD_DIR} + cmake --install ${LIBXML2_BUILD_DIR} + - name: Build libCellML + run: | + cd build + mkdir ${LIBCELLML_WASM_DIR} + emcmake cmake -G Ninja -S .. -B ${LIBCELLML_WASM_DIR} -DLibXml2_DIR=~/${LIBCELLML_WASM_DIR}/lib/cmake/libxml2-${LIBXML2_VERSION} -DBUILD_TYPE=Release + cmake --build ${LIBCELLML_WASM_DIR} + - name: Unit testing + run: | + cd build + cmake --build ${LIBCELLML_WASM_DIR} --target jest_test + code_formatting: + name: Code formatting + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - name: Check out libCellML + uses: actions/checkout@v4 + - name: Install ClangFormat + run: | + sudo apt update + sudo apt install clang-format + - name: Install CMake and Ninja + uses: lukka/get-cmake@latest + - name: Configure libCellML + run: | + mkdir build + cd build + cmake -G Ninja .. + - name: Code formatting + run: | + cd build + ninja test_clang_format + coverage: + name: Code coverage + runs-on: macos-latest + strategy: + fail-fast: false + steps: + - name: Check out libCellML + uses: actions/checkout@v4 + - name: Install CMake and Ninja + uses: lukka/get-cmake@latest + - name: Install buildcache + uses: mikehardy/buildcache-action@v2 + - name: Install LLVM + run: | + brew install --overwrite llvm + echo 'export PATH="/opt/homebrew/opt/llvm/bin:$PATH"' >> ~/.bash_profile + - name: Configure libCellML + run: | + mkdir build + cd build + cmake -G Ninja -DBINDINGS_PYTHON=OFF .. + - name: Code coverage + run: | + cd build + ninja llvm_coverage + if [ `ninja llvm_coverage | grep TOTAL | sed 's/ /\n/g' | grep "100.00%" | wc -l | sed 's/ //g'` -eq 4 ]; then exit 0; else exit 1; fi + memory_leaks: + name: Memory leaks + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - name: Check out libCellML + uses: actions/checkout@v4 + - name: Install CMake and Ninja + uses: lukka/get-cmake@latest + - name: Install buildcache + uses: mikehardy/buildcache-action@v2 + - name: Install Valgrind + run: | + sudo apt update + sudo apt install valgrind + - name: Configure libCellML + run: | + mkdir build + cd build + cmake -G Ninja -DBINDINGS_PYTHON=OFF .. + - name: Memory leaks + run: | + cd build + ninja memcheck + documentation: + name: Documentation + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - name: Check out libCellML + uses: actions/checkout@v4 + - name: Install CMake and Ninja + uses: lukka/get-cmake@latest + - name: Install buildcache + uses: mikehardy/buildcache-action@v2 + - name: Install Doxygen + run: | + sudo apt update + sudo apt install doxygen + - name: Install Sphinx + run: | + pip3 install sphinx + - name: Configure libCellML + run: | + mkdir build + cd build + cmake -G Ninja -DBINDINGS_PYTHON=OFF .. + - name: Documentation + run: | + cd build + ninja docs diff --git a/cmake/environmentchecks.cmake b/cmake/environmentchecks.cmake index 27e4f73d32..260b5c0ae4 100644 --- a/cmake/environmentchecks.cmake +++ b/cmake/environmentchecks.cmake @@ -48,8 +48,8 @@ else () find_program(CLANG_TIDY_EXE NAMES ${PREFERRED_CLANG_TIDY_NAMES} clang-tidy) find_program(FIND_EXE NAMES ${PREFERRED_FIND_NAMES} find) find_program(GCOV_EXE NAMES ${PREFERRED_GCOV_NAMES} gcov) - find_program(LLVM_COV_EXE NAMES ${PREFERRED_LLVM_COV_NAMES} llvm-cov HINTS ${LLVM_BIN_DIR} /Library/Developer/CommandLineTools/usr/bin/) - find_program(LLVM_PROFDATA_EXE NAMES ${PREFERRED_LLVM_PROFDATA_NAMES} llvm-profdata HINTS ${LLVM_BIN_DIR} /Library/Developer/CommandLineTools/usr/bin/) + find_program(LLVM_COV_EXE NAMES ${PREFERRED_LLVM_COV_NAMES} llvm-cov HINTS ${LLVM_BIN_DIR} ENV PATH /Library/Developer/CommandLineTools/usr/bin/) + find_program(LLVM_PROFDATA_EXE NAMES ${PREFERRED_LLVM_PROFDATA_NAMES} llvm-profdata HINTS ${LLVM_BIN_DIR} ENV PATH /Library/Developer/CommandLineTools/usr/bin/) find_program(VALGRIND_EXE NAMES ${PREFERRED_VALGRIND_NAMES} valgrind) find_program(INSTALL_NAME_TOOL_EXE NAMES ${PREFERRED_INSTALL_NAME_TOOL_NAMES} install_name_tool) diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt index 6795596e50..bab96399b3 100644 --- a/docs/CMakeLists.txt +++ b/docs/CMakeLists.txt @@ -86,4 +86,3 @@ if(SPHINX_FOUND OR DOXYGEN_FOUND OR LIBCELLML_COVERAGE) COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_BINARY_DIR}/_doctrees COMMENT "Cleaning documentation") endif() - diff --git a/docs/conf.in.py b/docs/conf.in.py index 1fad261573..b671f63111 100644 --- a/docs/conf.in.py +++ b/docs/conf.in.py @@ -47,42 +47,42 @@ # These are the shorthand for external links. Use them in the other pages as: # :shortcut:`Shortcut text ` NB space before < # Declare below as: -# 'shortcut': ('http://linkhere/%s',''), NB have to put the string insertion %s to make it work +# 'shortcut': ('http://linkhere/%s', None), NB have to put the string insertion %s to make it work extlinks = { # NB for deployment outside of the libcellml.org domain, you will need to include the root of the href for the # :api: shortcut here. This only works internally. - 'api': ('/documentation/latest/api/classlibcellml_1_1%s', ''), - 'buildbot': ('https://buildbot.net/%s',''), - 'cellml': ('https://www.cellml.org/%s',''), - 'cellml2spec': ('https://www.cellml.org/specifications/cellml_2.0%s', ''), - 'clang': ('https://clang.llvm.org/%s',''), - 'cmake': ('https://cmake.org/%s',''), - 'doxygen': ('http://www.doxygen.nl/%s',''), - 'forcescheduler': ('http://docs.buildbot.net/latest/developer/cls-forcesched.html%s',''), - 'gcc': ('https://gcc.gnu.org/%s',''), - 'gcovr': ('https://gcovr.com/%s',''), - 'git': ('https://git-scm.com/%s',''), - 'github': ('https://github.com/%s',''), - 'github_desktop': ('https://desktop.github.com/%s',''), - 'github_help': ('https://help.github.com%s',''), - 'github_rtd': ('https://github.com/rtfd/readthedocs.org/issues%s',''), - 'google_style_guide': ('https://google.github.io/styleguide/cppguide.html%s',''), - 'graphviz': ('http://graphviz.org%s',''), - 'htpasswd': ('https://httpd.apache.org/docs/current/programs/htpasswd.html%s',''), - 'libcellml_repo': ('https://github.com/cellml/libcellml/%s',''), - 'libcellml_buildbot': ('https://autotest.bioeng.auckland.ac.nz/buildbot/libcellml/#/builders%s',''), - 'libxml2': ('http://xmlsoft.org/%s',''), - 'mathml': ('https://www.w3.org/Math/%s',''), - 'msvs': ('https://visualstudio.microsoft.com%s',''), - 'opencmiss_libxml2_repo': ('https://github.com/OpenCMISS-Dependencies/libxml2/releases%s',''), - 'opencmiss_zlib_repo': ('https://github.com/OpenCMISS-Dependencies/zlib/releases%s',''), - 'python': ('https://www.python.org/%s',''), - 'sphinx': ('http://www.sphinx-doc.org/en/master/%s',''), - 'swig':('http://swig.org%s',''), - 'swigwin_download': ('https://sourceforge.net/projects/swig/files/swigwin/%s',''), - 'wikipedia': ('https://en.wikipedia.org/wiki%s',''), - 'xml': ('https://www.w3.org/XML/%s',''), - 'zlib': ('https://www.zlib.net/%s',''), + 'api': ('/documentation/latest/api/classlibcellml_1_1%s', None), + 'buildbot': ('https://buildbot.net/%s', None), + 'cellml': ('https://www.cellml.org/%s', None), + 'cellml2spec': ('https://www.cellml.org/specifications/cellml_2.0%s', None), + 'clang': ('https://clang.llvm.org/%s', None), + 'cmake': ('https://cmake.org/%s', None), + 'doxygen': ('http://www.doxygen.nl/%s', None), + 'forcescheduler': ('http://docs.buildbot.net/latest/developer/cls-forcesched.html%s', None), + 'gcc': ('https://gcc.gnu.org/%s', None), + 'gcovr': ('https://gcovr.com/%s', None), + 'git': ('https://git-scm.com/%s', None), + 'github': ('https://github.com/%s', None), + 'github_desktop': ('https://desktop.github.com/%s', None), + 'github_help': ('https://help.github.com%s', None), + 'github_rtd': ('https://github.com/rtfd/readthedocs.org/issues%s', None), + 'google_style_guide': ('https://google.github.io/styleguide/cppguide.html%s', None), + 'graphviz': ('http://graphviz.org%s', None), + 'htpasswd': ('https://httpd.apache.org/docs/current/programs/htpasswd.html%s', None), + 'libcellml_repo': ('https://github.com/cellml/libcellml/%s', None), + 'libcellml_buildbot': ('https://autotest.bioeng.auckland.ac.nz/buildbot/libcellml/#/builders%s', None), + 'libxml2': ('http://xmlsoft.org/%s', None), + 'mathml': ('https://www.w3.org/Math/%s', None), + 'msvs': ('https://visualstudio.microsoft.com%s', None), + 'opencmiss_libxml2_repo': ('https://github.com/OpenCMISS-Dependencies/libxml2/releases%s', None), + 'opencmiss_zlib_repo': ('https://github.com/OpenCMISS-Dependencies/zlib/releases%s', None), + 'python': ('https://www.python.org/%s', None), + 'sphinx': ('http://www.sphinx-doc.org/en/master/%s', None), + 'swig':('http://swig.org%s', None), + 'swigwin_download': ('https://sourceforge.net/projects/swig/files/swigwin/%s', None), + 'wikipedia': ('https://en.wikipedia.org/wiki%s', None), + 'xml': ('https://www.w3.org/XML/%s', None), + 'zlib': ('https://www.zlib.net/%s', None), } # The master toctree document. diff --git a/src/api/libcellml/generatorprofile.h b/src/api/libcellml/generatorprofile.h index 10335d24d8..fb9c90510c 100644 --- a/src/api/libcellml/generatorprofile.h +++ b/src/api/libcellml/generatorprofile.h @@ -2587,7 +2587,7 @@ class LIBCELLML_EXPORT GeneratorProfile * Set the @c std::string for the name of the state variable type that is * used in a differential model. * - * @param stateTypeString The @c std::string to use for the name of the + * @param stateVariableTypeString The @c std::string to use for the name of the * state variable type. */ void setStateVariableTypeString(const std::string &stateVariableTypeString); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index cf64a66c27..1dbf26da87 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -191,6 +191,7 @@ if(LIBCELLML_LLVM_COVERAGE) add_custom_target(llvm_coverage_report COMMAND ${LLVM_COV_EXE} show $ -instr-profile=${DATA_PROFILE_FILENAME} -format=html -Xdemangler c++filt -Xdemangler -n -o coverage_report --show-expansions --show-branches=count + COMMAND echo "The coverage report can be found at ${CMAKE_CURRENT_BINARY_DIR}/${COVERAGE_REPORT_DIR}coverage_report/index.html." DEPENDS prepare_llvm_coverage WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Running LLVM coverage missing lines command")