From 4874cd580c4e2ebd00c2d4a33aa281d964662ab1 Mon Sep 17 00:00:00 2001 From: Daniel Brondani Date: Mon, 4 Oct 2021 19:28:03 +0200 Subject: [PATCH 01/29] [projmgr] MVP prototype initial commit --- .github/workflows/projmgr.yml | 262 ++++++ .pre-commit-config.yaml | 1 + CMakeLists.txt | 6 + tools/buildmgr/cbuild/include/CbuildLayer.h | 2 +- tools/projmgr/CMakeLists.txt | 42 + tools/projmgr/docs/LICENSE.txt | 842 ++++++++++++++++++ tools/projmgr/docs/README.md | 165 ++++ tools/projmgr/include/ProjMgr.h | 101 +++ tools/projmgr/include/ProjMgrCallback.h | 61 ++ tools/projmgr/include/ProjMgrKernel.h | 48 + tools/projmgr/src/ProductInfo.h.in | 22 + tools/projmgr/src/ProjMgr.cpp | 702 +++++++++++++++ tools/projmgr/src/ProjMgrCallback.cpp | 43 + tools/projmgr/src/ProjMgrKernel.cpp | 70 ++ tools/projmgr/src/ProjMgrMain.cpp | 16 + tools/projmgr/swig/CMakeLists.txt | 12 + tools/projmgr/swig/projmgr-cli.py | 5 + tools/projmgr/swig/projmgr.i | 20 + tools/projmgr/test/CMakeLists.txt | 13 + tools/projmgr/test/data/project/main.c | 6 + .../test/data/project/test.cproject.yml | 20 + tools/projmgr/test/src/ProjMgrTestEnv.cpp | 46 + tools/projmgr/test/src/ProjMgrTestEnv.h | 19 + tools/projmgr/test/src/ProjMgrUnitTests.cpp | 25 + 24 files changed, 2548 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/projmgr.yml create mode 100644 tools/projmgr/CMakeLists.txt create mode 100644 tools/projmgr/docs/LICENSE.txt create mode 100644 tools/projmgr/docs/README.md create mode 100644 tools/projmgr/include/ProjMgr.h create mode 100644 tools/projmgr/include/ProjMgrCallback.h create mode 100644 tools/projmgr/include/ProjMgrKernel.h create mode 100644 tools/projmgr/src/ProductInfo.h.in create mode 100644 tools/projmgr/src/ProjMgr.cpp create mode 100644 tools/projmgr/src/ProjMgrCallback.cpp create mode 100644 tools/projmgr/src/ProjMgrKernel.cpp create mode 100644 tools/projmgr/src/ProjMgrMain.cpp create mode 100644 tools/projmgr/swig/CMakeLists.txt create mode 100644 tools/projmgr/swig/projmgr-cli.py create mode 100644 tools/projmgr/swig/projmgr.i create mode 100644 tools/projmgr/test/CMakeLists.txt create mode 100644 tools/projmgr/test/data/project/main.c create mode 100644 tools/projmgr/test/data/project/test.cproject.yml create mode 100644 tools/projmgr/test/src/ProjMgrTestEnv.cpp create mode 100644 tools/projmgr/test/src/ProjMgrTestEnv.h create mode 100644 tools/projmgr/test/src/ProjMgrUnitTests.cpp diff --git a/.github/workflows/projmgr.yml b/.github/workflows/projmgr.yml new file mode 100644 index 000000000..b0929f054 --- /dev/null +++ b/.github/workflows/projmgr.yml @@ -0,0 +1,262 @@ +name: projmgr +on: + pull_request: + paths: + - '.github/workflows/projmgr.yml' + - 'CMakeLists.txt' + - 'libs/crossplatform/**' + - 'libs/rtefsutils/**' + - 'libs/xmlreader/**' + - 'libs/xmltree/**' + - 'libs/xmltreeslim/**' + - 'tools/projmgr/**' + release: + types: [published] + +jobs: + build: + if: ${{ github.event_name == 'pull_request' || (github.event_name == 'release' && startsWith(github.ref, 'refs/tags/tools/projmgr/')) }} + runs-on: ${{ matrix.os }} + timeout-minutes: 15 + strategy: + fail-fast: true + matrix: + os: [ macos-10.15, ubuntu-20.04, windows-2019 ] + include: + - os: macos-10.15 + target: darwin64 + binary: projmgr + - os: ubuntu-20.04 + target: linux64 + binary: projmgr + - os: windows-2019 + target: windows64 + binary: projmgr.exe + + steps: + - name: Install macos deps + if: ${{ startsWith(matrix.os, 'macos') }} + run: | + brew install \ + ninja \ + python \ + swig + + - name: Install linux deps + if: ${{ startsWith(matrix.os, 'ubuntu') }} + run: | + sudo apt update + sudo apt-get install \ + bc \ + build-essential \ + ninja-build \ + python-dev \ + swig + + - name: Install windows deps + if: ${{ startsWith(matrix.os, 'windows') }} + run: choco install -y ninja python swig + + - name: Checkout devtools + uses: actions/checkout@v2 + with: + submodules: true + + - name: Create build folders + run: | + mkdir build + mkdir buildswig + + - name: Configure windows build for amd64 + if: ${{ startsWith(matrix.os, 'windows') }} + uses: ilammy/msvc-dev-cmd@v1 + with: + arch: amd64 + + - uses: ammaraskar/gcc-problem-matcher@master + if: ${{ startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu') }} + - uses: ammaraskar/msvc-problem-matcher@master + if: ${{ startsWith(matrix.os, 'windows') }} + + - name: Build projmgr + run: | + cmake -G Ninja -DCMAKE_BUILD_TYPE=Release .. + cmake --build . --target projmgr + working-directory: ./build + + - name: Archive projmgr + uses: actions/upload-artifact@v2 + with: + name: projmgr-${{ matrix.target }} + path: ./build/tools/projmgr/${{ matrix.target }}/Release/${{ matrix.binary }} + retention-days: 1 + if-no-files-found: error + + - name: Build projmgr swig libs + run: | + cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DSWIG_LIBS=ON .. + cmake --build . --target projmgr --config Release + working-directory: ./buildswig + + - name: Archive projmgr swig libs windows + if: ${{ startsWith(matrix.os, 'windows') }} + uses: actions/upload-artifact@v2 + with: + name: projmgr-swig-${{ matrix.target }} + path: | + ./buildswig/tools/projmgr/swig/projmgr.py + ./buildswig/tools/projmgr/swig/_projmgr.pyd + retention-days: 1 + + - name: Archive projmgr swig libs macos ubuntu + if: ${{ startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu') }} + uses: actions/upload-artifact@v2 + with: + name: projmgr-swig-${{ matrix.target }} + path: | + ./buildswig/tools/projmgr/swig/projmgr.py + ./buildswig/tools/projmgr/swig/_projmgr.so + retention-days: 1 + + release: + if: ${{ github.event_name == 'release' && startsWith(github.ref, 'refs/tags/tools/projmgr/') }} + needs: [ build, unittest ] + runs-on: ubuntu-20.04 + timeout-minutes: 15 + + steps: + - name: Checkout devtools + uses: actions/checkout@v2 + + - name: Create distribution folders + run: | + mkdir -p tools/projmgr/distribution/bin tools/projmgr/distribution/lib tools/projmgr/distribution/doc + cp tools/projmgr/docs/LICENSE.txt tools/projmgr/distribution/ + cp tools/projmgr/docs/README.md tools/projmgr/distribution/doc/ + + - name: Download projmgr linux + uses: actions/download-artifact@v2 + with: + name: projmgr-linux64 + path: tools/projmgr/distribution/bin/linux64/ + + - name: Download projmgr macos + uses: actions/download-artifact@v2 + with: + name: projmgr-darwin64 + path: tools/projmgr/distribution/bin/darwin64/ + + - name: Download projmgr windows + uses: actions/download-artifact@v2 + with: + name: projmgr-windows64 + path: tools/projmgr/distribution/bin/windows64/ + + - name: Download projmgr-swig linux + uses: actions/download-artifact@v2 + with: + name: projmgr-swig-linux64 + path: tools/projmgr/distribution/lib/linux64/ + + - name: Download projmgr-swig macos + uses: actions/download-artifact@v2 + with: + name: projmgr-swig-darwin64 + path: tools/projmgr/distribution/lib/darwin64/ + + - name: Download projmgr-swig windows + uses: actions/download-artifact@v2 + with: + name: projmgr-swig-windows64 + path: tools/projmgr/distribution/lib/windows64/ + + - name: Zip distribution folder + run: zip -r projmgr.zip * + working-directory: tools/projmgr/distribution + + - name: Attach zip archive to release assets + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: tools/projmgr/distribution/projmgr.zip + tag: ${{ github.ref }} + overwrite: true + asset_name: projmgr.zip + + unittest: + if: ${{ github.event_name == 'pull_request' || (github.event_name == 'release' && startsWith(github.ref, 'refs/tags/tools/projmgr/')) }} + runs-on: ${{ matrix.os }} + timeout-minutes: 15 + strategy: + fail-fast: true + matrix: + os: [ macos-10.15, ubuntu-20.04, windows-2019 ] + include: + - os: macos-10.15 + target: darwin64 + - os: ubuntu-20.04 + target: linux64 + - os: windows-2019 + target: windows64 + + steps: + - name: Install macos deps + if: ${{ startsWith(matrix.os, 'macos') }} + run: | + brew install \ + ninja + + - name: Install linux deps + if: ${{ startsWith(matrix.os, 'ubuntu') }} + run: | + sudo apt update + sudo apt-get install \ + bc \ + build-essential \ + ninja-build + + - name: Install windows deps + if: ${{ startsWith(matrix.os, 'windows') }} + run: choco install -y ninja + + - name: Checkout devtools + uses: actions/checkout@v2 + with: + submodules: true + + - name: Create build folder + run: mkdir build + + - name: Configure windows build for amd64 + if: ${{ startsWith(matrix.os, 'windows') }} + uses: ilammy/msvc-dev-cmd@v1 + with: + arch: amd64 + + - uses: ammaraskar/gcc-problem-matcher@master + if: ${{ startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu') }} + - uses: ammaraskar/msvc-problem-matcher@master + if: ${{ startsWith(matrix.os, 'windows') }} + + - name: Build and run projmgr unit tests + run: | + cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug .. + cmake --build . --target ProjMgrUnitTests + ctest -C Debug -R ProjMgrUnitTests + working-directory: ./build + + - name: Archive unit tests results + uses: actions/upload-artifact@v2 + with: + name: unittest-${{ matrix.target }} + path: ./build/Testing/Temporary/LastTest.log + retention-days: 1 + if-no-files-found: error + if: ${{ always() }} + + - name: Publish projmgr unit test results + uses: mikepenz/action-junit-report@v2 + with: + check_name: "projmgr unit tests [${{ matrix.target }}]" + report_paths: build/projmgr_unit_test_report.xml + diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d9d1e8c57..68e9b03b3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,6 +12,7 @@ repos: (?x)^( tools/buildmgr/test/testinput/| tools/packgen/test/data/| + tools/projmgr/test/data/| libs/crossplatform/include/win| tools/buildmgr/cbuildgen/include/Resource.h| libs/crossplatform/test/src/TestProg.cpp) diff --git a/CMakeLists.txt b/CMakeLists.txt index 366ea0197..1a470423c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,7 @@ cmake_policy(SET CMP0091 NEW) option(COVERAGE "Enable code coverage" OFF) option(LIBS_ONLY "Build only libraries" OFF) +option(SWIG_LIBS "Build SWIG libraries" OFF) if(LIBS_ONLY) message("LIBS_ONLY is active. Build only libraries") @@ -37,6 +38,10 @@ if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall") endif() +if(SWIG_LIBS) + message("SWIG_LIBS is active. Build SWIG libraries") + set(CMAKE_POSITION_INDEPENDENT_CODE ON) +endif(SWIG_LIBS) if(COVERAGE) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") @@ -78,6 +83,7 @@ add_subdirectory(libs/xmltreeslim) if(NOT LIBS_ONLY) add_subdirectory(tools/buildmgr) add_subdirectory(tools/packgen) + add_subdirectory(tools/projmgr) endif() # Google Test Framework diff --git a/tools/buildmgr/cbuild/include/CbuildLayer.h b/tools/buildmgr/cbuild/include/CbuildLayer.h index be5f44268..050575b90 100644 --- a/tools/buildmgr/cbuild/include/CbuildLayer.h +++ b/tools/buildmgr/cbuild/include/CbuildLayer.h @@ -87,7 +87,7 @@ class CbuildLayer { * @param saveBackup if true save the original file with extension '.bak' * @return true if xml file is written successfully, otherwise false */ - bool WriteXmlFile(const std::string &file, XMLTree* tree, const bool saveBackup=false); + static bool WriteXmlFile(const std::string &file, XMLTree* tree, const bool saveBackup=false); /** * @brief initialize header (tool and timestamp) information diff --git a/tools/projmgr/CMakeLists.txt b/tools/projmgr/CMakeLists.txt new file mode 100644 index 000000000..2678f49ca --- /dev/null +++ b/tools/projmgr/CMakeLists.txt @@ -0,0 +1,42 @@ +cmake_minimum_required(VERSION 3.14) + +include(DumpCMakeProjectVersion) +include(ProjectVersionFromGitTag) +get_version_from_git_tag("tools/projmgr/") + +project(ProjMgr VERSION "${PROJECT_VERSION}") +dump_cmake_project_version() + +configure_file(src/ProductInfo.h.in ProductInfo.h) + +set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT projmgr) + +# projmgr library +SET(PROJMGR_SOURCE_FILES ProjMgr.cpp ProjMgrKernel.cpp ProjMgrCallback.cpp) +SET(PROJMGR_HEADER_FILES ProjMgr.h ProjMgrKernel.h ProjMgrCallback.h) + +list(TRANSFORM PROJMGR_SOURCE_FILES PREPEND src/) +list(TRANSFORM PROJMGR_HEADER_FILES PREPEND include/) + +add_library(projmgrlib OBJECT ${PROJMGR_SOURCE_FILES} ${PROJMGR_HEADER_FILES}) +target_link_libraries(projmgrlib PUBLIC CrossPlatform RteFsUtils RteUtils XmlTree XmlTreeSlim XmlReader RteModel cbuild cxxopts yaml-cpp) +target_include_directories(projmgrlib PRIVATE include ${PROJECT_BINARY_DIR}) + +if(SWIG_LIBS) + # projmgr swig + add_subdirectory(swig) +else() + # projmgr target + add_executable(projmgr src/ProjMgrMain.cpp include/ProjMgr.h) + if(MSVC) + target_link_options(projmgr PUBLIC "$<$:/SAFESEH:NO>") + endif(MSVC) + set_property(TARGET projmgr PROPERTY + MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + target_link_libraries(projmgr projmgrlib) + target_include_directories(projmgr PRIVATE include) +endif() + +# projmgr test +enable_testing() +add_subdirectory(test) diff --git a/tools/projmgr/docs/LICENSE.txt b/tools/projmgr/docs/LICENSE.txt new file mode 100644 index 000000000..9ab72f76a --- /dev/null +++ b/tools/projmgr/docs/LICENSE.txt @@ -0,0 +1,842 @@ +The software is provided under Apache 2.0 license (below). +No contributions to cmsis-build are accepted at this point. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +Other Projects: +================ +The installer redistributes and installs GNU Make v4.2 for Windows 64-bit +when installed on Windows (.../bin/make.exe) +Name: GNU Make v4.2 +Summary: GNU Make is a tool which controls the generation of executables + and other non-source files of a program from the program's source + files. +Home-page: https://www.gnu.org/software/make/ +License(s): GNU General Public License v3.0 only (GPL-3.0-only). See later + section for a copy of license text. +Copyright(s): Refer to Source(s): https://ftp.gnu.org/gnu/make/ + +License text (GPL-3.0-only) for 'GNU Make' + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS +================================================================================ diff --git a/tools/projmgr/docs/README.md b/tools/projmgr/docs/README.md new file mode 100644 index 000000000..275dd5404 --- /dev/null +++ b/tools/projmgr/docs/README.md @@ -0,0 +1,165 @@ +# CMSIS Project Manager - MVP Prototype + +The utility `projmgr` assists the generation of a CMSIS Project Description file +according to the standard +[CPRJ format](https://arm-software.github.io/CMSIS_5/Build/html/cprjFormat_pg.html) +and provides commands to search packs, devices and components from installed packs +as well as unresolved component dependencies. + +The initial MVP prototype proposal can be found in the following Open-CMSIS-Pack forked branch: +
+https://github.com/brondani/devtools/tree/mvp-prototype + +## Requirements + +The CMSIS Pack repository must be present in the environment. + +There are several ways to initialize and configure the pack repository, for example using the +`cpackget` tool: +
+https://github.com/Open-CMSIS-Pack/cpackget + +## Quick Start + +The `projmgr` binaries as well as python interfaces for all supported platforms can be downloaded +from the releases page: +
+https://github.com/brondani/devtools/releases/tag/tools%2Fprojmgr%2F0.9.0 + +Before running `projmgr` the location of the pack repository shall be set via the environment variable +`CMSIS_PACK_ROOT` otherwise its default location will be taken. + +## Usage + +``` +CMSIS Project Manager 0.9.0 (C) 2021 ARM +Usage: + projmgr [] [OPTIONS...] + +Commands: + list packs Print list of installed packs + devices Print list of available device names + components Print list of available components + dependencies Print list of unresolved project dependencies + convert Convert cproject.yml in cprj file + help Print usage + +Options: + -i, --input arg Input YAML file + -f, --filter arg Filter words + -h, --help Print usage +``` + +## Commands + +- Print list of installed packs. The list can be filtered by words provided with the option `--filter`: +``` +list packs [--filter ""] +``` + +- Print list of available device names. The list can be filtered by words provided with the option `--filter`: +``` +list devices [--filter ""] +``` + +- Print list of available components. The list can be filtered by a selected device in the `cproject.yml` file with the option `--input` and/or by words provided with the option `-filter`: +``` +list components [--input --filter ""] +``` + +- Print list of unresolved project dependencies. The device and components selection must be provided in the `cproject.yml` file with the option `--input`. The list can be filtered by words provided with the option `--filter`: +``` +list dependencies --input [--filter ""] +``` + +Convert cproject.yml in cprj file: +``` +list convert --input +``` + + +## Input .cproject.yml file + +The YAML structure is described below. + +``` yml +project: + device: + attributes: {} + type: + output: + +compiler: + name: + version: + +components: + - filter: + attributes: {} + +files: + - file: + category: + - group: + files: + - file: + category: +``` + +### project +| Argument | Description +|:----------------|:---------------------------------------- +| device | Device name +| attributes | Device attributes: [Dfpu](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DfpuEnum), [Dmpu](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DmpuEnum), [Dendian](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DendianEnum), [Dsecure](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DsecureEnum), [Dmve](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DmveEnum) +| type | Output type: `exe` or `lib` +| output | Output build folder +
+ +### compiler +| Argument | Description +|:----------------|:---------------------------------------- +| name | Compiler name +| version | Compiler version +
+ +### components +| Argument | Description +|:----------------|:---------------------------------------- +| filter | Filter words +| attributes | Components attributes +
+ +### files +| Argument | Description +|:----------------|:---------------------------------------- +| file | File path and type according to [file category](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#FileCategoryEnum) +| group | Child group name. It accepts nested `files` nodes +
+ +## Public functions +``` + static int RunProjMgr(int argc, char **argv); + void PrintUsage(); + bool LoadPacks(); + bool CheckRteErrors(); + bool ListPacks(set& packs); + bool ListDevices(set& devices); + bool ListComponents(set& components); + bool ListDependencies(set& dependencies); + bool ParseInput(); + bool ProcessProject(); + bool GenerateCprj(); + bool ProcessDevice(); + bool ProcessComponents(); + bool ProcessDependencies(); +``` + +## Python interface + +Python library interfaces are generated with SWIG and can be found among the release artifacts. +A Python CLI wrapper is also provided as an example: [projmgr-cli.py](https://github.com/brondani/devtools/blob/mvp-prototype/tools/projmgr/swig/projmgr-cli.py). + +## Revision History +| Version | Description +|:---------|:---------------------------------------- +| 0.9.0 | Release for alpha review diff --git a/tools/projmgr/include/ProjMgr.h b/tools/projmgr/include/ProjMgr.h new file mode 100644 index 000000000..5abba59cf --- /dev/null +++ b/tools/projmgr/include/ProjMgr.h @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2020-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef PROJMGR_H +#define PROJMGR_H + +#include "ProjMgr.h" +#include "ProjMgrKernel.h" + +#include "XMLTreeSlim.h" +#include "yaml-cpp/yaml.h" +#include + +struct FileInfo { + std::string name; + std::string category; +}; + +struct GroupInfo { + std::string name; + std::set files; + std::set groups; +}; + +inline bool operator<(const FileInfo& lhs, const FileInfo& rhs) +{ + return lhs.name < rhs.name; +} + +inline bool operator<(const GroupInfo& lhs, const GroupInfo& rhs) +{ + return lhs.name < rhs.name; +} + +struct ComponentInfo { + std::string filter; + std::map attributes; +}; + +inline bool operator<(const ComponentInfo& lhs, const ComponentInfo& rhs) +{ + return lhs.filter < rhs.filter; +} + +class ProjMgr { +public: + ProjMgr(void); + ~ProjMgr(void); + static int RunProjMgr(int argc, char **argv); + void PrintUsage(); + bool LoadPacks(); + bool CheckRteErrors(); + bool ListPacks(std::set& packs); + bool ListDevices(std::set& devices); + bool ListComponents(std::set& components); + bool ListDependencies(std::set& dependencies); + bool ParseInput(); + bool ProcessProject(); + bool GenerateCprj(); + bool ProcessDevice(); + bool ProcessComponents(); + bool ProcessDependencies(); + +protected: + ProjMgrKernel* m_kernel = nullptr; + RteGlobalModel* m_model = nullptr; + RteProject* m_project = nullptr; + RteTarget* m_target = nullptr; + std::list m_installedPacks; + std::string m_input; + std::string m_filter; + std::string m_command; + std::string m_args; + + std::string m_projectName; + std::string m_rootFolder; + std::string m_infoDescription; + std::string m_device; + std::map m_deviceAttributes; + std::string m_outputFolder; + std::string m_outputType; + std::set m_packages; + std::string m_toolchain; + std::string m_toolchainVersion; + std::set m_componentDescriptions; + std::set m_components; + std::set m_dependencies; + GroupInfo m_files; + + void ParseFiles(YAML::Node files, GroupInfo& group); + void GenerateCprjGroups(XMLTreeElement* element, const GroupInfo& group); + std::set SplitArgs(const std::string& args); + static void SetAttribute(XMLTreeElement* element, const std::string& name, const std::string& value); + bool SetTargetAttributes(std::map& attributes); + void ApplyFilter(const std::set& origin, const std::set& filter, std::set& result); +}; + +#endif // PROJMGR_H diff --git a/tools/projmgr/include/ProjMgrCallback.h b/tools/projmgr/include/ProjMgrCallback.h new file mode 100644 index 000000000..4f993efd7 --- /dev/null +++ b/tools/projmgr/include/ProjMgrCallback.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef PROJMGRCALLBACK_H +#define PROJMGRCALLBACK_H + +#include "RteCallback.h" + +class ProjMgrCallback; + +/** + * @brief extension to RTE Callback +*/ +class ProjMgrCallback : public RteCallback +{ +public: + ProjMgrCallback(); + ~ProjMgrCallback(); + + /** + * @brief obtain error messages + * @return list of all error messages + */ + const std::list& GetErrorMessages() const { + return m_errorMessages; + } + + /** + * @brief clear all messages + */ + void ClearErrorMessages() { + m_errorMessages.clear(); + } + + /** + * @brief clear all output messages + */ + virtual void ClearOutput() override; + + /** + * @brief add message to output message list + * @param message error message to be added + */ + virtual void OutputErrMessage(const std::string& message) override; + + /** + * @brief create error message string and add it to message list + * @param id error Id + * @param message error message + * @param object file in which error occured + */ + virtual void Err(const std::string& id, const std::string& message, const std::string& object = RteUtils::EMPTY_STRING) override; + +protected: + std::list m_errorMessages; + +}; +#endif // PROJMGRCALLBACK_H diff --git a/tools/projmgr/include/ProjMgrKernel.h b/tools/projmgr/include/ProjMgrKernel.h new file mode 100644 index 000000000..40973afc0 --- /dev/null +++ b/tools/projmgr/include/ProjMgrKernel.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef PROJMGRKERNEL_H +#define PROJMGRKERNEL_H + +#include "ProjMgrCallback.h" +#include "RteKernel.h" + +class ProjMgrKernel : public RteKernel +{ +public: + ProjMgrKernel(RteCallback* callback); + ~ProjMgrKernel(); + + /** + * @brief get kernel + * @return pointer to singleton kernel instance + */ + static ProjMgrKernel *Get(); + + /** + * @brief destroy kernel + */ + static void Destroy(); + + + bool GetInstalledPacks(std::list& packs); + + /** + * @brief get callback + * @return pointer to callback + */ + const ProjMgrCallback* GetCallback() { + return m_callback; + } + +protected: + XMLTree* CreateXmlTree() const; + +private: + ProjMgrCallback *m_callback; +}; + +#endif /* PROJMGRKERNEL_H */ diff --git a/tools/projmgr/src/ProductInfo.h.in b/tools/projmgr/src/ProductInfo.h.in new file mode 100644 index 000000000..f61c9e919 --- /dev/null +++ b/tools/projmgr/src/ProductInfo.h.in @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2020-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +// Product Information + +static constexpr const char* MAJOR_VERSION = "@PROJECT_VERSION_MAJOR@"; +static constexpr const char* MINOR_VERSION = "@PROJECT_VERSION_MINOR@"; +static constexpr const char* PATCH_VERSION = "@PROJECT_VERSION_PATCH@"; +static constexpr const char* BUILD_VERSION = "0"; + +static constexpr const char* COMPANY_NAME = "Arm Ltd."; +static constexpr const char* FILE_DESCRIPTION = "CMSIS Project Manager"; +static constexpr const char* PRODUCT_NAME = "CMSIS Project Manager"; +static constexpr const char* INTERNAL_NAME = "projmgr"; +static constexpr const char* ORIGINAL_FILENAME = "projmgr"; +static constexpr const char* COPYRIGHT_NOTICE = "(C) @PROJECT_VERSION_YEAR@ ARM"; + +static constexpr const char* VERSION_STRING = "@PROJECT_VERSION_FULL@"; +static constexpr const char* VERSION_STRING_RC = "@PROJECT_VERSION_FULL@"; diff --git a/tools/projmgr/src/ProjMgr.cpp b/tools/projmgr/src/ProjMgr.cpp new file mode 100644 index 000000000..4de21d0c8 --- /dev/null +++ b/tools/projmgr/src/ProjMgr.cpp @@ -0,0 +1,702 @@ +/* + * Copyright (c) 2020-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "ProjMgr.h" + +#include "ProductInfo.h" + +#include "CbuildLayer.h" +#include "CbuildUtils.h" + +#include "RteFsUtils.h" +#include "XmlFormatter.h" +#include "CrossPlatformUtils.h" + +#include +#include +#include +#include +#include + +using namespace std; + +static constexpr const char* SCHEMA_FILE = "PACK.xsd"; // XML schema file name +static constexpr const char* SCHEMA_VERSION = "1.7.2"; // XML schema version + +static constexpr const char* USAGE = "\ +Usage:\n\ + projmgr [] [OPTIONS...]\n\n\ +Commands:\n\ + list packs Print list of installed packs\n\ + devices Print list of available device names\n\ + components Print list of available components\n\ + dependencies Print list of unresolved project dependencies\n\ + convert Convert cproject.yml in cprj file\n\ + help Print usage\n\n\ +Options:\n\ + -i, --input arg Input YAML file\n\ + -f, --filter arg Filter words\n\ + -h, --help Print usage\n\ +"; + +ProjMgr::ProjMgr(void) { + // Reserved +} + +ProjMgr::~ProjMgr(void) { + // Reserved +} + +int ProjMgr::RunProjMgr(int argc, char **argv) { + + ProjMgr manager; + + // Command line options + cxxopts::Options options(ORIGINAL_FILENAME); + cxxopts::ParseResult parseResult; + + try { + options.add_options() + ("command", "", cxxopts::value()) + ("args", "", cxxopts::value()) + ("i,input", "", cxxopts::value()) + ("f,filter", "", cxxopts::value()) + ("h,help", "") + ; + options.parse_positional({ "command", "args"}); + + parseResult = options.parse(argc, argv); + + if (parseResult.count("command")) { + manager.m_command = parseResult["command"].as(); + } else { + // No command was given, print usage and return success + manager.PrintUsage(); + return 0; + } + if (parseResult.count("args")) { + manager.m_args = parseResult["args"].as(); + } + if (parseResult.count("input")) { + manager.m_input = parseResult["input"].as(); + error_code ec; + if (!fs::exists(manager.m_input, ec)) { + cerr << "projmgr error: input file " << manager.m_input << " was not found" << endl; + return 1; + } + manager.m_projectName = fs::path(manager.m_input).stem().stem().generic_string(); + manager.m_rootFolder = fs::path(fs::canonical(manager.m_input, ec)).parent_path().generic_string(); + } + if (parseResult.count("filter")) { + manager.m_filter = parseResult["filter"].as(); + } + } catch (cxxopts::OptionException& e) { + cerr << "projmgr error: parsing command line failed!" << endl << e.what() << endl; + return 1; + } + + // Unmatched items in the parse result + if (!parseResult.unmatched().empty()) { + cerr << "projmgr error: too many command line arguments!" << endl; + return 1; + } + + // Parse commands + if ((manager.m_command == "help") || parseResult.count("help")) { + // Print usage + manager.PrintUsage(); + return 0; + } else if (manager.m_command == "list") { + // Process 'list' command + if (manager.m_args.empty()) { + cerr << "projmgr error: list was not specified!" << endl; + return 1; + } + // Load installed packs + if ((!manager.LoadPacks()) || (!manager.CheckRteErrors()) ){ + return 1; + } + // Parse input if present + if (!manager.m_input.empty() && !manager.ParseInput()) { + return 1; + } + // Process argument + if (manager.m_args == "packs") { + setpacks; + if (manager.ListPacks(packs)) { + for (const auto& pack : packs) { + cout << pack << endl; + } + } + } else if (manager.m_args == "devices") { + setdevices; + if (manager.ListDevices(devices)) { + for (const auto& device : devices) { + cout << device << endl; + } + } + } else if (manager.m_args == "components") { + if (manager.ProcessDevice()) { + setcomponents; + if (manager.ListComponents(components)) { + for (const auto& component : components) { + cout << component << endl; + } + } + } + } else if (manager.m_args == "dependencies") { + if (manager.m_input.empty()) { + cerr << "projmgr error: input YAML file was not specified!" << endl; + return 1; + } + if ((manager.ProcessDevice()) && (manager.ProcessComponents()) && (manager.ProcessDependencies())) { + setdependencies; + if (manager.ListDependencies(dependencies)) { + for (const auto& dependency : dependencies) { + cout << dependency << endl; + } + } + } + } else { + cerr << "projmgr error: list was not found!" << endl; + return 1; + } + } else if (manager.m_command == "convert") { + // Process 'convert' command + if (manager.m_input.empty()) { + cerr << "projmgr error: input YAML file was not specified!" << endl; + return 1; + } + if ((!manager.ParseInput()) || !manager.LoadPacks() || + !manager.ProcessProject() || !manager.CheckRteErrors() || !manager.GenerateCprj()) { + return 1; + } + } else { + cerr << "projmgr error: was not found!" << endl; + return 1; + } + return 0; +} + +void ProjMgr::PrintUsage(void) { + cout << PRODUCT_NAME << " " << VERSION_STRING << " " << COPYRIGHT_NOTICE << " " << endl; + cout << USAGE << endl; +} + +bool ProjMgr::LoadPacks() { + string packRoot = CrossPlatformUtils::GetEnv("CMSIS_PACK_ROOT"); + if (packRoot.empty()) { + packRoot = CrossPlatformUtils::GetDefaultCMSISPackRootDir(); + } + m_kernel = ProjMgrKernel::Get(); + m_kernel->SetCmsisPackRoot(packRoot); + // Get installed packs + if (!m_kernel->GetInstalledPacks(m_installedPacks)) { + cerr << "projmgr error: parsing installed packs failed!" << endl; + } + return true; +} + +bool ProjMgr::CheckRteErrors() { + const list& rteErrorMessages = m_kernel->GetCallback()->GetErrorMessages(); + if (!rteErrorMessages.empty()) { + for (const auto& rteErrorMessage : rteErrorMessages) { + cerr << rteErrorMessage << endl; + } + return false; + } + return true; +} + +bool ProjMgr::SetTargetAttributes(map& attributes) { + if (m_project == nullptr) { + m_model = m_kernel->GetGlobalModel(); + m_project = new RteProject(); + m_model->AddProject(0, m_project); + m_model->SetActiveProjectId(m_project->GetProjectId()); + m_project = m_model->GetActiveProject(); + m_project->AddTarget("CMSIS", attributes, true, true); + m_project->SetActiveTarget("CMSIS"); + m_target = m_project->GetActiveTarget(); + } + else { + m_target->SetAttributes(attributes); + m_target->UpdateFilterModel(); + } + return true; +} + +void ProjMgr::ApplyFilter(const set& origin, const set& filter, set& result) { + result.clear(); + for (const auto& word : filter) { + if (result.empty()) { + for (const auto& item : origin) { + if (item.find(word) != string::npos) { + result.insert(item); + } + } + } else { + const auto temp = result; + for (const auto& item : temp) { + if (item.find(word) == string::npos) { + result.erase(result.find(item)); + } + if (result.empty()) { + return; + } + } + } + } +} + +bool ProjMgr::ListPacks(set& packs) { + if (m_installedPacks.empty()) { + cerr << "projmgr error: no installed pack was found" << endl; + return false; + } + for (const auto& pack : m_installedPacks) { + packs.insert(pack->GetPackageID()); + } + if (!m_filter.empty()) { + set filteredPacks; + ApplyFilter(packs, SplitArgs(m_filter), filteredPacks); + if (filteredPacks.empty()) { + cerr << "projmgr error: no pack was found with filter '" << m_filter << "'" << endl; + return false; + } + packs = filteredPacks; + } + return true; +} + +bool ProjMgr::ListDevices(set& devices) { + for (const auto& pack : m_installedPacks) { + list deviceItems; + pack->GetEffectiveDeviceItems(deviceItems); + for (const auto& deviceItem : deviceItems) { + devices.insert(deviceItem->GetFullDeviceName()); + } + } + if (devices.empty()) { + cerr << "projmgr error: no installed device was found" << endl; + return false; + } + if (!m_filter.empty()) { + set filteredDevices; + ApplyFilter(devices, SplitArgs(m_filter), filteredDevices); + if (filteredDevices.empty()) { + cerr << "projmgr error: no device was found with filter '" << m_filter << "'" << endl; + return false; + } + devices = filteredDevices; + } + return true; +} + +bool ProjMgr::ListComponents(set& components) { + if (m_device.empty()) { + for (const auto& pack : m_installedPacks) { + if (pack->GetComponents()) { + const auto& packComponents = pack->GetComponents()->GetChildren(); + for (const auto& packComponent : packComponents) { + components.insert(packComponent->GetComponentUniqueID(true)); + } + } + } + if (components.empty()) { + cerr << "projmgr error: no installed component was found" << endl; + return false; + } + } else { + RteComponentMap componentMap = m_target->GetFilteredComponents(); + for (const auto& component : componentMap) { + components.insert(component.second->GetComponentUniqueID(true)); + } + if (components.empty()) { + cerr << "projmgr error: no filtered component was found for device '" << m_device << "'" << endl; + return false; + } + } + if (!m_filter.empty()) { + set filteredComponents; + ApplyFilter(components, SplitArgs(m_filter), filteredComponents); + if (filteredComponents.empty()) { + cerr << "projmgr error: no component was found with filter '" << m_filter << "'" << endl; + return false; + } + components = filteredComponents; + } + return true; +} + +bool ProjMgr::ListDependencies(set& dependencies) { + for (const auto& dependency : m_dependencies) { + dependencies.insert(dependency->GetComponentAggregateID()); + } + if (!dependencies.empty() && !m_filter.empty()) { + set filteredDependencies; + ApplyFilter(dependencies, SplitArgs(m_filter), filteredDependencies); + if (filteredDependencies.empty()) { + cerr << "projmgr error: no unresolved dependency was found with filter '" << m_filter << "'" << endl; + return false; + } + dependencies = filteredDependencies; + } + return true; +} + +bool ProjMgr::ParseInput() { + try { + YAML::Node input = YAML::LoadFile(m_input); + + YAML::Node project = input["project"]; + + m_device = project["device"].IsDefined() ? project["device"].as() : ""; + if (project["attributes"].IsDefined()) { + // Attributes + map deviceAttributes; + YAML::Node attributes = project["attributes"]; + for (const auto& attr : attributes) { + m_deviceAttributes.insert({ attr.first.as(), attr.second.as() }); + } + } + m_outputType = project["type"].IsDefined() ? project["type"].as() : "exe"; + m_outputFolder = project["output"].IsDefined() ? project["output"].as() : "output"; + + YAML::Node compiler = input["compiler"]; + m_toolchain = compiler["name"].as(); + m_toolchainVersion = compiler["version"].as(); + + YAML::Node components = input["components"]; + for (const auto& item : components) { + ComponentInfo description; + if (item["filter"].IsDefined()) { + description.filter = item["filter"].as(); + } + if (item["attributes"].IsDefined()) { + // Attributes + map deviceAttributes; + YAML::Node attributes = item["attributes"]; + for (const auto& attr : attributes) { + description.attributes.insert({ attr.first.as(), attr.second.as() }); + } + } + m_componentDescriptions.insert(description); + } + + YAML::Node files = input["files"]; + ParseFiles(files, m_files); + + } catch (YAML::Exception& e) { + cerr << "projmgr error: check YAML file!" << endl << e.what() << endl; + return false; + } + + return true; +} + +void ProjMgr::ParseFiles(YAML::Node node, GroupInfo& group) { + for (const auto& item : node) { + // File node + if (item["file"].IsDefined()) { + FileInfo file = { item["file"].as() }; + if (item["category"].IsDefined()) { + file.category = item["category"].as(); + } + group.files.insert(file); + } + + // Group node + if (item["group"].IsDefined()) { + GroupInfo subgroup = { item["group"].as() }; + GroupInfo& reference = const_cast(*(group.groups.insert(subgroup).first)); + + // Parse children recursively + if (item["files"].IsDefined()) { + YAML::Node files = item["files"]; + ParseFiles(files, reference); + } + } + } +} + +bool ProjMgr::ProcessDevice() { + list devices; + for (const auto& pack : m_installedPacks) { + list deviceItems; + pack->GetEffectiveDeviceItems(deviceItems); + devices.insert(devices.end(), deviceItems.begin(), deviceItems.end()); + } + list filteredDevices; + for (const auto& device : devices) { + if (device->GetDeviceName() == m_device) { + filteredDevices.push_back(device); + } + } + RteDeviceItem* filteredDevice = nullptr; + for (const auto& item : filteredDevices) { + if ((!filteredDevice) || (VersionCmp::Compare(filteredDevice->GetPackage()->GetVersionString(), item->GetPackage()->GetVersionString()) < 0)) { + filteredDevice = item; + } + } + if (!filteredDevice) { + cerr << "projmgr error: no device was found" << endl; + return false; + } + + for (const auto& processor : filteredDevice->GetProcessors()) { + const auto& attributes = processor.second->GetAttributes(); + m_deviceAttributes.insert(attributes.begin(), attributes.end()); + // TODO: handle multiple processors + break; + } + m_deviceAttributes["Dvendor"] = filteredDevice->GetEffectiveAttribute("Dvendor"); + m_deviceAttributes["Dname"] = m_device; + + map attributes; + attributes.insert(m_deviceAttributes.begin(), m_deviceAttributes.end()); + if (m_toolchain == "AC6" || m_toolchain == "AC5") { + attributes["Tcompiler"] = "ARMCC"; + attributes["Toptions"] = m_toolchain; + } else { + attributes["Tcompiler"] = m_toolchain; + } + if (!SetTargetAttributes(attributes)) { + return false; + } + + m_packages.insert(filteredDevice->GetPackage()); + + return true; +} + +bool ProjMgr::ProcessComponents() { + RteComponentMap componentMap = m_target->GetFilteredComponents(); + set componentIds, filteredIds; + for (const auto& component : componentMap) { + componentIds.insert(component.first); + } + + for (const auto& description : m_componentDescriptions) { + RteComponentMap filteredComponents, filteredComponentsByAttribute; + + // Filter components by filter words + if (!description.filter.empty()) { + set filteredIds; + ApplyFilter(componentIds, SplitArgs(description.filter), filteredIds); + filteredComponents.clear(); + for (const auto& filteredId : filteredIds) { + filteredComponents[filteredId] = componentMap[filteredId]; + } + } + + // Filter components by attributes + if (!description.attributes.empty()) { + for (const auto& component : (filteredComponents.empty() ? componentMap : filteredComponents)) { + bool match = true; + for (const auto& attribute : description.attributes) { + auto attr = component.second->GetAttribute(attribute.first); + if (component.second->GetAttribute(attribute.first) != attribute.second) { + match = false; + break; + } + } + if (match) { + filteredComponentsByAttribute.insert(component); + } + } + } + + // Evaluate filtered components + RteComponentMap& componentsRef = filteredComponentsByAttribute.empty() ? filteredComponents.empty() ? + componentMap : filteredComponents : filteredComponentsByAttribute; + if (componentsRef.size() == 1) { + // Single match + m_components.insert(componentsRef.begin()->second); + m_packages.insert(componentsRef.begin()->second->GetPackage()); + } else if (componentsRef.empty()) { + // No match + cerr << "projmgr error: no component was found with"; + if (!description.filter.empty()) { + cerr << " filter '" << description.filter << "'"; + } + if (!description.attributes.empty()) { + cerr << " attributes"; + for (const auto& attribute : description.attributes) { + cerr << " '" << attribute.first << ": " << attribute.second << "'"; + } + } + cerr << endl; + return false; + } else { + // Multiple matches + cerr << "projmgr error: multiple components were found:" << endl; + for (const auto& component : componentsRef) { + cerr << component.first << endl; + } + return false; + } + } + + // Add components into RTE + set unresolvedComponents; + const list selItems(begin(m_components), end(m_components)); + m_project->AddCprjComponents(selItems, m_target, unresolvedComponents); + if (!unresolvedComponents.empty()) { + cerr << "projmgr error: unresolved components:" << endl; + for (const auto& component : unresolvedComponents) { + cerr << component->GetComponentUniqueID(true) << endl; + } + return false; + } + return true; +} + +bool ProjMgr::ProcessDependencies() { + m_project->ResolveDependencies(m_target); + const auto& selected = m_target->GetSelectedComponentAggregates(); + for (const auto& component : selected) { + RteComponentContainer* c = component.first; + string componentAggregate = c->GetComponentAggregateID(); + const auto& match = find_if(m_components.begin(), m_components.end(), + [componentAggregate](auto component) { + return component->GetComponentAggregateID() == componentAggregate; + }); + if (match == m_components.end()) { + m_dependencies.insert(c); + } + } + if (selected.size() != (m_components.size() + m_dependencies.size())) { + cerr << "projmgr error: resolving dependencies failed" << endl; + return false; + } + return true; +} + +bool ProjMgr::ProcessProject() { + if ((!ProcessDevice()) || (!ProcessComponents()) || (!ProcessDependencies())) { + return false; + } + if (!m_dependencies.empty()) { + cerr << "projmgr error: missing dependencies:" << endl; + for (const auto& dependency : m_dependencies) { + cerr << dependency->GetComponentAggregateID() << endl; + } + return false; + } + return true; +} + +bool ProjMgr::GenerateCprj() { + // Root + XMLTree* cprjTree = new XMLTreeSlim(); + XMLTreeElement* rootElement; + rootElement = cprjTree->CreateElement("cprj"); + + // Created + const string& tool = string(ORIGINAL_FILENAME) + " " + string(VERSION_STRING); + const string& timestamp = CbuildUtils::GetLocalTimestamp(); + XMLTreeElement* createdElement = rootElement->CreateElement("created"); + createdElement->AddAttribute("tool", tool); + createdElement->AddAttribute("timestamp", string(timestamp)); + + // Info + XMLTreeElement* infoElement = rootElement->CreateElement("info"); + infoElement->AddAttribute("isLayer", "false"); + const string& infoDescription = m_infoDescription.empty() ? "Automatically generated project" : m_infoDescription; + XMLTreeElement* infoDescriptionElement = infoElement->CreateElement("description"); + infoDescriptionElement->SetText(infoDescription); + + // Create first level elements + XMLTreeElement* packagesElement = rootElement->CreateElement("packages"); + XMLTreeElement* compilersElement = rootElement->CreateElement("compilers"); + XMLTreeElement* targetElement = rootElement->CreateElement("target"); + XMLTreeElement* componentsElement = rootElement->CreateElement("components"); + XMLTreeElement* filesElement = rootElement->CreateElement("files"); + + // Packages + for (const auto& package : m_packages) { + XMLTreeElement* packageElement = packagesElement->CreateElement("package"); + packageElement->AddAttribute("name", package->GetName()); + packageElement->AddAttribute("vendor", package->GetVendorName()); + packageElement->AddAttribute("version", package->GetVersionString()); + } + + // Compilers + XMLTreeElement* compilerElement = compilersElement->CreateElement("compiler"); + compilerElement->AddAttribute("name", m_toolchain); + if (!m_toolchainVersion.empty()) { + compilerElement->AddAttribute("version", m_toolchainVersion); + } + + // Target + static constexpr const char* DEVICE_ATTRIBUTES[] = { "Ddsp", "Dfpu", "Dmve", "Dsecure", "Dtz", "Dvendor" }; + for (const auto& name : DEVICE_ATTRIBUTES) { + const string& value = m_deviceAttributes[name]; + SetAttribute(targetElement, name, value); + } + + targetElement->AddAttribute("Dname", m_device); + targetElement->AddAttribute("Dendian", "Little-endian"); + XMLTreeElement* targetOutputElement = targetElement->CreateElement("output"); + targetOutputElement->AddAttribute("name", m_projectName); + targetOutputElement->AddAttribute("type", m_outputType); + targetOutputElement->AddAttribute("outdir", m_outputFolder); + targetOutputElement->AddAttribute("intdir", m_outputFolder); + + // Components + static constexpr const char* COMPONENT_ATTRIBUTES[] = { "Cbundle", "Cclass", "Cgroup", "Csub", "Cvariant", "Cvendor", "Cversion" }; + for (const auto& component : m_components) { + XMLTreeElement* componentElement = componentsElement->CreateElement("component"); + for (const auto& name : COMPONENT_ATTRIBUTES) { + const string& value = component->GetAttribute(name); + SetAttribute(componentElement, name, value); + } + } + + // Files + GenerateCprjGroups(filesElement, m_files); + + // Save CPRJ + const string& filename = m_rootFolder + "/" + m_projectName + ".cprj"; + if (!CbuildLayer::WriteXmlFile(filename, cprjTree)) { + cerr << "projmgr error: " << filename << " file cannot be written!" << endl; + return false; + } + return true; +} + +void ProjMgr::GenerateCprjGroups(XMLTreeElement* element, const GroupInfo& group) { + if (!group.name.empty()) { + element->AddAttribute("name", group.name); + } + for (const auto& file : group.files) { + XMLTreeElement* fileElement = element->CreateElement("file"); + fileElement->AddAttribute("name", file.name); + fileElement->AddAttribute("category", file.category); + } + for (const auto& group : group.groups) { + XMLTreeElement* groupElement = element->CreateElement("group"); + GenerateCprjGroups(groupElement, group); + } +} + +void ProjMgr::SetAttribute(XMLTreeElement* element, const string& name, const string& value) { + if (!value.empty()) { + element->AddAttribute(name, value); + } +} + +set ProjMgr::SplitArgs(const string& args) { + set s; + size_t end = 0, start = 0, len = args.length(); + while (end < len) { + if ((end = args.find(" ", start)) == string::npos) end = len; + s.insert(args.substr(start, end - start)); + start = end + 1; + } + return s; +} diff --git a/tools/projmgr/src/ProjMgrCallback.cpp b/tools/projmgr/src/ProjMgrCallback.cpp new file mode 100644 index 000000000..263d131aa --- /dev/null +++ b/tools/projmgr/src/ProjMgrCallback.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "ProjMgrCallback.h" +#include "ProjMgrKernel.h" + +using namespace std; + +ProjMgrCallback::ProjMgrCallback() : RteCallback() +{ +} + +ProjMgrCallback::~ProjMgrCallback() +{ + ClearErrorMessages(); +} + +void ProjMgrCallback::ClearOutput() +{ + ClearErrorMessages(); +} + +void ProjMgrCallback::Err(const string& id, const string& message, const string& file) +{ + string msg = "Error " + id; + if (!message.empty()) { + msg += ": " + message; + } + if (!file.empty()) { + msg += ": " + file; + } + OutputErrMessage(msg); +} + +void ProjMgrCallback::OutputErrMessage(const string& message) +{ + if(!message.empty()) { + m_errorMessages.push_back(message); + } +} diff --git a/tools/projmgr/src/ProjMgrKernel.cpp b/tools/projmgr/src/ProjMgrKernel.cpp new file mode 100644 index 000000000..b1111f73c --- /dev/null +++ b/tools/projmgr/src/ProjMgrKernel.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2020-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "ProjMgrKernel.h" +#include "ProjMgrCallback.h" + +#include "RteFsUtils.h" +#include "RteKernel.h" +#include "RteValueAdjuster.h" +#include "XMLTreeSlim.h" + +#include + +using namespace std; + +// Singleton kernel object +static ProjMgrKernel *theProjMgrKernel = 0; + +ProjMgrKernel::ProjMgrKernel(RteCallback* callback) : RteKernel(callback) { + m_callback = dynamic_cast(callback); +} + +ProjMgrKernel::~ProjMgrKernel() { + if (m_callback) + delete m_callback; + m_callback = 0; +} + +ProjMgrKernel *ProjMgrKernel::Get() { + if (!theProjMgrKernel) { + ProjMgrCallback* cb = new ProjMgrCallback(); + theProjMgrKernel = new ProjMgrKernel(cb); + } + return theProjMgrKernel; +} + +void ProjMgrKernel::Destroy() { + if (theProjMgrKernel) + delete theProjMgrKernel; + theProjMgrKernel = 0; +} + +class ProjMgrXmlParser : public XMLTreeSlim +{ +public: + ProjMgrXmlParser() :XMLTreeSlim(0, true) { m_XmlValueAdjuster = new RteValueAdjuster(); } + ~ProjMgrXmlParser() { delete m_XmlValueAdjuster; } +}; + +XMLTree* ProjMgrKernel::CreateXmlTree() const +{ + return new ProjMgrXmlParser(); +} + +bool ProjMgrKernel::GetInstalledPacks(list& packs) { + list pdscFiles; + RteFsUtils::GetPackageDescriptionFiles(pdscFiles, theProjMgrKernel->GetCmsisPackRoot(), 3); + for (const auto& pdscFile : pdscFiles) { + RtePackage* pack = theProjMgrKernel->LoadPack(pdscFile); + if (!pack) { + return false; + } + packs.push_back(pack); + } + theProjMgrKernel->GetGlobalModel()->InsertPacks(packs); + return true; +} diff --git a/tools/projmgr/src/ProjMgrMain.cpp b/tools/projmgr/src/ProjMgrMain.cpp new file mode 100644 index 000000000..edee262dd --- /dev/null +++ b/tools/projmgr/src/ProjMgrMain.cpp @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2020-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "ProjMgr.h" + +/* +Main function +*/ +int main(int argc, char **argv) { + + return ProjMgr::RunProjMgr(argc, argv); + +} diff --git a/tools/projmgr/swig/CMakeLists.txt b/tools/projmgr/swig/CMakeLists.txt new file mode 100644 index 000000000..bf8f3d29f --- /dev/null +++ b/tools/projmgr/swig/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.14) + +find_package(SWIG REQUIRED) +include(${SWIG_USE_FILE}) + +find_package(PythonLibs) +include_directories(projmgr PUBLIC ${PYTHON_INCLUDE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/../include ${PROJECT_BINARY_DIR}) +set_source_files_properties(projmgr.i PROPERTIES CPLUSPLUS ON) + +swig_add_library(projmgr LANGUAGE python SOURCES projmgr.i) + +swig_link_libraries(projmgr ${PYTHON_LIBRARIES} projmgrlib) diff --git a/tools/projmgr/swig/projmgr-cli.py b/tools/projmgr/swig/projmgr-cli.py new file mode 100644 index 000000000..6e162cc01 --- /dev/null +++ b/tools/projmgr/swig/projmgr-cli.py @@ -0,0 +1,5 @@ +import projmgr +import sys + +manager = projmgr.ProjMgr() +manager.RunProjMgr(sys.argv) diff --git a/tools/projmgr/swig/projmgr.i b/tools/projmgr/swig/projmgr.i new file mode 100644 index 000000000..d20f71d7b --- /dev/null +++ b/tools/projmgr/swig/projmgr.i @@ -0,0 +1,20 @@ +%module projmgr +%include "std_list.i" +%include "std_set.i" +%include "std_map.i" +%include "std_string.i" +%include "argcargv.i" + +%apply (int ARGC, char **ARGV) { (int argc, char **argv) } + +namespace std { + %template(map_string_string) map; +} + +%rename(lt) operator<; + +%{ + #include "../include/ProjMgr.h" +%} + +%include "../include/ProjMgr.h" diff --git a/tools/projmgr/test/CMakeLists.txt b/tools/projmgr/test/CMakeLists.txt new file mode 100644 index 000000000..c15220145 --- /dev/null +++ b/tools/projmgr/test/CMakeLists.txt @@ -0,0 +1,13 @@ +add_executable(ProjMgrUnitTests src/ProjMgrUnitTests.cpp src/ProjMgrTestEnv.cpp) + +set_property(TARGET ProjMgrUnitTests PROPERTY + MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + +target_link_libraries(ProjMgrUnitTests PUBLIC projmgrlib gtest_main) +target_include_directories(ProjMgrUnitTests PUBLIC ../include ./src) + +add_definitions(-DTEST_FOLDER="${CMAKE_CURRENT_SOURCE_DIR}/") + +add_test(NAME ProjMgrUnitTests + COMMAND ProjMgrUnitTests --gtest_output=xml:projmgr_unit_test_report.xml + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) diff --git a/tools/projmgr/test/data/project/main.c b/tools/projmgr/test/data/project/main.c new file mode 100644 index 000000000..2d9749792 --- /dev/null +++ b/tools/projmgr/test/data/project/main.c @@ -0,0 +1,6 @@ +#include "RTE_Components.h" +#include CMSIS_device_header + +int main (void) { + return 1; +} diff --git a/tools/projmgr/test/data/project/test.cproject.yml b/tools/projmgr/test/data/project/test.cproject.yml new file mode 100644 index 000000000..f904bcb0e --- /dev/null +++ b/tools/projmgr/test/data/project/test.cproject.yml @@ -0,0 +1,20 @@ +### CMSIS Project Description ### + +project: + device: ARMCM3 + +compiler: + name: AC6 + version: "6.16.0" + +components: + - attributes: + Cvariant: "C Startup" + - filter: "Keil RTX Source" + - filter: "ARM CMSIS CORE" + +files: + - group: "Sources" + files: + - file: "main.c" + category: sourceC diff --git a/tools/projmgr/test/src/ProjMgrTestEnv.cpp b/tools/projmgr/test/src/ProjMgrTestEnv.cpp new file mode 100644 index 000000000..e067beb84 --- /dev/null +++ b/tools/projmgr/test/src/ProjMgrTestEnv.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "ProjMgrTestEnv.h" +#include "RteFsUtils.h" + +using namespace std; + +string testinput_folder; +string testoutput_folder; + +void ProjMgrTestEnv::SetUp() { + testinput_folder = string(TEST_FOLDER) + "data"; + testoutput_folder = RteFsUtils::GetCurrentFolder() + "output"; + if (RteFsUtils::Exists(testoutput_folder)) { + RteFsUtils::RemoveDir(testoutput_folder); + } + RteFsUtils::CreateDirectories(testoutput_folder); + testinput_folder = fs::canonical(testinput_folder).generic_string(); + testoutput_folder = fs::canonical(testoutput_folder).generic_string(); + ASSERT_FALSE(testinput_folder.empty()); + ASSERT_FALSE(testoutput_folder.empty()); +} + +void ProjMgrTestEnv::TearDown() { + // Reserved +} + +int main(int argc, char **argv) { + try { + testing::InitGoogleTest(&argc, argv); + ::testing::AddGlobalTestEnvironment(new ProjMgrTestEnv); + return RUN_ALL_TESTS(); + } + catch (testing::internal::GoogleTestFailureException const& e) { + cout << "runtime_error: " << e.what(); + return 2; + } + catch (...) { + cout << "non-standard exception"; + return 2; + } +} diff --git a/tools/projmgr/test/src/ProjMgrTestEnv.h b/tools/projmgr/test/src/ProjMgrTestEnv.h new file mode 100644 index 000000000..bbe453cca --- /dev/null +++ b/tools/projmgr/test/src/ProjMgrTestEnv.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2020-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "gtest/gtest.h" + +extern std::string testoutput_folder; +extern std::string testinput_folder; + +/** + * @brief global test environment for all the test suites +*/ +class ProjMgrTestEnv : public ::testing::Environment { +public: + void SetUp() override; + void TearDown() override; +}; diff --git a/tools/projmgr/test/src/ProjMgrUnitTests.cpp b/tools/projmgr/test/src/ProjMgrUnitTests.cpp new file mode 100644 index 000000000..0dd7c30ac --- /dev/null +++ b/tools/projmgr/test/src/ProjMgrUnitTests.cpp @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2020-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "ProjMgr.h" +#include "ProjMgrTestEnv.h" + +#include "gtest/gtest.h" + +using namespace std; + +class PackGenUnitTests : public ProjMgr, public ::testing::Test { +public: + PackGenUnitTests() {} + virtual ~PackGenUnitTests() {} +}; + +TEST_F(PackGenUnitTests, RunProjMgr) { + char *argv[1]; + + // Empty options + EXPECT_EQ(0, RunProjMgr(1, argv)); +} From 3208ad02db15b404f221a32b3c62287afdbfbb20 Mon Sep 17 00:00:00 2001 From: Daniel Brondani Date: Tue, 12 Oct 2021 13:20:26 +0200 Subject: [PATCH 02/29] [projmgr] Draft of Software Design Document --- tools/projmgr/docs/README.md | 2 +- tools/projmgr/docs/SDD.md | 84 +++++++++++++++++++ tools/projmgr/docs/images/GenerateCPRJ.svg | 4 + tools/projmgr/docs/images/ListComponents.svg | 4 + .../projmgr/docs/images/ListDependencies.svg | 4 + tools/projmgr/docs/images/ListDevices.svg | 4 + tools/projmgr/docs/images/Overview.svg | 4 + tools/projmgr/docs/images/RecreateYAML.svg | 4 + tools/projmgr/docs/images/UseCase1.svg | 4 + tools/projmgr/docs/images/UseCase2.svg | 4 + .../test/data/project/test.cproject.yml | 4 +- 11 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 tools/projmgr/docs/SDD.md create mode 100644 tools/projmgr/docs/images/GenerateCPRJ.svg create mode 100644 tools/projmgr/docs/images/ListComponents.svg create mode 100644 tools/projmgr/docs/images/ListDependencies.svg create mode 100644 tools/projmgr/docs/images/ListDevices.svg create mode 100644 tools/projmgr/docs/images/Overview.svg create mode 100644 tools/projmgr/docs/images/RecreateYAML.svg create mode 100644 tools/projmgr/docs/images/UseCase1.svg create mode 100644 tools/projmgr/docs/images/UseCase2.svg diff --git a/tools/projmgr/docs/README.md b/tools/projmgr/docs/README.md index 275dd5404..0818547a0 100644 --- a/tools/projmgr/docs/README.md +++ b/tools/projmgr/docs/README.md @@ -62,7 +62,7 @@ list packs [--filter ""] list devices [--filter ""] ``` -- Print list of available components. The list can be filtered by a selected device in the `cproject.yml` file with the option `--input` and/or by words provided with the option `-filter`: +- Print list of available components. The list can be filtered by a selected device in the `cproject.yml` file with the option `--input` and/or by words provided with the option `--filter`: ``` list components [--input --filter ""] ``` diff --git a/tools/projmgr/docs/SDD.md b/tools/projmgr/docs/SDD.md new file mode 100644 index 000000000..ee854c7db --- /dev/null +++ b/tools/projmgr/docs/SDD.md @@ -0,0 +1,84 @@ +# [DRAFT] CMSIS Project Manager - Software Design + +## Table of Contents + +[Introduction](#introduction)
+ +[Design Overview](#design-overview)
+ +[Use cases](#use-cases)
+- [ Use Case 1](#use-case-1)
+- [ Use Case 2](#use-case-2)
+ +[System Architecture](#system-architecture)
+ +[System Interfaces](#system-interfaces)
+ + +## Introduction + +The CMSIS Project Manager is a C++ utility provided as binary and as library with interfaces for the most common programming languages and platforms. +It leverages open source C++ libraries available in the [Open-CMSIS-Pack devtools](https://github.com/Open-CMSIS-Pack/devtools) repository.
+The tool assists the embedded software developer in the project creation by exposing available features +from installed CMSIS Packs such as devices and components, allowing to search them using free text filters in addition to standard PDSC attributes. It also validates input files that are written in a +human friendly YAML format following pre-defined schemas and it checks the correctness of components selection and unresolved missing dependencies.
+ +It accepts several input files: +| File | Description +|:-----------------|:--------------------------------------------------------------------------------- +| `.csolution.yml` | Defines the complete scope of the application and the build order of sub-projects +| `.cproject.yml` | Defines the content of an independent build - directly relates to a `cprj` file +| `.clayer.yml` | Defines pre-configured files and components for reusing in different solutions +| `.rzone` | Defines memory and peripheral resources. + + +## Design Overview + +The following diagram illustrates inputs and outputs of the `projmgr` processing: +

![Overview](images/Overview.svg) + + +## Use Cases + +The CMSIS Project Manager has two main use cases: +- Backend to synchronize YAML and CPRJ files and related resources. +- Utility to discover available resources and evaluate selected items during project conception. + +### Use case 1: +### Synchronize YAML and CPRJ files and related resources + +When used as a backend for other tools, such as an IDE or a Build Manager, the most typical use is to generate CPRJs and configuration/resources files, creating complete projects. + +

![UseCase1](images/UseCase1.svg) + +### Use case 2: +### Discover project resources and evaluate selected items + +

![UseCase2](images/UseCase2.svg) + + +## System Architecture + +According to the typical use cases some workflows can be defined.
+Creating complete projects: +

![GenerateCPRJ](images/GenerateCPRJ.svg) + +Recreating the `cproject.YAML` files: +

![RecreateYAML](images/RecreateYAML.svg) + +Discovering resources (devices, components, dependencies) for assisting the project conception: + +List Devices: +

![ListDevices](images/ListDevices.svg) + +List Components: +

![ListComponents](images/ListComponents.svg) + +List Dependencies: +

![ListDependencies](images/ListDependencies.svg) + + +## System Interfaces + +The CMSIS Project Manager binaries and libraries are pre-compiled for Windows, Linux and MacOS. The core functions are written in C++ to leverage the already available [Open-CMSIS-Pack/devtools](https://github.com/Open-CMSIS-Pack/devtools) code base.
+The library interfaces are generated by the Simplified Wrapper and Interface Generator ([SWIG](http://www.swig.org)). Initially Python interface is provided. SWIG supports several other [scripting languages](http://www.swig.org/compat.html). diff --git a/tools/projmgr/docs/images/GenerateCPRJ.svg b/tools/projmgr/docs/images/GenerateCPRJ.svg new file mode 100644 index 000000000..b62e74a6d --- /dev/null +++ b/tools/projmgr/docs/images/GenerateCPRJ.svg @@ -0,0 +1,4 @@ + + + +
input parsing
and validation
input parsing...
generate CPRJs
and RTE files
generate CPRJs...
components are not uniquely found
components are not u...
input YAML
and resource files

input YAML...
load relevant
packs

(defined by cprojects and/or clayers)
load relevant...
compose cprojects from clayers
compose cprojects fr...
search components

(defined by cprojects)
search components...
evaluate dependencies
evaluate dependencies
dependencies are not uniquely found
dependencies are not...
missing unambigous dependency,
add it to the project

missing unambigous d...
templates processing
templates processing
generate resources
generate resources
create/update project model
create/update projec...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/tools/projmgr/docs/images/ListComponents.svg b/tools/projmgr/docs/images/ListComponents.svg new file mode 100644 index 000000000..e508797c4 --- /dev/null +++ b/tools/projmgr/docs/images/ListComponents.svg @@ -0,0 +1,4 @@ + + + +
input YAML
input YAML
command
list components

command...
input parsing
and validation
input parsing...
load packs

(subset if cproject is provided)
load packs...
filter results
filter results
print results
print results
no component is found
no component is foun...
load components

(subset if cproject is provided)
load components...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/tools/projmgr/docs/images/ListDependencies.svg b/tools/projmgr/docs/images/ListDependencies.svg new file mode 100644 index 000000000..8d122e492 --- /dev/null +++ b/tools/projmgr/docs/images/ListDependencies.svg @@ -0,0 +1,4 @@ + + + +
input YAML
input YAML
command
list dependencies

command...
input parsing
and validation
input parsing...
load packs
subset
load packs...
filter results
filter results
print results
print results
no depencency is found
no depencency is fou...
load components subset
load components subs...
create project model and evaluate dependencies
create project model...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/tools/projmgr/docs/images/ListDevices.svg b/tools/projmgr/docs/images/ListDevices.svg new file mode 100644 index 000000000..f527f068e --- /dev/null +++ b/tools/projmgr/docs/images/ListDevices.svg @@ -0,0 +1,4 @@ + + + +
input YAML
input YAML
command
list devices

command...
input parsing
and validation
input parsing...
load packs

(subset if cproject is provided)
load packs...
filter results
filter results
print results
print results
no device is found
no device is found
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/tools/projmgr/docs/images/Overview.svg b/tools/projmgr/docs/images/Overview.svg new file mode 100644 index 000000000..faa6a88c5 --- /dev/null +++ b/tools/projmgr/docs/images/Overview.svg @@ -0,0 +1,4 @@ + + + +
                                                                projmgr
                                                                processing
pr...
csolution
































csolution...
cproject 1













cproject 1...
clayer 0
clayer 0
clayer 1%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22clayer%26lt%3Bbr%26gt%3B0%22%20style%3D%22rounded%3D1%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22350%22%20y%3D%22720%22%20width%3D%2270%22%20height%3D%2270%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
clayer 1%3C...
clayer N%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22clayer%26lt%3Bbr%26gt%3B0%22%20style%3D%22rounded%3D1%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22350%22%20y%3D%22720%22%20width%3D%2270%22%20height%3D%2270%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
clayer N%3C...
cproject 0
cproject 0
cproject N
cproject N
CPRJ 0
Resources 0

CPRJ 0...
Resources:
- linker script
- memory layout and partition
- memory and peripheral
protection setup
Resources:...
CPRJ 1
Resources 1

CPRJ 1...
CPRJ N
Resources N

CPRJ N...
azone, rzone, templates
azone, rzone, templates
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/tools/projmgr/docs/images/RecreateYAML.svg b/tools/projmgr/docs/images/RecreateYAML.svg new file mode 100644 index 000000000..affd7a6ef --- /dev/null +++ b/tools/projmgr/docs/images/RecreateYAML.svg @@ -0,0 +1,4 @@ + + + +
input parsing
and validation
input parsing...
write back differences into cproject.YAML
write back differenc...
CPRJ
CPRJ
load relevant
packs

(defined by CPRJ
and cproject)

load relevant...
load project models and compare
load project models...
original cproject
original cproject
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/tools/projmgr/docs/images/UseCase1.svg b/tools/projmgr/docs/images/UseCase1.svg new file mode 100644 index 000000000..bb71bc2ff --- /dev/null +++ b/tools/projmgr/docs/images/UseCase1.svg @@ -0,0 +1,4 @@ + + + +
           IDE scope





























IDE scope...
     Project Manager scope










Project Manager scope...
     Build Manager scope










Build Manager scope...
     Project Manager scope










Project Manager scope...
Build Solution
Build Solution
Project
Developer
Proje...
Generate CPRJ
and related resources
Generate CPRJ...
Build orchestration
Build orchestration
Artifacts
Artifacts
Edit Project
Edit Project
Update CPRJ
Update CPRJ
Recreate YAML files
Recreate YAML files
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/tools/projmgr/docs/images/UseCase2.svg b/tools/projmgr/docs/images/UseCase2.svg new file mode 100644 index 000000000..49f5a2edb --- /dev/null +++ b/tools/projmgr/docs/images/UseCase2.svg @@ -0,0 +1,4 @@ + + + +
                                                 Project Manager scope

















































Project Manager scope...
List Devices
List Devices
Project
Developer
Proje...
<include>
<include>
Load Relevant Packs
Search Devices
Load Relevant Packs...
FilterDevices
FilterDevices
<extend>
<extend>
List Components
List Components
Search Components
Search Components
Filter Components
Filter Components
<extend>
<extend>
List Dependencies
List Dependencies
Load Project Model
Search Dependencies
Load Project Model...
Filter Dependencies
Filter Dependencies
<extend>
<extend>
List Packs
List Packs
Search Packs
in the Pack Local Repository
Search Packs...
Filter Packs
Filter Packs
<extend>
<extend>
<include>
<include>
<include>
<include>
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/tools/projmgr/test/data/project/test.cproject.yml b/tools/projmgr/test/data/project/test.cproject.yml index f904bcb0e..6f632deb9 100644 --- a/tools/projmgr/test/data/project/test.cproject.yml +++ b/tools/projmgr/test/data/project/test.cproject.yml @@ -10,7 +10,9 @@ compiler: components: - attributes: Cvariant: "C Startup" - - filter: "Keil RTX Source" + - filter: "Keil RTX" + attributes: + Cvariant: "Source" - filter: "ARM CMSIS CORE" files: From 93e47d33a8a26e6a14fc89c9e93f6d30424408e7 Mon Sep 17 00:00:00 2001 From: Daniel Brondani Date: Mon, 18 Oct 2021 10:06:17 +0200 Subject: [PATCH 03/29] [projmgr] Update SDD draft --- tools/projmgr/docs/SDD.md | 378 +++++++++++++++++- .../projmgr/docs/images/YAMLAssociations.svg | 4 + 2 files changed, 378 insertions(+), 4 deletions(-) create mode 100644 tools/projmgr/docs/images/YAMLAssociations.svg diff --git a/tools/projmgr/docs/SDD.md b/tools/projmgr/docs/SDD.md index ee854c7db..0ca814ee3 100644 --- a/tools/projmgr/docs/SDD.md +++ b/tools/projmgr/docs/SDD.md @@ -3,16 +3,13 @@ ## Table of Contents [Introduction](#introduction)
- [Design Overview](#design-overview)
- [Use cases](#use-cases)
- [ Use Case 1](#use-case-1)
- [ Use Case 2](#use-case-2)
- [System Architecture](#system-architecture)
- [System Interfaces](#system-interfaces)
+[Input YAML Files](#input-yaml-files)
## Introduction @@ -82,3 +79,376 @@ List Dependencies: The CMSIS Project Manager binaries and libraries are pre-compiled for Windows, Linux and MacOS. The core functions are written in C++ to leverage the already available [Open-CMSIS-Pack/devtools](https://github.com/Open-CMSIS-Pack/devtools) code base.
The library interfaces are generated by the Simplified Wrapper and Interface Generator ([SWIG](http://www.swig.org)). Initially Python interface is provided. SWIG supports several other [scripting languages](http://www.swig.org/compat.html). + + +## Input YAML Files + +The YAML files support the tags listed below. See the YAML schemas for optional/mandatory and data type requirements. + +### csolution.yml + +``` yml +created: + tool: + timestamp: + +info: + name: + title: + description: + doc: + category: [] + license: + +projects: + - path: + "$ref": "/cproject" # Reference to cproject.yml schema + +resources: # TBD (placeholder) + +templates: # TBD (placeholder) +``` + +### cproject.yml + +``` yml +created: + tool: + timestamp: + +info: + name: + title: + description: + doc: + category: [] + license: + +output: + - label: + filter: + +packages: + - name: + vendor: + version: + +compiler: + name: + version: + +target: + filter: + attributes: {} + output: + name: + type: + outdir: + intdir: + includes: [] + defines: {} + cflags: + add: [] + cxxflags: + add: [] + asflags: + add: [] + ldflags: + add: [] + arflags: + add: [] + +components: + - filter: + attributes: {} + cflags: + add: [] + remove: [] + cxxflags: + add: [] + remove: [] + asflags: + add: [] + remove: [] + instances: + +files: + - file: + cflags: + add: [] + remove: [] + cxxflags: + add: [] + remove: [] + asflags: + add: [] + remove: [] + category: + path: + label: + source: + - group: + cflags: + add: [] + remove: [] + cxxflags: + add: [] + remove: [] + asflags: + add: [] + remove: [] + files: + "$ref": "#/files" # Recursive items + +layers: + - path: + "$ref": "/clayer" # Reference to clayer.yml schema +``` + +### clayer.yml + +``` yml +created: + tool: + timestamp: + +info: + name: + title: + description: + doc: + category: [] + license: + +output: + - label: + filter: + +interfaces: + provides: {} + consumes: {} + +packages: + - name: + vendor: + version: + +compiler: + name: + version: + +target: + filter: [] + attributes: {} + output: + name: + type: + outdir: + intdir: + includes: [] + defines: {} + cflags: + add: [] + cxxflags: + add: [] + asflags: + add: [] + ldflags: + add: [] + arflags: + add: [] + +components: + - filter: [] + attributes: {} + cflags: + add: [] + remove: [] + cxxflags: + add: [] + remove: [] + asflags: + add: [] + remove: [] + instances: + +files: + - file: + cflags: + add: [] + remove: [] + cxxflags: + add: [] + remove: [] + asflags: + add: [] + remove: [] + category: + path: + label: + source: [] + - group: + cflags: + add: [] + remove: [] + cxxflags: + add: [] + remove: [] + asflags: + add: [] + remove: [] + files: + "$ref": "#/files" # Recursive items +``` + +### created +| Argument | Description +|:----------------|:---------------------------------------- +| tool | Name of the tool that has written the file. The string shall include version information. +| timestamp | Date and Time information of the last update. Format: YYYY-MM-DDThh:mm:ss with optional fractional seconds and timezone +
+ +### info +| Argument | Description +|:----------------|:---------------------------------------- +| name | Name of the element +| title | Display name for the element +| description | Brief description +| doc | Documentation pointing to *.md file or URL +| category | List of predefined categories +| license | License ruling according to [spdx license names](https://spdx.org/licenses/) +
+ +### projects +| Argument | Description +|:----------------|:---------------------------------------- +| path | Path to `cproject.yml` file +| cproject | Accept and merge any child item according to `cproject` schema +
+ +### resources +| Argument | Description +|:----------------|:---------------------------------------- +| TBD (placeholder) +
+ +### templates +| Argument | Description +|:----------------|:---------------------------------------- +| TBD (placeholder) +
+ +### output +| Argument | Description +|:----------------|:---------------------------------------- +| label | Unique identifier of an output shared file in the solution context +| filter | Free text that unambiguously points to a file in the `outdir` +
+ +### packages +| Argument | Description +|:----------------|:---------------------------------------- +| name | Name of a required CMSIS Software Pack +| vendor | Pack's vendor +| version | Pack's version, which can be a minimum version or a version range +
+ +### compiler +| Argument | Description +|:----------------|:---------------------------------------- +| name | Name of a required compiler +| version | Compiler's version, which can be a minimum version or a version range +
+ +### target +| Argument | Description +|:----------------|:---------------------------------------- +| filter | Free text that unambiguously points to device name +| attributes | Device and board attributes Dvendor, Dname, Pname, [Dfpu](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DfpuEnum), [Dmpu](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DmpuEnum), [Dendian](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DendianEnum), [Dsecure](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DsecureEnum), [Dmve](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DmveEnum), Bvendor, Bname, Bversion +| output | Build output directories, output file and type (executable or library) +| includes | List of include paths that are valid for the compilation of all modules in the project +| defines | List of preprocessor definitions that are valid for all project modules undergoing preprocessing +| cflags | C compiler additional command line options +| cxxflags | C++ compiler additional command line options +| asflags | Assembler additional command line options +| ldflags | Linker additional command line options +| arflags | Archiver additional command line options +
+ +### target/output +| Argument | Description +|:----------------|:---------------------------------------- +| name | Name of the main output file +| type | Main build artifact type: `lib` for library or `exe` for executable +| intdir | Relative path of the folder containing intermediate files (such as object files) +| outdir | Relative path of the folder containing the final build artifacts +
+ +### components +| Argument | Description +|:----------------|:---------------------------------------- +| filter | Free text that unambiguously points to a CMSIS Pack component +| attributes | List of components attributes +| cflags | C compiler additional command line options +| cxxflags | C++ compiler additional command line options +| asflags | Assembler additional command line options +| instances | Number of instances, only for components that are multi-instance capable +
+ +### files/file +| Argument | Description +|:----------------|:---------------------------------------- +| file | Path and name of the file, relative to location of the project file +| cflags | C compiler additional command line options +| cxxflags | C++ compiler additional command line options +| asflags | Assembler additional command line options +| category | Type of file according to [File Categories](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#FileCategoryEnum) +| path | Include path for a file with `header` category +| source | Source path(s) to find source files for a library +
+ +### files/group +| Argument | Description +|:----------------|:---------------------------------------- +| group | Unique name of the group of files +| cflags | C compiler additional command line options +| cxxflags | C++ compiler additional command line options +| asflags | Assembler additional command line options +| files | Unlimited recursive `files` children +
+ +### layers +| Argument | Description +|:----------------|:---------------------------------------- +| path | Path to `clayer.yml` file +| clayer | Accept and merge any child item according to `clayer` schema +
+ + +YAML files can be associated in different ways. In the +following diagrams some common combinations are illustrated. +Several other combinations are possible. + +

![YAMLAssociations](images/YAMLAssociations.svg) + +### Multi-layer project +Everything is described in layers, there is no info at solution and +project level. This approach can be used to easily interchange parts +of project such as supported board, middleware or application. + +### Multi-context solution +A bootloader, secure and non-secure projects are part of this +solution, as well as resource files for producing memory and +peripheral configuration via templates processing. Output +artifacts in a project can be labeled for easier integration +as input objects in another project. + +### Multi-toolchain solution +In this solution the common parts are described at project level, +while the compiler selection is provided in layers. Any other +toolchain specific project item could be placed in a layer. + +### Multi-configuration solution +In this case the target options are separated in layers, for example +Debug/Release configurations would have different compiler options +for optimization and for inclusion of debug information in the image. As in the previous example, any other specific configuration project item could be shifted to the layer level. diff --git a/tools/projmgr/docs/images/YAMLAssociations.svg b/tools/projmgr/docs/images/YAMLAssociations.svg new file mode 100644 index 000000000..34c8c7eb1 --- /dev/null +++ b/tools/projmgr/docs/images/YAMLAssociations.svg @@ -0,0 +1,4 @@ + + + +
multi-context solution



















multi-context solution...


target options A
components A
files A



target options A...
multi-configuration solution














multi-configuration solution...
multi-toolchain solution














multi-toolchain solution...


target options
components
files







target options...
cproject
cproject
csolution 
csolution 
clayer
clayer
compiler A
compiler A

compiler B
compiler B



compiler
components
files








compiler...
target options A
target options A

target options B
target options B



target options B
components B
files B



output objects






target options B...



target options C
components C
files C


input objects






target options C...
resources
resources
multi-layer project















multi-layer project...
compiler
target options
compiler...
components A
files A
components A...
components B
files B
components B...
containers:
containers:
Viewer does not support full SVG 1.1
\ No newline at end of file From a96081378ce925817d3af5395e6c3bb258ef6e20 Mon Sep 17 00:00:00 2001 From: Daniel Brondani Date: Thu, 21 Oct 2021 11:30:45 +0200 Subject: [PATCH 04/29] Add YAML schemas --- tools/projmgr/docs/README.md | 2 +- tools/projmgr/docs/SDD.md | 48 ++--- tools/projmgr/schema/clayer.schema.json | 37 ++++ tools/projmgr/schema/common.schema.json | 213 +++++++++++++++++++++ tools/projmgr/schema/cproject.schema.json | 41 ++++ tools/projmgr/schema/csolution.schema.json | 46 +++++ 6 files changed, 364 insertions(+), 23 deletions(-) create mode 100644 tools/projmgr/schema/clayer.schema.json create mode 100644 tools/projmgr/schema/common.schema.json create mode 100644 tools/projmgr/schema/cproject.schema.json create mode 100644 tools/projmgr/schema/csolution.schema.json diff --git a/tools/projmgr/docs/README.md b/tools/projmgr/docs/README.md index 0818547a0..eb39f1769 100644 --- a/tools/projmgr/docs/README.md +++ b/tools/projmgr/docs/README.md @@ -74,7 +74,7 @@ list dependencies --input [--filter ""] Convert cproject.yml in cprj file: ``` -list convert --input +convert --input ``` diff --git a/tools/projmgr/docs/SDD.md b/tools/projmgr/docs/SDD.md index 0ca814ee3..2b5ddf257 100644 --- a/tools/projmgr/docs/SDD.md +++ b/tools/projmgr/docs/SDD.md @@ -2,14 +2,19 @@ ## Table of Contents -[Introduction](#introduction)
-[Design Overview](#design-overview)
-[Use cases](#use-cases)
-- [ Use Case 1](#use-case-1)
-- [ Use Case 2](#use-case-2)
-[System Architecture](#system-architecture)
-[System Interfaces](#system-interfaces)
-[Input YAML Files](#input-yaml-files)
+[Introduction](#introduction) + +[Design Overview](#design-overview) + +[Use cases](#use-cases) +- [ Use Case 1](#use-case-1) +- [ Use Case 2](#use-case-2) + +[System Architecture](#system-architecture) + +[System Interfaces](#system-interfaces) + +[Input YAML Files](#input-yaml-files) ## Introduction @@ -97,7 +102,7 @@ info: title: description: doc: - category: [] + category: license: projects: @@ -121,10 +126,10 @@ info: title: description: doc: - category: [] + category: license: -output: +artifacts: - label: filter: @@ -146,7 +151,7 @@ target: outdir: intdir: includes: [] - defines: {} + defines: [] cflags: add: [] cxxflags: @@ -170,7 +175,7 @@ components: asflags: add: [] remove: [] - instances: + instances: files: - file: @@ -185,7 +190,6 @@ files: remove: [] category: path: - label: source: - group: cflags: @@ -217,10 +221,10 @@ info: title: description: doc: - category: [] + category: license: -output: +artifacts: - label: filter: @@ -238,7 +242,7 @@ compiler: version: target: - filter: [] + filter: attributes: {} output: name: @@ -246,7 +250,7 @@ target: outdir: intdir: includes: [] - defines: {} + defines: [] cflags: add: [] cxxflags: @@ -259,7 +263,7 @@ target: add: [] components: - - filter: [] + - filter: attributes: {} cflags: add: [] @@ -270,7 +274,7 @@ components: asflags: add: [] remove: [] - instances: + instances: files: - file: @@ -315,7 +319,7 @@ files: | title | Display name for the element | description | Brief description | doc | Documentation pointing to *.md file or URL -| category | List of predefined categories +| category | Predefined categories | license | License ruling according to [spdx license names](https://spdx.org/licenses/)
@@ -338,7 +342,7 @@ files: | TBD (placeholder)
-### output +### artifacts | Argument | Description |:----------------|:---------------------------------------- | label | Unique identifier of an output shared file in the solution context diff --git a/tools/projmgr/schema/clayer.schema.json b/tools/projmgr/schema/clayer.schema.json new file mode 100644 index 000000000..698d3cf0f --- /dev/null +++ b/tools/projmgr/schema/clayer.schema.json @@ -0,0 +1,37 @@ +{ + "$schema": "http://json-schema.org/draft/2020-12/schema#", + "id": "clayer.schema.json", + "title": "CMSIS Project Manager clayer", + "version": "0.9.0", + "type": "object", + "properties": { + "created": { "$ref": "./common.schema.json#/$defs/CreationInfoType" }, + "info": { "$ref": "./common.schema.json#/$defs/InfoType" }, + "artifacts": { "$ref": "./common.schema.json#/$defs/ArtifactsType " }, + "interfaces": { "$ref": "#/$defs/InterfacesType" }, + "packages" : { "$ref": "./common.schema.json#/$defs/PackagesType" }, + "compilers" : { "$ref": "./common.schema.json#/$defs/CompilersType" }, + "target" : { "$ref": "./common.schema.json#/$defs/TargetType" }, + "components": { "$ref": "./common.schema.json#/$defs/ComponentsType" }, + "files": { "$ref": "./common.schema.json#/$defs/FilesType" } + }, + "additionalProperties": false, + "$defs": { + "InterfacesType": { + "type": "object", + "properties": { + "provides": { "$ref": "#/$defs/InterfaceType" }, + "consumes": { "$ref": "#/$defs/InterfaceType" } + }, + "additionalProperties": false + }, + "InterfaceType": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "value": { "type": "string" } + }, + "additionalProperties": false + } + } +} diff --git a/tools/projmgr/schema/common.schema.json b/tools/projmgr/schema/common.schema.json new file mode 100644 index 000000000..133de6220 --- /dev/null +++ b/tools/projmgr/schema/common.schema.json @@ -0,0 +1,213 @@ +{ + "$schema": "http://json-schema.org/draft/2020-12/schema#", + "id": "cproject.schema.json", + "title": "CMSIS Project Manager cproject", + "version": "0.9.0", + "$defs": { + "RestrictedString": { + "type": "string", + "pattern": "^[-_A-Za-z0-9]+$" + }, + "VersionType": { + "type": "string", + "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(((\\-|\\+)[0-9A-Za-z\\-\\+\\.]+)|())$" + }, + "VersionRangeType": { + "type": "string", + "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(((\\-|\\+)[0-9A-Za-z\\-\\+\\.]+)|())(:[0-9]+\\.[0-9]+\\.[0-9]+(((\\-|\\+)[0-9A-Za-z\\-\\+\\.]+)|())|())$" + }, + "ArtifactsType": { + "type": "array", + "uniqueItems": true, + "items": { "$ref": "#/$defs/ArtifactType" } + }, + "ArtifactType": { + "type": "object", + "properties": { + "label": { "type": "string" }, + "filter": { "type": "string" } + }, + "additionalProperties": false + }, + "OutputType": { + "type": "object", + "properties": { + "name": { "type": "string" }, + "type": { "enum": ["lib", "exe"] }, + "intdir": { "type": "string" }, + "outdir": { "type": "string" } + }, + "required": [ "name" ], + "additionalProperties": false + }, + "FlagsType": { + "type": "object", + "properties": { + "add": { + "type": "array", + "uniqueItems": true, + "items": { "type": "string" } + }, + "remove": { + "type": "array", + "uniqueItems": true, + "items": { "type": "string" } + } + }, + "additionalProperties": false + }, + "CreationInfoType": { + "type": "object", + "properties": { + "tool": { "type": "string"}, + "timestamp": { "type": "string", "format": "date-time" } + }, + "additionalProperties": false, + "required": [ "tool", "timestamp" ] + }, + "InfoType": { + "type": "object", + "properties": { + "name": { "$ref": "#/$defs/RestrictedString" }, + "title": { "type": "string" }, + "description": { "type": "string" }, + "doc": { "type": "string" }, + "category": { "type": "string" }, + "license": { "type": "string" } + }, + "additionalProperties": false, + "required": [ "description" ] + }, + "PackagesType": { + "type": "array", + "uniqueItems": true, + "items": { "$ref": "#/$defs/PackageType" } + }, + "PackageType":{ + "type": "object", + "properties": { + "name": { "type": "string" }, + "vendor": { "type": "string" }, + "version": { "$ref": "#/$defs/VersionRangeType" } + }, + "additionalProperties": false, + "required": [ "name", "vendor" ] + }, + "CompilerType": { + "type": "object", + "properties": { + "name": { "enum": [ "GCC", "AC5", "AC6" ] }, + "version": { "$ref": "#/$defs/VersionRangeType" } + }, + "additionalProperties": false, + "required": [ "name" ] + }, + "TargetType": { + "type": "object", + "properties": { + "filter": { "type": "string" }, + "attributes": { + "properties": { + "Bvendor": { "type": "string" }, + "Bname": { "type": "string" }, + "Bversion": { "type": "string" }, + "Dvendor": { "type": "string" }, + "Dname": { "type": "string" }, + "Pname": { "type": "string" }, + "Dfpu": { "enum": ["FPU", "NO_FPU", "SP_FPU", "DP_FPU"] }, + "Dendian": { "enum": ["Little-endian", "Big-endian"] }, + "Dmpu": { "enum": ["MPU", "NO_MPU"] }, + "Ddsp": { "enum": ["DSP", "NO_DSP"] }, + "Dmve": { "enum": ["NO_MVE", "MVE", "FP_MVE"] }, + "Dtz": { "enum": ["TZ", "NO_TZ"] }, + "Dsecure": { "enum": ["Secure", "Non-secure", "TZ-disabled"] } + }, + "additionalProperties": false + }, + "output": { "$ref" : "#/$defs/OutputType" }, + "includes": { + "type": "array", + "uniqueItems": true, + "items": { "type": "string" } + }, + "defines": { + "type": "array", + "uniqueItems": true, + "items": { "type": "string" } + }, + "ldflags": {"$ref": "#/$defs/FlagsType" }, + "cflags": {"$ref": "#/$defs/FlagsType" }, + "cxxflags": {"$ref": "#/$defs/FlagsType" }, + "asflags": {"$ref": "#/$defs/FlagsType" }, + "arflags": {"$ref": "#/$defs/FlagsType" } + } + }, + "ComponentsType": { + "type": "array", + "uniqueItems": true, + "items": { "$ref": "#/$defs/ComponentType" } + }, + "ComponentType": { + "type": "object", + "properties": { + "filter": { + "type": "array", + "uniqueItems": true, + "items": { "type": "string" } + }, + "attributes": { + "properties": { + "Cvendor": { "type": "string" }, + "Cbundle": { "type": "string" }, + "Cclass": { "type": "string" }, + "Cgroup": { "type": "string" }, + "Csub": { "type": "string" }, + "Cvariant": { "type": "string" }, + "Cversion": { "$ref": "#/$defs/VersionType" }, + "Capiversion": { "$ref": "#/$defs/VersionType" } + }, + "required": ["Cclass", "Cgroup"] + }, + "cflags": { "$ref": "#/$defs/FlagsType" }, + "cxxflags": { "$ref": "#/$defs/FlagsType" }, + "asflags": { "$ref": "#/$defs/FlagsType" }, + "instances": { "type": "string" } + } + }, + "FilesType": { + "type": "array", + "items": { + "oneOf": [ + { "$ref": "#/$defs/FileType" }, + { "$ref": "#/$defs/GroupType" } + ] + } + }, + "FileType": { + "type": "object", + "properties": { + "file": { "type": "string" }, + "cflags": { "$ref": "#/$defs/FlagsType" }, + "cxxflags": { "$ref": "#/$defs/FlagsType" }, + "asflags": { "$ref": "#/$defs/FlagsType" }, + "category": { "enum": ["doc", "header", "library", "object", "source", "sourceC", "sourceCpp", "sourceAsm", "linkerScript", "utility", "image", "other", "preIncludeGlobal", "preIncludeLocal"] }, + "path": { "type": "string" }, + "source" : { "type": "string" } + }, + "additionalProperties": false, + "required": [ "file" ] + }, + "GroupType": { + "type": "object", + "properties": { + "group": { "type": "string" }, + "cflags": { "$ref": "#/$defs/FlagsType" }, + "cxxflags": { "$ref": "#/$defs/FlagsType" }, + "asflags": { "$ref": "#/$defs/FlagsType" }, + "files": { "$ref": "#/$defs/FilesType" } + }, + "additionalProperties": false, + "required": [ "group" ] + } + } +} diff --git a/tools/projmgr/schema/cproject.schema.json b/tools/projmgr/schema/cproject.schema.json new file mode 100644 index 000000000..ef1363951 --- /dev/null +++ b/tools/projmgr/schema/cproject.schema.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json-schema.org/draft/2020-12/schema#", + "id": "cproject.schema.json", + "title": "CMSIS Project Manager cproject", + "version": "0.9.0", + "type": "object", + "properties": { + "created": { "$ref": "./common.schema.json#/$defs/CreationInfoType" }, + "info": { "$ref": "./common.schema.json#/$defs/InfoType "}, + "artifacts": { "$ref": "./common.schema.json#/$defs/ArtifactsType " }, + "packages": { "$ref": "./common.schema.json#/$defs/PackagesType" }, + "compiler": { "$ref": "./common.schema.json#/$defs/CompilerType" }, + "target" : { "$ref": "./common.schema.json#/$defs/TargetType" }, + "components": { "$ref": "./common.schema.json#/$defs/ComponentsType" }, + "files": { "$ref": "./common.schema.json#/$defs/FilesType" }, + "layers": { "$ref": "#/$defs/LayersType" } + }, + "additionalProperties": false, + "$defs": { + "LayersType": { + "type": "array", + "uniqueItems": true, + "items": { "$ref": "#/$defs/LayerType" } + }, + "LayerType": { + "type": "object", + "properties": { + "path": { "type": "string" }, + "info": { "$ref": "./common.schema.json#/$defs/InfoType" }, + "artifacts": { "$ref": "./common.schema.json#/$defs/ArtifactsType " }, + "interfaces": { "$ref": "./clayer.schema.json#/$defs/InterfacesType" }, + "packages" : { "$ref": "./common.schema.json#/$defs/PackagesType" }, + "compiler" : { "$ref": "./common.schema.json#/$defs/CompilerType" }, + "target" : { "$ref": "./common.schema.json#/$defs/TargetType" }, + "components": { "$ref": "./common.schema.json#/$defs/ComponentsType" }, + "files": { "$ref": "./common.schema.json#/$defs/FilesType" } + }, + "additionalProperties": false + } + } +} diff --git a/tools/projmgr/schema/csolution.schema.json b/tools/projmgr/schema/csolution.schema.json new file mode 100644 index 000000000..6783bd226 --- /dev/null +++ b/tools/projmgr/schema/csolution.schema.json @@ -0,0 +1,46 @@ +{ + "$schema": "http://json-schema.org/draft/2020-12/schema#", + "id": "csolution.schema.json", + "title": "CMSIS Project Manager csolution", + "version": "0.9.0", + "type": "object", + "properties": { + "created": { "$ref": "./common.schema.json#/$defs/CreationInfoType" }, + "info": { "$ref": "./common.schema.json#/$defs/InfoType" }, + "projects": { "$ref": "#/$defs/ProjectsType" }, + "resources": { "$ref": "#/$defs/ResourcesType" }, + "templates": { "$ref": "#/$defs/TemplatesType" } + }, + "additionalProperties": false, + "required": [ "info", "projects" ], + "$defs": { + "ProjectsType": { + "type": "array", + "uniqueItems": true, + "items": { "$ref": "#/$defs/ProjectType" } + }, + "ProjectType": { + "type": "object", + "properties": { + "path": { "type": "string" }, + "info": { "$ref": "./common.schema.json#/$defs/InfoType" }, + "artifacts": { "$ref": "./common.schema.json#/$defs/ArtifactsType" }, + "packages": { "$ref": "./common.schema.json#/$defs/PackagesType" }, + "compiler": { "$ref": "./common.schema.json#/$defs/CompilerType" }, + "target" : { "$ref": "./common.schema.json#/$defs/TargetType" }, + "components": { "$ref": "./common.schema.json#/$defs/ComponentsType" }, + "files": { "$ref": "./common.schema.json#/$defs/FilesType" }, + "layers": { "$ref": "./cproject.schema.json#/$defs/LayersType" } + }, + "additionalProperties": false + }, + "ResourcesType": { + "type": "object", + "uniqueItems": true + }, + "TemplatesType": { + "type": "object", + "uniqueItems": true + } + } +} From ecfb9c29d71c5bc858ecb80c2c405d59a4f54784 Mon Sep 17 00:00:00 2001 From: Daniel Brondani Date: Mon, 25 Oct 2021 12:07:22 +0200 Subject: [PATCH 05/29] [projmgr] Update YAML schemas proposal --- tools/projmgr/docs/SDD.md | 33 +-- tools/projmgr/schema/common.schema.json | 277 +++++++++++++++------ tools/projmgr/schema/cproject.schema.json | 11 +- tools/projmgr/schema/csolution.schema.json | 22 +- 4 files changed, 243 insertions(+), 100 deletions(-) diff --git a/tools/projmgr/docs/SDD.md b/tools/projmgr/docs/SDD.md index 2b5ddf257..3c73188a5 100644 --- a/tools/projmgr/docs/SDD.md +++ b/tools/projmgr/docs/SDD.md @@ -105,6 +105,10 @@ info: category: license: +target: + device: + attributes: {} + projects: - path: "$ref": "/cproject" # Reference to cproject.yml schema @@ -131,7 +135,7 @@ info: artifacts: - label: - filter: + pattern: packages: - name: @@ -143,7 +147,7 @@ compiler: version: target: - filter: + device: attributes: {} output: name: @@ -164,8 +168,7 @@ target: add: [] components: - - filter: - attributes: {} + - id: cflags: add: [] remove: [] @@ -226,7 +229,7 @@ info: artifacts: - label: - filter: + pattern: interfaces: provides: {} @@ -242,7 +245,7 @@ compiler: version: target: - filter: + device: attributes: {} output: name: @@ -263,8 +266,7 @@ target: add: [] components: - - filter: - attributes: {} + - id: cflags: add: [] remove: [] @@ -308,15 +310,15 @@ files: ### created | Argument | Description |:----------------|:---------------------------------------- -| tool | Name of the tool that has written the file. The string shall include version information. +| tool | Name of the tool that has written the file. The string shall include version information | timestamp | Date and Time information of the last update. Format: YYYY-MM-DDThh:mm:ss with optional fractional seconds and timezone
### info | Argument | Description |:----------------|:---------------------------------------- -| name | Name of the element -| title | Display name for the element +| name | Name of the solution, project or layer +| title | Display name for the solution, project or layer | description | Brief description | doc | Documentation pointing to *.md file or URL | category | Predefined categories @@ -346,7 +348,7 @@ files: | Argument | Description |:----------------|:---------------------------------------- | label | Unique identifier of an output shared file in the solution context -| filter | Free text that unambiguously points to a file in the `outdir` +| pattern | Free text that unambiguously points to a file in the `outdir`
### packages @@ -367,8 +369,8 @@ files: ### target | Argument | Description |:----------------|:---------------------------------------- -| filter | Free text that unambiguously points to device name -| attributes | Device and board attributes Dvendor, Dname, Pname, [Dfpu](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DfpuEnum), [Dmpu](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DmpuEnum), [Dendian](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DendianEnum), [Dsecure](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DsecureEnum), [Dmve](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DmveEnum), Bvendor, Bname, Bversion +| device | Free text that unambiguously points to device name +| attributes | Device and board attributes Dvendor, Dname, [Dfpu](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DfpuEnum), [Dmpu](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DmpuEnum), [Dendian](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DendianEnum), [Dsecure](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DsecureEnum), [Dmve](https://arm-software.github.io/CMSIS_5/Build/html/cprj_types.html#DmveEnum), Bvendor, Bname, Bversion | output | Build output directories, output file and type (executable or library) | includes | List of include paths that are valid for the compilation of all modules in the project | defines | List of preprocessor definitions that are valid for all project modules undergoing preprocessing @@ -391,8 +393,7 @@ files: ### components | Argument | Description |:----------------|:---------------------------------------- -| filter | Free text that unambiguously points to a CMSIS Pack component -| attributes | List of components attributes +| id | Component identifier `Cvendor::Cclass:Cbundle:Cgroup:Csub:Cvariant@Cversion` or a free text that unambiguously points to a component | cflags | C compiler additional command line options | cxxflags | C++ compiler additional command line options | asflags | Assembler additional command line options diff --git a/tools/projmgr/schema/common.schema.json b/tools/projmgr/schema/common.schema.json index 133de6220..37339ac06 100644 --- a/tools/projmgr/schema/common.schema.json +++ b/tools/projmgr/schema/common.schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/draft/2020-12/schema#", + "$schema": "http://json-schema.org/draft-07/schema#", "id": "cproject.schema.json", "title": "CMSIS Project Manager cproject", "version": "0.9.0", @@ -24,18 +24,36 @@ "ArtifactType": { "type": "object", "properties": { - "label": { "type": "string" }, - "filter": { "type": "string" } + "label": { + "type": "string", + "description": "Unique identifier of an output shared file in the solution context" + }, + "pattern": { + "type": "string", + "description": "Free text that unambiguously points to a file in the outdir" + } }, "additionalProperties": false }, "OutputType": { "type": "object", "properties": { - "name": { "type": "string" }, - "type": { "enum": ["lib", "exe"] }, - "intdir": { "type": "string" }, - "outdir": { "type": "string" } + "name": { + "type": "string", + "description": "Name of the main output file" + }, + "type": { + "enum": ["lib", "exe"], + "description": "Main build artifact type: lib for library or exe for executable" + }, + "intdir": { + "type": "string", + "description": "Relative path of the folder containing intermediate files (such as object files)" + }, + "outdir": { + "type": "string", + "description": "Relative path of the folder containing the final build artifacts" + } }, "required": [ "name" ], "additionalProperties": false @@ -45,11 +63,13 @@ "properties": { "add": { "type": "array", + "description": "Add command line options", "uniqueItems": true, "items": { "type": "string" } }, "remove": { "type": "array", + "description": "Remove command line options", "uniqueItems": true, "items": { "type": "string" } } @@ -59,21 +79,44 @@ "CreationInfoType": { "type": "object", "properties": { - "tool": { "type": "string"}, - "timestamp": { "type": "string", "format": "date-time" } - }, + "tool": { + "type": "string", + "description": "Name of the tool that has written the file. The string shall include version information" + }, + "timestamp": { + "type": "string", + "description": "Date and Time information of the last update. Format: YYYY-MM-DDThh:mm:ss with optional fractional seconds and timezone", + "format": "date-time" } + }, "additionalProperties": false, "required": [ "tool", "timestamp" ] }, "InfoType": { "type": "object", "properties": { - "name": { "$ref": "#/$defs/RestrictedString" }, - "title": { "type": "string" }, - "description": { "type": "string" }, - "doc": { "type": "string" }, - "category": { "type": "string" }, - "license": { "type": "string" } + "name": { + "$ref": "#/$defs/RestrictedString", + "description": "Name of the solution, project or layer" }, + "title": { + "type": "string", + "description": "Display name for the solution, project or layer" + }, + "description": { + "type": "string", + "description": "Brief description" + }, + "doc": { + "type": "string", + "description": "Documentation pointing to *.md file or URL" + }, + "category": { + "type": "string", + "description": "Predefined categories" + }, + "license": { + "type": "string", + "description": "License ruling according to spdx license names" + } }, "additionalProperties": false, "required": [ "description" ] @@ -86,9 +129,18 @@ "PackageType":{ "type": "object", "properties": { - "name": { "type": "string" }, - "vendor": { "type": "string" }, - "version": { "$ref": "#/$defs/VersionRangeType" } + "name": { + "type": "string", + "description": "Name of a required CMSIS Software Pack" + }, + "vendor": { + "type": "string", + "description": "Pack's vendor" + }, + "version": { + "$ref": "#/$defs/VersionRangeType", + "description": "Pack's version, which can be a minimum version or a version range" + } }, "additionalProperties": false, "required": [ "name", "vendor" ] @@ -96,51 +148,85 @@ "CompilerType": { "type": "object", "properties": { - "name": { "enum": [ "GCC", "AC5", "AC6" ] }, - "version": { "$ref": "#/$defs/VersionRangeType" } + "name": { + "enum": [ "GCC", "AC5", "AC6" ], + "description": "Name of a required compiler" + }, + "version": { + "$ref": "#/$defs/VersionRangeType", + "description": "Compiler's version, which can be a minimum version or a version range" + } }, "additionalProperties": false, "required": [ "name" ] }, + "TargetAttributesType": { + "type": "object", + "properties": { + "Bvendor": { "type": "string" }, + "Bname": { "type": "string" }, + "Bversion": { "type": "string" }, + "Dvendor": { "type": "string" }, + "Dname": { "type": "string" }, + "Dfpu": { "enum": ["FPU", "NO_FPU", "SP_FPU", "DP_FPU"] }, + "Dendian": { "enum": ["Little-endian", "Big-endian"] }, + "Dmpu": { "enum": ["MPU", "NO_MPU"] }, + "Ddsp": { "enum": ["DSP", "NO_DSP"] }, + "Dmve": { "enum": ["NO_MVE", "MVE", "FP_MVE"] }, + "Dtz": { "enum": ["TZ", "NO_TZ"] }, + "Dsecure": { "enum": ["Secure", "Non-secure", "TZ-disabled"] } + }, + "additionalProperties": false + }, "TargetType": { "type": "object", "properties": { - "filter": { "type": "string" }, + "device": { + "type": "string", + "description": "Free text that unambiguously points to device name" + }, "attributes": { - "properties": { - "Bvendor": { "type": "string" }, - "Bname": { "type": "string" }, - "Bversion": { "type": "string" }, - "Dvendor": { "type": "string" }, - "Dname": { "type": "string" }, - "Pname": { "type": "string" }, - "Dfpu": { "enum": ["FPU", "NO_FPU", "SP_FPU", "DP_FPU"] }, - "Dendian": { "enum": ["Little-endian", "Big-endian"] }, - "Dmpu": { "enum": ["MPU", "NO_MPU"] }, - "Ddsp": { "enum": ["DSP", "NO_DSP"] }, - "Dmve": { "enum": ["NO_MVE", "MVE", "FP_MVE"] }, - "Dtz": { "enum": ["TZ", "NO_TZ"] }, - "Dsecure": { "enum": ["Secure", "Non-secure", "TZ-disabled"] } - }, - "additionalProperties": false + "$ref" : "#/$defs/TargetAttributesType", + "description": "Device and board attributes Dvendor, Dname, Dfpu, Dmpu, Dendian, Dsecure, Dmve, Bvendor, Bname, Bversion" + }, + "output": { + "$ref" : "#/$defs/OutputType", + "description": "Build output directories, output file and type (executable or library)" }, - "output": { "$ref" : "#/$defs/OutputType" }, "includes": { "type": "array", + "description": "List of include paths that are valid for the compilation of all modules in the project", "uniqueItems": true, "items": { "type": "string" } }, "defines": { "type": "array", + "description": "List of preprocessor definitions that are valid for all project modules undergoing preprocessing", "uniqueItems": true, "items": { "type": "string" } }, - "ldflags": {"$ref": "#/$defs/FlagsType" }, - "cflags": {"$ref": "#/$defs/FlagsType" }, - "cxxflags": {"$ref": "#/$defs/FlagsType" }, - "asflags": {"$ref": "#/$defs/FlagsType" }, - "arflags": {"$ref": "#/$defs/FlagsType" } - } + "ldflags": { + "$ref": "#/$defs/FlagsType", + "description": "Linker additional command line options" + }, + "cflags": { + "$ref": "#/$defs/FlagsType", + "description": "C compiler additional command line options" + }, + "cxxflags": { + "$ref": "#/$defs/FlagsType", + "description": "C++ compiler additional command line options" + }, + "asflags": { + "$ref": "#/$defs/FlagsType", + "description": "Assembler additional command line options" + }, + "arflags": { + "$ref": "#/$defs/FlagsType", + "description": "Archiver additional command line options" + } + }, + "additionalProperties": false }, "ComponentsType": { "type": "array", @@ -150,29 +236,28 @@ "ComponentType": { "type": "object", "properties": { - "filter": { - "type": "array", - "uniqueItems": true, - "items": { "type": "string" } + "id": { + "type": "string", + "description": "Component identifier Cvendor::Cclass:Cbundle:Cgroup:Csub:Cvariant@Cversion or a free text that unambiguously points to a component" }, - "attributes": { - "properties": { - "Cvendor": { "type": "string" }, - "Cbundle": { "type": "string" }, - "Cclass": { "type": "string" }, - "Cgroup": { "type": "string" }, - "Csub": { "type": "string" }, - "Cvariant": { "type": "string" }, - "Cversion": { "$ref": "#/$defs/VersionType" }, - "Capiversion": { "$ref": "#/$defs/VersionType" } - }, - "required": ["Cclass", "Cgroup"] + "cflags": { + "$ref": "#/$defs/FlagsType", + "description": "C compiler additional command line options" }, - "cflags": { "$ref": "#/$defs/FlagsType" }, - "cxxflags": { "$ref": "#/$defs/FlagsType" }, - "asflags": { "$ref": "#/$defs/FlagsType" }, - "instances": { "type": "string" } - } + "cxxflags": { + "$ref": "#/$defs/FlagsType", + "description": "C++ compiler additional command line options" + }, + "asflags": { + "$ref": "#/$defs/FlagsType", + "description": "Assembler additional command line options" + }, + "instances": { + "type": "string", + "description": "Number of instances, only for components that are multi-instance capable" + } + }, + "additionalProperties": false }, "FilesType": { "type": "array", @@ -186,13 +271,34 @@ "FileType": { "type": "object", "properties": { - "file": { "type": "string" }, - "cflags": { "$ref": "#/$defs/FlagsType" }, - "cxxflags": { "$ref": "#/$defs/FlagsType" }, - "asflags": { "$ref": "#/$defs/FlagsType" }, - "category": { "enum": ["doc", "header", "library", "object", "source", "sourceC", "sourceCpp", "sourceAsm", "linkerScript", "utility", "image", "other", "preIncludeGlobal", "preIncludeLocal"] }, - "path": { "type": "string" }, - "source" : { "type": "string" } + "file": { + "type": "string", + "description": "Path and name of the file, relative to location of the project file" + }, + "cflags": { + "$ref": "#/$defs/FlagsType", + "description": "C compiler additional command line options" + }, + "cxxflags": { + "$ref": "#/$defs/FlagsType", + "description": "C++ compiler additional command line options" + }, + "asflags": { + "$ref": "#/$defs/FlagsType", + "description": "Assembler additional command line options" + }, + "category": { + "enum": ["doc", "header", "library", "object", "source", "sourceC", "sourceCpp", "sourceAsm", "linkerScript", "utility", "image", "other", "preIncludeGlobal", "preIncludeLocal"], + "description": "Type of file according to File Categories" + }, + "path": { + "type": "string", + "description": "Include path for a file with header category" + }, + "source": { + "type": "string", + "description": "Source path(s) to find source files for a library" + } }, "additionalProperties": false, "required": [ "file" ] @@ -200,11 +306,26 @@ "GroupType": { "type": "object", "properties": { - "group": { "type": "string" }, - "cflags": { "$ref": "#/$defs/FlagsType" }, - "cxxflags": { "$ref": "#/$defs/FlagsType" }, - "asflags": { "$ref": "#/$defs/FlagsType" }, - "files": { "$ref": "#/$defs/FilesType" } + "group": { + "type": "string", + "description": "Unique name of the group of files" + }, + "cflags": { + "$ref": "#/$defs/FlagsType", + "description": "C compiler additional command line options" + }, + "cxxflags": { + "$ref": "#/$defs/FlagsType", + "description": "C++ compiler additional command line options" + }, + "asflags": { + "$ref": "#/$defs/FlagsType", + "description": "Assembler additional command line options" + }, + "files": { + "$ref": "#/$defs/FilesType", + "description": "Unlimited recursive files children" + } }, "additionalProperties": false, "required": [ "group" ] diff --git a/tools/projmgr/schema/cproject.schema.json b/tools/projmgr/schema/cproject.schema.json index ef1363951..f79928fb3 100644 --- a/tools/projmgr/schema/cproject.schema.json +++ b/tools/projmgr/schema/cproject.schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/draft/2020-12/schema#", + "$schema": "http://json-schema.org/draft-07/schema#", "id": "cproject.schema.json", "title": "CMSIS Project Manager cproject", "version": "0.9.0", @@ -7,7 +7,7 @@ "properties": { "created": { "$ref": "./common.schema.json#/$defs/CreationInfoType" }, "info": { "$ref": "./common.schema.json#/$defs/InfoType "}, - "artifacts": { "$ref": "./common.schema.json#/$defs/ArtifactsType " }, + "artifacts": { "$ref": "./common.schema.json#/$defs/ArtifactsType" }, "packages": { "$ref": "./common.schema.json#/$defs/PackagesType" }, "compiler": { "$ref": "./common.schema.json#/$defs/CompilerType" }, "target" : { "$ref": "./common.schema.json#/$defs/TargetType" }, @@ -25,9 +25,12 @@ "LayerType": { "type": "object", "properties": { - "path": { "type": "string" }, + "path": { + "type": "string", + "description": "Path to clayer.yml file" + }, "info": { "$ref": "./common.schema.json#/$defs/InfoType" }, - "artifacts": { "$ref": "./common.schema.json#/$defs/ArtifactsType " }, + "artifacts": { "$ref": "./common.schema.json#/$defs/ArtifactsType" }, "interfaces": { "$ref": "./clayer.schema.json#/$defs/InterfacesType" }, "packages" : { "$ref": "./common.schema.json#/$defs/PackagesType" }, "compiler" : { "$ref": "./common.schema.json#/$defs/CompilerType" }, diff --git a/tools/projmgr/schema/csolution.schema.json b/tools/projmgr/schema/csolution.schema.json index 6783bd226..b0c60b17d 100644 --- a/tools/projmgr/schema/csolution.schema.json +++ b/tools/projmgr/schema/csolution.schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/draft/2020-12/schema#", + "$schema": "http://json-schema.org/draft-07/schema#", "id": "csolution.schema.json", "title": "CMSIS Project Manager csolution", "version": "0.9.0", @@ -7,6 +7,7 @@ "properties": { "created": { "$ref": "./common.schema.json#/$defs/CreationInfoType" }, "info": { "$ref": "./common.schema.json#/$defs/InfoType" }, + "target" : { "$ref": "#/$defs/SolutionTargetType" }, "projects": { "$ref": "#/$defs/ProjectsType" }, "resources": { "$ref": "#/$defs/ResourcesType" }, "templates": { "$ref": "#/$defs/TemplatesType" } @@ -19,10 +20,27 @@ "uniqueItems": true, "items": { "$ref": "#/$defs/ProjectType" } }, + "SolutionTargetType": { + "type": "object", + "properties": { + "device": { + "type": "string", + "description": "Device valid for all child projects" + }, + "attributes": { + "$ref" : "./common.schema.json#/$defs/TargetAttributesType", + "description": "Device and board attributes valid for all child projects" + } + }, + "additionalProperties": false + }, "ProjectType": { "type": "object", "properties": { - "path": { "type": "string" }, + "path": { + "type": "string", + "description": "Path to cproject.yml file" + }, "info": { "$ref": "./common.schema.json#/$defs/InfoType" }, "artifacts": { "$ref": "./common.schema.json#/$defs/ArtifactsType" }, "packages": { "$ref": "./common.schema.json#/$defs/PackagesType" }, From b0e99d3c146f50804375cbd730f2a278375c187d Mon Sep 17 00:00:00 2001 From: Daniel Brondani Date: Mon, 25 Oct 2021 12:22:14 +0200 Subject: [PATCH 06/29] [projmgr] Update clayer YAML schema proposal --- tools/projmgr/docs/SDD.md | 7 +++++++ tools/projmgr/schema/clayer.schema.json | 17 ++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/tools/projmgr/docs/SDD.md b/tools/projmgr/docs/SDD.md index 3c73188a5..6eb9db11f 100644 --- a/tools/projmgr/docs/SDD.md +++ b/tools/projmgr/docs/SDD.md @@ -427,6 +427,13 @@ files: |:----------------|:---------------------------------------- | path | Path to `clayer.yml` file | clayer | Accept and merge any child item according to `clayer` schema + +### interfaces +| Argument | Description +|:----------------|:---------------------------------------- +| provides | List of interfaces provided by the layer +| consumes | List of interfaces consumed by the layer +
diff --git a/tools/projmgr/schema/clayer.schema.json b/tools/projmgr/schema/clayer.schema.json index 698d3cf0f..22ee58e7f 100644 --- a/tools/projmgr/schema/clayer.schema.json +++ b/tools/projmgr/schema/clayer.schema.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/draft/2020-12/schema#", + "$schema": "http://json-schema.org/draft-07/schema#", "id": "clayer.schema.json", "title": "CMSIS Project Manager clayer", "version": "0.9.0", @@ -20,11 +20,22 @@ "InterfacesType": { "type": "object", "properties": { - "provides": { "$ref": "#/$defs/InterfaceType" }, - "consumes": { "$ref": "#/$defs/InterfaceType" } + "provides": { + "$ref": "#/$defs/InterfaceListType", + "description": "Interfaces provided by the layer" + }, + "consumes": { + "$ref": "#/$defs/InterfaceListType", + "description": "Interfaces consumed by the layer" + } }, "additionalProperties": false }, + "InterfaceListType": { + "type": "array", + "uniqueItems": true, + "items": { "$ref": "#/$defs/InterfaceType" } + }, "InterfaceType": { "type": "object", "properties": { From 4e6226800e746aa064c3a3fc687649010447f681 Mon Sep 17 00:00:00 2001 From: Emil HAMMARSTEDT Date: Wed, 27 Oct 2021 11:40:53 +0200 Subject: [PATCH 07/29] Whitespaces is throwing parser off - spelling, CompilersType => CompilerType Contributed by STMicroelectronics Signed-off-by: Emil HAMMARSTEDT --- tools/projmgr/schema/clayer.schema.json | 4 ++-- tools/projmgr/schema/cproject.schema.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/projmgr/schema/clayer.schema.json b/tools/projmgr/schema/clayer.schema.json index 22ee58e7f..934217885 100644 --- a/tools/projmgr/schema/clayer.schema.json +++ b/tools/projmgr/schema/clayer.schema.json @@ -7,10 +7,10 @@ "properties": { "created": { "$ref": "./common.schema.json#/$defs/CreationInfoType" }, "info": { "$ref": "./common.schema.json#/$defs/InfoType" }, - "artifacts": { "$ref": "./common.schema.json#/$defs/ArtifactsType " }, + "artifacts": { "$ref": "./common.schema.json#/$defs/ArtifactsType" }, "interfaces": { "$ref": "#/$defs/InterfacesType" }, "packages" : { "$ref": "./common.schema.json#/$defs/PackagesType" }, - "compilers" : { "$ref": "./common.schema.json#/$defs/CompilersType" }, + "compiler" : { "$ref": "./common.schema.json#/$defs/CompilerType" }, "target" : { "$ref": "./common.schema.json#/$defs/TargetType" }, "components": { "$ref": "./common.schema.json#/$defs/ComponentsType" }, "files": { "$ref": "./common.schema.json#/$defs/FilesType" } diff --git a/tools/projmgr/schema/cproject.schema.json b/tools/projmgr/schema/cproject.schema.json index f79928fb3..402a2119e 100644 --- a/tools/projmgr/schema/cproject.schema.json +++ b/tools/projmgr/schema/cproject.schema.json @@ -6,7 +6,7 @@ "type": "object", "properties": { "created": { "$ref": "./common.schema.json#/$defs/CreationInfoType" }, - "info": { "$ref": "./common.schema.json#/$defs/InfoType "}, + "info": { "$ref": "./common.schema.json#/$defs/InfoType"}, "artifacts": { "$ref": "./common.schema.json#/$defs/ArtifactsType" }, "packages": { "$ref": "./common.schema.json#/$defs/PackagesType" }, "compiler": { "$ref": "./common.schema.json#/$defs/CompilerType" }, From 5edb618f9e390c0b520dc84bd540b1db449bac6b Mon Sep 17 00:00:00 2001 From: Reinhard Keil Date: Fri, 5 Nov 2021 17:28:44 +0100 Subject: [PATCH 08/29] Added Overview documentation --- tools/projmgr/docs/Overview.md | 131 +++++++++++++++++++++++++ tools/projmgr/docs/images/Overview.png | Bin 0 -> 141369 bytes 2 files changed, 131 insertions(+) create mode 100644 tools/projmgr/docs/Overview.md create mode 100644 tools/projmgr/docs/images/Overview.png diff --git a/tools/projmgr/docs/Overview.md b/tools/projmgr/docs/Overview.md new file mode 100644 index 000000000..f525b5fda --- /dev/null +++ b/tools/projmgr/docs/Overview.md @@ -0,0 +1,131 @@ +# [DRAFT] Overview + +![Overview](./images/Overview.png "Overview") + +The CMSIS Project Manager essentially uses **Project Files** and **CMSIS-Packs** to create self-contained +CMSIS-Build input files. + +| Project Files | Description +|:------------------|:--------------------------------------------------------------------------------- +| `*.csolution.yml` | Container for related projects. +| `*.cproject.yml` | Build description of an independant image. +| `*.clayer.yml` | Set of source files along with pre-configured components for reuse in different context. +| `*.csettings.yml` | Default setup for project creation. + +## Project Examples + +### Minimal Project Setup + +Simple applications require just one self-contained. + +**Simple Project: `Sample.cproject.yml`** +```yml +default: + target: + device: LPC55S69 + optimize: size + debug: on + +groups: + - group: My files + files: + - file: main.c + + - group: HAL + files: + - file: .\hal\driver1.c + +components: + - component: Device:Startup +``` + + +**Flexible Builds: `Multi.cproject.yml`** + +Complex examples require frequently slightly different targets and or modifications during build, i.e. for testing. + +It adds target-types and build-types. After processing it with the CMSIS Project Manager the *.cprj output files have the following naming conventions: +`.[~target-type].cprj` --> Example: `Multi.Debug~Production-HW.cprj` + + +```yml +target-types: + - type: Board + target: + board: NUCLEO-L552ZE-Q + + - type: Production-HW + target: + device: STM32U5X # specifies device + + - type: Virtual + target: + board: VHT-Corstone-300 # FVP platform (appears as board) + +build-types: + - type: Debug + optimize: debug + debug: on + + - type: Test + optimize: max + debug: on + + - type: Release + optimize: max + debug: off + +groups: + - group: My group1 + files: + - file: file1a.c + - file: file1b.c + - file: file1c.c + + - group: My group2 + - file: file2a.c + + - group: Test-Interface + include: .Test + - file: fileTa.c + +layers: + - layer: NUCLEO-L552ZE-Q\Board.clayer.yml # Need to find a better way: $Board$.clayer.yml + include: ~Board + + - layer: Production.clayer.yml + include: ~Production-HW + + - layer: Corstone-300\Board.clayer.yml + include: ~VHT-Corstone-300 +``` + +**Related Projects `iot-product.csolution.yml`** + +```yml +target-types: + - type: Board + target: + board: NUCLEO-L552ZE-Q + + - type: Production-HW + target: + device: STM32U5X # specifies device + +build-types: + - type: Debug + optimize: debug + debug: on + + - type: Test + optimize: max + debug: on + +solution: + - project: \security\TFM.cproject.yml + type: .Release + - project: \application\MQTT_AWS.cproject.yml + - project: \bootloader\Bootloader.cproject.yml + exclude: ~Virtual +``` + diff --git a/tools/projmgr/docs/images/Overview.png b/tools/projmgr/docs/images/Overview.png new file mode 100644 index 0000000000000000000000000000000000000000..24a1aeb2f2fa23c11646a7113ac6c2ce2d68cdcb GIT binary patch literal 141369 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 LO{P@prQiPp_*LNs literal 0 HcmV?d00001 From ce06da9b015017c3ec3d25a9510162a2e5853f8d Mon Sep 17 00:00:00 2001 From: Reinhard Keil Date: Mon, 8 Nov 2021 09:59:11 +0100 Subject: [PATCH 09/29] Added content to Project Manager Overview --- tools/projmgr/docs/Overview.md | 177 ++++++++++++++++-- tools/projmgr/docs/README.md | 4 + tools/projmgr/docs/images/Solution.png | Bin 0 -> 63303 bytes .../projmgr/docs/images/TargetBuild-Types.png | Bin 0 -> 109769 bytes 4 files changed, 163 insertions(+), 18 deletions(-) create mode 100644 tools/projmgr/docs/images/Solution.png create mode 100644 tools/projmgr/docs/images/TargetBuild-Types.png diff --git a/tools/projmgr/docs/Overview.md b/tools/projmgr/docs/Overview.md index f525b5fda..76a4c8309 100644 --- a/tools/projmgr/docs/Overview.md +++ b/tools/projmgr/docs/Overview.md @@ -5,16 +5,26 @@ The CMSIS Project Manager essentially uses **Project Files** and **CMSIS-Packs** to create self-contained CMSIS-Build input files. +The CMSIS-Pack shown on the left side provide device setup (DFP), board configuration, and other reusable software components. It should be investigated if the CMSIS-Zone concept can be integrated into the CMSIS Project Manager. The files on the left side are typically not touched by an application programmer as they are provided by silicon vendors, board manufacturers, or the software industry. + +The project setup uses YML Format that provides with a schema file validation and "intellisense" features during interactive edit, for example in VS Code. + | Project Files | Description |:------------------|:--------------------------------------------------------------------------------- | `*.csolution.yml` | Container for related projects. -| `*.cproject.yml` | Build description of an independant image. +| `*.cproject.yml` | Build description of an independent image. | `*.clayer.yml` | Set of source files along with pre-configured components for reuse in different context. -| `*.csettings.yml` | Default setup for project creation. +| `*.csettings.yml` | Default setup for project creation. For example, could provide build-types and a default board. + +The **CMSIS Project Manager** uses the *Project Files* along with the *CMSIS-Packs* to generate: + - `*.cproject.yml` output files that contain the effective setting. When comparing to a previous generated version, this file shows the effective changes done by a user compared to the previous setup. + - `*.cprj` files for CMSIS-Build where a reproducible build can be made on different computers. It lists all packs, software components, etc. + - `script files` that are generated by a template engine (CMSIS-Zone concept) to setup linker and other application parameters (to be investigated). + -## Project Examples +# Project Examples -### Minimal Project Setup +## Minimal Project Setup Simple applications require just one self-contained. @@ -39,28 +49,45 @@ components: - component: Device:Startup ``` +## Project Setup for Multiple Targets and Test Builds -**Flexible Builds: `Multi.cproject.yml`** -Complex examples require frequently slightly different targets and or modifications during build, i.e. for testing. +Complex examples require frequently slightly different targets and or modifications during build, i.e. for testing. The picture below shows a setup during software development that supports: + - Unit/Integration Testing on simulation models (call Virtual Hardware) where Virtual Drivers implement the interface to simulated I/O. + - Unit/Integration Testing the same software setup on a physical board where Hardware Drivers implement the interface to physical I/O. + - System Testing where the software is combined with more software components that compose the final application. + + ![Target and Build Types](./images/TargetBuild-Types.png "Target and Build Types") + +As the software may share a large set of common files, provisions are required to manage such projects. The common way in other IDE's is to add: + - **target-types** that select a target system. In the example this would be: + - `Virtual`: for Simulation Models. + - `Board`: for a physical evaluation board. + - `Production-HW`: for the system test. + - **build-types** add the flexibility to configure each target build towards a specific testing. It might be: + - `Debug`: for a full debug build of the software for interactive debug. + - `Test`: for a specific timing test using a test interface with code maximal optimization. + - `Release`: for the final code deployment to the systems. + +It is required to generate reproducible builds that can deployed on independent CI/CD test systems. To achieve that, *.the CMSIS Project Manager generates *.cprj output files with the following naming conventions: -It adds target-types and build-types. After processing it with the CMSIS Project Manager the *.cprj output files have the following naming conventions: -`.[~target-type].cprj` --> Example: `Multi.Debug~Production-HW.cprj` +`.[~target-type].cprj` this would generate for example: `Multi.Debug~Production-HW.cprj` + +This enables that each target and/or build type can be identified and independently generated which provides the support for test automation. It is however not required to build every possible combination, this should be under user control. + +**Flexible Builds: `Multi.cproject.yml`** ```yml target-types: - type: Board - target: - board: NUCLEO-L552ZE-Q + board: NUCLEO-L552ZE-Q - type: Production-HW - target: - device: STM32U5X # specifies device + device: STM32U5X # specifies device - type: Virtual - target: - board: VHT-Corstone-300 # FVP platform (appears as board) + board: VHT-Corstone-300 # FVP platform (appears as board) build-types: - type: Debug @@ -100,17 +127,29 @@ layers: include: ~VHT-Corstone-300 ``` +## Project Setup for Related Projects + +A solution combines projects that can be generated independently and therefore manages related projects. The picture below shows a system that is composed of: + - Project A: that implements a time-critical control algorithm running on a independent processor #2. + - Project B: which is a diagram of a cloud connected IoT application with Machine Learning (ML) functionality. + - Project C: that is the data model of the Machine Learning algorithm and separate to allow independent updates. + - Project D: that implements the device security (for example with TF-M that runs with TrustZone in secure mode). + +In addition such systems may have a boot-loader that can be also viewed as another independent project. + + ![Related Projects of an Embedded System](./images/Solution.png "Related Projects of an Embedded System") + +To manage the complexity of such related a projects, the `*.csolution.yml` file is introduced. At this level the `target-types` and `build-types` may be managed, so that a common set is available across the system. However it should be also possible to add project specific `build-types` at project level. (tdb: `target-types` might be only possible at solution level). + **Related Projects `iot-product.csolution.yml`** ```yml target-types: - type: Board - target: - board: NUCLEO-L552ZE-Q + board: NUCLEO-L552ZE-Q - type: Production-HW - target: - device: STM32U5X # specifies device + device: STM32U5X # specifies device build-types: - type: Debug @@ -129,3 +168,105 @@ solution: exclude: ~Virtual ``` +## YML Syntax + +### General Properties + +The keywords below can be used at top-level of `[defaults].csettings.yml`, `*.csolution.yml`, and `*.cproject.yml`. Some of settings can be overwritten on various levels. + +Keyword | Description +:-----------|:------------------------------------ +`compiler:` | Selection of the toolchain used for the project, i.e. `GCC`, `AC6`, `IAR`. +`device:` | Unique device name, optionally with vendor. Format: `[::]`. Examples: `NXP::LPC55S69` or `STM32L552RCT6` +`board:` | Unique board name, optionally with vendor. Format: `[::]`. Examples: `NXP::LPCxpresso55S69` or `NUCLEO-L552ZE-Q`. +`optimize:` | Generic optimize levels (max, size, speed, debug, tbd, ...), mapped to the toolchain by CMSIS-Build. +`debug:` | Generic control for the generation of debug information (on, off, tbd, ...), mapped to the toolchain by CMSIS-Build. +`defines:` | Settings for the code generation tools that are passed via the command line and result in #define. +`misc:` | Literal tool-specific controls (tbd variants `misc-c`, `misc-ar`, ... needed?) + +**Note:** `defines:` and `misc:` are additive. Other options overwrite previous settings. + +### Target and Build Types + +ToDo + +```yml +target-types: + - type: Board + board: NUCLEO-L552ZE-Q + + - type: Production-HW + device: STM32U5X # specifies device + +build-types: + - type: Debug + optimize: debug + debug: on + + - type: Test + optimize: max + debug: on +``` + +### Include or Exclude + +Depending on a *`target-type`* or *`build-type`* selection it is also possible to include or exclude *items* in the build process. + +Keyword | Description +:------------|:------------------------------------ +`include:` | A *type list* that adds an *item* for a specific target or build *type* or a list of *types*. +`exclude:` | A *type list* that removes an *item* for a specific target or build *type* or a list of *types*. + +It is possible to specify only a ``, only a `` or a combination of `` and ``. It is also possible to provide a list of *build* and *target* types. The *type list syntax* for `include:` or `exclude:` is: + +`[.][~] [, [.]~[]] [, ...]` + + +The keyword `include:` or `exclude:` can be applied to the following list keywords: + +Keyword | Description +:------------|:------------------------------------ +`project:` | At `solution:` level it is possible to control inclusion of project. +`group:` | At `group:` level it is possible to control inclusion of a file group. +`file:` | At `file:` level it is possible to control inclusion of a file. +`layer:` | At `layer:` level it is possible to control inclusion of a software layer. +`component:` | At `component:` level it is possible to control inclusion of a software component. + +*Examples:* +Todo + +### Groups and Files + +```yml +groups: + - group: "Main File Group" + exclude: .Release~Virtual, .Test-DSP~Virtual, ~Board + files: + - file: file1a.c + - file: file1b.c + defines: + - define: a=1 + - undefine: b + optimize: size + + - group: "Other File Group" + files: + - file: file2a.c + include: ~Virtual + defines: + - define: test=2 + - file: file2a.c + exclude: ~Virtual + - file: file2b.c + + - group: "Nested Group" + groups: + - group: Subgroup1 + files: + - file: file-sub1-1.c + - file: file-sub1-2.c + - group: Subgroup2 + files: + - file: file-sub2-1.c + - file: file-sub2-2.c +``` \ No newline at end of file diff --git a/tools/projmgr/docs/README.md b/tools/projmgr/docs/README.md index eb39f1769..d1fc0b125 100644 --- a/tools/projmgr/docs/README.md +++ b/tools/projmgr/docs/README.md @@ -6,6 +6,10 @@ according to the standard and provides commands to search packs, devices and components from installed packs as well as unresolved component dependencies. +## Overview +[Overview](Overview.md) explains the top-level concept and the project file formats. + +## Prototype The initial MVP prototype proposal can be found in the following Open-CMSIS-Pack forked branch:
https://github.com/brondani/devtools/tree/mvp-prototype diff --git a/tools/projmgr/docs/images/Solution.png b/tools/projmgr/docs/images/Solution.png new file mode 100644 index 0000000000000000000000000000000000000000..6007102678bc4a6a2e66ac922d19f256cbcdd6a4 GIT binary patch literal 63303 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 literal 0 HcmV?d00001 diff --git a/tools/projmgr/docs/images/TargetBuild-Types.png b/tools/projmgr/docs/images/TargetBuild-Types.png new file mode 100644 index 0000000000000000000000000000000000000000..86aee1ce7dc094b6c324f7bc05359a8fc3340d3e GIT binary patch literal 109769 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