From 92e7c1d00c9bb680167772b38dd468f0010f47b6 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sat, 14 May 2022 20:00:36 +0930 Subject: [PATCH 01/77] created About.rst --- OpenMS-Wiki/About.rst | 124 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 OpenMS-Wiki/About.rst diff --git a/OpenMS-Wiki/About.rst b/OpenMS-Wiki/About.rst new file mode 100644 index 00000000..c3b63817 --- /dev/null +++ b/OpenMS-Wiki/About.rst @@ -0,0 +1,124 @@ +===== +About +===== + + +.. contents:: Contents + +Background +########## +OpenMS is an open-source C++ library for mass spectrometry (MS) data management and analysis. It offers an infrastructure for the rapid development of mass spectrometry-related software. OpenMS is free software available under the three-clause BSD license. It runs under Windows, Mac OS X and Linux. + +OpenMS comes with a vast variety of pre-built and ready-to-use tools for proteomics and metabolomics data analysis (TOPP tools) and powerful 2D and 3D visualization (TOPPView). It supports analyses for various quantification protocols, including label-free shotgun, SILAC, iTRAQ, SRM, SWATH, .... It also provides built-in algorithms for peptide/protein identification, both de-novo and via database searching, as well as adapters to state-of-the art tools like X! Tandem, Mascot, OMSSA and others. + +Through the TOPP tools concept and unified parameter handling (CTD), OpenMS supports easy integration into workflow engines like TOPPAS (included), KNIME, Galaxy or WS-PGRADE. +With PyOpenMS, OpenMS offers Python bindings to a large part of the API to enable rapid algorithm development. + +OpenMS supports the Proteomics Standard Initiative (PSI) file formats for MS data. +The main contributors of OpenMS are currently Eberhard-Karls Universität in Tübingen, Freie Universität Berlin and ETH Zurich. + +For Users +######### + +Getting Started with OpenMS +*************************** +The current stable version of OpenMS can be downloaded from the [OpenMS download site](http://open-ms.de/downloads/) or can be obtained via the [[OpenMS docker containers|OpenMS Docker Containers]]. + +As a general primer to OpenMS, we also recommend to read [Röst et al, OpenMS: a flexible open-source software platform for mass spectrometry data analysis. Nat Methods. 2016](https://www.ncbi.nlm.nih.gov/pubmed/27575624) as well as the [Getting Started](http://www.openms.de/getting-started/) page on openms.de. + +Novice users should start by reading the OpenMS documentation (especially for TOPP) available from the [OpenMS documentation site](http://www.openms.de/current_doxygen/) or in the folder doc/index.html of stable releases. Some example workflows with optimised parameter settings can be downloaded from the [repository](https://github.com/OpenMS/OpenMS/wiki/Workflow-Collection). To understand which tools are available, please read the [TOPP Tool documentation page](http://www.openms.de/current_doxygen/html/TOPP_documentation.html) as well as the [UTILS Tool documentation page](http://www.openms.de/current_doxygen/html/UTILS_documentation.html). + +Getting in Contact +****************** +For general usage problems, bug reports and questions, please contact us directly on [Gitter](https://gitter.im/OpenMS/OpenMS) for real-time interaction with the developers or write to the mailing list [open-ms-general](https://lists.sourceforge.net/lists/listinfo/open-ms-general/). + +If you only want to be informed of new versions of OpenMS, please subscribe to the mailing list [open-ms-announcements](https://lists.sourceforge.net/lists/listinfo/open-ms-announcements). + +Reporting Bugs/Issues +********************* +A list of known issues in the current OpenMS release can be found here. Please check if your OpenMS version matches the current version and if the bug has already been reported. + +In order to report a new bug, please use either our [GitHub issues system](Writing-and-labelling-GitHub-issues) or contact us through the general OpenMS mailing list. + +Please include the following information into your bug report: +* the command line (i.e. call) including the TOPP tool and the arguments you used, or the steps you followed in a GUI tool (e.g. TOPPView) - e.g. "FeatureFinderCentroided -in myfile.mzML -out myfile.featureXML" +* the output of OpenMS/TOPP (or a screenshot in case of a GUI problem) +* operating system (e.g. "Windows XP 32bit", "Win 7 64bit", "Fedora 8 32bit", "MacOS 10.6 64bit") +* OpenMS version (e.g. "OpenMS 1.11.1", "Revision 63082 from the SVN repository") +* OpenMS architecture ("32 bit" or "64 bit") + +Please provide files that we need to reproduce the bug (e.g. TOPP INI files, data files - usually mzML) via a download link, via the mailing list or by directly contacting one of the developers. + +For Developers +############## + +Developing with OpenMS +********************** +If you would like to contribute to OpenMS, this is how to best get started: + +- Familiarize yourself with our [online documentation](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html). + +- Learn how to [[build OpenMS|Building OpenMS]]. + +- Start reading the [OpenMS tutorial for developers](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/OpenMS_tutorial.html). + +- Any questions can be directed at the mailing list. + +OpenMS tutorial for developers +****************************** +Please read the [OpenMS tutorial for developers](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/OpenMS_tutorial.html) +which contains general information about the structure of OpenMS, the concepts +behind it and example code. + +Technical Documentation +*********************** +See the documentation for the nightly snapshot of [develop](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/nightly/html/index.html) ([doxygen log](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_nightly_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). + +See the documentation for the latest [release](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html) ([doxygen log](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_release_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). + + +Development model +***************** +OpenMS follows the Gitflow development workflow which is excellently described [here](http://nvie.com/posts/a-successful-git-branching-model/). Additionally we encourage every developer (even if he is eligible to push directly to OpenMS) to create his own fork (e.g. @username). The GitHub people provide superb documentation on [forking](https://help.github.com/articles/fork-a-repo) and how to keep your fork [up-to-date](https://help.github.com/articles/syncing-a-fork). With your own fork you can follow the Gitflow development model directly, but instead of merging into "develop" in your own fork you can open a [pull request](https://help.github.com/articles/using-pull-requests). Before opening the pull request, please check the [checklist](Pull-Request-Checklist) + +Some more details and tips are collected [here](OpenMS-Git-Workflow). + +Coding Conventions +****************** +See the manual for proper coding style: [Coding conventions](Coding-conventions) +also see: [C++ Guide](https://github.com/OpenMS/OpenMS/wiki/Cpp-Guide) + +See the [manual](NewBuildUnit) for creating a new build unit (to be completed) + +We automatically test for common coding convention violations using a modified version of cpplint. +Style testing can be enabled using CMake options. We also provide a configuration file for Uncrustify for automated style corrections (see "tools/uncrustify.cfg"). + +Commit Messages +*************** +In order to ease the creation of a CHANGELOG we use a defined format for our commit messages. + +See the manual for proper commit messages: [How to write commit messages](https://github.com/OpenMS/OpenMS/wiki/HowTo---Write-Commit-Messages) + +Automated Unit Tests +******************** +We perform nightly test runs on different platforms. Even if everything compiled well on your machine and all tests passed, please check if you broke another platform on the next day. + +Nightly tests: [CDASH](http://cdash.openms.de/index.php?project=OpenMS) + + +Further developer resources +*************************** + +Guidelines for addition of new dependency libraries +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +See [here](https://github.com/OpenMS/OpenMS/wiki/Developer-Guidelines-for-adding-new-dependent-libraries). + +Experimental Installers +^^^^^^^^^^^^^^^^^^^^^^^ +We automatically build installers for different platforms. These usually contain unstable or partially untested code - so use them at your own risk. + +The nightly (unstable) installers are available [here](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/). + +Developer FAQ (formerly Internal FAQ) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The [FAQ](https://github.com/OpenMS/OpenMS/wiki/Developer-FAQ) for developers is currently expanded and might contain answers to your questions. From 7180d607469bafa42b98a4a48a277a28a828698b Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sat, 14 May 2022 20:42:30 +0930 Subject: [PATCH 02/77] linked Developer FAQ to external website --- OpenMS-Wiki/About.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenMS-Wiki/About.rst b/OpenMS-Wiki/About.rst index c3b63817..6b4d4888 100644 --- a/OpenMS-Wiki/About.rst +++ b/OpenMS-Wiki/About.rst @@ -1,11 +1,11 @@ ===== -About +Home ===== .. contents:: Contents -Background +About ########## OpenMS is an open-source C++ library for mass spectrometry (MS) data management and analysis. It offers an infrastructure for the rapid development of mass spectrometry-related software. OpenMS is free software available under the three-clause BSD license. It runs under Windows, Mac OS X and Linux. @@ -121,4 +121,4 @@ The nightly (unstable) installers are available [here](https://abibuilder.inform Developer FAQ (formerly Internal FAQ) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The [FAQ](https://github.com/OpenMS/OpenMS/wiki/Developer-FAQ) for developers is currently expanded and might contain answers to your questions. +The `FAQ `_(https://github.com/OpenMS/OpenMS/wiki/Developer-FAQ) for developers is currently expanded and might contain answers to your questions. From 5376e21db0d86a5676b2c4b643117558f613cfd9 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sat, 14 May 2022 20:46:56 +0930 Subject: [PATCH 03/77] linked Developer FAQ to external website --- OpenMS-Wiki/About.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenMS-Wiki/About.rst b/OpenMS-Wiki/About.rst index 6b4d4888..a4a9fe28 100644 --- a/OpenMS-Wiki/About.rst +++ b/OpenMS-Wiki/About.rst @@ -121,4 +121,5 @@ The nightly (unstable) installers are available [here](https://abibuilder.inform Developer FAQ (formerly Internal FAQ) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The `FAQ `_(https://github.com/OpenMS/OpenMS/wiki/Developer-FAQ) for developers is currently expanded and might contain answers to your questions. +The FAQ_(https://github.com/OpenMS/OpenMS/wiki/Developer-FAQ) for developers is currently expanded and might contain answers to your questions. +.. _FAQ: https://github.com/OpenMS/OpenMS/wiki/Developer-FAQ From 8c1c0da22931c41c88e609b10f68be24352dd3fc Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sat, 14 May 2022 20:50:01 +0930 Subject: [PATCH 04/77] linked Developer FAQ to external website --- OpenMS-Wiki/About.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenMS-Wiki/About.rst b/OpenMS-Wiki/About.rst index a4a9fe28..58564c59 100644 --- a/OpenMS-Wiki/About.rst +++ b/OpenMS-Wiki/About.rst @@ -122,4 +122,5 @@ The nightly (unstable) installers are available [here](https://abibuilder.inform Developer FAQ (formerly Internal FAQ) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The FAQ_(https://github.com/OpenMS/OpenMS/wiki/Developer-FAQ) for developers is currently expanded and might contain answers to your questions. + .. _FAQ: https://github.com/OpenMS/OpenMS/wiki/Developer-FAQ From dd5b159be86555e82ffd2effb063c5c5aac82ef2 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 09:24:26 +0930 Subject: [PATCH 05/77] fix links in About.rst --- OpenMS-Wiki/About.rst | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/OpenMS-Wiki/About.rst b/OpenMS-Wiki/About.rst index 58564c59..d2946d92 100644 --- a/OpenMS-Wiki/About.rst +++ b/OpenMS-Wiki/About.rst @@ -22,15 +22,15 @@ For Users Getting Started with OpenMS *************************** -The current stable version of OpenMS can be downloaded from the [OpenMS download site](http://open-ms.de/downloads/) or can be obtained via the [[OpenMS docker containers|OpenMS Docker Containers]]. +The current stable version of OpenMS can be downloaded from the `OpenMS download site `_ or can be obtained via the `OpenMS docker containers `_. -As a general primer to OpenMS, we also recommend to read [Röst et al, OpenMS: a flexible open-source software platform for mass spectrometry data analysis. Nat Methods. 2016](https://www.ncbi.nlm.nih.gov/pubmed/27575624) as well as the [Getting Started](http://www.openms.de/getting-started/) page on openms.de. +As a general primer to OpenMS, we also recommend to read `Röst et al, OpenMS: a flexible open-source software platform for mass spectrometry data analysis. Nat Methods. 2016 `_ as well as the `Getting Started `_ page on openms.de. -Novice users should start by reading the OpenMS documentation (especially for TOPP) available from the [OpenMS documentation site](http://www.openms.de/current_doxygen/) or in the folder doc/index.html of stable releases. Some example workflows with optimised parameter settings can be downloaded from the [repository](https://github.com/OpenMS/OpenMS/wiki/Workflow-Collection). To understand which tools are available, please read the [TOPP Tool documentation page](http://www.openms.de/current_doxygen/html/TOPP_documentation.html) as well as the [UTILS Tool documentation page](http://www.openms.de/current_doxygen/html/UTILS_documentation.html). +Novice users should start by reading the OpenMS documentation (especially for TOPP) available from the `OpenMS documentation site `_ or in the folder doc/index.html of stable releases. Some example workflows with optimised parameter settings can be downloaded from the `repository `_. To understand which tools are available, please read the `TOPP Tool documentation page `_ as well as the `UTILS Tool documentation page `_. Getting in Contact ****************** -For general usage problems, bug reports and questions, please contact us directly on [Gitter](https://gitter.im/OpenMS/OpenMS) for real-time interaction with the developers or write to the mailing list [open-ms-general](https://lists.sourceforge.net/lists/listinfo/open-ms-general/). +For general usage problems, bug reports and questions, please contact us directly on `Gitter `_ for real-time interaction with the developers or write to the mailing list `open-ms-general `_. If you only want to be informed of new versions of OpenMS, please subscribe to the mailing list [open-ms-announcements](https://lists.sourceforge.net/lists/listinfo/open-ms-announcements). @@ -56,39 +56,39 @@ Developing with OpenMS ********************** If you would like to contribute to OpenMS, this is how to best get started: -- Familiarize yourself with our [online documentation](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html). +- Familiarize yourself with our `online documentation` `_. -- Learn how to [[build OpenMS|Building OpenMS]]. +- Learn how to `build OpenMS `_. -- Start reading the [OpenMS tutorial for developers](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/OpenMS_tutorial.html). +- Start reading the `OpenMS tutorial for developers `_. - Any questions can be directed at the mailing list. OpenMS tutorial for developers ****************************** -Please read the [OpenMS tutorial for developers](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/OpenMS_tutorial.html) +Please read the `OpenMS tutorial for developers `_) which contains general information about the structure of OpenMS, the concepts behind it and example code. Technical Documentation *********************** -See the documentation for the nightly snapshot of [develop](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/nightly/html/index.html) ([doxygen log](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_nightly_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). +See the documentation for the nightly snapshot of `develop `_ (`doxygen log `_). -See the documentation for the latest [release](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html) ([doxygen log](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_release_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). +See the documentation for the latest `release `_ (`doxygen log `_). Development model ***************** -OpenMS follows the Gitflow development workflow which is excellently described [here](http://nvie.com/posts/a-successful-git-branching-model/). Additionally we encourage every developer (even if he is eligible to push directly to OpenMS) to create his own fork (e.g. @username). The GitHub people provide superb documentation on [forking](https://help.github.com/articles/fork-a-repo) and how to keep your fork [up-to-date](https://help.github.com/articles/syncing-a-fork). With your own fork you can follow the Gitflow development model directly, but instead of merging into "develop" in your own fork you can open a [pull request](https://help.github.com/articles/using-pull-requests). Before opening the pull request, please check the [checklist](Pull-Request-Checklist) +OpenMS follows the Gitflow development workflow which is excellently described `here `_. Additionally we encourage every developer (even if he is eligible to push directly to OpenMS) to create his own fork (e.g. @username). The GitHub people provide superb documentation on `forking `_ and how to keep your fork `up-to-date `_. With your own fork you can follow the Gitflow development model directly, but instead of merging into "develop" in your own fork you can open a `pull request``_. Before opening the pull request, please check the [checklist](Pull-Request-Checklist) Some more details and tips are collected [here](OpenMS-Git-Workflow). Coding Conventions ****************** -See the manual for proper coding style: [Coding conventions](Coding-conventions) -also see: [C++ Guide](https://github.com/OpenMS/OpenMS/wiki/Cpp-Guide) +See the manual for proper coding style: `Coding conventions `_ +also see: `C++ Guide `_ -See the [manual](NewBuildUnit) for creating a new build unit (to be completed) +See the `manual` `_ for creating a new build unit (to be completed) We automatically test for common coding convention violations using a modified version of cpplint. Style testing can be enabled using CMake options. We also provide a configuration file for Uncrustify for automated style corrections (see "tools/uncrustify.cfg"). @@ -97,13 +97,16 @@ Commit Messages *************** In order to ease the creation of a CHANGELOG we use a defined format for our commit messages. -See the manual for proper commit messages: [How to write commit messages](https://github.com/OpenMS/OpenMS/wiki/HowTo---Write-Commit-Messages) +See the manual for proper commit messages: `How to write commit messages `_ + Automated Unit Tests ******************** We perform nightly test runs on different platforms. Even if everything compiled well on your machine and all tests passed, please check if you broke another platform on the next day. -Nightly tests: [CDASH](http://cdash.openms.de/index.php?project=OpenMS) +Nightly tests: CDASH_(http://cdash.openms.de/index.php?project=OpenMS) + +.. _CDASH: http://cdash.openms.de/index.php?project=OpenMS Further developer resources @@ -111,13 +114,17 @@ Further developer resources Guidelines for addition of new dependency libraries ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -See [here](https://github.com/OpenMS/OpenMS/wiki/Developer-Guidelines-for-adding-new-dependent-libraries). +See here_(https://github.com/OpenMS/OpenMS/wiki/Developer-Guidelines-for-adding-new-dependent-libraries). + +.. _here: https://github.com/OpenMS/OpenMS/wiki/Developer-Guidelines-for-adding-new-dependent-libraries Experimental Installers ^^^^^^^^^^^^^^^^^^^^^^^ We automatically build installers for different platforms. These usually contain unstable or partially untested code - so use them at your own risk. -The nightly (unstable) installers are available [here](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/). +The nightly (unstable) installers are available here_(https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/). + +.. _here: https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/ Developer FAQ (formerly Internal FAQ) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From d3ece909d6e9581325303fe426b4746dcdde908b Mon Sep 17 00:00:00 2001 From: greengypsy <31978630+greengypsy@users.noreply.github.com> Date: Sun, 15 May 2022 09:44:12 +0930 Subject: [PATCH 06/77] Update About.rst --- OpenMS-Wiki/About.rst | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/OpenMS-Wiki/About.rst b/OpenMS-Wiki/About.rst index d2946d92..1a6af630 100644 --- a/OpenMS-Wiki/About.rst +++ b/OpenMS-Wiki/About.rst @@ -104,30 +104,23 @@ Automated Unit Tests ******************** We perform nightly test runs on different platforms. Even if everything compiled well on your machine and all tests passed, please check if you broke another platform on the next day. -Nightly tests: CDASH_(http://cdash.openms.de/index.php?project=OpenMS) - -.. _CDASH: http://cdash.openms.de/index.php?project=OpenMS - +Nightly tests: `CDASH '_ Further developer resources *************************** Guidelines for addition of new dependency libraries ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -See here_(https://github.com/OpenMS/OpenMS/wiki/Developer-Guidelines-for-adding-new-dependent-libraries). - -.. _here: https://github.com/OpenMS/OpenMS/wiki/Developer-Guidelines-for-adding-new-dependent-libraries +See `here `_. Experimental Installers ^^^^^^^^^^^^^^^^^^^^^^^ We automatically build installers for different platforms. These usually contain unstable or partially untested code - so use them at your own risk. -The nightly (unstable) installers are available here_(https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/). - -.. _here: https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/ +The nightly (unstable) installers are available `here `_. Developer FAQ (formerly Internal FAQ) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The FAQ_(https://github.com/OpenMS/OpenMS/wiki/Developer-FAQ) for developers is currently expanded and might contain answers to your questions. +The `FAQ `_ for developers is currently expanded and might contain answers to your questions. + -.. _FAQ: https://github.com/OpenMS/OpenMS/wiki/Developer-FAQ From 396fc7ab861a853666605d8a13c0d5461b4d8e7c Mon Sep 17 00:00:00 2001 From: greengypsy <31978630+greengypsy@users.noreply.github.com> Date: Sun, 15 May 2022 09:47:31 +0930 Subject: [PATCH 07/77] Update About.rst --- OpenMS-Wiki/About.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/OpenMS-Wiki/About.rst b/OpenMS-Wiki/About.rst index 1a6af630..3e6fff7b 100644 --- a/OpenMS-Wiki/About.rst +++ b/OpenMS-Wiki/About.rst @@ -32,13 +32,13 @@ Getting in Contact ****************** For general usage problems, bug reports and questions, please contact us directly on `Gitter `_ for real-time interaction with the developers or write to the mailing list `open-ms-general `_. -If you only want to be informed of new versions of OpenMS, please subscribe to the mailing list [open-ms-announcements](https://lists.sourceforge.net/lists/listinfo/open-ms-announcements). +If you only want to be informed of new versions of OpenMS, please subscribe to the mailing list `open-ms-announcements `_. Reporting Bugs/Issues ********************* A list of known issues in the current OpenMS release can be found here. Please check if your OpenMS version matches the current version and if the bug has already been reported. -In order to report a new bug, please use either our [GitHub issues system](Writing-and-labelling-GitHub-issues) or contact us through the general OpenMS mailing list. +In order to report a new bug, please use either our `GitHub issues system `_ or contact us through the general OpenMS mailing list. Please include the following information into your bug report: * the command line (i.e. call) including the TOPP tool and the arguments you used, or the steps you followed in a GUI tool (e.g. TOPPView) - e.g. "FeatureFinderCentroided -in myfile.mzML -out myfile.featureXML" @@ -56,7 +56,7 @@ Developing with OpenMS ********************** If you would like to contribute to OpenMS, this is how to best get started: -- Familiarize yourself with our `online documentation` `_. +- Familiarize yourself with our `online documentation `_. - Learn how to `build OpenMS `_. @@ -79,7 +79,7 @@ See the documentation for the latest `release `_. Additionally we encourage every developer (even if he is eligible to push directly to OpenMS) to create his own fork (e.g. @username). The GitHub people provide superb documentation on `forking `_ and how to keep your fork `up-to-date `_. With your own fork you can follow the Gitflow development model directly, but instead of merging into "develop" in your own fork you can open a `pull request``_. Before opening the pull request, please check the [checklist](Pull-Request-Checklist) +OpenMS follows the Gitflow development workflow which is excellently described `here `_. Additionally we encourage every developer (even if he is eligible to push directly to OpenMS) to create his own fork (e.g. @username). The GitHub people provide superb documentation on `forking `_ and how to keep your fork `up-to-date `_. With your own fork you can follow the Gitflow development model directly, but instead of merging into "develop" in your own fork you can open a `pull request `_. Before opening the pull request, please check the [checklist](Pull-Request-Checklist) Some more details and tips are collected [here](OpenMS-Git-Workflow). @@ -88,7 +88,7 @@ Coding Conventions See the manual for proper coding style: `Coding conventions `_ also see: `C++ Guide `_ -See the `manual` `_ for creating a new build unit (to be completed) +See the `manual `_ for creating a new build unit (to be completed) We automatically test for common coding convention violations using a modified version of cpplint. Style testing can be enabled using CMake options. We also provide a configuration file for Uncrustify for automated style corrections (see "tools/uncrustify.cfg"). @@ -104,7 +104,7 @@ Automated Unit Tests ******************** We perform nightly test runs on different platforms. Even if everything compiled well on your machine and all tests passed, please check if you broke another platform on the next day. -Nightly tests: `CDASH '_ +Nightly tests: `CDASH `_ Further developer resources *************************** From 67579ba84bdbd1d5371db6911f0af9d3526b17be Mon Sep 17 00:00:00 2001 From: greengypsy <31978630+greengypsy@users.noreply.github.com> Date: Sun, 15 May 2022 09:52:08 +0930 Subject: [PATCH 08/77] Update About.rst --- OpenMS-Wiki/About.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/OpenMS-Wiki/About.rst b/OpenMS-Wiki/About.rst index 3e6fff7b..6129e579 100644 --- a/OpenMS-Wiki/About.rst +++ b/OpenMS-Wiki/About.rst @@ -79,16 +79,16 @@ See the documentation for the latest `release `_. Additionally we encourage every developer (even if he is eligible to push directly to OpenMS) to create his own fork (e.g. @username). The GitHub people provide superb documentation on `forking `_ and how to keep your fork `up-to-date `_. With your own fork you can follow the Gitflow development model directly, but instead of merging into "develop" in your own fork you can open a `pull request `_. Before opening the pull request, please check the [checklist](Pull-Request-Checklist) +OpenMS follows the Gitflow development workflow which is excellently described `here `_. Additionally we encourage every developer (even if he is eligible to push directly to OpenMS) to create his own fork (e.g. @username). The GitHub people provide superb documentation on `forking `_ and how to keep your fork `up-to-date `_. With your own fork you can follow the Gitflow development model directly, but instead of merging into "develop" in your own fork you can open a `pull request `_. Before opening the pull request, please check the `checklist `_ -Some more details and tips are collected [here](OpenMS-Git-Workflow). +Some more details and tips are collected `here `_. Coding Conventions ****************** See the manual for proper coding style: `Coding conventions `_ -also see: `C++ Guide `_ +also see: `C++ Guide `_. -See the `manual `_ for creating a new build unit (to be completed) +See the `manual `_ for creating a new build unit (to be completed). We automatically test for common coding convention violations using a modified version of cpplint. Style testing can be enabled using CMake options. We also provide a configuration file for Uncrustify for automated style corrections (see "tools/uncrustify.cfg"). @@ -97,7 +97,7 @@ Commit Messages *************** In order to ease the creation of a CHANGELOG we use a defined format for our commit messages. -See the manual for proper commit messages: `How to write commit messages `_ +See the manual for proper commit messages: `How to write commit messages `_. Automated Unit Tests From 8ebb7736a79ad73afd1646c4e584d20f4373efa5 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 10:05:48 +0930 Subject: [PATCH 09/77] changed About.rst to about.rst --- OpenMS-Wiki/About.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/OpenMS-Wiki/About.rst b/OpenMS-Wiki/About.rst index 6129e579..be76ff11 100644 --- a/OpenMS-Wiki/About.rst +++ b/OpenMS-Wiki/About.rst @@ -122,5 +122,3 @@ The nightly (unstable) installers are available `here `_ for developers is currently expanded and might contain answers to your questions. - - From 7415287a3913e37b749562fa42a71031df115255 Mon Sep 17 00:00:00 2001 From: greengypsy <31978630+greengypsy@users.noreply.github.com> Date: Sun, 15 May 2022 10:08:08 +0930 Subject: [PATCH 10/77] Rename About.rst to about.rst --- OpenMS-Wiki/{About.rst => about.rst} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename OpenMS-Wiki/{About.rst => about.rst} (100%) diff --git a/OpenMS-Wiki/About.rst b/OpenMS-Wiki/about.rst similarity index 100% rename from OpenMS-Wiki/About.rst rename to OpenMS-Wiki/about.rst From 05e29717b648f83bd6ee7216df59f8471037df2a Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 11:49:14 +0930 Subject: [PATCH 11/77] added known-issues.rst --- OpenMS-Wiki/known-issues.rst | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 OpenMS-Wiki/known-issues.rst diff --git a/OpenMS-Wiki/known-issues.rst b/OpenMS-Wiki/known-issues.rst new file mode 100644 index 00000000..2eed2837 --- /dev/null +++ b/OpenMS-Wiki/known-issues.rst @@ -0,0 +1,17 @@ +============ +Known Issues +============ + +Have look at the Internal FAQ, if you cannot find your answer here. Write to the OpenMS mailing list, if the problem persists. + +.. contents:: Contents + +Known issues on Windows +####################### +* **Starting a (GUI) TOPP executable (like TOPPView or FeatureFinderCentroided) gives "The application was unable to start correctly (0xc0000005). Click OK to close the application"** + When you run the tool in Debug mode and look where it crashes, you might actually find it to be a very weird place - e.g. when creating a perfectly legal String from a QString: +* + + +Known issues on Linux +####################### From b2cea56f167c4a58f65cfd939354ca9494c2e8a4 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 11:50:29 +0930 Subject: [PATCH 12/77] fix bullet point in known-rst --- OpenMS-Wiki/known-issues.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenMS-Wiki/known-issues.rst b/OpenMS-Wiki/known-issues.rst index 2eed2837..ccaf97c2 100644 --- a/OpenMS-Wiki/known-issues.rst +++ b/OpenMS-Wiki/known-issues.rst @@ -9,6 +9,7 @@ Have look at the Internal FAQ, if you cannot find your answer here. Write to the Known issues on Windows ####################### * **Starting a (GUI) TOPP executable (like TOPPView or FeatureFinderCentroided) gives "The application was unable to start correctly (0xc0000005). Click OK to close the application"** + When you run the tool in Debug mode and look where it crashes, you might actually find it to be a very weird place - e.g. when creating a perfectly legal String from a QString: * From e3635bcaa9d9ea31dbe6f41b9efe72eafc75dda1 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 12:05:36 +0930 Subject: [PATCH 13/77] add code to known-issues.rst --- OpenMS-Wiki/known-issues.rst | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/OpenMS-Wiki/known-issues.rst b/OpenMS-Wiki/known-issues.rst index ccaf97c2..fc7b1cd8 100644 --- a/OpenMS-Wiki/known-issues.rst +++ b/OpenMS-Wiki/known-issues.rst @@ -2,7 +2,7 @@ Known Issues ============ -Have look at the Internal FAQ, if you cannot find your answer here. Write to the OpenMS mailing list, if the problem persists. +Have a look at the Internal FAQ, if you cannot find your answer here. Write to the OpenMS mailing list, if the problem persists. .. contents:: Contents @@ -11,6 +11,11 @@ Known issues on Windows * **Starting a (GUI) TOPP executable (like TOPPView or FeatureFinderCentroided) gives "The application was unable to start correctly (0xc0000005). Click OK to close the application"** When you run the tool in Debug mode and look where it crashes, you might actually find it to be a very weird place - e.g. when creating a perfectly legal String from a QString: + .. code:: cpp + + + QFileInfo fi(file.toQString()); + return fi.path() * From 63a1fed80b0a4cb8b057da2f80c44167a7b70f9a Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 12:10:31 +0930 Subject: [PATCH 14/77] add code to known-issues.rst --- OpenMS-Wiki/known-issues.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenMS-Wiki/known-issues.rst b/OpenMS-Wiki/known-issues.rst index fc7b1cd8..0f40f343 100644 --- a/OpenMS-Wiki/known-issues.rst +++ b/OpenMS-Wiki/known-issues.rst @@ -11,10 +11,10 @@ Known issues on Windows * **Starting a (GUI) TOPP executable (like TOPPView or FeatureFinderCentroided) gives "The application was unable to start correctly (0xc0000005). Click OK to close the application"** When you run the tool in Debug mode and look where it crashes, you might actually find it to be a very weird place - e.g. when creating a perfectly legal String from a QString: - .. code:: cpp + .. code:: c++ - QFileInfo fi(file.toQString()); + return fi.path() * From 1225eb4889d857c9077fd7b7d4ec5cb11506a75e Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 12:11:34 +0930 Subject: [PATCH 15/77] fix code to known-issues.rst --- OpenMS-Wiki/known-issues.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenMS-Wiki/known-issues.rst b/OpenMS-Wiki/known-issues.rst index 0f40f343..18d2380c 100644 --- a/OpenMS-Wiki/known-issues.rst +++ b/OpenMS-Wiki/known-issues.rst @@ -11,11 +11,12 @@ Known issues on Windows * **Starting a (GUI) TOPP executable (like TOPPView or FeatureFinderCentroided) gives "The application was unable to start correctly (0xc0000005). Click OK to close the application"** When you run the tool in Debug mode and look where it crashes, you might actually find it to be a very weird place - e.g. when creating a perfectly legal String from a QString: + .. code:: c++ QFileInfo fi(file.toQString()); - return fi.path() + return fi.path(); * From b4b305e209d1634ed5ee8fcc027dffa84563942a Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 12:23:41 +0930 Subject: [PATCH 16/77] added VS output to known-issues.rst --- OpenMS-Wiki/known-issues.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OpenMS-Wiki/known-issues.rst b/OpenMS-Wiki/known-issues.rst index 18d2380c..f7e7441e 100644 --- a/OpenMS-Wiki/known-issues.rst +++ b/OpenMS-Wiki/known-issues.rst @@ -17,6 +17,14 @@ Known issues on Windows QFileInfo fi(file.toQString()); return fi.path(); + + The reason this happens is usually: you've mixed DLL's from multiple runtimes (e.g. compiled with VS10 and VS9). This can easily happen, if you use your Qt (build with VS9) to link against your OpenMS (build with VS10). The loader will load VS9 and VS10 runtimes and will NOT tell you that they conflict. Instead, very weird things are going to happen. You can identify if you are affected by looking at the DLL's that are loaded via daisy-chaining - see either DependencyWalker's output or the 'output' window in VS when running the app from inside VS. It might read: + + ..code:: + + 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcp90d.dll', Symbols loaded. + 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcr90d.dll', Symbols loaded. + 'MSSimulator.exe': Loaded 'C:\dev\qt-everywhere-opensource-src-4.7.1\bin\QtSqld4.dll', Symbols loaded. * From 62c050f39965a67623c6c81ea9027067ee0b3037 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 12:24:17 +0930 Subject: [PATCH 17/77] added VS output to known-issues.rst --- OpenMS-Wiki/known-issues.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenMS-Wiki/known-issues.rst b/OpenMS-Wiki/known-issues.rst index f7e7441e..f7d57b26 100644 --- a/OpenMS-Wiki/known-issues.rst +++ b/OpenMS-Wiki/known-issues.rst @@ -20,7 +20,7 @@ Known issues on Windows The reason this happens is usually: you've mixed DLL's from multiple runtimes (e.g. compiled with VS10 and VS9). This can easily happen, if you use your Qt (build with VS9) to link against your OpenMS (build with VS10). The loader will load VS9 and VS10 runtimes and will NOT tell you that they conflict. Instead, very weird things are going to happen. You can identify if you are affected by looking at the DLL's that are loaded via daisy-chaining - see either DependencyWalker's output or the 'output' window in VS when running the app from inside VS. It might read: - ..code:: + .. code:: c++ 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcp90d.dll', Symbols loaded. 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcr90d.dll', Symbols loaded. From ec7a3a0441b3248c6bf0157a6bd3fe2b5b7917ac Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 12:24:42 +0930 Subject: [PATCH 18/77] added VS output to known-issues.rst --- OpenMS-Wiki/known-issues.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenMS-Wiki/known-issues.rst b/OpenMS-Wiki/known-issues.rst index f7d57b26..73ea622a 100644 --- a/OpenMS-Wiki/known-issues.rst +++ b/OpenMS-Wiki/known-issues.rst @@ -20,7 +20,7 @@ Known issues on Windows The reason this happens is usually: you've mixed DLL's from multiple runtimes (e.g. compiled with VS10 and VS9). This can easily happen, if you use your Qt (build with VS9) to link against your OpenMS (build with VS10). The loader will load VS9 and VS10 runtimes and will NOT tell you that they conflict. Instead, very weird things are going to happen. You can identify if you are affected by looking at the DLL's that are loaded via daisy-chaining - see either DependencyWalker's output or the 'output' window in VS when running the app from inside VS. It might read: - .. code:: c++ + .. code:: 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcp90d.dll', Symbols loaded. 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcr90d.dll', Symbols loaded. From a1afab410821bbc37ed0f2a10c2f2db8bfd3954a Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 12:25:11 +0930 Subject: [PATCH 19/77] added VS output to known-issues.rst --- OpenMS-Wiki/known-issues.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenMS-Wiki/known-issues.rst b/OpenMS-Wiki/known-issues.rst index 73ea622a..11e87867 100644 --- a/OpenMS-Wiki/known-issues.rst +++ b/OpenMS-Wiki/known-issues.rst @@ -20,11 +20,11 @@ Known issues on Windows The reason this happens is usually: you've mixed DLL's from multiple runtimes (e.g. compiled with VS10 and VS9). This can easily happen, if you use your Qt (build with VS9) to link against your OpenMS (build with VS10). The loader will load VS9 and VS10 runtimes and will NOT tell you that they conflict. Instead, very weird things are going to happen. You can identify if you are affected by looking at the DLL's that are loaded via daisy-chaining - see either DependencyWalker's output or the 'output' window in VS when running the app from inside VS. It might read: - .. code:: + .. code:: - 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcp90d.dll', Symbols loaded. - 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcr90d.dll', Symbols loaded. - 'MSSimulator.exe': Loaded 'C:\dev\qt-everywhere-opensource-src-4.7.1\bin\QtSqld4.dll', Symbols loaded. + 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcp90d.dll', Symbols loaded. + 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcr90d.dll', Symbols loaded. + 'MSSimulator.exe': Loaded 'C:\dev\qt-everywhere-opensource-src-4.7.1\bin\QtSqld4.dll', Symbols loaded. * From 5b58ce9ba280bbf993067c710445a8b91cdac16f Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 12:25:51 +0930 Subject: [PATCH 20/77] added VS output to known-issues.rst --- OpenMS-Wiki/known-issues.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenMS-Wiki/known-issues.rst b/OpenMS-Wiki/known-issues.rst index 11e87867..3fc84aef 100644 --- a/OpenMS-Wiki/known-issues.rst +++ b/OpenMS-Wiki/known-issues.rst @@ -20,7 +20,7 @@ Known issues on Windows The reason this happens is usually: you've mixed DLL's from multiple runtimes (e.g. compiled with VS10 and VS9). This can easily happen, if you use your Qt (build with VS9) to link against your OpenMS (build with VS10). The loader will load VS9 and VS10 runtimes and will NOT tell you that they conflict. Instead, very weird things are going to happen. You can identify if you are affected by looking at the DLL's that are loaded via daisy-chaining - see either DependencyWalker's output or the 'output' window in VS when running the app from inside VS. It might read: - .. code:: + .. code:: c++ 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcp90d.dll', Symbols loaded. 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcr90d.dll', Symbols loaded. From a54e3561781ed70d60ed2bde6de22d7ddcb639b9 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 12:30:30 +0930 Subject: [PATCH 21/77] added more text to known-issues.rst --- OpenMS-Wiki/known-issues.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OpenMS-Wiki/known-issues.rst b/OpenMS-Wiki/known-issues.rst index 3fc84aef..b258803d 100644 --- a/OpenMS-Wiki/known-issues.rst +++ b/OpenMS-Wiki/known-issues.rst @@ -25,6 +25,10 @@ Known issues on Windows 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcp90d.dll', Symbols loaded. 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcr90d.dll', Symbols loaded. 'MSSimulator.exe': Loaded 'C:\dev\qt-everywhere-opensource-src-4.7.1\bin\QtSqld4.dll', Symbols loaded. + + As this was a VS10 build, the vc90 DLL's have no place here, but got loaded from the Qt4 DLL's. + + **Solution**: recompile Qt (in this case) using VS10 and link against the new Qt. * From a59a7966c48e8e9dc20da06129be70d9f03f1550 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 12:39:50 +0930 Subject: [PATCH 22/77] tried adding console code to known-issues.rst --- OpenMS-Wiki/known-issues.rst | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/OpenMS-Wiki/known-issues.rst b/OpenMS-Wiki/known-issues.rst index b258803d..ad3dc6b8 100644 --- a/OpenMS-Wiki/known-issues.rst +++ b/OpenMS-Wiki/known-issues.rst @@ -29,8 +29,21 @@ Known issues on Windows As this was a VS10 build, the vc90 DLL's have no place here, but got loaded from the Qt4 DLL's. **Solution**: recompile Qt (in this case) using VS10 and link against the new Qt. -* +* **Starting a (GUI) TOPP executable (like TOPPView or FeatureFinderCentroided) gives "Entry point not found"** + + This usually happens when your PATH contains multiple versions of DLL's on which TOPP/OpenMS depends. Candidates are all QT (QtGui4.dll, QtCore4.dll, ...) or Xerces-C (xerces-c_3_0) libraries. Usually other external programs (Miktex, Mendeley etc) put their own binary directory (which contains these incompatible DLL's) before the contrib directory in your PATH%. + + **Solution**: put the contrib directory at the very beginning of your PATH%. The other tools should be unaffected as DLL's are first searched in the path of the executable (where their DLL's should be as well). We do that for OpenMS as well, but only in the binary installer packages, not for the developer version. + +* **Compiling the contrib or OpenMS, the windows.h header file seems to be missing!** + + Your error message might look like this: + + .. code:: console + + c:\dev\contrib_build\src\bzip2-1.0.5\bzlib.h(79) : fatal error C1083: + Cannot open include file: 'windows.h': No such file or directory Known issues on Linux ####################### From 43c7f3b471865f3a7d80d5611666751e80f0f66a Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 12:46:15 +0930 Subject: [PATCH 23/77] completed copying content for known-issues.rst --- OpenMS-Wiki/known-issues.rst | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/OpenMS-Wiki/known-issues.rst b/OpenMS-Wiki/known-issues.rst index ad3dc6b8..40fad087 100644 --- a/OpenMS-Wiki/known-issues.rst +++ b/OpenMS-Wiki/known-issues.rst @@ -20,7 +20,7 @@ Known issues on Windows The reason this happens is usually: you've mixed DLL's from multiple runtimes (e.g. compiled with VS10 and VS9). This can easily happen, if you use your Qt (build with VS9) to link against your OpenMS (build with VS10). The loader will load VS9 and VS10 runtimes and will NOT tell you that they conflict. Instead, very weird things are going to happen. You can identify if you are affected by looking at the DLL's that are loaded via daisy-chaining - see either DependencyWalker's output or the 'output' window in VS when running the app from inside VS. It might read: - .. code:: c++ + .. code:: console 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcp90d.dll', Symbols loaded. 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcr90d.dll', Symbols loaded. @@ -45,5 +45,21 @@ Known issues on Windows c:\dev\contrib_build\src\bzip2-1.0.5\bzlib.h(79) : fatal error C1083: Cannot open include file: 'windows.h': No such file or directory + This can happen if you are using the VS Express Edition or VS2008 on Win7 (other cases might be possible as well). The reason is that your INCLUDE environment path does not contain the system header windows.h, which is required by the contrib and OpenMS. + + **Solution**: You need to download the Microsoft SDK for Windows 7 (or whatever your OS is). Make sure to select "Header Files" Section during install and make sure that the SDK's include path is in your INCLUDE environment. + Known issues on Linux ####################### + +* **Contrib fails to compile on Ubuntu 10.04** + + Your error message might look like: + + .. code:: console + + gzip: stdin: invalid compressed data--crc error + + This happens with a buggy version of gzip in Ubuntu 10.04. + + **Solution**: To solve this issue update gzip using lucid-proposed (see https://wiki.ubuntu.com/Testing/EnableProposed). From ccdf3ec4e3c4de38ccac8b9734ea57ec07306660 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 13:30:24 +0930 Subject: [PATCH 24/77] added topp-faq.rst and docutils.conf --- OpenMS-Wiki/docutils.conf | 2 ++ OpenMS-Wiki/topp-faq.rst | 66 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 OpenMS-Wiki/docutils.conf create mode 100644 OpenMS-Wiki/topp-faq.rst diff --git a/OpenMS-Wiki/docutils.conf b/OpenMS-Wiki/docutils.conf new file mode 100644 index 00000000..1bf4d832 --- /dev/null +++ b/OpenMS-Wiki/docutils.conf @@ -0,0 +1,2 @@ +[restructuredtext parser] +syntax_highlight = short diff --git a/OpenMS-Wiki/topp-faq.rst b/OpenMS-Wiki/topp-faq.rst new file mode 100644 index 00000000..e39f5e2d --- /dev/null +++ b/OpenMS-Wiki/topp-faq.rst @@ -0,0 +1,66 @@ +========================== +TOPP Frequently Asked Questions +========================== + +.. contents:: Contents + +I'm getting the error message "Unexpected internal error (unable to allocate enough memory (size = 0 bytes)". +############################################################################################################ + +Call "OpenMSInfo" and look at "OS Information". + +If you are using the 32bit version of OpenMS, the data you are processing is probably too big (e.g. using RAW data files bigger than 1.5 GB as input, or many featureXML files etc). You can now either: + +* Switch to the 64bit Version of OpenMS. Be aware though that your Operating System also needs to have 64bit. Furthermore your PC should have sufficient RAM, to hold the data. Otherwise your hard drive will be used extensively for swapping and processing will take longer. +* On 32bit Windows systems you can try the increase the allowed amount of memory from 2GB to 3GB by using the "/3GB" boot switch (boot.ini). This might already do the trick. However, if your data again gets bigger, this solution will only help temporarily. Google "3GB windows". This trick does not depend on the amount of memory installed on your system! You can use it even if you have only 1GB or 2GB of RAM, although you hard drive will be used for swapping then. +* On 32bit Linux systems: sorry, we cannot do anything. Use a 64bit system or reduce the amount of data. + +If you already have the 64bit version, you probably encountered a bug in our software. Please contact the mailing list (see OpenMS.de). + +How to disable the OpenMS update check. +###################################### + +Starting with OpenMS 2.1 all TOPP tools will check for updated versions of the tools online and will print an information message if a newer version is available. This version check occurs only once per day and tool. Information on which tools are executed will be collected anonymously to identify which tools are no longer used and to optimally distribute development resources. If the feature causes problems or concerns, it can be disabled at build or runtime: + +* Build time: disabling it in the build script (switch ENABLE_UPDATE_CHECK to "OFF" ) +* Runtime: setting the environment variable (OPENMS_DISABLE_UPDATE_CHECK to "ON") + +How can I change the temporary directory that OpenMS uses? +########################################################## + +By default OpenMS will use the system wide temporary directory (defined either by TMPDIR, TEMP or TMP environmental variable). You can override this by setting the parameter "temp_dir" in the OpenMS.ini or setting the environmental variable OPENMS_TMPDIR. + +Calling msConvert (of ProteoWizard) results in small mzML files with no peak data. + + +The Thermo interface expects an English locale setting. Otherwise it will silently forget to return peak data. Set your locale to English and it should work. + +Some TOPP tools always crashes when executed. Other TOPP tools work properly. +############################################################################# + +If a error message similar to + +.. code:: console + OpenMS::File::find(...) of File.cpp error message: the file 'CHEMISTRY/unimod.xml' could not be found + +is shown, you have probably moved your OpenMS installation manually?! Then the TOPP tools cannot find some required data files anymore, e.g. XML schema files or chemical isotope data. + +Either of the following actions should fix your problem: + +* Set the environment variable OPENMS_DATA_PATH to your /share/OpenMS/ folder. +* [developers only] Use the cmake option -D CMAKE_INSTALL_PREFIX=... to set the installation directory. Run 'make OpenMS TOPP UTILS' again. +* [developers only] Execute cmake in the new location and run 'make OpenMS TOPP UTILS' again. + +A TOPP tool crashes when loading a certain input file. Other files work properly. +################################################################################# +If an XML input file is used, please check if the file is valid. + +For most XML data formats, this can be done using the FileInfo tool: + +.. code:: console + FileInfo -v -in + +You can also check for corrupt data in peak files + +.. code:: console + FileInfo -c -in From 2c6ca45657c9febc36dc98b4730a0238fcea575f Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 13:32:23 +0930 Subject: [PATCH 25/77] changed contents title in topp-faq.rst --- OpenMS-Wiki/topp-faq.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenMS-Wiki/topp-faq.rst b/OpenMS-Wiki/topp-faq.rst index e39f5e2d..4e56b02a 100644 --- a/OpenMS-Wiki/topp-faq.rst +++ b/OpenMS-Wiki/topp-faq.rst @@ -2,7 +2,7 @@ TOPP Frequently Asked Questions ========================== -.. contents:: Contents +.. contents:: Some of our most frequently asked questions regarding TOPP are: I'm getting the error message "Unexpected internal error (unable to allocate enough memory (size = 0 bytes)". ############################################################################################################ From c3120d20bf45d0238db7cad8f4d95954ade7868c Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 15:13:02 +0930 Subject: [PATCH 26/77] inline cpp class in topp-faq.rst --- OpenMS-Wiki/topp-faq.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenMS-Wiki/topp-faq.rst b/OpenMS-Wiki/topp-faq.rst index 4e56b02a..c877203f 100644 --- a/OpenMS-Wiki/topp-faq.rst +++ b/OpenMS-Wiki/topp-faq.rst @@ -55,7 +55,7 @@ A TOPP tool crashes when loading a certain input file. Other files work properly ################################################################################# If an XML input file is used, please check if the file is valid. -For most XML data formats, this can be done using the FileInfo tool: +For most XML data formats, this can be done using the .. cpp:class:: FileInfo tool: .. code:: console FileInfo -v -in From 1cc94774230ec8754a38bb4d0d41aad07a75439d Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 15:21:42 +0930 Subject: [PATCH 27/77] FileInfo is not a cpp class its a tool --- OpenMS-Wiki/topp-faq.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenMS-Wiki/topp-faq.rst b/OpenMS-Wiki/topp-faq.rst index c877203f..4e56b02a 100644 --- a/OpenMS-Wiki/topp-faq.rst +++ b/OpenMS-Wiki/topp-faq.rst @@ -55,7 +55,7 @@ A TOPP tool crashes when loading a certain input file. Other files work properly ################################################################################# If an XML input file is used, please check if the file is valid. -For most XML data formats, this can be done using the .. cpp:class:: FileInfo tool: +For most XML data formats, this can be done using the FileInfo tool: .. code:: console FileInfo -v -in From 02978c96b3a1946e995338adcde6fccef8d5698e Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 15:24:58 +0930 Subject: [PATCH 28/77] adding console code --- OpenMS-Wiki/topp-faq.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenMS-Wiki/topp-faq.rst b/OpenMS-Wiki/topp-faq.rst index 4e56b02a..7ba4e420 100644 --- a/OpenMS-Wiki/topp-faq.rst +++ b/OpenMS-Wiki/topp-faq.rst @@ -60,7 +60,7 @@ For most XML data formats, this can be done using the FileInfo tool: .. code:: console FileInfo -v -in -You can also check for corrupt data in peak files +You can also check for corrupt data in peak files: .. code:: console FileInfo -c -in From 2178ad5eedda8918d600811dd30385a2b7beaa25 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 15:26:07 +0930 Subject: [PATCH 29/77] adding console code --- OpenMS-Wiki/topp-faq.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenMS-Wiki/topp-faq.rst b/OpenMS-Wiki/topp-faq.rst index 7ba4e420..72bbfaa5 100644 --- a/OpenMS-Wiki/topp-faq.rst +++ b/OpenMS-Wiki/topp-faq.rst @@ -58,9 +58,9 @@ If an XML input file is used, please check if the file is valid. For most XML data formats, this can be done using the FileInfo tool: .. code:: console - FileInfo -v -in + FileInfo -v -in You can also check for corrupt data in peak files: .. code:: console - FileInfo -c -in + FileInfo -c -in From c4dd64b513d61d652ff99e93267541a5f0dc61b8 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 15:27:11 +0930 Subject: [PATCH 30/77] adding console code --- OpenMS-Wiki/topp-faq.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OpenMS-Wiki/topp-faq.rst b/OpenMS-Wiki/topp-faq.rst index 72bbfaa5..e87512c8 100644 --- a/OpenMS-Wiki/topp-faq.rst +++ b/OpenMS-Wiki/topp-faq.rst @@ -41,6 +41,7 @@ Some TOPP tools always crashes when executed. Other TOPP tools work properly. If a error message similar to .. code:: console + OpenMS::File::find(...) of File.cpp error message: the file 'CHEMISTRY/unimod.xml' could not be found is shown, you have probably moved your OpenMS installation manually?! Then the TOPP tools cannot find some required data files anymore, e.g. XML schema files or chemical isotope data. @@ -58,9 +59,11 @@ If an XML input file is used, please check if the file is valid. For most XML data formats, this can be done using the FileInfo tool: .. code:: console + FileInfo -v -in You can also check for corrupt data in peak files: .. code:: console + FileInfo -c -in From 504d9c90f0f23ab6efb054d1f2727148b50a1c2e Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 16:13:27 +0930 Subject: [PATCH 31/77] add monospace text to topp-faq.rst --- OpenMS-Wiki/topp-faq.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenMS-Wiki/topp-faq.rst b/OpenMS-Wiki/topp-faq.rst index e87512c8..e319ff75 100644 --- a/OpenMS-Wiki/topp-faq.rst +++ b/OpenMS-Wiki/topp-faq.rst @@ -49,7 +49,7 @@ is shown, you have probably moved your OpenMS installation manually?! Then the T Either of the following actions should fix your problem: * Set the environment variable OPENMS_DATA_PATH to your /share/OpenMS/ folder. -* [developers only] Use the cmake option -D CMAKE_INSTALL_PREFIX=... to set the installation directory. Run 'make OpenMS TOPP UTILS' again. +* [developers only] Use the cmake option ``-D CMAKE_INSTALL_PREFIX=...`` to set the installation directory. Run 'make OpenMS TOPP UTILS' again. * [developers only] Execute cmake in the new location and run 'make OpenMS TOPP UTILS' again. A TOPP tool crashes when loading a certain input file. Other files work properly. From 239dc5b368d9a4f44532a2783b794566def026ae Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 17:09:55 +0930 Subject: [PATCH 32/77] fixed code blocks --- OpenMS-Wiki/known-issues.rst | 10 +++------- OpenMS-Wiki/topp-faq.rst | 14 ++++---------- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/OpenMS-Wiki/known-issues.rst b/OpenMS-Wiki/known-issues.rst index 40fad087..6cbe24b4 100644 --- a/OpenMS-Wiki/known-issues.rst +++ b/OpenMS-Wiki/known-issues.rst @@ -40,10 +40,8 @@ Known issues on Windows Your error message might look like this: - .. code:: console - - c:\dev\contrib_build\src\bzip2-1.0.5\bzlib.h(79) : fatal error C1083: - Cannot open include file: 'windows.h': No such file or directory + `c:\dev\contrib_build\src\bzip2-1.0.5\bzlib.h(79) : fatal error C1083: + Cannot open include file: 'windows.h': No such file or directory` This can happen if you are using the VS Express Edition or VS2008 on Win7 (other cases might be possible as well). The reason is that your INCLUDE environment path does not contain the system header windows.h, which is required by the contrib and OpenMS. @@ -56,9 +54,7 @@ Known issues on Linux Your error message might look like: - .. code:: console - - gzip: stdin: invalid compressed data--crc error + `gzip: stdin: invalid compressed data--crc error` This happens with a buggy version of gzip in Ubuntu 10.04. diff --git a/OpenMS-Wiki/topp-faq.rst b/OpenMS-Wiki/topp-faq.rst index e319ff75..c38a9b07 100644 --- a/OpenMS-Wiki/topp-faq.rst +++ b/OpenMS-Wiki/topp-faq.rst @@ -40,16 +40,14 @@ Some TOPP tools always crashes when executed. Other TOPP tools work properly. If a error message similar to -.. code:: console - - OpenMS::File::find(...) of File.cpp error message: the file 'CHEMISTRY/unimod.xml' could not be found +`OpenMS::File::find(...) of File.cpp error message: the file 'CHEMISTRY/unimod.xml' could not be found` is shown, you have probably moved your OpenMS installation manually?! Then the TOPP tools cannot find some required data files anymore, e.g. XML schema files or chemical isotope data. Either of the following actions should fix your problem: * Set the environment variable OPENMS_DATA_PATH to your /share/OpenMS/ folder. -* [developers only] Use the cmake option ``-D CMAKE_INSTALL_PREFIX=...`` to set the installation directory. Run 'make OpenMS TOPP UTILS' again. +* [developers only] Use the cmake option `-D CMAKE_INSTALL_PREFIX=...` to set the installation directory. Run 'make OpenMS TOPP UTILS' again. * [developers only] Execute cmake in the new location and run 'make OpenMS TOPP UTILS' again. A TOPP tool crashes when loading a certain input file. Other files work properly. @@ -58,12 +56,8 @@ If an XML input file is used, please check if the file is valid. For most XML data formats, this can be done using the FileInfo tool: -.. code:: console - - FileInfo -v -in +`FileInfo -v -in ` You can also check for corrupt data in peak files: -.. code:: console - - FileInfo -c -in +`FileInfo -c -in ` From f5385b4f9e03e646d66150e8bd18715a3dfca81e Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 18:22:52 +0930 Subject: [PATCH 33/77] created about contact for-developers for-users reporting-bugs-issues rst files --- OpenMS-Wiki/about.rst | 114 +------------------------- OpenMS-Wiki/contact.rst | 7 ++ OpenMS-Wiki/docutils.conf | 2 - OpenMS-Wiki/for-developers.rst | 73 +++++++++++++++++ OpenMS-Wiki/for-users.rst | 11 +++ OpenMS-Wiki/known-issues.rst | 61 -------------- OpenMS-Wiki/reporting-bugs-issues.rst | 16 ++++ OpenMS-Wiki/topp-faq.rst | 63 -------------- 8 files changed, 108 insertions(+), 239 deletions(-) create mode 100644 OpenMS-Wiki/contact.rst delete mode 100644 OpenMS-Wiki/docutils.conf create mode 100644 OpenMS-Wiki/for-developers.rst create mode 100644 OpenMS-Wiki/for-users.rst delete mode 100644 OpenMS-Wiki/known-issues.rst create mode 100644 OpenMS-Wiki/reporting-bugs-issues.rst delete mode 100644 OpenMS-Wiki/topp-faq.rst diff --git a/OpenMS-Wiki/about.rst b/OpenMS-Wiki/about.rst index be76ff11..a0a9c577 100644 --- a/OpenMS-Wiki/about.rst +++ b/OpenMS-Wiki/about.rst @@ -1,12 +1,6 @@ ===== -Home -===== - - -.. contents:: Contents - About -########## +===== OpenMS is an open-source C++ library for mass spectrometry (MS) data management and analysis. It offers an infrastructure for the rapid development of mass spectrometry-related software. OpenMS is free software available under the three-clause BSD license. It runs under Windows, Mac OS X and Linux. OpenMS comes with a vast variety of pre-built and ready-to-use tools for proteomics and metabolomics data analysis (TOPP tools) and powerful 2D and 3D visualization (TOPPView). It supports analyses for various quantification protocols, including label-free shotgun, SILAC, iTRAQ, SRM, SWATH, .... It also provides built-in algorithms for peptide/protein identification, both de-novo and via database searching, as well as adapters to state-of-the art tools like X! Tandem, Mascot, OMSSA and others. @@ -16,109 +10,3 @@ With PyOpenMS, OpenMS offers Python bindings to a large part of the API to enabl OpenMS supports the Proteomics Standard Initiative (PSI) file formats for MS data. The main contributors of OpenMS are currently Eberhard-Karls Universität in Tübingen, Freie Universität Berlin and ETH Zurich. - -For Users -######### - -Getting Started with OpenMS -*************************** -The current stable version of OpenMS can be downloaded from the `OpenMS download site `_ or can be obtained via the `OpenMS docker containers `_. - -As a general primer to OpenMS, we also recommend to read `Röst et al, OpenMS: a flexible open-source software platform for mass spectrometry data analysis. Nat Methods. 2016 `_ as well as the `Getting Started `_ page on openms.de. - -Novice users should start by reading the OpenMS documentation (especially for TOPP) available from the `OpenMS documentation site `_ or in the folder doc/index.html of stable releases. Some example workflows with optimised parameter settings can be downloaded from the `repository `_. To understand which tools are available, please read the `TOPP Tool documentation page `_ as well as the `UTILS Tool documentation page `_. - -Getting in Contact -****************** -For general usage problems, bug reports and questions, please contact us directly on `Gitter `_ for real-time interaction with the developers or write to the mailing list `open-ms-general `_. - -If you only want to be informed of new versions of OpenMS, please subscribe to the mailing list `open-ms-announcements `_. - -Reporting Bugs/Issues -********************* -A list of known issues in the current OpenMS release can be found here. Please check if your OpenMS version matches the current version and if the bug has already been reported. - -In order to report a new bug, please use either our `GitHub issues system `_ or contact us through the general OpenMS mailing list. - -Please include the following information into your bug report: -* the command line (i.e. call) including the TOPP tool and the arguments you used, or the steps you followed in a GUI tool (e.g. TOPPView) - e.g. "FeatureFinderCentroided -in myfile.mzML -out myfile.featureXML" -* the output of OpenMS/TOPP (or a screenshot in case of a GUI problem) -* operating system (e.g. "Windows XP 32bit", "Win 7 64bit", "Fedora 8 32bit", "MacOS 10.6 64bit") -* OpenMS version (e.g. "OpenMS 1.11.1", "Revision 63082 from the SVN repository") -* OpenMS architecture ("32 bit" or "64 bit") - -Please provide files that we need to reproduce the bug (e.g. TOPP INI files, data files - usually mzML) via a download link, via the mailing list or by directly contacting one of the developers. - -For Developers -############## - -Developing with OpenMS -********************** -If you would like to contribute to OpenMS, this is how to best get started: - -- Familiarize yourself with our `online documentation `_. - -- Learn how to `build OpenMS `_. - -- Start reading the `OpenMS tutorial for developers `_. - -- Any questions can be directed at the mailing list. - -OpenMS tutorial for developers -****************************** -Please read the `OpenMS tutorial for developers `_) -which contains general information about the structure of OpenMS, the concepts -behind it and example code. - -Technical Documentation -*********************** -See the documentation for the nightly snapshot of `develop `_ (`doxygen log `_). - -See the documentation for the latest `release `_ (`doxygen log `_). - - -Development model -***************** -OpenMS follows the Gitflow development workflow which is excellently described `here `_. Additionally we encourage every developer (even if he is eligible to push directly to OpenMS) to create his own fork (e.g. @username). The GitHub people provide superb documentation on `forking `_ and how to keep your fork `up-to-date `_. With your own fork you can follow the Gitflow development model directly, but instead of merging into "develop" in your own fork you can open a `pull request `_. Before opening the pull request, please check the `checklist `_ - -Some more details and tips are collected `here `_. - -Coding Conventions -****************** -See the manual for proper coding style: `Coding conventions `_ -also see: `C++ Guide `_. - -See the `manual `_ for creating a new build unit (to be completed). - -We automatically test for common coding convention violations using a modified version of cpplint. -Style testing can be enabled using CMake options. We also provide a configuration file for Uncrustify for automated style corrections (see "tools/uncrustify.cfg"). - -Commit Messages -*************** -In order to ease the creation of a CHANGELOG we use a defined format for our commit messages. - -See the manual for proper commit messages: `How to write commit messages `_. - - -Automated Unit Tests -******************** -We perform nightly test runs on different platforms. Even if everything compiled well on your machine and all tests passed, please check if you broke another platform on the next day. - -Nightly tests: `CDASH `_ - -Further developer resources -*************************** - -Guidelines for addition of new dependency libraries -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -See `here `_. - -Experimental Installers -^^^^^^^^^^^^^^^^^^^^^^^ -We automatically build installers for different platforms. These usually contain unstable or partially untested code - so use them at your own risk. - -The nightly (unstable) installers are available `here `_. - -Developer FAQ (formerly Internal FAQ) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The `FAQ `_ for developers is currently expanded and might contain answers to your questions. diff --git a/OpenMS-Wiki/contact.rst b/OpenMS-Wiki/contact.rst new file mode 100644 index 00000000..89c37a9b --- /dev/null +++ b/OpenMS-Wiki/contact.rst @@ -0,0 +1,7 @@ +================== +Getting in Contact +================== + +For general usage problems, bug reports and questions, please contact us directly on `Gitter `_ for real-time interaction with the developers or write to the mailing list `open-ms-general `_. + +If you only want to be informed of new versions of OpenMS, please subscribe to the mailing list `open-ms-announcements `_. diff --git a/OpenMS-Wiki/docutils.conf b/OpenMS-Wiki/docutils.conf deleted file mode 100644 index 1bf4d832..00000000 --- a/OpenMS-Wiki/docutils.conf +++ /dev/null @@ -1,2 +0,0 @@ -[restructuredtext parser] -syntax_highlight = short diff --git a/OpenMS-Wiki/for-developers.rst b/OpenMS-Wiki/for-developers.rst new file mode 100644 index 00000000..028ebdbf --- /dev/null +++ b/OpenMS-Wiki/for-developers.rst @@ -0,0 +1,73 @@ +============== +For Developers +============== + +Developing with OpenMS +********************** +If you would like to contribute to OpenMS, this is how to best get started: + +- Familiarize yourself with our `online documentation `_. + +- Learn how to `build OpenMS `_. + +- Start reading the `OpenMS tutorial for developers `_. + +- Any questions can be directed at the mailing list. + +OpenMS tutorial for developers +****************************** +Please read the `OpenMS tutorial for developers `_) +which contains general information about the structure of OpenMS, the concepts +behind it and example code. + +Technical Documentation +*********************** +See the documentation for the nightly snapshot of `develop `_ (`doxygen log `_). + +See the documentation for the latest `release `_ (`doxygen log `_). + +Development model +***************** +OpenMS follows the Gitflow development workflow which is excellently described `here `_. Additionally we encourage every developer (even if he is eligible to push directly to OpenMS) to create his own fork (e.g. @username). The GitHub people provide superb documentation on `forking `_ and how to keep your fork `up-to-date `_. With your own fork you can follow the Gitflow development model directly, but instead of merging into "develop" in your own fork you can open a `pull request `_. Before opening the pull request, please check the `checklist `_ + +Some more details and tips are collected `here `_. + +Coding Conventions +****************** +See the manual for proper coding style: `Coding conventions `_ +also see: `C++ Guide `_. + +See the `manual `_ for creating a new build unit (to be completed). + +We automatically test for common coding convention violations using a modified version of cpplint. +Style testing can be enabled using CMake options. We also provide a configuration file for Uncrustify for automated style corrections (see "tools/uncrustify.cfg"). + +Commit Messages +*************** +In order to ease the creation of a CHANGELOG we use a defined format for our commit messages. + +See the manual for proper commit messages: `How to write commit messages `_. + +Automated Unit Tests +******************** +We perform nightly test runs on different platforms. Even if everything compiled well on your machine and all tests passed, please check if you broke another platform on the next day. + +Nightly tests: `CDASH `_ + +Further developer resources +*************************** + +Guidelines for addition of new dependency libraries +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +See `here `_. + +Experimental Installers +^^^^^^^^^^^^^^^^^^^^^^^ +We automatically build installers for different platforms. These usually contain unstable or partially untested code - so use them at your own risk. + +The nightly (unstable) installers are available `here `_. + +Developer FAQ (formerly Internal FAQ) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The `FAQ `_ for developers is currently expanded and might contain answers to your questions. +`FAQ ` diff --git a/OpenMS-Wiki/for-users.rst b/OpenMS-Wiki/for-users.rst new file mode 100644 index 00000000..363e34db --- /dev/null +++ b/OpenMS-Wiki/for-users.rst @@ -0,0 +1,11 @@ +========= +For Users +========= + +Getting Started with OpenMS +*************************** +The current stable version of OpenMS can be downloaded from the `OpenMS download site `_ or can be obtained via the `OpenMS docker containers `_. + +As a general primer to OpenMS, we also recommend to read `Röst et al, OpenMS: a flexible open-source software platform for mass spectrometry data analysis. Nat Methods. 2016 `_ as well as the `Getting Started `_ page on openms.de. + +Novice users should start by reading the OpenMS documentation (especially for TOPP) available from the `OpenMS documentation site `_ or in the folder doc/index.html of stable releases. Some example workflows with optimised parameter settings can be downloaded from the `repository `_. To understand which tools are available, please read the `TOPP Tool documentation page `_ as well as the `UTILS Tool documentation page `_. diff --git a/OpenMS-Wiki/known-issues.rst b/OpenMS-Wiki/known-issues.rst deleted file mode 100644 index 6cbe24b4..00000000 --- a/OpenMS-Wiki/known-issues.rst +++ /dev/null @@ -1,61 +0,0 @@ -============ -Known Issues -============ - -Have a look at the Internal FAQ, if you cannot find your answer here. Write to the OpenMS mailing list, if the problem persists. - -.. contents:: Contents - -Known issues on Windows -####################### -* **Starting a (GUI) TOPP executable (like TOPPView or FeatureFinderCentroided) gives "The application was unable to start correctly (0xc0000005). Click OK to close the application"** - - When you run the tool in Debug mode and look where it crashes, you might actually find it to be a very weird place - e.g. when creating a perfectly legal String from a QString: - - .. code:: c++ - - QFileInfo fi(file.toQString()); - - return fi.path(); - - The reason this happens is usually: you've mixed DLL's from multiple runtimes (e.g. compiled with VS10 and VS9). This can easily happen, if you use your Qt (build with VS9) to link against your OpenMS (build with VS10). The loader will load VS9 and VS10 runtimes and will NOT tell you that they conflict. Instead, very weird things are going to happen. You can identify if you are affected by looking at the DLL's that are loaded via daisy-chaining - see either DependencyWalker's output or the 'output' window in VS when running the app from inside VS. It might read: - - .. code:: console - - 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcp90d.dll', Symbols loaded. - 'MSSimulator.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_4ec74c6b3093419c\msvcr90d.dll', Symbols loaded. - 'MSSimulator.exe': Loaded 'C:\dev\qt-everywhere-opensource-src-4.7.1\bin\QtSqld4.dll', Symbols loaded. - - As this was a VS10 build, the vc90 DLL's have no place here, but got loaded from the Qt4 DLL's. - - **Solution**: recompile Qt (in this case) using VS10 and link against the new Qt. - -* **Starting a (GUI) TOPP executable (like TOPPView or FeatureFinderCentroided) gives "Entry point not found"** - - This usually happens when your PATH contains multiple versions of DLL's on which TOPP/OpenMS depends. Candidates are all QT (QtGui4.dll, QtCore4.dll, ...) or Xerces-C (xerces-c_3_0) libraries. Usually other external programs (Miktex, Mendeley etc) put their own binary directory (which contains these incompatible DLL's) before the contrib directory in your PATH%. - - **Solution**: put the contrib directory at the very beginning of your PATH%. The other tools should be unaffected as DLL's are first searched in the path of the executable (where their DLL's should be as well). We do that for OpenMS as well, but only in the binary installer packages, not for the developer version. - -* **Compiling the contrib or OpenMS, the windows.h header file seems to be missing!** - - Your error message might look like this: - - `c:\dev\contrib_build\src\bzip2-1.0.5\bzlib.h(79) : fatal error C1083: - Cannot open include file: 'windows.h': No such file or directory` - - This can happen if you are using the VS Express Edition or VS2008 on Win7 (other cases might be possible as well). The reason is that your INCLUDE environment path does not contain the system header windows.h, which is required by the contrib and OpenMS. - - **Solution**: You need to download the Microsoft SDK for Windows 7 (or whatever your OS is). Make sure to select "Header Files" Section during install and make sure that the SDK's include path is in your INCLUDE environment. - -Known issues on Linux -####################### - -* **Contrib fails to compile on Ubuntu 10.04** - - Your error message might look like: - - `gzip: stdin: invalid compressed data--crc error` - - This happens with a buggy version of gzip in Ubuntu 10.04. - - **Solution**: To solve this issue update gzip using lucid-proposed (see https://wiki.ubuntu.com/Testing/EnableProposed). diff --git a/OpenMS-Wiki/reporting-bugs-issues.rst b/OpenMS-Wiki/reporting-bugs-issues.rst new file mode 100644 index 00000000..c8fe197c --- /dev/null +++ b/OpenMS-Wiki/reporting-bugs-issues.rst @@ -0,0 +1,16 @@ +===================== +Reporting Bugs/Issues +===================== + +A list of known issues in the current OpenMS release can be found here. Please check if your OpenMS version matches the current version and if the bug has already been reported. + +In order to report a new bug, please use either our `GitHub issues system `_ or contact us through the general OpenMS mailing list. + +Please include the following information into your bug report: +* the command line (i.e. call) including the TOPP tool and the arguments you used, or the steps you followed in a GUI tool (e.g. TOPPView) - e.g. "FeatureFinderCentroided -in myfile.mzML -out myfile.featureXML" +* the output of OpenMS/TOPP (or a screenshot in case of a GUI problem) +* operating system (e.g. "Windows XP 32bit", "Win 7 64bit", "Fedora 8 32bit", "MacOS 10.6 64bit") +* OpenMS version (e.g. "OpenMS 1.11.1", "Revision 63082 from the SVN repository") +* OpenMS architecture ("32 bit" or "64 bit") + +Please provide files that we need to reproduce the bug (e.g. TOPP INI files, data files - usually mzML) via a download link, via the mailing list or by directly contacting one of the developers. diff --git a/OpenMS-Wiki/topp-faq.rst b/OpenMS-Wiki/topp-faq.rst deleted file mode 100644 index c38a9b07..00000000 --- a/OpenMS-Wiki/topp-faq.rst +++ /dev/null @@ -1,63 +0,0 @@ -========================== -TOPP Frequently Asked Questions -========================== - -.. contents:: Some of our most frequently asked questions regarding TOPP are: - -I'm getting the error message "Unexpected internal error (unable to allocate enough memory (size = 0 bytes)". -############################################################################################################ - -Call "OpenMSInfo" and look at "OS Information". - -If you are using the 32bit version of OpenMS, the data you are processing is probably too big (e.g. using RAW data files bigger than 1.5 GB as input, or many featureXML files etc). You can now either: - -* Switch to the 64bit Version of OpenMS. Be aware though that your Operating System also needs to have 64bit. Furthermore your PC should have sufficient RAM, to hold the data. Otherwise your hard drive will be used extensively for swapping and processing will take longer. -* On 32bit Windows systems you can try the increase the allowed amount of memory from 2GB to 3GB by using the "/3GB" boot switch (boot.ini). This might already do the trick. However, if your data again gets bigger, this solution will only help temporarily. Google "3GB windows". This trick does not depend on the amount of memory installed on your system! You can use it even if you have only 1GB or 2GB of RAM, although you hard drive will be used for swapping then. -* On 32bit Linux systems: sorry, we cannot do anything. Use a 64bit system or reduce the amount of data. - -If you already have the 64bit version, you probably encountered a bug in our software. Please contact the mailing list (see OpenMS.de). - -How to disable the OpenMS update check. -###################################### - -Starting with OpenMS 2.1 all TOPP tools will check for updated versions of the tools online and will print an information message if a newer version is available. This version check occurs only once per day and tool. Information on which tools are executed will be collected anonymously to identify which tools are no longer used and to optimally distribute development resources. If the feature causes problems or concerns, it can be disabled at build or runtime: - -* Build time: disabling it in the build script (switch ENABLE_UPDATE_CHECK to "OFF" ) -* Runtime: setting the environment variable (OPENMS_DISABLE_UPDATE_CHECK to "ON") - -How can I change the temporary directory that OpenMS uses? -########################################################## - -By default OpenMS will use the system wide temporary directory (defined either by TMPDIR, TEMP or TMP environmental variable). You can override this by setting the parameter "temp_dir" in the OpenMS.ini or setting the environmental variable OPENMS_TMPDIR. - -Calling msConvert (of ProteoWizard) results in small mzML files with no peak data. - - -The Thermo interface expects an English locale setting. Otherwise it will silently forget to return peak data. Set your locale to English and it should work. - -Some TOPP tools always crashes when executed. Other TOPP tools work properly. -############################################################################# - -If a error message similar to - -`OpenMS::File::find(...) of File.cpp error message: the file 'CHEMISTRY/unimod.xml' could not be found` - -is shown, you have probably moved your OpenMS installation manually?! Then the TOPP tools cannot find some required data files anymore, e.g. XML schema files or chemical isotope data. - -Either of the following actions should fix your problem: - -* Set the environment variable OPENMS_DATA_PATH to your /share/OpenMS/ folder. -* [developers only] Use the cmake option `-D CMAKE_INSTALL_PREFIX=...` to set the installation directory. Run 'make OpenMS TOPP UTILS' again. -* [developers only] Execute cmake in the new location and run 'make OpenMS TOPP UTILS' again. - -A TOPP tool crashes when loading a certain input file. Other files work properly. -################################################################################# -If an XML input file is used, please check if the file is valid. - -For most XML data formats, this can be done using the FileInfo tool: - -`FileInfo -v -in ` - -You can also check for corrupt data in peak files: - -`FileInfo -c -in ` From 14af2e3a1011ba05094e19976081fff33eb7477a Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sun, 15 May 2022 19:26:06 +0930 Subject: [PATCH 34/77] created developer-faq.rst --- OpenMS-Wiki/developer-faq.rst | 79 +++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 OpenMS-Wiki/developer-faq.rst diff --git a/OpenMS-Wiki/developer-faq.rst b/OpenMS-Wiki/developer-faq.rst new file mode 100644 index 00000000..cbf9b79a --- /dev/null +++ b/OpenMS-Wiki/developer-faq.rst @@ -0,0 +1,79 @@ +============= +Developer FAQ +============= + +This FAQ (formerly called Internal FAQ) is intended for developers. Note that some actions require special permissions like e.g. updating the website. + +..content:: What's on this page + +Troubleshooting +*************** + +OpenMS complains about boost not being found but I'm sure its there! +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +CMake got confused. Set up a new build directory and try again. If you build in-source (not recommended), deleting the CMakeCache.txt and cmake directory might help. + +General information +******************* + +I am new to OpenMS. What should I do first? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* Check out the developement version of OpenMS (see website). +* Try and build OpenMS according to the installation instructions. +* Read the OpenMS Coding Convention. +* Read the OpenMS Tutorial. +* Create a GitHub account +* Register to the open-ms-general and open-ms-developers mailing list. (You can see the developers list only if you are logged in to Sourceforge and if you are a OpenMS developer). + +What is the difference between an OpenMS tool and util? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A tool starts its lifecycle in UTILS and may exist without beeing thoroughly tested. Tools may be promoted from UTILS to TOOLS if they are stable enough, are fully tested, fully documented and a test workflow exists. + +I have written a class for OpenMS I want to contribute. What should I do? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Basically, you must conform to the OpenMS Coding conventions : + +Coding style (brackets, variable names, etc.) must conform to the conventions. + +* The class and all the members must be documented thoroughly. +* You can check your code with the tool `tools/checker.php`. Call `php tools/checker.php` for detailed instructions. + +Please open a pull request and follow the `checklist `_ + +How do I update the `openms.de `_? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Login to the wordpress admin area at www.openms.de/wp-admin with your username and password assigned by the current Homepage maintainers. + +Can I use QT designer to create GUI widgets? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Yes! If you want to create a class called `Widget: Create .ui-File` with `QT designer` and store it as `Widget.ui.`, add the class to `sources.cmake`. +From the .ui-File the file `include/OpenMS/VISUAL/UIC/ClassTemplate.h` is generated by the build system. +DO NOT CHECK-IN THIS FILE, AS IT IS GENERATED AUTOMATICALLY, WHEN NEEDED!!! +Derive the class `Widget` from `WidgetTemplate`. You need to check in the `Widget.h` and `Widget.cpp` files. + +Can the START_SECTION-macro not handle template methods that have two or more arguments? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Put round brackets around the method declaration. Then it should work. + +Where can I find the binary installers created? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/. +Please verify the creation date of the individual installers, as there may have been an error while creating the installer. + +Build system +************ + +What is cmake? +^^^^^^^^^^^^^^ + +CMake builds BuildSystems for different platforms, e.g. VisualStudio Solutions on Windows, Makefiles on Linux etc. +This allows us to define in one central location (namely CMakeLists.txt) how OpenMS is build and have the platform specific stuff handled by CMake. +See http://www.cmake.org for more information. From 8695bfb3805bcda424b4e885dea7d17e94cfe726 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Mon, 16 May 2022 16:31:57 +0930 Subject: [PATCH 35/77] developer-faq changes --- OpenMS-Wiki/developer-faq.rst | 92 +++++++++++++++++++++++++++++++++-- 1 file changed, 88 insertions(+), 4 deletions(-) diff --git a/OpenMS-Wiki/developer-faq.rst b/OpenMS-Wiki/developer-faq.rst index cbf9b79a..f2f8e5a2 100644 --- a/OpenMS-Wiki/developer-faq.rst +++ b/OpenMS-Wiki/developer-faq.rst @@ -4,7 +4,7 @@ Developer FAQ This FAQ (formerly called Internal FAQ) is intended for developers. Note that some actions require special permissions like e.g. updating the website. -..content:: What's on this page +.. content:: What's on this page Troubleshooting *************** @@ -30,7 +30,7 @@ I am new to OpenMS. What should I do first? What is the difference between an OpenMS tool and util? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -A tool starts its lifecycle in UTILS and may exist without beeing thoroughly tested. Tools may be promoted from UTILS to TOOLS if they are stable enough, are fully tested, fully documented and a test workflow exists. +A tool starts its lifecycle in UTILS and may exist without being thoroughly tested. Tools may be promoted from UTILS to TOOLS if they are stable enough, are fully tested, fully documented and a test workflow exists. I have written a class for OpenMS I want to contribute. What should I do? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -42,7 +42,7 @@ Coding style (brackets, variable names, etc.) must conform to the conventions. * The class and all the members must be documented thoroughly. * You can check your code with the tool `tools/checker.php`. Call `php tools/checker.php` for detailed instructions. -Please open a pull request and follow the `checklist `_ +Please open a pull request and follow the `checklist `_. How do I update the `openms.de `_? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -75,5 +75,89 @@ What is cmake? ^^^^^^^^^^^^^^ CMake builds BuildSystems for different platforms, e.g. VisualStudio Solutions on Windows, Makefiles on Linux etc. -This allows us to define in one central location (namely CMakeLists.txt) how OpenMS is build and have the platform specific stuff handled by CMake. +This allows us to define in one central location (namely CMakeLists.txt) how OpenMS is build and have the platform specific stuff handled by CMake. See http://www.cmake.org for more information. + +How do I use cmake? +^^^^^^^^^^^^^^^^^^^ + +See Installation instructions for your platform. +In general, you call `CMake(.exe)`` with some parameters to create the native build-system. +Afterwards you can (but usually don't have to edit the current configuration using a GUI named `ccmake` (or `CMake-GUI` in Windows), which ships with CMake). +Note: whenever `ccmake` is mentioned in this document, substitute this by `CMake-GUI` if your OS is Windows. You can also edit the `CMakeCache.txt` file directly. + +How do I generate a build-system for Eclipse, KDevelop, CodeBlocks etc?! +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Type `cmake` into a console. This will list the available code generators available on your platform, which you can pass to `CMake` using the `-G` option. + +What are user definable cMake cache variables?! +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +They allow the user to pass options to `CMake` which will influence the build system. The most important option which should be given when calling `CMake.exe` is: + +`CMAKE_FIND_ROOT_PATH`, which is where `CMake` will search for additional libraries if they are not found in the default system paths. By default we add `OpenMS/contrib`. + +If your have installed all libraries on your system already there is no need to change `CMAKE_FIND_ROOT_PATH`. If you need the `contrib` folder, you will need to set this variable. +On Windows, you always need the `contrib` folder, as there are no system developer packages. To pass this variable to `CMake` use the `-D` switch e.g. `cmake -D CMAKE_FIND_ROOT_PATH:PATH="D:\\somepath\\contrib"`. +Everything else can be edited using `ccmake` afterwards. + +The following options are of interest: + +* `CMAKE_BUILD_TYPE` Define if you want to build Debug or Release version of OpenMS. Release is the default. + +* `CMAKE_FIND_ROOT_PATH` The path to the `contrib` libraries. Note that you can also provide more then one value here (e.g., `-D CMAKE_FIND_ROOT_PATH="/path/to/contrib;/usr/"` will search in your `contrib` path and in `/usr` for the required libraries) + +* `STL_DEBUG` Enables STL debug mode. + +* `DB_TEST` (deprecated) Enables database testing. + +* `QT_DB_PLUGIN` (deprecated) Defines the db plugin used by Qt. + +* `MT_CUDA_BUILD_TYPE` ... + +Their description will be displayed when you call ccmake. + +Can I use another solver than GLPK?! +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Yes, but by default the build system only links against GLPK (this is how OpenMS binary packages must be build!). +To use another solver try `cmake ... -D USE_COINOR=1 ....` and look at the documentation of the `LPWrapper` class. + +How do I switch to Debug/Release configuration?! +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For Makefile generators (typically on Linux) you can set the `CMAKE_BUILD_TYPE` variable to either Debug or Release by calling `ccmake`. +For Visual Studio, this is not necessary as all configurations are generated and you can choose the one you like within the IDE itself. +The 'Debug' configuration enabled debug information. The 'Release' configuration disables debug information and enables optimization. + +I changed the contrib path, but re-running CMake won't change the library paths? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Once a library is found and its location is stored in a cache variable, it will only be searched again if the corresponding entry in the cache file is set to false. +You can simply delete the `CMakeCache.txt`, but all other custom settings will be lost as well. + +What are the most useful (make) targets? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In Visual Studio you can see all targets on the left. For Makefiles type make help. However, this list is quite long. +The most useful targets will be shown to you by calling the targets target, i.e. make targets. + +CMake can't seem to find a Qt library (usually QtCore)! What now? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +`CMake` finds QT by looking for `qmake` in your PATH or for the Environment Variable `QTDIR`! Set these accordingly. +If the problem still persists: do you have a second installation of Qt (especially the MinGW version?)? This might lead `CMake` to the wrong path (it's searching for the `Qt*.lib` files). +You should only move/delete the offending Qt version if you know what you are doing! + A save workaround is to edit the `CMakeCache` file (e.g. via `ccmake`) and set all paths relating to QT (e.g. `QT_LIBRARY_DIR`) manually. + +(Windows) What version of Visual Studio should I use? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Use the latest if you can. Get the latest `CMake`, as its generator needs to support your VS. If your VS is too new and there is no `CMake` for that yet, you're gonna be faced with a lot of conversion issues. +This happens whenever the Build-System calls `CMake` (which can be quite often, e.g., after changes to `CMakeLists.txt`). + +How do I add a new class MyClass to the build system? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +# From b5341174628ebdb15199d105a12cf46760e7f351 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Mon, 16 May 2022 16:33:03 +0930 Subject: [PATCH 36/77] developer-faq changes --- OpenMS-Wiki/developer-faq.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenMS-Wiki/developer-faq.rst b/OpenMS-Wiki/developer-faq.rst index f2f8e5a2..b5bce10f 100644 --- a/OpenMS-Wiki/developer-faq.rst +++ b/OpenMS-Wiki/developer-faq.rst @@ -4,7 +4,7 @@ Developer FAQ This FAQ (formerly called Internal FAQ) is intended for developers. Note that some actions require special permissions like e.g. updating the website. -.. content:: What's on this page +.. contents:: What's on this page Troubleshooting *************** From f324f7d288dcf58a8ccc4657d11bca2913d206fa Mon Sep 17 00:00:00 2001 From: greengypsy Date: Mon, 16 May 2022 16:43:13 +0930 Subject: [PATCH 37/77] developer-faq changes --- OpenMS-Wiki/developer-faq.rst | 10 +++++++--- OpenMS-Wiki/for-developers.rst | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/OpenMS-Wiki/developer-faq.rst b/OpenMS-Wiki/developer-faq.rst index b5bce10f..12e6fcc2 100644 --- a/OpenMS-Wiki/developer-faq.rst +++ b/OpenMS-Wiki/developer-faq.rst @@ -44,7 +44,7 @@ Coding style (brackets, variable names, etc.) must conform to the conventions. Please open a pull request and follow the `checklist `_. -How do I update the `openms.de `_? +How do I update the `openms.de `_ website? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Login to the wordpress admin area at www.openms.de/wp-admin with your username and password assigned by the current Homepage maintainers. @@ -149,7 +149,7 @@ CMake can't seem to find a Qt library (usually QtCore)! What now? `CMake` finds QT by looking for `qmake` in your PATH or for the Environment Variable `QTDIR`! Set these accordingly. If the problem still persists: do you have a second installation of Qt (especially the MinGW version?)? This might lead `CMake` to the wrong path (it's searching for the `Qt*.lib` files). You should only move/delete the offending Qt version if you know what you are doing! - A save workaround is to edit the `CMakeCache` file (e.g. via `ccmake`) and set all paths relating to QT (e.g. `QT_LIBRARY_DIR`) manually. +A save workaround is to edit the `CMakeCache` file (e.g. via `ccmake`) and set all paths relating to QT (e.g. `QT_LIBRARY_DIR`) manually. (Windows) What version of Visual Studio should I use? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -160,4 +160,8 @@ This happens whenever the Build-System calls `CMake` (which can be quite often, How do I add a new class MyClass to the build system? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -# +# Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in src//include/OpenMS and the cpp file in src//source, e.g., src/openms/include/OpenMS/FORMAT/NewFileFormat.h and src/openms/source/FORMAT/NewFileFormat.cpp. +# Add both to the respective sources.cmake file in the same directory (e.g., src/openms/source/FORMAT/ and src/openms/include/OpenMS/FORMAT/). +# Add the corresponding class test to src/tests/class_tests// (e.g., src/tests/class_tests/openms/source/NewFileFormat_test.cpp). +# Add the test to the executables.cmake file in the test folder (e.g., src/tests/class_tests/openms/executables.cmake). +# Add them to git git add. diff --git a/OpenMS-Wiki/for-developers.rst b/OpenMS-Wiki/for-developers.rst index 028ebdbf..ce1a3d43 100644 --- a/OpenMS-Wiki/for-developers.rst +++ b/OpenMS-Wiki/for-developers.rst @@ -16,7 +16,7 @@ If you would like to contribute to OpenMS, this is how to best get started: OpenMS tutorial for developers ****************************** -Please read the `OpenMS tutorial for developers `_) +Please read the `OpenMS tutorial for developers `_ which contains general information about the structure of OpenMS, the concepts behind it and example code. From 86ce4d4b33712df3e091dd18dc7fffbd61a8a45a Mon Sep 17 00:00:00 2001 From: greengypsy Date: Mon, 16 May 2022 16:43:44 +0930 Subject: [PATCH 38/77] developer-faq changes --- OpenMS-Wiki/developer-faq.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/OpenMS-Wiki/developer-faq.rst b/OpenMS-Wiki/developer-faq.rst index 12e6fcc2..48cdec00 100644 --- a/OpenMS-Wiki/developer-faq.rst +++ b/OpenMS-Wiki/developer-faq.rst @@ -160,8 +160,8 @@ This happens whenever the Build-System calls `CMake` (which can be quite often, How do I add a new class MyClass to the build system? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -# Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in src//include/OpenMS and the cpp file in src//source, e.g., src/openms/include/OpenMS/FORMAT/NewFileFormat.h and src/openms/source/FORMAT/NewFileFormat.cpp. -# Add both to the respective sources.cmake file in the same directory (e.g., src/openms/source/FORMAT/ and src/openms/include/OpenMS/FORMAT/). -# Add the corresponding class test to src/tests/class_tests// (e.g., src/tests/class_tests/openms/source/NewFileFormat_test.cpp). -# Add the test to the executables.cmake file in the test folder (e.g., src/tests/class_tests/openms/executables.cmake). -# Add them to git git add. +#. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in src//include/OpenMS and the cpp file in src//source, e.g., src/openms/include/OpenMS/FORMAT/NewFileFormat.h and src/openms/source/FORMAT/NewFileFormat.cpp. +#. Add both to the respective sources.cmake file in the same directory (e.g., src/openms/source/FORMAT/ and src/openms/include/OpenMS/FORMAT/). +#. Add the corresponding class test to src/tests/class_tests// (e.g., src/tests/class_tests/openms/source/NewFileFormat_test.cpp). +#. Add the test to the executables.cmake file in the test folder (e.g., src/tests/class_tests/openms/executables.cmake). +#. Add them to git git add. From 42305e53c8bddd662b2fbc58c3e4409ccf1ffdfc Mon Sep 17 00:00:00 2001 From: greengypsy Date: Mon, 16 May 2022 16:48:24 +0930 Subject: [PATCH 39/77] testing --- OpenMS-Wiki/developer-faq.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenMS-Wiki/developer-faq.rst b/OpenMS-Wiki/developer-faq.rst index 48cdec00..c7401163 100644 --- a/OpenMS-Wiki/developer-faq.rst +++ b/OpenMS-Wiki/developer-faq.rst @@ -12,7 +12,7 @@ Troubleshooting OpenMS complains about boost not being found but I'm sure its there! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -CMake got confused. Set up a new build directory and try again. If you build in-source (not recommended), deleting the CMakeCache.txt and cmake directory might help. +``CMake`` got confused. Set up a new build directory and try again. If you build in-source (not recommended), deleting the CMakeCache.txt and cmake directory might help. General information ******************* @@ -160,8 +160,8 @@ This happens whenever the Build-System calls `CMake` (which can be quite often, How do I add a new class MyClass to the build system? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in src//include/OpenMS and the cpp file in src//source, e.g., src/openms/include/OpenMS/FORMAT/NewFileFormat.h and src/openms/source/FORMAT/NewFileFormat.cpp. +#. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in `src//include/OpenMS` and the cpp file in `src//source`, e.g., src/openms/include/OpenMS/FORMAT/NewFileFormat.h and src/openms/source/FORMAT/NewFileFormat.cpp. #. Add both to the respective sources.cmake file in the same directory (e.g., src/openms/source/FORMAT/ and src/openms/include/OpenMS/FORMAT/). #. Add the corresponding class test to src/tests/class_tests// (e.g., src/tests/class_tests/openms/source/NewFileFormat_test.cpp). #. Add the test to the executables.cmake file in the test folder (e.g., src/tests/class_tests/openms/executables.cmake). -#. Add them to git git add. +#. Add them to git by using the command git add. From d7d73ad9ba3f8077a12fbad40955981c3d4753f4 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Mon, 16 May 2022 17:21:57 +0930 Subject: [PATCH 40/77] developer-faq --- OpenMS-Wiki/developer-faq.rst | 186 +++++++++++++++++++++++++++------- 1 file changed, 152 insertions(+), 34 deletions(-) diff --git a/OpenMS-Wiki/developer-faq.rst b/OpenMS-Wiki/developer-faq.rst index c7401163..fce83be4 100644 --- a/OpenMS-Wiki/developer-faq.rst +++ b/OpenMS-Wiki/developer-faq.rst @@ -12,7 +12,7 @@ Troubleshooting OpenMS complains about boost not being found but I'm sure its there! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -``CMake`` got confused. Set up a new build directory and try again. If you build in-source (not recommended), deleting the CMakeCache.txt and cmake directory might help. +``CMake`` got confused. Set up a new build directory and try again. If you build in-source (not recommended), deleting the ``CMakeCache.txt`` and ``cmake`` directory might help. General information ******************* @@ -40,7 +40,7 @@ Basically, you must conform to the OpenMS Coding conventions : Coding style (brackets, variable names, etc.) must conform to the conventions. * The class and all the members must be documented thoroughly. -* You can check your code with the tool `tools/checker.php`. Call `php tools/checker.php` for detailed instructions. +* You can check your code with the tool ``tools/checker.php``. Call ``php tools/checker.php`` for detailed instructions. Please open a pull request and follow the `checklist `_. @@ -52,10 +52,10 @@ Login to the wordpress admin area at www.openms.de/wp-admin with your username a Can I use QT designer to create GUI widgets? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Yes! If you want to create a class called `Widget: Create .ui-File` with `QT designer` and store it as `Widget.ui.`, add the class to `sources.cmake`. +Yes! If you want to create a class called ``Widget: Create .ui-File`` with ``QT designer`` and store it as ``Widget.ui.``, add the class to ``sources.cmake``. From the .ui-File the file `include/OpenMS/VISUAL/UIC/ClassTemplate.h` is generated by the build system. DO NOT CHECK-IN THIS FILE, AS IT IS GENERATED AUTOMATICALLY, WHEN NEEDED!!! -Derive the class `Widget` from `WidgetTemplate`. You need to check in the `Widget.h` and `Widget.cpp` files. +Derive the class ``Widget`` from ``WidgetTemplate``. You need to check in the ``Widget.h`` and ``Widget.cpp`` files. Can the START_SECTION-macro not handle template methods that have two or more arguments? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -74,7 +74,7 @@ Build system What is cmake? ^^^^^^^^^^^^^^ -CMake builds BuildSystems for different platforms, e.g. VisualStudio Solutions on Windows, Makefiles on Linux etc. +``CMake`` builds BuildSystems for different platforms, e.g. VisualStudio Solutions on Windows, Makefiles on Linux etc. This allows us to define in one central location (namely CMakeLists.txt) how OpenMS is build and have the platform specific stuff handled by CMake. See http://www.cmake.org for more information. @@ -82,52 +82,52 @@ How do I use cmake? ^^^^^^^^^^^^^^^^^^^ See Installation instructions for your platform. -In general, you call `CMake(.exe)`` with some parameters to create the native build-system. -Afterwards you can (but usually don't have to edit the current configuration using a GUI named `ccmake` (or `CMake-GUI` in Windows), which ships with CMake). -Note: whenever `ccmake` is mentioned in this document, substitute this by `CMake-GUI` if your OS is Windows. You can also edit the `CMakeCache.txt` file directly. +In general, you call ``CMake(.exe)`` with some parameters to create the native build-system. +Afterwards you can (but usually don't have to edit the current configuration using a GUI named ``ccmake`` (or ``CMake-GUI`` in Windows), which ships with ``CMake``). +Note: whenever ``ccmake`` is mentioned in this document, substitute this by ``CMake-GUI`` if your OS is Windows. You can also edit the ``CMakeCache.txt`` file directly. How do I generate a build-system for Eclipse, KDevelop, CodeBlocks etc?! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Type `cmake` into a console. This will list the available code generators available on your platform, which you can pass to `CMake` using the `-G` option. +Type ``cmake`` into a console. This will list the available code generators available on your platform, which you can pass to ``CMake`` using the ``-G`` option. What are user definable cMake cache variables?! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -They allow the user to pass options to `CMake` which will influence the build system. The most important option which should be given when calling `CMake.exe` is: +They allow the user to pass options to ``CMake`` which will influence the build system. The most important option which should be given when calling ``CMake.exe`` is: -`CMAKE_FIND_ROOT_PATH`, which is where `CMake` will search for additional libraries if they are not found in the default system paths. By default we add `OpenMS/contrib`. +`CMAKE_FIND_ROOT_PATH`, which is where ``CMake`` will search for additional libraries if they are not found in the default system paths. By default we add `OpenMS/contrib`. -If your have installed all libraries on your system already there is no need to change `CMAKE_FIND_ROOT_PATH`. If you need the `contrib` folder, you will need to set this variable. -On Windows, you always need the `contrib` folder, as there are no system developer packages. To pass this variable to `CMake` use the `-D` switch e.g. `cmake -D CMAKE_FIND_ROOT_PATH:PATH="D:\\somepath\\contrib"`. -Everything else can be edited using `ccmake` afterwards. +If your have installed all libraries on your system already there is no need to change ``CMAKE_FIND_ROOT_PATH``. If you need the `contrib` libraries, you will need to set this variable. +On Windows, you always need the ``contrib`` folder, as there are no system developer packages. To pass this variable to ``CMake`` use the ``-D`` switch e.g. ``cmake -D CMAKE_FIND_ROOT_PATH:PATH="D:\\somepath\\contrib"``. +Everything else can be edited using ``ccmake`` afterwards. The following options are of interest: -* `CMAKE_BUILD_TYPE` Define if you want to build Debug or Release version of OpenMS. Release is the default. +* ``CMAKE_BUILD_TYPE`` Define if you want to build Debug or Release version of OpenMS. Release is the default. -* `CMAKE_FIND_ROOT_PATH` The path to the `contrib` libraries. Note that you can also provide more then one value here (e.g., `-D CMAKE_FIND_ROOT_PATH="/path/to/contrib;/usr/"` will search in your `contrib` path and in `/usr` for the required libraries) +* ``CMAKE_FIND_ROOT_PATH`` The path to the ``contrib`` libraries. Note that you can also provide more then one value here (e.g., `-D CMAKE_FIND_ROOT_PATH="/path/to/contrib;/usr/"` will search in your `contrib` path and in `/usr` for the required libraries) -* `STL_DEBUG` Enables STL debug mode. +* ``STL_DEBUG`` Enables STL debug mode. -* `DB_TEST` (deprecated) Enables database testing. +* ``DB_TEST`` (deprecated) Enables database testing. -* `QT_DB_PLUGIN` (deprecated) Defines the db plugin used by Qt. +* ``QT_DB_PLUGIN`` (deprecated) Defines the db plugin used by Qt. -* `MT_CUDA_BUILD_TYPE` ... +* ``MT_CUDA_BUILD_TYPE`` ... -Their description will be displayed when you call ccmake. +Their description will be displayed when you call ``ccmake``. Can I use another solver than GLPK?! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Yes, but by default the build system only links against GLPK (this is how OpenMS binary packages must be build!). -To use another solver try `cmake ... -D USE_COINOR=1 ....` and look at the documentation of the `LPWrapper` class. +To use another solver try ``cmake ... -D USE_COINOR=1 ....`` and look at the documentation of the ``LPWrapper`` class. How do I switch to Debug/Release configuration?! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -For Makefile generators (typically on Linux) you can set the `CMAKE_BUILD_TYPE` variable to either Debug or Release by calling `ccmake`. +For Makefile generators (typically on Linux) you can set the ``CMAKE_BUILD_TYPE`` variable to either Debug or Release by calling ``ccmake``. For Visual Studio, this is not necessary as all configurations are generated and you can choose the one you like within the IDE itself. The 'Debug' configuration enabled debug information. The 'Release' configuration disables debug information and enables optimization. @@ -135,7 +135,7 @@ I changed the contrib path, but re-running CMake won't change the library paths? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Once a library is found and its location is stored in a cache variable, it will only be searched again if the corresponding entry in the cache file is set to false. -You can simply delete the `CMakeCache.txt`, but all other custom settings will be lost as well. +You can simply delete the ``CMakeCache.txt``, but all other custom settings will be lost as well. What are the most useful (make) targets? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -146,22 +146,140 @@ The most useful targets will be shown to you by calling the targets target, i.e. CMake can't seem to find a Qt library (usually QtCore)! What now? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -`CMake` finds QT by looking for `qmake` in your PATH or for the Environment Variable `QTDIR`! Set these accordingly. -If the problem still persists: do you have a second installation of Qt (especially the MinGW version?)? This might lead `CMake` to the wrong path (it's searching for the `Qt*.lib` files). +``CMake`` finds QT by looking for ``qmake`` in your PATH or for the Environment Variable ``QTDIR``! Set these accordingly. +If the problem still persists: do you have a second installation of Qt (especially the MinGW version?)? This might lead ``CMake`` to the wrong path (it's searching for the ``Qt*.lib`` files). You should only move/delete the offending Qt version if you know what you are doing! -A save workaround is to edit the `CMakeCache` file (e.g. via `ccmake`) and set all paths relating to QT (e.g. `QT_LIBRARY_DIR`) manually. +A save workaround is to edit the ``CMakeCache`` file (e.g. via ``ccmake``) and set all paths relating to QT (e.g. ``QT_LIBRARY_DIR``) manually. (Windows) What version of Visual Studio should I use? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Use the latest if you can. Get the latest `CMake`, as its generator needs to support your VS. If your VS is too new and there is no `CMake` for that yet, you're gonna be faced with a lot of conversion issues. -This happens whenever the Build-System calls `CMake` (which can be quite often, e.g., after changes to `CMakeLists.txt`). +Use the latest if you can. Get the latest ``CMake``, as its generator needs to support your VS. If your VS is too new and there is no ``CMake`` for that yet, you're gonna be faced with a lot of conversion issues. +This happens whenever the Build-System calls ``CMake`` (which can be quite often, e.g., after changes to ``CMakeLists.txt``). How do I add a new class MyClass to the build system? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in `src//include/OpenMS` and the cpp file in `src//source`, e.g., src/openms/include/OpenMS/FORMAT/NewFileFormat.h and src/openms/source/FORMAT/NewFileFormat.cpp. -#. Add both to the respective sources.cmake file in the same directory (e.g., src/openms/source/FORMAT/ and src/openms/include/OpenMS/FORMAT/). -#. Add the corresponding class test to src/tests/class_tests// (e.g., src/tests/class_tests/openms/source/NewFileFormat_test.cpp). -#. Add the test to the executables.cmake file in the test folder (e.g., src/tests/class_tests/openms/executables.cmake). -#. Add them to git by using the command git add. +#. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in ``src//include/OpenMS`` and the cpp file in ``src//source``, e.g., src/openms/include/OpenMS/FORMAT/NewFileFormat.h and src/openms/source/FORMAT/NewFileFormat.cpp. +#. Add both to the respective sources.cmake file in the same directory (e.g., ``src/openms/source/FORMAT/`` and ``src/openms/include/OpenMS/FORMAT/``). +#. Add the corresponding class test to src/tests/class_tests// (e.g., ``src/tests/class_tests/openms/source/NewFileFormat_test.cpp``). +#. Add the test to the ``executables.cmake`` file in the test folder (e.g., ``src/tests/class_tests/openms/executables.cmake``). +#. Add them to git by using the command ``git add``. + +How do I add a new directory MYDIR to the build system? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +#. Create two new ``sources.cmake`` files (one for ``src//include/OpenMS/MYDIR``, one for ``src//source/MYDIR``), using existing ``sources.cmake`` files as template. +#. Add the new ``sources.cmake`` files to ``src//includes.cmake`` +#. If you created a new directory directly under ``src/openms/source``, then have a look at ``src/tests/class_tests/openms/executables.cmake``. +#. Add a new section that makes the unit testing system aware of the new (upcoming) tests. +#. Look at the very bottom and augment ``TEST_executables``. +#. Add a new group target to ``src/tests/class_tests/openms/CMakeLists.txt``. + +Class/Unit tests and TOPP/Tool tests +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Class tests are unit tests that typically test the functionality of a class. + +They get build as standalone "additional" executables that include the class to be tested and our own testing utility classes to test outcomes of single functions of the class in question. + +Unless you added functions that are intended to be used outside of your new additional mode, you don't need to add anything there. + +Tool tests are using the tool executable that the user would also receive. We use those executables to run the full algorithm on a small test dataset, to ensure that from version to version the results stay the same/meaningful. + +Each tool test consists of: + +* An executable call on a test dataset (by using either fixed command line parameters or an ini file). + +* A FuzzyDiff call that compares the temporary output file of the last call and a reference test output that you have to provide. + +* a line to add a dependency of the FuzzyDiff call on the actual executable call (so they get executed after each other). + +Use e.g., ``ctest -V -R IDMapper`` to only test tests that include the regex ``IDMapper`` (-V is just verbose). Make sure to build the ``IDMapper`` and ``IDMapper_test`` (if edited) executable first everytime. +``ctest`` does not have any automatic dependency on the timestamps of the executables. + +How do I add a new test for the class MyClass? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You should always add a test alongside every new class added to OpenMS. + +#. Add the class test to ``src/tests/class_tests//`` (e.g., ``src/tests/class_tests/openms/source/NewFileFormat_test.cpp``). +#. Add the test to the ``executables.cmake`` file in the test folder. +#. Add them to git using the ``git add`` command. + +A test template for your specific class can be generated by the ``create_test.php`` script found in ``tools/``. + +#. Make sure you generated XML files containing the class information make doc_xml +#. Call: + +``php tools/create_test.php /BUILD_DIRECTORY/ /PATH_TO_HEADER/MyClass.h \ + "FIRSTNAME LASTNAME" > ./src/tests/class_tests/openms/source/MyClass_test.cpp`` + +How do I add a new GUI test (for QT Gui classes) for the class MyClass? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +#. Create the MyClass_test.cpp in src/tests/class_tests/openms_gui/source +#. Add it to src/tests/class_tests/openms_gui/CMakeLists.txt in the GUI section. +#. Have a look at existing GUI tests, as they use the QT TestLib framework and not the OpenMS macros. + +(Linux) When executing 'make test', all tests fail. +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Please check the ``LD_LIBRARY_PATH`` environment variable: + +You can print the ``LD_LIBRARY_PATH`` with ``echo $LD_LIBRARY_PATH``. If your ``/lib/`` folder is included, check that ``libOpenMS.so`` is present. +With the ``ldd`` command, you can show the libraries used by an executable, e.g. ``ldd /bin/ClassTest_test``. + +How can I speed up the compile process of OpenMS? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Build with several threads. If you have several processors/cores you can build OpenMS classes/tests and TOPP tools in in several threads. On Linux use the make option -j: make -j8 OpenMS TOPP test_build + +On Windows, Visual Studio solution files are automatically build with the /MP flag, such that VS uses all available cores of the machine. + +Release +******* + +see 'Preparation-of-a-new-OpenMS-release `_ + +Continuous integration +********************** + +How does travis work? +^^^^^^^^^^^^^^^^^^^^^ + +`Travis `_ is an automated system for continuous integration and each new commit and pull request is automatically run through the travis build system. +This is controlled by a ``.travis.yaml`` file in the source tree. + +What can we do if travis times out? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The first thing to try is to simply restart travis, it sometimes hangs and since it builds on shared infrastructure, the next build may work better. This needs to be done by a OpenMS core developer. + +Since we use extensive caching, the build may take much longer when many files are touched and may never complete in that case (running into the travis time limit). In that case we can rebuild the cache using the following approach: + +``$ git cherry-pick 89c5cd7f2d9d343b3d63fc6bab18e08dcd969c05 + +$ git push origin develop + +# Now wait for the build to complete + +$ git revert 89c5cd7f2d9d343b3d63fc6bab18e08dcd969c05 + +$ git push origin develop`` + +Working in IDE's +**************** + +General: +^^^^^^^^ + +Why are there no source/TEST and source/APPLICATIONS/TOPP|UTILS folder? +_______________________________________________________________________ + +All source files added to an IDE are associated with their targets. You can find the source files for each test within its own subproject. The same is true for the ``TOPP`` and ``UTILS`` classes. + +How can I easily update a lot of test files (e.g., after a small format change in result files)? +_________________________________________________________________________________________________ + +Using grep one can simply extract the lines starting with diff FILENAME1 FILENAME2 and replace the diff by copy. From 56259bde81fa8bf4b45c3012107a6cd00fcbb788 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Mon, 16 May 2022 17:23:18 +0930 Subject: [PATCH 41/77] developer-faq --- OpenMS-Wiki/developer-faq.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/OpenMS-Wiki/developer-faq.rst b/OpenMS-Wiki/developer-faq.rst index fce83be4..8f74a6e0 100644 --- a/OpenMS-Wiki/developer-faq.rst +++ b/OpenMS-Wiki/developer-faq.rst @@ -240,7 +240,7 @@ On Windows, Visual Studio solution files are automatically build with the /MP fl Release ******* -see 'Preparation-of-a-new-OpenMS-release `_ +see `Preparation-of-a-new-OpenMS-release `_ Continuous integration ********************** @@ -258,7 +258,9 @@ The first thing to try is to simply restart travis, it sometimes hangs and since Since we use extensive caching, the build may take much longer when many files are touched and may never complete in that case (running into the travis time limit). In that case we can rebuild the cache using the following approach: -``$ git cherry-pick 89c5cd7f2d9d343b3d63fc6bab18e08dcd969c05 +..code:: console + +$ git cherry-pick 89c5cd7f2d9d343b3d63fc6bab18e08dcd969c05 $ git push origin develop From 18e951ff2d0ff660c6d46c3b274972c5c10ad184 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Mon, 16 May 2022 17:23:42 +0930 Subject: [PATCH 42/77] developer-faq --- OpenMS-Wiki/developer-faq.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenMS-Wiki/developer-faq.rst b/OpenMS-Wiki/developer-faq.rst index 8f74a6e0..9d3f6603 100644 --- a/OpenMS-Wiki/developer-faq.rst +++ b/OpenMS-Wiki/developer-faq.rst @@ -258,7 +258,7 @@ The first thing to try is to simply restart travis, it sometimes hangs and since Since we use extensive caching, the build may take much longer when many files are touched and may never complete in that case (running into the travis time limit). In that case we can rebuild the cache using the following approach: -..code:: console +.. code:: console $ git cherry-pick 89c5cd7f2d9d343b3d63fc6bab18e08dcd969c05 From 23c4f6dcb8a1bf1e3efa606733a48fecf5cd6451 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Mon, 16 May 2022 17:24:14 +0930 Subject: [PATCH 43/77] developer-faq --- OpenMS-Wiki/developer-faq.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/OpenMS-Wiki/developer-faq.rst b/OpenMS-Wiki/developer-faq.rst index 9d3f6603..d7680339 100644 --- a/OpenMS-Wiki/developer-faq.rst +++ b/OpenMS-Wiki/developer-faq.rst @@ -260,15 +260,15 @@ Since we use extensive caching, the build may take much longer when many files a .. code:: console -$ git cherry-pick 89c5cd7f2d9d343b3d63fc6bab18e08dcd969c05 + $ git cherry-pick 89c5cd7f2d9d343b3d63fc6bab18e08dcd969c05 -$ git push origin develop + $ git push origin develop -# Now wait for the build to complete + # Now wait for the build to complete -$ git revert 89c5cd7f2d9d343b3d63fc6bab18e08dcd969c05 + $ git revert 89c5cd7f2d9d343b3d63fc6bab18e08dcd969c05 -$ git push origin develop`` + $ git push origin develop Working in IDE's **************** From 91739ca27d99a511059a8a4628a0ca3b986165d3 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Mon, 16 May 2022 17:24:54 +0930 Subject: [PATCH 44/77] developer-faq --- OpenMS-Wiki/developer-faq.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenMS-Wiki/developer-faq.rst b/OpenMS-Wiki/developer-faq.rst index d7680339..59f0e25f 100644 --- a/OpenMS-Wiki/developer-faq.rst +++ b/OpenMS-Wiki/developer-faq.rst @@ -258,7 +258,7 @@ The first thing to try is to simply restart travis, it sometimes hangs and since Since we use extensive caching, the build may take much longer when many files are touched and may never complete in that case (running into the travis time limit). In that case we can rebuild the cache using the following approach: -.. code:: console +.. code:: bash $ git cherry-pick 89c5cd7f2d9d343b3d63fc6bab18e08dcd969c05 From d6abb996ea9c848f4938b87daca442a5ef692ae2 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Mon, 16 May 2022 18:07:38 +0930 Subject: [PATCH 45/77] developer-faq --- OpenMS-Wiki/developer-faq.rst | 261 +++++++++++++++++++++++++++++++++- 1 file changed, 260 insertions(+), 1 deletion(-) diff --git a/OpenMS-Wiki/developer-faq.rst b/OpenMS-Wiki/developer-faq.rst index 59f0e25f..0f4f06e4 100644 --- a/OpenMS-Wiki/developer-faq.rst +++ b/OpenMS-Wiki/developer-faq.rst @@ -284,4 +284,263 @@ All source files added to an IDE are associated with their targets. You can find How can I easily update a lot of test files (e.g., after a small format change in result files)? _________________________________________________________________________________________________ -Using grep one can simply extract the lines starting with diff FILENAME1 FILENAME2 and replace the diff by copy. +Using ``grep`` one can simply extract the lines starting with ``diff FILENAME1 FILENAME2`` and replace the ``diff`` by ``copy``. + +Visual Studio: +^^^^^^^^^^^^^^ + +I'm getting the error "Error C2471: cannot update program database". +_____________________________________________________________________ + +This is a bug in Visual Studio and there is a bugfix: http://code.msdn.microsoft.com/KB946040 Only apply it if you encounter the error. The bugfix might have unwanted side effects! + + +Visual Studio can't read the clang-format file. +_______________________________________________ + +Depending on the Visual Studio version you're using you might get an error like "Error while formating with ClangFormat!". This is because Visual Studio is using an outdated version of clang-format. Unfortunately there is no easy way to update this using Visual Studio itself. +There is a plugin provided by LLVM designed to fix this exact problem, but the plugin doesn't work with every Visual Studio version. However, you can update clang-format by hand using the pre-build clang-format binary. Both the binary and a link to the plugin can be found here: https://llvm.org/builds/. +To update clang-format by hand just download the binary and exchange it with the clang-format binary in your Visual Studio folder. +For Visual Studio 17 and 19 it should be located at: ``C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\bin``. + +Eclipse CDT: +^^^^^^^^^^^^ + +The indexer gets stuck at some file which ``#includes seqan`` +_____________________________________________________________ + +It seems that SeqAn code is just too confusing for older eclipse C++ indexers. You should upgrade to eclipse galileo (CDT 6.0.x). Also, increase the available memory limit in eclipse.ini, e.g. -Xmx1024m for one gig. + + +The parser is confused after OPENMS_DLLAPI and does not recognize standard C++ headers +______________________________________________________________________________________ + +Go to ``Project -> Properties -> C/C++ Include Paths and Preprocessor Symbols -> Add Preprocessor symbol -> "OPENMS_DLLAPI="``. This tells eclipse that the macro is defined empty. In the same dialog you can also add an external include path to e.g. ``/usr/include/c++/4.3.3/``, etc. The issue with C++ headers was fixed in the latest galileo release. + +Hints to resolve the OPENMS_DLLAPI issue using the ``cmake`` generator are welcome! + +Debugging +********* + +How do I run a single test? +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You can can execute an OpenMS class test using the CTest regular expressions: + +.. code:: bash + + > ctest -V -R "^_test" + + # To build a class test, you simply call the respective make target in ./source/TEST: + + > make _test + +To run a TOPP test, you can use: + +.. code:: bash + + > ctest -V -R "TOPP_" + +To build the tool, use: + +.. code:: bash + > make + +How do I debug uncaught exceptions? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is a mechanism to have a core dumped if an uncaught exception occurs. + +To enable it, the environment variable ``OPENMS_DUMP_CORE`` has to be set. + +Each time an uncaught exception occurs, the ``OPENMS_DUMP_CORE`` variable is checked and a segmentation fault is caused, if it is set. + +(Linux) Why is no core dumped, although a fatal error occured? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Try the ``ulimit -c`` unlimited command. It sets the maximum size of a core to unlimited. + +Note: We observed that, on some systems, no core is dumped even if the size of the core file is set to unlimited. We are not sure what causes this problem + +(Linux) How can I set breakpoints in gdb to debug OpenMS? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Imagine you want to debug the TOPPView application and you want it to stop at line 341 of + +.. code:: bash + SpectrumMDIWindow.C. + Run gdb: + shell> gdb TOPPView + +Start the application (and close it): + +.. code:: bash + gdb> run [arguments] + +Set the breakpoint: + +.. code:: bash + gdb> break SpectrumMDIWindow.C:341 + +Start the application again (with the same arguments): + +.. code:: bash + gdb> run + +How can I find out which shared libraries are used by an application? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Linux: ``ldd`` + +Windows (Visual studio console): Try "Dependency Walker" (http://www.dependencywalker.com/) (use x86 for 32bit builds and the x64 version for 64bit builds. Using the wrong version of depends.exe will give wrong results!) or ``dumpbin /DEPENDENTS OpenMS.dll``. + +How can I get a list of the symbols defined in a (shared) library or object file? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Linux: ``nm `` + +Use ``nm -C`` to switch on demangling of low-level symbols into their C++-equivalent names. ``nm`` also accepts .a and .o files. + +Windows (Visual studio console): ``dumpbin /ALL `` + +You can use dumpbin on object files (.o) or (shared) library files (.lib) or the DLL itself e.g. ``dumpbin /EXPORTS OpenMS.dll``. + +Cross-platform thoughts +*********************** + +OpenMS runs on three major platforms, each one having its own ways of doing things. Here are the most prominent causes of "it runs on Platform A, but not on B. What now?" + +Reading/Writing binary files causes different behaviour ... Usually Linux does not make a difference between text-mode and binary-mode when reading files. This is quite different on Windows as some bytes are interpreted as EOF, which lead might to a premature end of the reading process. + +Thus, if reading binary files make sure that you explicitly state that the file is binary when opening it! + +During writing in text-mode on windows a line-break (\n) is expanded to (\r\n). Keep this in mind or use the eol-style property of subversion to ensure that line endings are correctly checked out on non-Windows systems. + +``unsigned int`` vs ``size_t`` (UInt and Size) UInt and Size are the same on Linux GCC (i.e. both have the same size, 32bit on 32bit systems, 64bit on 64 bit systems), however on Windows this only holds for 32bit. On a 64bit Windows the UInt type is still 32bit, Size is (obviously) 64bit. This might lead to warnings (at best) or overflows and other nasty stuff. +So make sure you do not rely on UInt being equal to Size - because they're not. + +Paths and system functions... + +This is trivial but hardcoding something like ``String tmp_dir = "/tmp";`` is a big no-no! This must fail on Windows! Use Qt's QDir to get a path to the systems temporary directory if required. + +Also calling things like uname which are only available on Linux: don't! + +When working with files or directories, it is usually safe to use "/" on all platforms. Even Windows understands that. Take care of spaces in directory names though. You should always quote paths if they are used in a system call to ensure that the subsequent interpreter takes the spaced path as a single entity. + + +PyOpenMS - Trouble shooting +*************************** + +How can I wrap my new method with PyOpenMS? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You will have to add an entry to ``src/pyOpenMS/pxds/CLASS_NAME.pxd`` with the signature of your new method(s). + +How can I wrap my new class with PyOpenMS? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You will have to create a new file ``src/pyOpenMS/pxds/CLASS_NAME.pxd`` which is explained `here `_. + +My method has multiple outputs. Can I use output parameters? I have trouble wrapping them for pyOpenMS. +******************************************************************************************************* + +Python does not support passing primitive types (int, double etc) by reference, there fore void calculate(double &) will not work. + +Doxygen documentation +********************* + +Where can I find the definition of the main page? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``OpenMS/doc/doxygen/public/Main.doxygen`` + +Where can I add a new module? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``OpenMS/doc/doxygen/public/Modules.doxygen`` + +How is the parameter documentation for classes derived from DefaultParamHandler created? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You have to add your class to the program ``OpenMS/doc/doxygen/parameters/DefaultParamHandlerDocumenter.cpp``. This program generates a html table with the parameters. This table can then be included in the class documentation using the following ``doxygen`` command: + + +``@htmlinclude OpenMS_.parameters`` + + +Note that parameter documentation is automatically generated for ``TOPP/UTILS`` included in the static ``ToolHandler.cpp`` tools list. To include TOPP/UTILS parameter documentation use following ``doxygen`` command: + + +``@htmlinclude TOPP_.parameters`` + +or + +``@htmlinclude UTILS_.parameters`` + +You can test if everything worked by calling make doc_param_internal. The parameters documentation is written to ``OpenMS/doc/doxygen/parameters/output/``. + + +How is the command line documentation for TOPP/UTILS tools created? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The program ``OpenMS/doc/doxygen/parameters/TOPPDocumenter.cpp`` creates the command line documentation for all classes that are included in the static ``ToolHandler.cpp`` tools list. It can be included in the documentation using the following ``doxygen`` command: + +``@verbinclude TOPP_.cli`` + +You can test if everything worked by calling ``make doc_param_internal``. The command line documentation is written to ``OpenMS/doc/doxygen/parameters/output/``. + +What are the important files for adding a new tutorial section? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +OpenMS tutorial: + +* ``OpenMS/doc/OpenMS_tutorial/refman_overwrite.tex.in`` (for PDF tutorials) +* ``OpenMS/doc/doxygen/public/OpenMS_Tutorial_html.doxygen~`` (for html tutorials) + +TOPP and TOPPView tutorial: + +* ``OpenMS/doc/TOPP_tutorial/refman_overwrite.tex.in`` (for PDF tutorials) +* ``OpenMS/doc/doxygen/public/TOPP_Tutorial_html.doxygen`` (for html tutorials) + +Bug fixes +********* + +How to contribute a bugfix? +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +#. Submit the bug as a GitHub issue. +#. Create a feature branch (e.g. ``feature/fix_missing_filename_issue_615``) from your (up-to-date) develop branch in your fork of OpenMS. +#. Fix the bug and add a test. +#. Create a pull request for your branch. +#. After approval and merge make sure the issue is closed. + +How can I profile my code? +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Try IBM's profiler, available for all platforms (and free for academic use): Purify(Plus) and/or Quantify. + +Windows: this is directly supported by Visual Studio (Depending on the edition: Team and above). Follow their documentation. + +Linux: + +* Build OpenMS in debug mode (set CMAKE_BUILD_TYPE to 'Debug'). +* Call the executable with valgrind: 'valgrind –tool=callgrind ' Note: other processes running on the same machine can influence the profiling. Make sure your application gets enough resources (memory, CPU time). +* You can start and stop the profiling while the executable is running e.g. to skip initialization steps: +* Start valgrind with the option –instr-atstart=no. +* Call 'callgrind -i [on|off]' to start/stop the profiling. +* The output can be viewed with 'kcachegrind callgrind.out.' + +(Linux) How do I check my code for memory leaks? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* Build OpenMS in debug mode (set ``CMAKE_BUILD_TYPE`` to ``Debug``). +* Call the executable with ``valgrind: valgrind --suppressions=OpenMS/tools/valgrind/openms_external.supp –leak-check=full ``. + +Common errors are: + +* ``'Invalid write/read ...'`` - Violation of container boundaries. +* ``'... depends on uninitialized variable'`` - Uninitialized variables: +* ``'... definitely lost'`` - Memory leak that has to be fixed +* ``'... possibly lost'`` - Possible wemory leak, so have a look at the code + +For more information see the valgrind documentation at http://valgrind.org/docs/manual/. From fb70e4ea298dae4a7ab26cec04b6b386e2e58b44 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Mon, 16 May 2022 18:12:23 +0930 Subject: [PATCH 46/77] developer-faq --- OpenMS-Wiki/developer-faq.rst | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/OpenMS-Wiki/developer-faq.rst b/OpenMS-Wiki/developer-faq.rst index 0f4f06e4..5b9359dd 100644 --- a/OpenMS-Wiki/developer-faq.rst +++ b/OpenMS-Wiki/developer-faq.rst @@ -53,7 +53,7 @@ Can I use QT designer to create GUI widgets? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Yes! If you want to create a class called ``Widget: Create .ui-File`` with ``QT designer`` and store it as ``Widget.ui.``, add the class to ``sources.cmake``. -From the .ui-File the file `include/OpenMS/VISUAL/UIC/ClassTemplate.h` is generated by the build system. +From the .ui-File the file ``include/OpenMS/VISUAL/UIC/ClassTemplate.h`` is generated by the build system. DO NOT CHECK-IN THIS FILE, AS IT IS GENERATED AUTOMATICALLY, WHEN NEEDED!!! Derive the class ``Widget`` from ``WidgetTemplate``. You need to check in the ``Widget.h`` and ``Widget.cpp`` files. @@ -75,7 +75,7 @@ What is cmake? ^^^^^^^^^^^^^^ ``CMake`` builds BuildSystems for different platforms, e.g. VisualStudio Solutions on Windows, Makefiles on Linux etc. -This allows us to define in one central location (namely CMakeLists.txt) how OpenMS is build and have the platform specific stuff handled by CMake. +This allows us to define in one central location (namely ``CMakeLists.txt``) how OpenMS is build and have the platform specific stuff handled by CMake. See http://www.cmake.org for more information. How do I use cmake? @@ -96,7 +96,7 @@ What are user definable cMake cache variables?! They allow the user to pass options to ``CMake`` which will influence the build system. The most important option which should be given when calling ``CMake.exe`` is: -`CMAKE_FIND_ROOT_PATH`, which is where ``CMake`` will search for additional libraries if they are not found in the default system paths. By default we add `OpenMS/contrib`. +``CMAKE_FIND_ROOT_PATH``, which is where ``CMake`` will search for additional libraries if they are not found in the default system paths. By default we add `OpenMS/contrib`. If your have installed all libraries on your system already there is no need to change ``CMAKE_FIND_ROOT_PATH``. If you need the `contrib` libraries, you will need to set this variable. On Windows, you always need the ``contrib`` folder, as there are no system developer packages. To pass this variable to ``CMake`` use the ``-D`` switch e.g. ``cmake -D CMAKE_FIND_ROOT_PATH:PATH="D:\\somepath\\contrib"``. @@ -212,15 +212,16 @@ A test template for your specific class can be generated by the ``create_test.ph #. Make sure you generated XML files containing the class information make doc_xml #. Call: -``php tools/create_test.php /BUILD_DIRECTORY/ /PATH_TO_HEADER/MyClass.h \ - "FIRSTNAME LASTNAME" > ./src/tests/class_tests/openms/source/MyClass_test.cpp`` +.. code:: bash + php tools/create_test.php /BUILD_DIRECTORY/ /PATH_TO_HEADER/MyClass.h \ + "FIRSTNAME LASTNAME" > ./src/tests/class_tests/openms/source/MyClass_test.cpp`` How do I add a new GUI test (for QT Gui classes) for the class MyClass? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#. Create the MyClass_test.cpp in src/tests/class_tests/openms_gui/source -#. Add it to src/tests/class_tests/openms_gui/CMakeLists.txt in the GUI section. -#. Have a look at existing GUI tests, as they use the QT TestLib framework and not the OpenMS macros. +#. Create the ``MyClass_test.cpp`` in ``src/tests/class_tests/openms_gui/source``. +#. Add it to ``src/tests/class_tests/openms_gui/CMakeLists.txt`` in the GUI section. +#. Have a look at existing GUI tests, as they use the ``QT TestLib`` framework and not the OpenMS macros. (Linux) When executing 'make test', all tests fail. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 8e3b42a7e67562c8c4c5aa8090682ae3b75506e7 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Mon, 16 May 2022 18:15:11 +0930 Subject: [PATCH 47/77] minor change --- OpenMS-Wiki/for-developers.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/OpenMS-Wiki/for-developers.rst b/OpenMS-Wiki/for-developers.rst index ce1a3d43..3e999fb3 100644 --- a/OpenMS-Wiki/for-developers.rst +++ b/OpenMS-Wiki/for-developers.rst @@ -69,5 +69,4 @@ The nightly (unstable) installers are available `here `_ for developers is currently expanded and might contain answers to your questions. -`FAQ ` +The `FAQ `_ for developers is currently expanded and might contain answers to your questions. From db2e310399447479d6b8a379310a459df3008d44 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Tue, 17 May 2022 16:47:26 +0930 Subject: [PATCH 48/77] renamed folder to lower case --- {OpenMS-Wiki => openms-wiki}/about.rst | 0 {OpenMS-Wiki => openms-wiki}/contact.rst | 0 {OpenMS-Wiki => openms-wiki}/developer-faq.rst | 0 {OpenMS-Wiki => openms-wiki}/for-developers.rst | 0 {OpenMS-Wiki => openms-wiki}/for-users.rst | 0 {OpenMS-Wiki => openms-wiki}/reporting-bugs-issues.rst | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename {OpenMS-Wiki => openms-wiki}/about.rst (100%) rename {OpenMS-Wiki => openms-wiki}/contact.rst (100%) rename {OpenMS-Wiki => openms-wiki}/developer-faq.rst (100%) rename {OpenMS-Wiki => openms-wiki}/for-developers.rst (100%) rename {OpenMS-Wiki => openms-wiki}/for-users.rst (100%) rename {OpenMS-Wiki => openms-wiki}/reporting-bugs-issues.rst (100%) diff --git a/OpenMS-Wiki/about.rst b/openms-wiki/about.rst similarity index 100% rename from OpenMS-Wiki/about.rst rename to openms-wiki/about.rst diff --git a/OpenMS-Wiki/contact.rst b/openms-wiki/contact.rst similarity index 100% rename from OpenMS-Wiki/contact.rst rename to openms-wiki/contact.rst diff --git a/OpenMS-Wiki/developer-faq.rst b/openms-wiki/developer-faq.rst similarity index 100% rename from OpenMS-Wiki/developer-faq.rst rename to openms-wiki/developer-faq.rst diff --git a/OpenMS-Wiki/for-developers.rst b/openms-wiki/for-developers.rst similarity index 100% rename from OpenMS-Wiki/for-developers.rst rename to openms-wiki/for-developers.rst diff --git a/OpenMS-Wiki/for-users.rst b/openms-wiki/for-users.rst similarity index 100% rename from OpenMS-Wiki/for-users.rst rename to openms-wiki/for-users.rst diff --git a/OpenMS-Wiki/reporting-bugs-issues.rst b/openms-wiki/reporting-bugs-issues.rst similarity index 100% rename from OpenMS-Wiki/reporting-bugs-issues.rst rename to openms-wiki/reporting-bugs-issues.rst From dd4c91600a8dc1811c72640ed07bffd5eed7e586 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Tue, 17 May 2022 16:57:53 +0930 Subject: [PATCH 49/77] made small changes to files and created 3 empty .md files --- openms-wiki/developer-faq.rst | 18 +++++++++--------- .../preparation-of-a-new-openms-release.md | 0 openms-wiki/pull-request-checklist.md | 0 openms-wiki/pyopenms-wrapping-classes.md | 0 4 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 openms-wiki/preparation-of-a-new-openms-release.md create mode 100644 openms-wiki/pull-request-checklist.md create mode 100644 openms-wiki/pyopenms-wrapping-classes.md diff --git a/openms-wiki/developer-faq.rst b/openms-wiki/developer-faq.rst index 5b9359dd..6dd909fc 100644 --- a/openms-wiki/developer-faq.rst +++ b/openms-wiki/developer-faq.rst @@ -42,7 +42,7 @@ Coding style (brackets, variable names, etc.) must conform to the conventions. * The class and all the members must be documented thoroughly. * You can check your code with the tool ``tools/checker.php``. Call ``php tools/checker.php`` for detailed instructions. -Please open a pull request and follow the `checklist `_. +Please open a pull request and follow the `checklist `_. How do I update the `openms.de `_ website? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -160,7 +160,7 @@ This happens whenever the Build-System calls ``CMake`` (which can be quite often How do I add a new class MyClass to the build system? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in ``src//include/OpenMS`` and the cpp file in ``src//source``, e.g., src/openms/include/OpenMS/FORMAT/NewFileFormat.h and src/openms/source/FORMAT/NewFileFormat.cpp. +#. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in ``src//include/OpenMS`` and the cpp file in ``src//source``, e.g., ``src/openms/include/OpenMS/FORMAT/NewFileFormat.h`` and ``src/openms/source/FORMAT/NewFileFormat.cpp``. #. Add both to the respective sources.cmake file in the same directory (e.g., ``src/openms/source/FORMAT/`` and ``src/openms/include/OpenMS/FORMAT/``). #. Add the corresponding class test to src/tests/class_tests// (e.g., ``src/tests/class_tests/openms/source/NewFileFormat_test.cpp``). #. Add the test to the ``executables.cmake`` file in the test folder (e.g., ``src/tests/class_tests/openms/executables.cmake``). @@ -241,7 +241,7 @@ On Windows, Visual Studio solution files are automatically build with the /MP fl Release ******* -see `Preparation-of-a-new-OpenMS-release `_ +see `Preparation-of-a-new-OpenMS-release `_ Continuous integration ********************** @@ -440,7 +440,7 @@ You will have to add an entry to ``src/pyOpenMS/pxds/CLASS_NAME.pxd`` with the s How can I wrap my new class with PyOpenMS? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -You will have to create a new file ``src/pyOpenMS/pxds/CLASS_NAME.pxd`` which is explained `here `_. +You will have to create a new file ``src/pyOpenMS/pxds/CLASS_NAME.pxd`` which is explained `here `_. My method has multiple outputs. Can I use output parameters? I have trouble wrapping them for pyOpenMS. ******************************************************************************************************* @@ -524,12 +524,12 @@ Windows: this is directly supported by Visual Studio (Depending on the edition: Linux: -* Build OpenMS in debug mode (set CMAKE_BUILD_TYPE to 'Debug'). -* Call the executable with valgrind: 'valgrind –tool=callgrind ' Note: other processes running on the same machine can influence the profiling. Make sure your application gets enough resources (memory, CPU time). +* Build OpenMS in debug mode (set ``CMAKE_BUILD_TYPE`` to ``Debug``). +* Call the executable with valgrind: ``valgrind –tool=callgrind``. Note: other processes running on the same machine can influence the profiling. Make sure your application gets enough resources (memory, CPU time). * You can start and stop the profiling while the executable is running e.g. to skip initialization steps: -* Start valgrind with the option –instr-atstart=no. -* Call 'callgrind -i [on|off]' to start/stop the profiling. -* The output can be viewed with 'kcachegrind callgrind.out.' +* Start valgrind with the option ``–instr-atstart=no``. +* Call ``callgrind -i [on|off]`` to start/stop the profiling. +* The output can be viewed with ``kcachegrind callgrind.out``. (Linux) How do I check my code for memory leaks? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/openms-wiki/preparation-of-a-new-openms-release.md b/openms-wiki/preparation-of-a-new-openms-release.md new file mode 100644 index 00000000..e69de29b diff --git a/openms-wiki/pull-request-checklist.md b/openms-wiki/pull-request-checklist.md new file mode 100644 index 00000000..e69de29b diff --git a/openms-wiki/pyopenms-wrapping-classes.md b/openms-wiki/pyopenms-wrapping-classes.md new file mode 100644 index 00000000..e69de29b From 09ebe25643a4d0f34fb59819b2a25667962f2f8b Mon Sep 17 00:00:00 2001 From: greengypsy Date: Tue, 17 May 2022 18:14:08 +0930 Subject: [PATCH 50/77] added pyopenmswrapping classes link --- openms-wiki/developer-faq.rst | 2 +- openms-wiki/pyopenms-wrapping-classes.md | 0 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 openms-wiki/pyopenms-wrapping-classes.md diff --git a/openms-wiki/developer-faq.rst b/openms-wiki/developer-faq.rst index 6dd909fc..a35765ea 100644 --- a/openms-wiki/developer-faq.rst +++ b/openms-wiki/developer-faq.rst @@ -440,7 +440,7 @@ You will have to add an entry to ``src/pyOpenMS/pxds/CLASS_NAME.pxd`` with the s How can I wrap my new class with PyOpenMS? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -You will have to create a new file ``src/pyOpenMS/pxds/CLASS_NAME.pxd`` which is explained `here `_. +You will have to create a new file ``src/pyOpenMS/pxds/CLASS_NAME.pxd`` which is explained `here `_. My method has multiple outputs. Can I use output parameters? I have trouble wrapping them for pyOpenMS. ******************************************************************************************************* diff --git a/openms-wiki/pyopenms-wrapping-classes.md b/openms-wiki/pyopenms-wrapping-classes.md deleted file mode 100644 index e69de29b..00000000 From 0b94d9eccb30f33165d510990045c9eae15d41df Mon Sep 17 00:00:00 2001 From: greengypsy Date: Tue, 17 May 2022 19:46:32 +0930 Subject: [PATCH 51/77] removed about.rst and added about.md --- openms-wiki/{about.rst => about.md} | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) rename openms-wiki/{about.rst => about.md} (62%) diff --git a/openms-wiki/about.rst b/openms-wiki/about.md similarity index 62% rename from openms-wiki/about.rst rename to openms-wiki/about.md index a0a9c577..20c921d6 100644 --- a/openms-wiki/about.rst +++ b/openms-wiki/about.md @@ -1,12 +1,12 @@ -===== -About -===== -OpenMS is an open-source C++ library for mass spectrometry (MS) data management and analysis. It offers an infrastructure for the rapid development of mass spectrometry-related software. OpenMS is free software available under the three-clause BSD license. It runs under Windows, Mac OS X and Linux. -OpenMS comes with a vast variety of pre-built and ready-to-use tools for proteomics and metabolomics data analysis (TOPP tools) and powerful 2D and 3D visualization (TOPPView). It supports analyses for various quantification protocols, including label-free shotgun, SILAC, iTRAQ, SRM, SWATH, .... It also provides built-in algorithms for peptide/protein identification, both de-novo and via database searching, as well as adapters to state-of-the art tools like X! Tandem, Mascot, OMSSA and others. +# About -Through the TOPP tools concept and unified parameter handling (CTD), OpenMS supports easy integration into workflow engines like TOPPAS (included), KNIME, Galaxy or WS-PGRADE. -With PyOpenMS, OpenMS offers Python bindings to a large part of the API to enable rapid algorithm development. +OpenMS is an open-source C++ library for mass spectrometry (MS) data management and analyses. It offers an infrastructure for the rapid development of mass spectrometry-related software. OpenMS is free software available under the three-clause BSD license. It runs under Windows, Mac OS X and Linux. + +OpenMS comes with a vast variety of pre-built and ready-to-use tools for proteomics and metabolomics data analysis (TOPP tools) and powerful 2D and 3D visualization (TOPPView). It supports analyses for various quantification protocols, including label-free shotgun proteomics, SILAC, iTRAQ, SRM, and SWATH. It also provides built-in algorithms for peptide/protein identification, both de-novo and via database searching, as well as adapters to state-of-the art tools like X! Tandem, Mascot, OMSSA and others. + +Through the TOPP tools concept and unified parameter handling (CTD), OpenMS supports easy integration into workflow engines like TOPPAS (included), KNIME, Galaxy, or WS-PGRADE. +With pyOpenMS, OpenMS offers Python bindings to a large part of the API to enable rapid computational mass spectrometry development. OpenMS supports the Proteomics Standard Initiative (PSI) file formats for MS data. The main contributors of OpenMS are currently Eberhard-Karls Universität in Tübingen, Freie Universität Berlin and ETH Zurich. From 2173ccfe981447d17012607b377e648813638128 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Tue, 17 May 2022 19:57:17 +0930 Subject: [PATCH 52/77] added contact.md --- openms-wiki/contact.md | 6 ++++++ openms-wiki/contact.rst | 7 ------- openms-wiki/developer-faq.rst | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) create mode 100644 openms-wiki/contact.md delete mode 100644 openms-wiki/contact.rst diff --git a/openms-wiki/contact.md b/openms-wiki/contact.md new file mode 100644 index 00000000..30f38b14 --- /dev/null +++ b/openms-wiki/contact.md @@ -0,0 +1,6 @@ +# Getting in Contact + + +For general problems, bug reports and questions, contact us directly on [Gitter] (https://gitter.im/OpenMS/OpenMS) for real-time interaction with the developers or write to the mailing list [open-ms-general] (https://lists.sourceforge.net/lists/listinfo/open-ms-general/). + +If you only want to be informed of new versions of OpenMS, please subscribe to the mailing list [open-ms-announcements] (https://lists.sourceforge.net/lists/listinfo/open-ms-announcements). diff --git a/openms-wiki/contact.rst b/openms-wiki/contact.rst deleted file mode 100644 index 89c37a9b..00000000 --- a/openms-wiki/contact.rst +++ /dev/null @@ -1,7 +0,0 @@ -================== -Getting in Contact -================== - -For general usage problems, bug reports and questions, please contact us directly on `Gitter `_ for real-time interaction with the developers or write to the mailing list `open-ms-general `_. - -If you only want to be informed of new versions of OpenMS, please subscribe to the mailing list `open-ms-announcements `_. diff --git a/openms-wiki/developer-faq.rst b/openms-wiki/developer-faq.rst index a35765ea..4624ea39 100644 --- a/openms-wiki/developer-faq.rst +++ b/openms-wiki/developer-faq.rst @@ -20,7 +20,7 @@ General information I am new to OpenMS. What should I do first? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -* Check out the developement version of OpenMS (see website). +* Check out the development version of OpenMS (see website). * Try and build OpenMS according to the installation instructions. * Read the OpenMS Coding Convention. * Read the OpenMS Tutorial. From 0c6a366756a3a915481aac65390a241a6a08efd5 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Tue, 17 May 2022 21:01:45 +0930 Subject: [PATCH 53/77] created for-developers.md --- openms-wiki/for-developers.md | 71 +++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 openms-wiki/for-developers.md diff --git a/openms-wiki/for-developers.md b/openms-wiki/for-developers.md new file mode 100644 index 00000000..8b38de51 --- /dev/null +++ b/openms-wiki/for-developers.md @@ -0,0 +1,71 @@ +# For Developers + +## Developing With OpenMS + +To contribute to OpenMS, you should: + +* Familiarize yourself with our [online documentation] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html). + +* Learn how to [build OpenMS] (https://github.com/OpenMS/OpenMS/wiki/Building-OpenMS). + +* Start reading the [OpenMS tutorial for developers] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/OpenMS_tutorial.html). + +* Direct any questions to the mailing list. + +## OpenMS Tutorial For Developers + +Please read the [OpenMS tutorial for developers] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/OpenMS_tutorial.html) +that contains general information about the structure of OpenMS, the concepts +behind it and example code. + +## Technical Documentation + +See the documentation for the nightly snapshot of [develop] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/nightly/html/index.html) ([doxygen log] (https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_nightly_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). + +See the documentation for the latest [release] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html) ([doxygen log] (https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_release_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). + +## Development model + +OpenMS follows the Gitflow development workflow that [this post] (http://nvie.com/posts/a-successful-git-branching-model) excellently describes. We encourage every developer (even if they are eligible to push directly to OpenMS) to create their fork (e.g. @username). The GitHub people provide excellent documentation on [forking] (https://help.github.com/articles/fork-a-repo) and how to keep your [fork up-to-date] (https://help.github.com/articles/syncing-a-fork). With your fork, follow the Gitflow development model directly, but instead of merging into "develop" in your fork, open a [pull request ](https://help.github.com/articles/using-pull-requests). Before opening the pull request, please check the [checklist](https://github.com/OpenMS/OpenMS/wiki/Pull-Request-Checklist). + +Some more details and tips are collected [here] (https://github.com/OpenMS/OpenMS/wiki/OpenMS-Git-Workflow). + +## Coding Conventions + +See the manual for proper coding style: [Coding conventions] (https://github.com/OpenMS/OpenMS/wiki/Coding-conventions). +Also see: [C++ Guide](http://https://github.com/OpenMS/OpenMS/wiki/Cpp-Guide). + +See the [manual] (https://github.com/OpenMS/OpenMS/wiki/NewBuildUnit) for creating a new build unit (to be completed). + +We automatically test for common coding convention violations using a modified version of `cpplint`. +Style testing can be enabled using CMake options. We also provide a configuration file for Uncrustify for automated style corrections (see `tools/uncrustify.cfg`). + +## Commit Messages + +To ease the creation of a CHANGELOG, we use a defined format for our commit messages. + +See the manual for writing `commit` messages: [How to write `commit` messages] (http://https://github.com/OpenMS/OpenMS/wiki/HowTo---Write-Commit-Messages). + +## Automated Unit Tests + +We perform nightly test runs on different platforms. Even if everything compiled well on your machine and all tests have passed, please check if you broke another platform. + +Nightly tests: [CDASH] (http://cdash.openms.de/index.php?project=OpenMS) + +## Further developer resources + +### Guidelines for the addition of new dependency libraries + +See [here] (https://github.com/OpenMS/OpenMS/wiki/Developer-Guidelines-for-adding-new-dependent-libraries). + +### Experimental Installers + +We automatically build installers for different platforms. These usually contain unstable or partially untested code, so use them at your own risk. + +The nightly (unstable) installers are available [here] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/). + +### Developer FAQ (formerly Internal FAQ) + +The [FAQ] (requires link) for developers is currently expanded and might contain answers to your questions. + + From c4574417d8309fb8fa56964436a2fa60eaeb67f6 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Tue, 17 May 2022 21:21:40 +0930 Subject: [PATCH 54/77] modified for-developers.md --- openms-wiki/for-developers.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/openms-wiki/for-developers.md b/openms-wiki/for-developers.md index 8b38de51..923aa407 100644 --- a/openms-wiki/for-developers.md +++ b/openms-wiki/for-developers.md @@ -6,7 +6,7 @@ To contribute to OpenMS, you should: * Familiarize yourself with our [online documentation] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html). -* Learn how to [build OpenMS] (https://github.com/OpenMS/OpenMS/wiki/Building-OpenMS). +* Learn how to [build OpenMS] (building-openms.md). * Start reading the [OpenMS tutorial for developers] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/OpenMS_tutorial.html). @@ -24,7 +24,7 @@ See the documentation for the nightly snapshot of [develop] (https://abibuilder. See the documentation for the latest [release] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html) ([doxygen log] (https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_release_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). -## Development model +## Development Model OpenMS follows the Gitflow development workflow that [this post] (http://nvie.com/posts/a-successful-git-branching-model) excellently describes. We encourage every developer (even if they are eligible to push directly to OpenMS) to create their fork (e.g. @username). The GitHub people provide excellent documentation on [forking] (https://help.github.com/articles/fork-a-repo) and how to keep your [fork up-to-date] (https://help.github.com/articles/syncing-a-fork). With your fork, follow the Gitflow development model directly, but instead of merging into "develop" in your fork, open a [pull request ](https://help.github.com/articles/using-pull-requests). Before opening the pull request, please check the [checklist](https://github.com/OpenMS/OpenMS/wiki/Pull-Request-Checklist). @@ -52,9 +52,9 @@ We perform nightly test runs on different platforms. Even if everything compiled Nightly tests: [CDASH] (http://cdash.openms.de/index.php?project=OpenMS) -## Further developer resources +## Further Developer Resources -### Guidelines for the addition of new dependency libraries +### Guidelines for the Addition of New Dependency Libraries See [here] (https://github.com/OpenMS/OpenMS/wiki/Developer-Guidelines-for-adding-new-dependent-libraries). @@ -64,7 +64,7 @@ We automatically build installers for different platforms. These usually contain The nightly (unstable) installers are available [here] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/). -### Developer FAQ (formerly Internal FAQ) +### Developer FAQ (Formerly Internal FAQ) The [FAQ] (requires link) for developers is currently expanded and might contain answers to your questions. From 3bac9fbc86ade2d3d3bb3eec991daeca9afe9af3 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Tue, 17 May 2022 21:21:58 +0930 Subject: [PATCH 55/77] created building-openms.md --- openms-wiki/building-openms.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 openms-wiki/building-openms.md diff --git a/openms-wiki/building-openms.md b/openms-wiki/building-openms.md new file mode 100644 index 00000000..5b665c6c --- /dev/null +++ b/openms-wiki/building-openms.md @@ -0,0 +1,11 @@ +# Building OpenMS + +To build OpenMS, please follow the build instructions: + +* [Instructions for Linux] (instructions-for-linux.md) +* [Instructions for OSX] (instructions-for-osx.md) +* [Instructions for Windows] (instructions-for-windows.md) + +For certain special builds, find instructions here: + +* Instructions to [build pyOpenMS on Windows] (requires link) From 9e078231855d0aaf2cce43f86011a07de7c6b1f6 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Wed, 18 May 2022 19:14:20 +0930 Subject: [PATCH 56/77] just checking links in contact.md --- openms-wiki/contact.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/openms-wiki/contact.md b/openms-wiki/contact.md index 30f38b14..cd8b3e94 100644 --- a/openms-wiki/contact.md +++ b/openms-wiki/contact.md @@ -1,6 +1,5 @@ # Getting in Contact +For general problems, bug reports and questions, contact us on [Gitter](https://gitter.im/OpenMS/OpenMS) for real-time interaction with the developers or write to the mailing list[open-ms-general](https://lists.sourceforge.net/lists/listinfo/open-ms-general/). -For general problems, bug reports and questions, contact us directly on [Gitter] (https://gitter.im/OpenMS/OpenMS) for real-time interaction with the developers or write to the mailing list [open-ms-general] (https://lists.sourceforge.net/lists/listinfo/open-ms-general/). - -If you only want to be informed of new versions of OpenMS, please subscribe to the mailing list [open-ms-announcements] (https://lists.sourceforge.net/lists/listinfo/open-ms-announcements). +If you want to be informed of new versions of OpenMS, subscribe to the mailing list [open-ms-announcements](https://lists.sourceforge.net/lists/listinfo/open-ms-announcements). From fb4eb631adeed91f42a5bb5b9aafcf0c1461720c Mon Sep 17 00:00:00 2001 From: greengypsy Date: Wed, 18 May 2022 20:30:55 +0930 Subject: [PATCH 57/77] added contributor quickstart guide, users quick start guide and reporting bugs and issues md files --- openms-wiki/contact.md | 2 +- openms-wiki/contributors-quickstart-guide.md | 61 +++++++++++++++++++ openms-wiki/for-users.rst | 11 ---- ...ssues.rst => reporting-bugs-and-issues.md} | 13 ++-- openms-wiki/users-quickstart-guide.md | 7 +++ 5 files changed, 75 insertions(+), 19 deletions(-) create mode 100644 openms-wiki/contributors-quickstart-guide.md delete mode 100644 openms-wiki/for-users.rst rename openms-wiki/{reporting-bugs-issues.rst => reporting-bugs-and-issues.md} (54%) create mode 100644 openms-wiki/users-quickstart-guide.md diff --git a/openms-wiki/contact.md b/openms-wiki/contact.md index cd8b3e94..7df0ff40 100644 --- a/openms-wiki/contact.md +++ b/openms-wiki/contact.md @@ -1,5 +1,5 @@ # Getting in Contact -For general problems, bug reports and questions, contact us on [Gitter](https://gitter.im/OpenMS/OpenMS) for real-time interaction with the developers or write to the mailing list[open-ms-general](https://lists.sourceforge.net/lists/listinfo/open-ms-general/). +For general problems, bug reports and questions, contact us on [Gitter](https://gitter.im/OpenMS/OpenMS) for real-time interaction with the developers or write to the mailing list [open-ms-general](https://lists.sourceforge.net/lists/listinfo/open-ms-general/). If you want to be informed of new versions of OpenMS, subscribe to the mailing list [open-ms-announcements](https://lists.sourceforge.net/lists/listinfo/open-ms-announcements). diff --git a/openms-wiki/contributors-quickstart-guide.md b/openms-wiki/contributors-quickstart-guide.md new file mode 100644 index 00000000..fd335991 --- /dev/null +++ b/openms-wiki/contributors-quickstart-guide.md @@ -0,0 +1,61 @@ +# Contribute to OpenMS + +If you would like to contribute to OpenMS: + +* Familiarise yourself with our [online documentation](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html). + +* Learn how to [build OpenMS](https://github.com/OpenMS/OpenMS/wiki/Building-OpenMS). + +* Start reading the [OpenMS tutorial for developers](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/OpenMS_tutorial.html). + +Any questions can be directed at the mailing list. + +## Technical Documentation + +See the documentation for the nightly snapshot of [develop](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/nightly/html/index.html) ([doxygen log] (https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_nightly_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). + +See the documentation for the [latest release] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html) ([doxygen log](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_release_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). + +## Development Model + +OpenMS follows the Gitflow development workflow that is described [here] (http://nvie.com/posts/a-successful-git-branching-model/). + +We encourage every developer (even if he is eligible to push directly to OpenMS) to create his own fork (e.g. @username). The GitHub people provide documentation on [forking](https://help.github.com/articles/fork-a-repo) and how to [keep your fork up-to-date](https://help.github.com/articles/syncing-a-fork). With your own fork you can follow the Gitflow development model directly, but instead of merging into `develop` in your own fork you can open a [pull request] (https://help.github.com/articles/using-pull-requests). Before opening the pull request, please check the [checklist](alinkstob). + +Some more details and tips are collected [here] (alinkstob). + +## Coding Conventions + +See the manual for coding style recommended by OpenMS: [Coding conventions](alinkstob). +also see: [C++ Guide](alinkstob). + +See the [manual](https://github.com/OpenMS/OpenMS/wiki/NewBuildUnit) for creating a new build unit (to be completed). + +We automatically test for common coding convention violations using a modified version of `cpplint`. +Style testing can be enabled using `cmake` options. We also provide a configuration file for `Uncrustify` for automated style corrections (see `tools/uncrustify.cfg`). + +## Commit Messages + +See the guidelines for commit messages: [How to write commit messages] (alinkstob). + +## Automated Unit Tests + +We perform nightly test runs on different platforms. Try to test on as many platforms as possible. This will save you time and surprises during continuous integration tests. + +Nightly tests: [CDASH](http://cdash.openms.de/index.php?project=OpenMS) + +## Further Developer Resources + +### Guidelines for adding new dependency libraries + +View the guidelines for [adding new dependency libraries](https://github.com/OpenMS/OpenMS/wiki/Developer-Guidelines-for-adding-new-dependent-libraries). + +### Experimental installers + +We automatically build installers for different platforms. These usually contain unstable or partially untested code. Use them at your own risk. + +The nightly (unstable) installers are available [here](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/). + +### Developer FAQ + +Visit the [Developer FAQ](alinkstob) page to get answers to frequently asked questions. diff --git a/openms-wiki/for-users.rst b/openms-wiki/for-users.rst deleted file mode 100644 index 363e34db..00000000 --- a/openms-wiki/for-users.rst +++ /dev/null @@ -1,11 +0,0 @@ -========= -For Users -========= - -Getting Started with OpenMS -*************************** -The current stable version of OpenMS can be downloaded from the `OpenMS download site `_ or can be obtained via the `OpenMS docker containers `_. - -As a general primer to OpenMS, we also recommend to read `Röst et al, OpenMS: a flexible open-source software platform for mass spectrometry data analysis. Nat Methods. 2016 `_ as well as the `Getting Started `_ page on openms.de. - -Novice users should start by reading the OpenMS documentation (especially for TOPP) available from the `OpenMS documentation site `_ or in the folder doc/index.html of stable releases. Some example workflows with optimised parameter settings can be downloaded from the `repository `_. To understand which tools are available, please read the `TOPP Tool documentation page `_ as well as the `UTILS Tool documentation page `_. diff --git a/openms-wiki/reporting-bugs-issues.rst b/openms-wiki/reporting-bugs-and-issues.md similarity index 54% rename from openms-wiki/reporting-bugs-issues.rst rename to openms-wiki/reporting-bugs-and-issues.md index c8fe197c..c4a49c78 100644 --- a/openms-wiki/reporting-bugs-issues.rst +++ b/openms-wiki/reporting-bugs-and-issues.md @@ -1,16 +1,15 @@ -===================== -Reporting Bugs/Issues -===================== +# Reporting Bugs and Issues A list of known issues in the current OpenMS release can be found here. Please check if your OpenMS version matches the current version and if the bug has already been reported. -In order to report a new bug, please use either our `GitHub issues system `_ or contact us through the general OpenMS mailing list. +In order to report a new bug, please use either our [GitHub issues system] (https://github.com/OpenMS/OpenMS/wiki/Writing-and-labelling-GitHub-issues) or contact us through the general OpenMS mailing list. -Please include the following information into your bug report: -* the command line (i.e. call) including the TOPP tool and the arguments you used, or the steps you followed in a GUI tool (e.g. TOPPView) - e.g. "FeatureFinderCentroided -in myfile.mzML -out myfile.featureXML" +Include the following information in your bug report: +* the command line (i.e. call) including the TOPP tool and the arguments you used, or the steps you followed in a GUI tool (e.g. TOPPView) - e.g. `FeatureFinderCentroided -in myfile.mzML -out myfile.featureXML` * the output of OpenMS/TOPP (or a screenshot in case of a GUI problem) * operating system (e.g. "Windows XP 32bit", "Win 7 64bit", "Fedora 8 32bit", "MacOS 10.6 64bit") * OpenMS version (e.g. "OpenMS 1.11.1", "Revision 63082 from the SVN repository") * OpenMS architecture ("32 bit" or "64 bit") -Please provide files that we need to reproduce the bug (e.g. TOPP INI files, data files - usually mzML) via a download link, via the mailing list or by directly contacting one of the developers. +Please provide files that we need to reproduce the bug (e.g. TOPP INI files, data files — usually mzML) via a download link, via the mailing list or by directly contacting one of the developers. + diff --git a/openms-wiki/users-quickstart-guide.md b/openms-wiki/users-quickstart-guide.md new file mode 100644 index 00000000..cd0562e6 --- /dev/null +++ b/openms-wiki/users-quickstart-guide.md @@ -0,0 +1,7 @@ +# Users Quick Start Guide + +Download the current stable version of OpenMS from the [OpenMS download site](http://open-ms.de/downloads) or via the [OpenMS docker containers](https://github.com/OpenMS/OpenMS/wiki/OpenMS-Docker-Containers). + +Familiarise yourself with OpenMS by reading [Röst et al, OpenMS: a flexible open-source software platform for mass spectrometry data analysis. Nat Methods. 2016](https://www.ncbi.nlm.nih.gov/pubmed/27575624) as well as the [Getting Started] (http://www.openms.de/getting-started) page on openms.de. + +Read the OpenMS documentation (especially for TOPP) available from the [OpenMS documentation site](http://www.openms.de/current_doxygen) or in the folder doc/index.html of stable releases. You can download some example workflows with optimised parameter settings from the [repository](https://github.com/OpenMS/OpenMS/wiki/Workflow-Collection). To understand which tools are available, read the [TOPP Tool documentation page](http://www.openms.de/current_doxygen/html/TOPP_documentation.html) as well as the [UTILS Tool documentation page](http://www.openms.de/current_doxygen/html/UTILS_documentation.html). From 04f8f7a29d5d8645bd4e579d2456cdf41011e873 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Wed, 18 May 2022 20:56:33 +0930 Subject: [PATCH 58/77] added linkstobs to flag dead links --- openms-wiki/building-openms.md | 8 +-- openms-wiki/contributors-quickstart-guide.md | 10 +-- openms-wiki/for-developers.rst | 72 -------------------- 3 files changed, 9 insertions(+), 81 deletions(-) delete mode 100644 openms-wiki/for-developers.rst diff --git a/openms-wiki/building-openms.md b/openms-wiki/building-openms.md index 5b665c6c..e6135948 100644 --- a/openms-wiki/building-openms.md +++ b/openms-wiki/building-openms.md @@ -2,10 +2,10 @@ To build OpenMS, please follow the build instructions: -* [Instructions for Linux] (instructions-for-linux.md) -* [Instructions for OSX] (instructions-for-osx.md) -* [Instructions for Windows] (instructions-for-windows.md) +* [Instructions for Linux](instructions-for-linux.md) +* [Instructions for OSX](instructions-for-osx.md) +* [Instructions for Windows](instructions-for-windows.md) For certain special builds, find instructions here: -* Instructions to [build pyOpenMS on Windows] (requires link) +* Instructions to [build pyOpenMS on Windows](alinkstob) diff --git a/openms-wiki/contributors-quickstart-guide.md b/openms-wiki/contributors-quickstart-guide.md index fd335991..4e20d47d 100644 --- a/openms-wiki/contributors-quickstart-guide.md +++ b/openms-wiki/contributors-quickstart-guide.md @@ -11,8 +11,8 @@ If you would like to contribute to OpenMS: Any questions can be directed at the mailing list. ## Technical Documentation - -See the documentation for the nightly snapshot of [develop](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/nightly/html/index.html) ([doxygen log] (https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_nightly_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). +Untested installers, containers, etc., known as the nightly snapshot, are released every night. They generally pass automated continuous integration tests but no manual tests. +Access the documentation for the nightly snapshot of [OpenMS develop branch](https://github.com/OpenMS/OpenMS/tree/develop) [here](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/nightly/html/index.html). Access the doxygen log from [here](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_nightly_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log). See the documentation for the [latest release] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html) ([doxygen log](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_release_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). @@ -22,14 +22,14 @@ OpenMS follows the Gitflow development workflow that is described [here] (http:/ We encourage every developer (even if he is eligible to push directly to OpenMS) to create his own fork (e.g. @username). The GitHub people provide documentation on [forking](https://help.github.com/articles/fork-a-repo) and how to [keep your fork up-to-date](https://help.github.com/articles/syncing-a-fork). With your own fork you can follow the Gitflow development model directly, but instead of merging into `develop` in your own fork you can open a [pull request] (https://help.github.com/articles/using-pull-requests). Before opening the pull request, please check the [checklist](alinkstob). -Some more details and tips are collected [here] (alinkstob). +Some more details and tips are collected [here](alinkstob). ## Coding Conventions See the manual for coding style recommended by OpenMS: [Coding conventions](alinkstob). also see: [C++ Guide](alinkstob). -See the [manual](https://github.com/OpenMS/OpenMS/wiki/NewBuildUnit) for creating a new build unit (to be completed). +See the [manual](alinkstob) for creating a new build unit (to be completed). We automatically test for common coding convention violations using a modified version of `cpplint`. Style testing can be enabled using `cmake` options. We also provide a configuration file for `Uncrustify` for automated style corrections (see `tools/uncrustify.cfg`). @@ -48,7 +48,7 @@ Nightly tests: [CDASH](http://cdash.openms.de/index.php?project=OpenMS) ### Guidelines for adding new dependency libraries -View the guidelines for [adding new dependency libraries](https://github.com/OpenMS/OpenMS/wiki/Developer-Guidelines-for-adding-new-dependent-libraries). +View the guidelines for [adding new dependency libraries](alinkstob). ### Experimental installers diff --git a/openms-wiki/for-developers.rst b/openms-wiki/for-developers.rst deleted file mode 100644 index 3e999fb3..00000000 --- a/openms-wiki/for-developers.rst +++ /dev/null @@ -1,72 +0,0 @@ -============== -For Developers -============== - -Developing with OpenMS -********************** -If you would like to contribute to OpenMS, this is how to best get started: - -- Familiarize yourself with our `online documentation `_. - -- Learn how to `build OpenMS `_. - -- Start reading the `OpenMS tutorial for developers `_. - -- Any questions can be directed at the mailing list. - -OpenMS tutorial for developers -****************************** -Please read the `OpenMS tutorial for developers `_ -which contains general information about the structure of OpenMS, the concepts -behind it and example code. - -Technical Documentation -*********************** -See the documentation for the nightly snapshot of `develop `_ (`doxygen log `_). - -See the documentation for the latest `release `_ (`doxygen log `_). - -Development model -***************** -OpenMS follows the Gitflow development workflow which is excellently described `here `_. Additionally we encourage every developer (even if he is eligible to push directly to OpenMS) to create his own fork (e.g. @username). The GitHub people provide superb documentation on `forking `_ and how to keep your fork `up-to-date `_. With your own fork you can follow the Gitflow development model directly, but instead of merging into "develop" in your own fork you can open a `pull request `_. Before opening the pull request, please check the `checklist `_ - -Some more details and tips are collected `here `_. - -Coding Conventions -****************** -See the manual for proper coding style: `Coding conventions `_ -also see: `C++ Guide `_. - -See the `manual `_ for creating a new build unit (to be completed). - -We automatically test for common coding convention violations using a modified version of cpplint. -Style testing can be enabled using CMake options. We also provide a configuration file for Uncrustify for automated style corrections (see "tools/uncrustify.cfg"). - -Commit Messages -*************** -In order to ease the creation of a CHANGELOG we use a defined format for our commit messages. - -See the manual for proper commit messages: `How to write commit messages `_. - -Automated Unit Tests -******************** -We perform nightly test runs on different platforms. Even if everything compiled well on your machine and all tests passed, please check if you broke another platform on the next day. - -Nightly tests: `CDASH `_ - -Further developer resources -*************************** - -Guidelines for addition of new dependency libraries -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -See `here `_. - -Experimental Installers -^^^^^^^^^^^^^^^^^^^^^^^ -We automatically build installers for different platforms. These usually contain unstable or partially untested code - so use them at your own risk. - -The nightly (unstable) installers are available `here `_. - -Developer FAQ (formerly Internal FAQ) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The `FAQ `_ for developers is currently expanded and might contain answers to your questions. From 8ed8f260d7d53e1133361ad05695d95e9215cb71 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Wed, 18 May 2022 21:04:09 +0930 Subject: [PATCH 59/77] fixed some links and deleted for-developers.md --- openms-wiki/building-openms.md | 2 +- openms-wiki/for-developers.md | 71 ------------------------ openms-wiki/reporting-bugs-and-issues.md | 2 +- openms-wiki/users-quickstart-guide.md | 6 +- 4 files changed, 5 insertions(+), 76 deletions(-) delete mode 100644 openms-wiki/for-developers.md diff --git a/openms-wiki/building-openms.md b/openms-wiki/building-openms.md index e6135948..ad8924b4 100644 --- a/openms-wiki/building-openms.md +++ b/openms-wiki/building-openms.md @@ -1,4 +1,4 @@ -# Building OpenMS +# Build OpenMS To build OpenMS, please follow the build instructions: diff --git a/openms-wiki/for-developers.md b/openms-wiki/for-developers.md deleted file mode 100644 index 923aa407..00000000 --- a/openms-wiki/for-developers.md +++ /dev/null @@ -1,71 +0,0 @@ -# For Developers - -## Developing With OpenMS - -To contribute to OpenMS, you should: - -* Familiarize yourself with our [online documentation] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html). - -* Learn how to [build OpenMS] (building-openms.md). - -* Start reading the [OpenMS tutorial for developers] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/OpenMS_tutorial.html). - -* Direct any questions to the mailing list. - -## OpenMS Tutorial For Developers - -Please read the [OpenMS tutorial for developers] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/OpenMS_tutorial.html) -that contains general information about the structure of OpenMS, the concepts -behind it and example code. - -## Technical Documentation - -See the documentation for the nightly snapshot of [develop] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/nightly/html/index.html) ([doxygen log] (https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_nightly_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). - -See the documentation for the latest [release] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html) ([doxygen log] (https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_release_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). - -## Development Model - -OpenMS follows the Gitflow development workflow that [this post] (http://nvie.com/posts/a-successful-git-branching-model) excellently describes. We encourage every developer (even if they are eligible to push directly to OpenMS) to create their fork (e.g. @username). The GitHub people provide excellent documentation on [forking] (https://help.github.com/articles/fork-a-repo) and how to keep your [fork up-to-date] (https://help.github.com/articles/syncing-a-fork). With your fork, follow the Gitflow development model directly, but instead of merging into "develop" in your fork, open a [pull request ](https://help.github.com/articles/using-pull-requests). Before opening the pull request, please check the [checklist](https://github.com/OpenMS/OpenMS/wiki/Pull-Request-Checklist). - -Some more details and tips are collected [here] (https://github.com/OpenMS/OpenMS/wiki/OpenMS-Git-Workflow). - -## Coding Conventions - -See the manual for proper coding style: [Coding conventions] (https://github.com/OpenMS/OpenMS/wiki/Coding-conventions). -Also see: [C++ Guide](http://https://github.com/OpenMS/OpenMS/wiki/Cpp-Guide). - -See the [manual] (https://github.com/OpenMS/OpenMS/wiki/NewBuildUnit) for creating a new build unit (to be completed). - -We automatically test for common coding convention violations using a modified version of `cpplint`. -Style testing can be enabled using CMake options. We also provide a configuration file for Uncrustify for automated style corrections (see `tools/uncrustify.cfg`). - -## Commit Messages - -To ease the creation of a CHANGELOG, we use a defined format for our commit messages. - -See the manual for writing `commit` messages: [How to write `commit` messages] (http://https://github.com/OpenMS/OpenMS/wiki/HowTo---Write-Commit-Messages). - -## Automated Unit Tests - -We perform nightly test runs on different platforms. Even if everything compiled well on your machine and all tests have passed, please check if you broke another platform. - -Nightly tests: [CDASH] (http://cdash.openms.de/index.php?project=OpenMS) - -## Further Developer Resources - -### Guidelines for the Addition of New Dependency Libraries - -See [here] (https://github.com/OpenMS/OpenMS/wiki/Developer-Guidelines-for-adding-new-dependent-libraries). - -### Experimental Installers - -We automatically build installers for different platforms. These usually contain unstable or partially untested code, so use them at your own risk. - -The nightly (unstable) installers are available [here] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/). - -### Developer FAQ (Formerly Internal FAQ) - -The [FAQ] (requires link) for developers is currently expanded and might contain answers to your questions. - - diff --git a/openms-wiki/reporting-bugs-and-issues.md b/openms-wiki/reporting-bugs-and-issues.md index c4a49c78..fe7adba5 100644 --- a/openms-wiki/reporting-bugs-and-issues.md +++ b/openms-wiki/reporting-bugs-and-issues.md @@ -2,7 +2,7 @@ A list of known issues in the current OpenMS release can be found here. Please check if your OpenMS version matches the current version and if the bug has already been reported. -In order to report a new bug, please use either our [GitHub issues system] (https://github.com/OpenMS/OpenMS/wiki/Writing-and-labelling-GitHub-issues) or contact us through the general OpenMS mailing list. +In order to report a new bug, please use either our [GitHub issues system](https://github.com/OpenMS/OpenMS/wiki/Writing-and-labelling-GitHub-issues) or contact us through the general OpenMS mailing list. Include the following information in your bug report: * the command line (i.e. call) including the TOPP tool and the arguments you used, or the steps you followed in a GUI tool (e.g. TOPPView) - e.g. `FeatureFinderCentroided -in myfile.mzML -out myfile.featureXML` diff --git a/openms-wiki/users-quickstart-guide.md b/openms-wiki/users-quickstart-guide.md index cd0562e6..f85a2e89 100644 --- a/openms-wiki/users-quickstart-guide.md +++ b/openms-wiki/users-quickstart-guide.md @@ -1,7 +1,7 @@ # Users Quick Start Guide -Download the current stable version of OpenMS from the [OpenMS download site](http://open-ms.de/downloads) or via the [OpenMS docker containers](https://github.com/OpenMS/OpenMS/wiki/OpenMS-Docker-Containers). +Download the current stable version of OpenMS from the [OpenMS download site](http://open-ms.de/downloads) or via the [OpenMS docker containers](alinkstob). -Familiarise yourself with OpenMS by reading [Röst et al, OpenMS: a flexible open-source software platform for mass spectrometry data analysis. Nat Methods. 2016](https://www.ncbi.nlm.nih.gov/pubmed/27575624) as well as the [Getting Started] (http://www.openms.de/getting-started) page on openms.de. +Familiarise yourself with OpenMS by reading [Röst et al, OpenMS: a flexible open-source software platform for mass spectrometry data analysis. Nat Methods. 2016](https://www.ncbi.nlm.nih.gov/pubmed/27575624) as well as the [Getting Started](http://www.openms.de/getting-started) page on openms.de. -Read the OpenMS documentation (especially for TOPP) available from the [OpenMS documentation site](http://www.openms.de/current_doxygen) or in the folder doc/index.html of stable releases. You can download some example workflows with optimised parameter settings from the [repository](https://github.com/OpenMS/OpenMS/wiki/Workflow-Collection). To understand which tools are available, read the [TOPP Tool documentation page](http://www.openms.de/current_doxygen/html/TOPP_documentation.html) as well as the [UTILS Tool documentation page](http://www.openms.de/current_doxygen/html/UTILS_documentation.html). +Read the OpenMS documentation (especially for TOPP) available from the [OpenMS documentation site](http://www.openms.de/current_doxygen) or in the folder doc/index.html of stable releases. You can download some example workflows with optimised parameter settings from the [repository](alinkstob). To understand which tools are available, read the [TOPP Tool documentation page](http://www.openms.de/current_doxygen/html/TOPP_documentation.html) as well as the [UTILS Tool documentation page](http://www.openms.de/current_doxygen/html/UTILS_documentation.html). From 569c4d2bb15b63c6b5f1b14e0676d46569712f76 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Thu, 19 May 2022 20:10:40 +0930 Subject: [PATCH 60/77] modified about.md, deleted building-openms.md, created build-openms-from-source.md, developer-faq.md --- openms-wiki/about.md | 10 +- openms-wiki/build-openms-from-source.md | 10 + openms-wiki/building-openms.md | 11 - openms-wiki/contact.md | 5 - openms-wiki/contributors-quickstart-guide.md | 37 +- openms-wiki/developer-faq.md | 506 +++++++++++++++++++ 6 files changed, 541 insertions(+), 38 deletions(-) create mode 100644 openms-wiki/build-openms-from-source.md delete mode 100644 openms-wiki/building-openms.md delete mode 100644 openms-wiki/contact.md create mode 100644 openms-wiki/developer-faq.md diff --git a/openms-wiki/about.md b/openms-wiki/about.md index 20c921d6..9cd7a2dc 100644 --- a/openms-wiki/about.md +++ b/openms-wiki/about.md @@ -1,12 +1,14 @@ -# About +About +===== -OpenMS is an open-source C++ library for mass spectrometry (MS) data management and analyses. It offers an infrastructure for the rapid development of mass spectrometry-related software. OpenMS is free software available under the three-clause BSD license. It runs under Windows, Mac OS X and Linux. +OpenMS is an open-source C++ library for Mass Spectrometry (MS) data management and analyses. It offers an infrastructure for the rapid development of mass spectrometry-related software. OpenMS is free software available under the [three-clause BSD license](https://github.com/OpenMS/OpenMS-docs/blob/main/LICENSE). It is available for Windows, Mac OS X and Linux. -OpenMS comes with a vast variety of pre-built and ready-to-use tools for proteomics and metabolomics data analysis (TOPP tools) and powerful 2D and 3D visualization (TOPPView). It supports analyses for various quantification protocols, including label-free shotgun proteomics, SILAC, iTRAQ, SRM, and SWATH. It also provides built-in algorithms for peptide/protein identification, both de-novo and via database searching, as well as adapters to state-of-the art tools like X! Tandem, Mascot, OMSSA and others. +OpenMS comes with a vast variety of pre-built and ready-to-use tools for proteomics and metabolomics data analysis (TOPP tools), and powerful 2D and 3D visualisation (TOPPView). It supports analyses for various quantification protocols, including label-free shotgun proteomics, SILAC, iTRAQ, SRM, and SWATH. It also provides built-in algorithms for peptide/protein identification, both de-novo and via database searching, as well as adapters to state-of-the-art tools like X! Tandem, Mascot, OMSSA, and others. -Through the TOPP tools concept and unified parameter handling (CTD), OpenMS supports easy integration into workflow engines like TOPPAS (included), KNIME, Galaxy, or WS-PGRADE. +Through the TOPP tools concept and unified parameter handling (CTD), OpenMS supports easy integration into workflow engines like TOPPAS (included), KNIME, Galaxy, and WS-PGRADE. With pyOpenMS, OpenMS offers Python bindings to a large part of the API to enable rapid computational mass spectrometry development. OpenMS supports the Proteomics Standard Initiative (PSI) file formats for MS data. + The main contributors of OpenMS are currently Eberhard-Karls Universität in Tübingen, Freie Universität Berlin and ETH Zurich. diff --git a/openms-wiki/build-openms-from-source.md b/openms-wiki/build-openms-from-source.md new file mode 100644 index 00000000..9347d701 --- /dev/null +++ b/openms-wiki/build-openms-from-source.md @@ -0,0 +1,10 @@ +Build OpenMS From Source +======================== + +To build OpenMS, please follow the build instructions for: + +* [Linux](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_linux.html) +* [OSX](ihttps://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_mac.html) +* [Windows](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_win.html) + +Instructions to build pyOpenMS can be found in the [pyOpenMS documentation](https://pyopenms.readthedocs.io/en/latest/build_from_source.html). diff --git a/openms-wiki/building-openms.md b/openms-wiki/building-openms.md deleted file mode 100644 index ad8924b4..00000000 --- a/openms-wiki/building-openms.md +++ /dev/null @@ -1,11 +0,0 @@ -# Build OpenMS - -To build OpenMS, please follow the build instructions: - -* [Instructions for Linux](instructions-for-linux.md) -* [Instructions for OSX](instructions-for-osx.md) -* [Instructions for Windows](instructions-for-windows.md) - -For certain special builds, find instructions here: - -* Instructions to [build pyOpenMS on Windows](alinkstob) diff --git a/openms-wiki/contact.md b/openms-wiki/contact.md deleted file mode 100644 index 7df0ff40..00000000 --- a/openms-wiki/contact.md +++ /dev/null @@ -1,5 +0,0 @@ -# Getting in Contact - -For general problems, bug reports and questions, contact us on [Gitter](https://gitter.im/OpenMS/OpenMS) for real-time interaction with the developers or write to the mailing list [open-ms-general](https://lists.sourceforge.net/lists/listinfo/open-ms-general/). - -If you want to be informed of new versions of OpenMS, subscribe to the mailing list [open-ms-announcements](https://lists.sourceforge.net/lists/listinfo/open-ms-announcements). diff --git a/openms-wiki/contributors-quickstart-guide.md b/openms-wiki/contributors-quickstart-guide.md index 4e20d47d..cbbcaef2 100644 --- a/openms-wiki/contributors-quickstart-guide.md +++ b/openms-wiki/contributors-quickstart-guide.md @@ -1,4 +1,5 @@ -# Contribute to OpenMS +Contribute to OpenMS +==================== If you would like to contribute to OpenMS: @@ -6,56 +7,56 @@ If you would like to contribute to OpenMS: * Learn how to [build OpenMS](https://github.com/OpenMS/OpenMS/wiki/Building-OpenMS). -* Start reading the [OpenMS tutorial for developers](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/OpenMS_tutorial.html). +* Check out the [OpenMS tutorial for developers](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/OpenMS_tutorial.html). Any questions can be directed at the mailing list. -## Technical Documentation +# Technical Documentation Untested installers, containers, etc., known as the nightly snapshot, are released every night. They generally pass automated continuous integration tests but no manual tests. Access the documentation for the nightly snapshot of [OpenMS develop branch](https://github.com/OpenMS/OpenMS/tree/develop) [here](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/nightly/html/index.html). Access the doxygen log from [here](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_nightly_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log). See the documentation for the [latest release] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html) ([doxygen log](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_release_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). -## Development Model +# Development Model OpenMS follows the Gitflow development workflow that is described [here] (http://nvie.com/posts/a-successful-git-branching-model/). -We encourage every developer (even if he is eligible to push directly to OpenMS) to create his own fork (e.g. @username). The GitHub people provide documentation on [forking](https://help.github.com/articles/fork-a-repo) and how to [keep your fork up-to-date](https://help.github.com/articles/syncing-a-fork). With your own fork you can follow the Gitflow development model directly, but instead of merging into `develop` in your own fork you can open a [pull request] (https://help.github.com/articles/using-pull-requests). Before opening the pull request, please check the [checklist](alinkstob). +We encourage every developer (even if they are eligible to push directly to OpenMS) to create their own fork (e.g. @username). The GitHub people provide documentation on [forking](https://help.github.com/articles/fork-a-repo) and how to [keep your fork up-to-date](https://help.github.com/articles/syncing-a-fork). With your own fork you can follow the Gitflow development model, but instead of merging into `develop` in your own fork you can open a [pull request] (https://help.github.com/articles/using-pull-requests). Before opening the pull request, please check the [checklist](alinkstob). -Some more details and tips are collected [here](alinkstob). +Some more details and tips are collected [here](). -## Coding Conventions +# Coding Conventions -See the manual for coding style recommended by OpenMS: [Coding conventions](alinkstob). -also see: [C++ Guide](alinkstob). +See the manual for coding style recommended by OpenMS: [Coding conventions](). +also see: [C++ Guide](). -See the [manual](alinkstob) for creating a new build unit (to be completed). +View the [manual]() for creating a new build unit (to be completed). We automatically test for common coding convention violations using a modified version of `cpplint`. Style testing can be enabled using `cmake` options. We also provide a configuration file for `Uncrustify` for automated style corrections (see `tools/uncrustify.cfg`). -## Commit Messages +# Commit Messages -See the guidelines for commit messages: [How to write commit messages] (alinkstob). +View the guidelines for commit messages: [How to write commit messages] (alinkstob). -## Automated Unit Tests +# Automated Unit Tests We perform nightly test runs on different platforms. Try to test on as many platforms as possible. This will save you time and surprises during continuous integration tests. Nightly tests: [CDASH](http://cdash.openms.de/index.php?project=OpenMS) -## Further Developer Resources +# Further Developer Resources -### Guidelines for adding new dependency libraries +## Guidelines for adding new dependency libraries View the guidelines for [adding new dependency libraries](alinkstob). -### Experimental installers +## Experimental installers We automatically build installers for different platforms. These usually contain unstable or partially untested code. Use them at your own risk. The nightly (unstable) installers are available [here](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/). -### Developer FAQ +## Developer FAQ -Visit the [Developer FAQ](alinkstob) page to get answers to frequently asked questions. +Visit the [Developer FAQ](developer-faq.rst) page to get answers to frequently asked questions. diff --git a/openms-wiki/developer-faq.md b/openms-wiki/developer-faq.md new file mode 100644 index 00000000..8c299660 --- /dev/null +++ b/openms-wiki/developer-faq.md @@ -0,0 +1,506 @@ +Developer FAQ +============= + +This FAQ is for developers. Note that some actions require special permissions like e.g. updating the website. + +#Troubleshooting + +OpenMS complains about boost not being found but I'm sure its there! +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``CMake`` got confused. Set up a new build directory and try again. If you build in-source (not recommended), deleting the ``CMakeCache.txt`` and ``cmake`` directory might help. + +# General information +******************* + +## I am new to OpenMS. What should I do first? + +* Check out the development version of OpenMS (see website). +* Try and build OpenMS according to the installation instructions. +* Read the OpenMS Coding Convention. +* Read the OpenMS Tutorial. +* Create a GitHub account +* Register to the open-ms-general and open-ms-developers mailing list. (You can see the developers list only if you are logged in to Sourceforge and if you are a OpenMS developer). + +## What is the difference between an OpenMS tool and util? + +A tool starts its lifecycle in UTILS and may exist without being thoroughly tested. Tools may be promoted from UTILS to TOOLS if they are stable enough, are fully tested, fully documented and a test workflow exists. + +## I have written a class for OpenMS I want to contribute. What should I do? + +Basically, you must conform to the OpenMS [coding conventions](). + +Coding style (brackets, variable names, etc.) must conform to the conventions. + +* The class and all the members must be documented thoroughly. +* You can check your code with the tool `tools/checker.php`. Call `php tools/checker.php` for detailed instructions. + +Please open a pull request and follow the `checklist `_. + +## How do I update the `openms.de `_ website? + +Login to the wordpress admin area at www.openms.de/wp-admin with your username and password assigned by the current Homepage maintainers. + +## Can I use QT designer to create GUI widgets? + +Yes! If you want to create a class called `Widget: Create .ui-File` with `QT designer` and store it as `Widget.ui.`, add the class to `sources.cmake`. +From the .ui-File the file `include/OpenMS/VISUAL/UIC/ClassTemplate.h` is generated by the build system. +DO NOT CHECK-IN THIS FILE, AS IT IS GENERATED AUTOMATICALLY, WHEN NEEDED!!! +Derive the class ``Widget`` from ``WidgetTemplate``. You need to check in the ``Widget.h`` and ``Widget.cpp`` files. + +## Can the START_SECTION-macro not handle template methods that have two or more arguments? + +Put round brackets around the method declaration. Then it should work. + +## Where can I find the binary installers created? + +View the binary installers at https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/. +Please verify the creation date of the individual installers, as there may have been an error while creating the installer. + +# Build System + +## What is cmake? + +`CMake` builds BuildSystems for different platforms, e.g. VisualStudio Solutions on Windows, Makefiles on Linux etc. +This allows us to define in one central location (namely `CMakeLists.txt`) how OpenMS is build and have the platform specific stuff handled by `CMake`. +See http://www.cmake.org for more information. + +## How do I use cmake? + +See Installation instructions for your platform. +In general, you call ``CMake(.exe)`` with some parameters to create the native build-system. +Afterwards you can (but usually don't have to edit the current configuration using a GUI named ``ccmake`` (or ``CMake-GUI`` in Windows), which ships with ``CMake``). +Note: whenever ``ccmake`` is mentioned in this document, substitute this by ``CMake-GUI`` if your OS is Windows. You can also edit the ``CMakeCache.txt`` file directly. + +## How do I generate a build-system for Eclipse, KDevelop, CodeBlocks etc? + +Type ``cmake`` into a console. This will list the available code generators available on your platform, which you can pass to ``CMake`` using the ``-G`` option. + +## What are user definable cMake cache variables? + +They allow the user to pass options to ``CMake`` which will influence the build system. The most important option which should be given when calling ``CMake.exe`` is: + +``CMAKE_FIND_ROOT_PATH``, which is where ``CMake`` will search for additional libraries if they are not found in the default system paths. By default we add `OpenMS/contrib`. + +If your have installed all libraries on your system already there is no need to change ``CMAKE_FIND_ROOT_PATH``. If you need the `contrib` libraries, you will need to set this variable. +On Windows, you always need the ``contrib`` folder, as there are no system developer packages. To pass this variable to ``CMake`` use the ``-D`` switch e.g. ``cmake -D CMAKE_FIND_ROOT_PATH:PATH="D:\\somepath\\contrib"``. +Everything else can be edited using ``ccmake`` afterwards. + +The following options are of interest: + +* ``CMAKE_BUILD_TYPE`` Define if you want to build Debug or Release version of OpenMS. Release is the default. + +* ``CMAKE_FIND_ROOT_PATH`` The path to the ``contrib`` libraries. Note that you can also provide more then one value here (e.g., `-D CMAKE_FIND_ROOT_PATH="/path/to/contrib;/usr/"` will search in your `contrib` path and in `/usr` for the required libraries) + +* ``STL_DEBUG`` Enables STL debug mode. + +* ``DB_TEST`` (deprecated) Enables database testing. + +* ``QT_DB_PLUGIN`` (deprecated) Defines the db plugin used by Qt. + +* ``MT_CUDA_BUILD_TYPE`` ... + +Their description will be displayed when you call ``ccmake``. + +## Can I use another solver than GLPK?! + + +Yes, but by default the build system only links against GLPK (this is how OpenMS binary packages must be build!). +To use another solver try ``cmake ... -D USE_COINOR=1 ....`` and look at the documentation of the ``LPWrapper`` class. + +## How do I switch to Debug/Release configuration?! + +For Makefile generators (typically on Linux) you can set the ``CMAKE_BUILD_TYPE`` variable to either Debug or Release by calling ``ccmake``. +For Visual Studio, this is not necessary as all configurations are generated and you can choose the one you like within the IDE itself. +The 'Debug' configuration enabled debug information. The 'Release' configuration disables debug information and enables optimization. + +## I changed the `contrib` path, but re-running `CMake` won't change the library paths? + +Once a library is found and its location is stored in a cache variable, it will only be searched again if the corresponding entry in the cache file is set to false. +You can simply delete the ``CMakeCache.txt``, but all other custom settings will be lost as well. + +## What are the most useful `make` targets? + +In Visual Studio you can see all targets on the left. For Makefiles type make help. However, this list is quite long. +The most useful targets will be shown to you by calling the targets target, i.e. make targets. + +## CMake can't seem to find a Qt library (usually QtCore)! What now? + +``CMake`` finds QT by looking for ``qmake`` in your PATH or for the Environment Variable ``QTDIR``! Set these accordingly. +If the problem still persists: do you have a second installation of Qt (especially the MinGW version?)? This might lead ``CMake`` to the wrong path (it's searching for the ``Qt*.lib`` files). +You should only move/delete the offending Qt version if you know what you are doing! +A save workaround is to edit the ``CMakeCache`` file (e.g. via ``ccmake``) and set all paths relating to QT (e.g. ``QT_LIBRARY_DIR``) manually. + +## (Windows) What version of Visual Studio should I use? + +Use the latest if you can. Get the latest ``CMake``, as its generator needs to support your VS. If your VS is too new and there is no ``CMake`` for that yet, you're gonna be faced with a lot of conversion issues. +This happens whenever the Build-System calls ``CMake`` (which can be quite often, e.g., after changes to ``CMakeLists.txt``). + +## How do I add a new class MyClass to the build system? + +1. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in ``src//include/OpenMS`` and the cpp file in ``src//source``, e.g., ``src/openms/include/OpenMS/FORMAT/NewFileFormat.h`` and ``src/openms/source/FORMAT/NewFileFormat.cpp``. +2. Add both to the respective sources.cmake file in the same directory (e.g., ``src/openms/source/FORMAT/`` and ``src/openms/include/OpenMS/FORMAT/``). +3. Add the corresponding class test to src/tests/class_tests// (e.g., ``src/tests/class_tests/openms/source/NewFileFormat_test.cpp``). +4. Add the test to the ``executables.cmake`` file in the test folder (e.g., ``src/tests/class_tests/openms/executables.cmake``). +5. Add them to git by using the command ``git add``. + +## How do I add a new directory MYDIR to the build system? + +1. Create two new ``sources.cmake`` files (one for ``src//include/OpenMS/MYDIR``, one for ``src//source/MYDIR``), using existing ``sources.cmake`` files as template. +2. Add the new ``sources.cmake`` files to ``src//includes.cmake`` +3. If you created a new directory directly under ``src/openms/source``, then have a look at ``src/tests/class_tests/openms/executables.cmake``. +4. Add a new section that makes the unit testing system aware of the new (upcoming) tests. +5. Look at the very bottom and augment ``TEST_executables``. +6. Add a new group target to ``src/tests/class_tests/openms/CMakeLists.txt``. + +## Class/Unit tests and TOPP/Tool tests + +Class tests are unit tests that typically test the functionality of a class. + +They get built as standalone, additional executables that include the class to be tested and the testing utility classes to test outcomes of single functions of the class in question. + +Unless you added functions that are intended to be used outside of your new additional mode, you don't need to add anything there. + +Tool tests are using the tool executable that the user would also receive. We use those executables to run the full algorithm on a small test dataset, to ensure that from version to version the results stay the same and are meaningful. + +Each tool test consists of: + +* An executable call on a test dataset (by using either fixed command line parameters or an ini file). + +* A `FuzzyDiff` call that compares the temporary output file of the last call and a reference test output that you have to provide. + +* a line to add a dependency of the FuzzyDiff call on the actual executable call (so they get executed after each other). + +Use e.g., ``ctest -V -R IDMapper`` to only test tests that include the regex ``IDMapper`` (-V is just verbose). Make sure to build the ``IDMapper`` and ``IDMapper_test`` (if edited) executable first everytime. +``ctest`` does not have any automatic dependency on the timestamps of the executables. + +## How do I add a new test for the class MyClass? + +You should always add a test alongside every new class added to OpenMS. +To add a new class test: + +1. Add the class test to ``src/tests/class_tests//`` (e.g., ``src/tests/class_tests/openms/source/NewFileFormat_test.cpp``). +2. Add the test to the ``executables.cmake`` file in the test folder. +3. Add them to git using the ``git add`` command. + +A test template for your specific class can be generated by the ``create_test.php`` script found in ``tools/``. + +1. Make sure you generated XML files containing the class information make doc_xml +2. Call: + + `php tools/create_test.php /BUILD_DIRECTORY/ / PATH_TO_HEADER/MyClass.h \ "FIRSTNAME LASTNAME" > ./src/tests/class_tests/openms/source/MyClass_test.cpp` + +## How do I add a new GUI test (for QT Gui classes) for the class MyClass? +To add a new GUI test: + +1. Create the ``MyClass_test.cpp`` in ``src/tests/class_tests/openms_gui/source``. +2. Add it to ``src/tests/class_tests/openms_gui/CMakeLists.txt`` in the GUI section. +3. Have a look at existing GUI tests, as they use the ``QT TestLib`` framework and not the OpenMS macros. + +## (Linux) All tests fail when you execute `make test` + +Check the ``LD_LIBRARY_PATH`` environment variable: + +You can print the ``LD_LIBRARY_PATH`` with ``echo $LD_LIBRARY_PATH``. If your ``/lib/`` folder is included, check that ``libOpenMS.so`` is present. +With the ``ldd`` command, you can show the libraries used by an executable, e.g. ``ldd /bin/ClassTest_test``. + +## How can I speed up the compile process of OpenMS? + +To spped up the compile process of OpenMS, use several threads. If you have several processors/cores, you can build OpenMS classes/tests and TOPP tools in in several threads. On Linux use the `make option -j: make -j8 OpenMS TOPP test_build`. + +On Windows, Visual Studio solution files are automatically build with the /MP flag, such that VS uses all available cores of the machine. + +# Release + +see `Preparation-of-a-new-OpenMS-release `_ + +# Continuous integration + +## How does travis work? + +`Travis `_ is an automated system for continuous integration and each new commit and pull request is automatically run through the travis build system. +This is controlled by a ``.travis.yaml`` file in the source tree. + +## What can we do if travis times out? + +Try to simply restart travis, it sometimes hangs and since it builds on shared infrastructure, the next build may work better. This needs to be done by a OpenMS core developer. + +Since we use extensive caching, the build may take much longer when many files are touched and may never complete in that case (running into the travis time limit). In that case we can rebuild the cache using the following approach: +``` + $ git cherry-pick 89c5cd7f2d9d343b3d63fc6bab18e08dcd969c05 + + $ git push origin develop + + # Now wait for the build to complete + + $ git revert 89c5cd7f2d9d343b3d63fc6bab18e08dcd969c05 + + $ git push origin develop +``` + +# Working in IDE's + +## General: + +Why are there no `source/TEST` and `source/APPLICATIONS/TOPP|UTILS` folder? + +All source files added to an IDE are associated with their targets. You can find the source files for each test within its own subproject. The same is true for the ``TOPP`` and ``UTILS`` classes. + +How can I easily update a lot of test files (e.g., after a small format change in result files)? +_________________________________________________________________________________________________ + +Using ``grep`` one can simply extract the lines starting with ``diff FILENAME1 FILENAME2`` and replace the ``diff`` by ``copy``. + +Visual Studio: +^^^^^^^^^^^^^^ + +I'm getting the error "Error C2471: cannot update program database". +_____________________________________________________________________ + +This is a bug in Visual Studio and there is a bugfix: http://code.msdn.microsoft.com/KB946040 Only apply it if you encounter the error. The bugfix might have unwanted side effects! + + +Visual Studio can't read the clang-format file. +_______________________________________________ + +Depending on the Visual Studio version you're using you might get an error like "Error while formating with ClangFormat!". This is because Visual Studio is using an outdated version of clang-format. Unfortunately there is no easy way to update this using Visual Studio itself. +There is a plugin provided by LLVM designed to fix this exact problem, but the plugin doesn't work with every Visual Studio version. However, you can update clang-format by hand using the pre-build clang-format binary. Both the binary and a link to the plugin can be found here: https://llvm.org/builds/. +To update clang-format by hand just download the binary and exchange it with the clang-format binary in your Visual Studio folder. +For Visual Studio 17 and 19 it should be located at: ``C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\bin``. + +Eclipse CDT: +^^^^^^^^^^^^ + +The indexer gets stuck at some file which ``#includes seqan`` +_____________________________________________________________ + +It seems that SeqAn code is just too confusing for older eclipse C++ indexers. You should upgrade to eclipse galileo (CDT 6.0.x). Also, increase the available memory limit in eclipse.ini, e.g. -Xmx1024m for one gig. + + +The parser is confused after OPENMS_DLLAPI and does not recognize standard C++ headers +______________________________________________________________________________________ + +Go to ``Project -> Properties -> C/C++ Include Paths and Preprocessor Symbols -> Add Preprocessor symbol -> "OPENMS_DLLAPI="``. This tells eclipse that the macro is defined empty. In the same dialog you can also add an external include path to e.g. ``/usr/include/c++/4.3.3/``, etc. The issue with C++ headers was fixed in the latest galileo release. + +Hints to resolve the OPENMS_DLLAPI issue using the ``cmake`` generator are welcome! + +Debugging +********* + +How do I run a single test? +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You can can execute an OpenMS class test using the CTest regular expressions: + +.. code:: bash + + > ctest -V -R "^_test" + + # To build a class test, you simply call the respective make target in ./source/TEST: + + > make _test + +To run a TOPP test, you can use: + +.. code:: bash + + > ctest -V -R "TOPP_" + +To build the tool, use: + +.. code:: bash + > make + +How do I debug uncaught exceptions? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is a mechanism to have a core dumped if an uncaught exception occurs. + +To enable it, the environment variable ``OPENMS_DUMP_CORE`` has to be set. + +Each time an uncaught exception occurs, the ``OPENMS_DUMP_CORE`` variable is checked and a segmentation fault is caused, if it is set. + +(Linux) Why is no core dumped, although a fatal error occured? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Try the ``ulimit -c`` unlimited command. It sets the maximum size of a core to unlimited. + +Note: We observed that, on some systems, no core is dumped even if the size of the core file is set to unlimited. We are not sure what causes this problem + +(Linux) How can I set breakpoints in gdb to debug OpenMS? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Imagine you want to debug the TOPPView application and you want it to stop at line 341 of + +.. code:: bash + SpectrumMDIWindow.C. + Run gdb: + shell> gdb TOPPView + +Start the application (and close it): + +.. code:: bash + gdb> run [arguments] + +Set the breakpoint: + +.. code:: bash + gdb> break SpectrumMDIWindow.C:341 + +Start the application again (with the same arguments): + +.. code:: bash + gdb> run + +How can I find out which shared libraries are used by an application? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Linux: ``ldd`` + +Windows (Visual studio console): Try "Dependency Walker" (http://www.dependencywalker.com/) (use x86 for 32bit builds and the x64 version for 64bit builds. Using the wrong version of depends.exe will give wrong results!) or ``dumpbin /DEPENDENTS OpenMS.dll``. + +How can I get a list of the symbols defined in a (shared) library or object file? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Linux: ``nm `` + +Use ``nm -C`` to switch on demangling of low-level symbols into their C++-equivalent names. ``nm`` also accepts .a and .o files. + +Windows (Visual studio console): ``dumpbin /ALL `` + +You can use dumpbin on object files (.o) or (shared) library files (.lib) or the DLL itself e.g. ``dumpbin /EXPORTS OpenMS.dll``. + +Cross-platform thoughts +*********************** + +OpenMS runs on three major platforms, each one having its own ways of doing things. Here are the most prominent causes of "it runs on Platform A, but not on B. What now?" + +Reading/Writing binary files causes different behaviour ... Usually Linux does not make a difference between text-mode and binary-mode when reading files. This is quite different on Windows as some bytes are interpreted as EOF, which lead might to a premature end of the reading process. + +Thus, if reading binary files make sure that you explicitly state that the file is binary when opening it! + +During writing in text-mode on windows a line-break (\n) is expanded to (\r\n). Keep this in mind or use the eol-style property of subversion to ensure that line endings are correctly checked out on non-Windows systems. + +``unsigned int`` vs ``size_t`` (UInt and Size) UInt and Size are the same on Linux GCC (i.e. both have the same size, 32bit on 32bit systems, 64bit on 64 bit systems), however on Windows this only holds for 32bit. On a 64bit Windows the UInt type is still 32bit, Size is (obviously) 64bit. This might lead to warnings (at best) or overflows and other nasty stuff. +So make sure you do not rely on UInt being equal to Size - because they're not. + +Paths and system functions... + +This is trivial but hardcoding something like ``String tmp_dir = "/tmp";`` is a big no-no! This must fail on Windows! Use Qt's QDir to get a path to the systems temporary directory if required. + +Also calling things like uname which are only available on Linux: don't! + +When working with files or directories, it is usually safe to use "/" on all platforms. Even Windows understands that. Take care of spaces in directory names though. You should always quote paths if they are used in a system call to ensure that the subsequent interpreter takes the spaced path as a single entity. + + +PyOpenMS - Trouble shooting +*************************** + +How can I wrap my new method with PyOpenMS? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You will have to add an entry to ``src/pyOpenMS/pxds/CLASS_NAME.pxd`` with the signature of your new method(s). + +How can I wrap my new class with PyOpenMS? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You will have to create a new file ``src/pyOpenMS/pxds/CLASS_NAME.pxd`` which is explained `here `_. + +My method has multiple outputs. Can I use output parameters? I have trouble wrapping them for pyOpenMS. +******************************************************************************************************* + +Python does not support passing primitive types (int, double etc) by reference, there fore void calculate(double &) will not work. + +Doxygen documentation +********************* + +Where can I find the definition of the main page? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``OpenMS/doc/doxygen/public/Main.doxygen`` + +Where can I add a new module? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``OpenMS/doc/doxygen/public/Modules.doxygen`` + +How is the parameter documentation for classes derived from DefaultParamHandler created? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You have to add your class to the program ``OpenMS/doc/doxygen/parameters/DefaultParamHandlerDocumenter.cpp``. This program generates a html table with the parameters. This table can then be included in the class documentation using the following ``doxygen`` command: + + +``@htmlinclude OpenMS_.parameters`` + + +Note that parameter documentation is automatically generated for ``TOPP/UTILS`` included in the static ``ToolHandler.cpp`` tools list. To include TOPP/UTILS parameter documentation use following ``doxygen`` command: + + +``@htmlinclude TOPP_.parameters`` + +or + +``@htmlinclude UTILS_.parameters`` + +You can test if everything worked by calling make doc_param_internal. The parameters documentation is written to ``OpenMS/doc/doxygen/parameters/output/``. + + +How is the command line documentation for TOPP/UTILS tools created? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The program ``OpenMS/doc/doxygen/parameters/TOPPDocumenter.cpp`` creates the command line documentation for all classes that are included in the static ``ToolHandler.cpp`` tools list. It can be included in the documentation using the following ``doxygen`` command: + +``@verbinclude TOPP_.cli`` + +You can test if everything worked by calling ``make doc_param_internal``. The command line documentation is written to ``OpenMS/doc/doxygen/parameters/output/``. + +## What are the important files for adding a new tutorial section? + +OpenMS tutorial: + +* ``OpenMS/doc/OpenMS_tutorial/refman_overwrite.tex.in`` (for PDF tutorials) +* ``OpenMS/doc/doxygen/public/OpenMS_Tutorial_html.doxygen~`` (for html tutorials) + +TOPP and TOPPView tutorial: + +* ``OpenMS/doc/TOPP_tutorial/refman_overwrite.tex.in`` (for PDF tutorials) +* ``OpenMS/doc/doxygen/public/TOPP_Tutorial_html.doxygen`` (for html tutorials) + +# Bug fixes + +## How to contribute a bugfix? + +1. Submit the bug as a GitHub issue. +2. Create a feature branch (e.g. ``feature/fix_missing_filename_issue_615``) from your (up-to-date) develop branch in your fork of OpenMS. +3. Fix the bug and add a test. +4. Create a pull request for your branch. +5. After approval and merge make sure the issue is closed. + +## How can I profile my code? + +Try IBM's profiler, available for all platforms (and free for academic use): Purify(Plus) and/or Quantify. + +Windows: this is directly supported by Visual Studio (Depending on the edition: Team and above). Follow their documentation. + +Linux: + +* Build OpenMS in debug mode (set ``CMAKE_BUILD_TYPE`` to ``Debug``). +* Call the executable with valgrind: ``valgrind –tool=callgrind``. Note: other processes running on the same machine can influence the profiling. Make sure your application gets enough resources (memory, CPU time). +* You can start and stop the profiling while the executable is running e.g. to skip initialization steps: +* Start valgrind with the option ``–instr-atstart=no``. +* Call ``callgrind -i [on|off]`` to start/stop the profiling. +* The output can be viewed with ``kcachegrind callgrind.out``. + +## (Linux) How do I check my code for memory leaks? + +* Build OpenMS in debug mode (set ``CMAKE_BUILD_TYPE`` to ``Debug``). +* Call the executable with ``valgrind: valgrind --suppressions=OpenMS/tools/valgrind/openms_external.supp –leak-check=full ``. + +Common errors are: + +* ``'Invalid write/read ...'`` - Violation of container boundaries. +* ``'... depends on uninitialized variable'`` - Uninitialized variables: +* ``'... definitely lost'`` - Memory leak that has to be fixed +* ``'... possibly lost'`` - Possible wemory leak, so have a look at the code + +For more information see the valgrind documentation at http://valgrind.org/docs/manual/. From 9f33627ce465cab485cd806d601c882f46577ab6 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Fri, 20 May 2022 16:07:28 +0930 Subject: [PATCH 61/77] modified quickstart guide contributors, developer faq, reporting bugs, and user quick start guide --- openms-wiki/contributors-quickstart-guide.md | 33 +- openms-wiki/developer-faq.md | 299 +++++++++---------- openms-wiki/reporting-bugs-and-issues.md | 6 +- openms-wiki/users-quickstart-guide.md | 7 +- 4 files changed, 168 insertions(+), 177 deletions(-) diff --git a/openms-wiki/contributors-quickstart-guide.md b/openms-wiki/contributors-quickstart-guide.md index cbbcaef2..9715a714 100644 --- a/openms-wiki/contributors-quickstart-guide.md +++ b/openms-wiki/contributors-quickstart-guide.md @@ -11,13 +11,15 @@ If you would like to contribute to OpenMS: Any questions can be directed at the mailing list. -# Technical Documentation +## Technical Documentation Untested installers, containers, etc., known as the nightly snapshot, are released every night. They generally pass automated continuous integration tests but no manual tests. -Access the documentation for the nightly snapshot of [OpenMS develop branch](https://github.com/OpenMS/OpenMS/tree/develop) [here](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/nightly/html/index.html). Access the doxygen log from [here](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_nightly_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log). +View the documentation for the nightly snapshot of [OpenMS develop branch](https://github.com/OpenMS/OpenMS/tree/develop) at the [build archive](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/nightly/html/index.html). + +View the doxygen log from [here](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_nightly_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log). See the documentation for the [latest release] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html) ([doxygen log](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_release_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). -# Development Model +## Development Model OpenMS follows the Gitflow development workflow that is described [here] (http://nvie.com/posts/a-successful-git-branching-model/). @@ -25,7 +27,7 @@ We encourage every developer (even if they are eligible to push directly to Open Some more details and tips are collected [here](). -# Coding Conventions +## Coding Conventions See the manual for coding style recommended by OpenMS: [Coding conventions](). also see: [C++ Guide](). @@ -35,28 +37,27 @@ View the [manual]() for creating a new build unit (to be completed). We automatically test for common coding convention violations using a modified version of `cpplint`. Style testing can be enabled using `cmake` options. We also provide a configuration file for `Uncrustify` for automated style corrections (see `tools/uncrustify.cfg`). -# Commit Messages +## Commit Messages View the guidelines for commit messages: [How to write commit messages] (alinkstob). -# Automated Unit Tests +## Automated Unit Tests We perform nightly test runs on different platforms. Try to test on as many platforms as possible. This will save you time and surprises during continuous integration tests. Nightly tests: [CDASH](http://cdash.openms.de/index.php?project=OpenMS) -# Further Developer Resources - -## Guidelines for adding new dependency libraries - -View the guidelines for [adding new dependency libraries](alinkstob). +## Further Developer Resources -## Experimental installers +You may want to consider the following resources: +* **Guidelines for adding new dependency libraries** -We automatically build installers for different platforms. These usually contain unstable or partially untested code. Use them at your own risk. + View the guidelines for [adding new dependency libraries](). +* **Experimental installers** -The nightly (unstable) installers are available [here](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/). + We automatically build installers for different platforms. These usually contain unstable or partially untested code. Use them at your own risk. -## Developer FAQ + The nightly (unstable) installers are available at the [build archive](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/). +* **Developer FAQ** -Visit the [Developer FAQ](developer-faq.rst) page to get answers to frequently asked questions. + Visit the [Developer FAQ](developer-faq.md) to get answers to frequently asked questions. diff --git a/openms-wiki/developer-faq.md b/openms-wiki/developer-faq.md index 8c299660..596360d7 100644 --- a/openms-wiki/developer-faq.md +++ b/openms-wiki/developer-faq.md @@ -1,19 +1,15 @@ Developer FAQ ============= -This FAQ is for developers. Note that some actions require special permissions like e.g. updating the website. +The following contains answers to typical questions from developers about OpenMS. -#Troubleshooting +> **_NOTE:_** Some actions require special permissions like e.g. updating the website. -OpenMS complains about boost not being found but I'm sure its there! -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +## General -``CMake`` got confused. Set up a new build directory and try again. If you build in-source (not recommended), deleting the ``CMakeCache.txt`` and ``cmake`` directory might help. +The following section provides general information to new contributors. -# General information -******************* - -## I am new to OpenMS. What should I do first? +### I am new to OpenMS. What should I do first? * Check out the development version of OpenMS (see website). * Try and build OpenMS according to the installation instructions. @@ -22,144 +18,151 @@ OpenMS complains about boost not being found but I'm sure its there! * Create a GitHub account * Register to the open-ms-general and open-ms-developers mailing list. (You can see the developers list only if you are logged in to Sourceforge and if you are a OpenMS developer). -## What is the difference between an OpenMS tool and util? +### What is the difference between an OpenMS tool and util? -A tool starts its lifecycle in UTILS and may exist without being thoroughly tested. Tools may be promoted from UTILS to TOOLS if they are stable enough, are fully tested, fully documented and a test workflow exists. +A tool starts its lifecycle in `UTILS` and may exist without being thoroughly tested. Tools may be promoted from `UTILS` to `TOOLS` if they are stable enough, are fully tested, fully documented, and a test workflow exists. -## I have written a class for OpenMS I want to contribute. What should I do? +### I have written a class for OpenMS. What should I do? -Basically, you must conform to the OpenMS [coding conventions](). +Follow the OpenMS [coding conventions](). Coding style (brackets, variable names, etc.) must conform to the conventions. * The class and all the members must be documented thoroughly. * You can check your code with the tool `tools/checker.php`. Call `php tools/checker.php` for detailed instructions. -Please open a pull request and follow the `checklist `_. +Please open a pull request and follow the [checklist](pull-request-checklist.md). -## How do I update the `openms.de `_ website? +### How do I update the [openms.de](https://www.openms.de)? -Login to the wordpress admin area at www.openms.de/wp-admin with your username and password assigned by the current Homepage maintainers. +Login to the [wordpress admin area](www.openms.de/wp-admin) with your username and password assigned by the current Homepage maintainers. -## Can I use QT designer to create GUI widgets? +### Can I use QT designer to create GUI widgets? Yes! If you want to create a class called `Widget: Create .ui-File` with `QT designer` and store it as `Widget.ui.`, add the class to `sources.cmake`. From the .ui-File the file `include/OpenMS/VISUAL/UIC/ClassTemplate.h` is generated by the build system. DO NOT CHECK-IN THIS FILE, AS IT IS GENERATED AUTOMATICALLY, WHEN NEEDED!!! -Derive the class ``Widget`` from ``WidgetTemplate``. You need to check in the ``Widget.h`` and ``Widget.cpp`` files. +Derive the class `Widget` from `WidgetTemplate`. You need to check in the `Widget.h` and `Widget.cpp` files. -## Can the START_SECTION-macro not handle template methods that have two or more arguments? +### Can the START_SECTION-macro not handle template methods that have two or more arguments? Put round brackets around the method declaration. Then it should work. -## Where can I find the binary installers created? +### Where can I find the binary installers created? -View the binary installers at https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/. +View the binary installers at the [build archive](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/). Please verify the creation date of the individual installers, as there may have been an error while creating the installer. -# Build System +## Troubleshooting + +The following section provides information about how to troubleshoot common OpenMS issues. + +### OpenMS complains about boost not being found but I'm sure its there! + +`CMake` got confused. Set up a new build directory and try again. If you build in-source (not recommended), deleting the `CMakeCache.txt` and `cmake` directory might help. -## What is cmake? +## Build System + +The following questions are related to the build system. + +### What is CMake? `CMake` builds BuildSystems for different platforms, e.g. VisualStudio Solutions on Windows, Makefiles on Linux etc. This allows us to define in one central location (namely `CMakeLists.txt`) how OpenMS is build and have the platform specific stuff handled by `CMake`. -See http://www.cmake.org for more information. +View the [cmake website[(http://www.cmake.org) for more information. -## How do I use cmake? +### How do I use CMake? See Installation instructions for your platform. -In general, you call ``CMake(.exe)`` with some parameters to create the native build-system. -Afterwards you can (but usually don't have to edit the current configuration using a GUI named ``ccmake`` (or ``CMake-GUI`` in Windows), which ships with ``CMake``). -Note: whenever ``ccmake`` is mentioned in this document, substitute this by ``CMake-GUI`` if your OS is Windows. You can also edit the ``CMakeCache.txt`` file directly. +In general, you call `CMake(.exe)` with some parameters to create the native build-system. +Afterwards you can (but usually don't have to edit the current configuration using a GUI named `ccmake` (or `CMake-GUI` in Windows), which ships with `CMake`). +Note: whenever `ccmake` is mentioned in this document, substitute this by `CMake-GUI` if your OS is Windows. You can also edit the `CMakeCache.txt` file directly. -## How do I generate a build-system for Eclipse, KDevelop, CodeBlocks etc? +### How do I generate a build-system for Eclipse, KDevelop, CodeBlocks etc? -Type ``cmake`` into a console. This will list the available code generators available on your platform, which you can pass to ``CMake`` using the ``-G`` option. +Type `cmake` into a console. This will list the available code generators available on your platform, which you can pass to `CMake` using the `-G` option. -## What are user definable cMake cache variables? +### What are user definable CMake cache variables? -They allow the user to pass options to ``CMake`` which will influence the build system. The most important option which should be given when calling ``CMake.exe`` is: +They allow the user to pass options to `CMake` which will influence the build system. The most important option which should be given when calling `CMake.exe` is: -``CMAKE_FIND_ROOT_PATH``, which is where ``CMake`` will search for additional libraries if they are not found in the default system paths. By default we add `OpenMS/contrib`. +`CMAKE_FIND_ROOT_PATH`, which is where `CMake` will search for additional libraries if they are not found in the default system paths. By default we add `OpenMS/contrib`. -If your have installed all libraries on your system already there is no need to change ``CMAKE_FIND_ROOT_PATH``. If you need the `contrib` libraries, you will need to set this variable. -On Windows, you always need the ``contrib`` folder, as there are no system developer packages. To pass this variable to ``CMake`` use the ``-D`` switch e.g. ``cmake -D CMAKE_FIND_ROOT_PATH:PATH="D:\\somepath\\contrib"``. -Everything else can be edited using ``ccmake`` afterwards. +If your have installed all libraries on your system already there is no need to change `CMAKE_FIND_ROOT_PATH`. If you need the `contrib` libraries, you will need to set this variable. +On Windows, you always need the `contrib` folder, as there are no system developer packages. To pass this variable to `CMake` use the `-D` switch e.g. `cmake -D CMAKE_FIND_ROOT_PATH:PATH="D:\\somepath\\contrib"`. +Everything else can be edited using `ccmake` afterwards. The following options are of interest: -* ``CMAKE_BUILD_TYPE`` Define if you want to build Debug or Release version of OpenMS. Release is the default. - -* ``CMAKE_FIND_ROOT_PATH`` The path to the ``contrib`` libraries. Note that you can also provide more then one value here (e.g., `-D CMAKE_FIND_ROOT_PATH="/path/to/contrib;/usr/"` will search in your `contrib` path and in `/usr` for the required libraries) +* `CMAKE_BUILD_TYPE` Define if you want to build Debug or Release version of OpenMS. Release is the default. -* ``STL_DEBUG`` Enables STL debug mode. +* `CMAKE_FIND_ROOT_PATH` The path to the `contrib` libraries. Note that you can also provide more then one value here (e.g., `-D CMAKE_FIND_ROOT_PATH="/path/to/contrib;/usr/"` will search in your `contrib` path and in `/usr` for the required libraries) -* ``DB_TEST`` (deprecated) Enables database testing. +* `STL_DEBUG` Enables STL debug mode. -* ``QT_DB_PLUGIN`` (deprecated) Defines the db plugin used by Qt. +* `DB_TEST` (deprecated) Enables database testing. -* ``MT_CUDA_BUILD_TYPE`` ... +* `QT_DB_PLUGIN` (deprecated) Defines the db plugin used by Qt. -Their description will be displayed when you call ``ccmake``. +* `MT_CUDA_BUILD_TYPE` ... -## Can I use another solver than GLPK?! +View the description for each option by calling `ccmake`. +### Can I use another solver than GLPK? -Yes, but by default the build system only links against GLPK (this is how OpenMS binary packages must be build!). -To use another solver try ``cmake ... -D USE_COINOR=1 ....`` and look at the documentation of the ``LPWrapper`` class. +Yes, but by default the build system only links against GLPK (this is how OpenMS binary packages must be build). +To to use another solver try `cmake ... -D USE_COINOR=1 ....` and look at the documentation of the `LPWrapper` class. -## How do I switch to Debug/Release configuration?! +### How do I switch to debug or release configuration? -For Makefile generators (typically on Linux) you can set the ``CMAKE_BUILD_TYPE`` variable to either Debug or Release by calling ``ccmake``. +For Makefile generators (typically on Linux), you can set the `CMAKE_BUILD_TYPE` variable to either Debug or Release by calling `ccmake`. For Visual Studio, this is not necessary as all configurations are generated and you can choose the one you like within the IDE itself. -The 'Debug' configuration enabled debug information. The 'Release' configuration disables debug information and enables optimization. +The 'Debug' configuration enabled debug information. The 'Release' configuration disables debug information and enables optimisation. -## I changed the `contrib` path, but re-running `CMake` won't change the library paths? +### I changed the `contrib` path, but re-running `CMake` won't change the library paths? Once a library is found and its location is stored in a cache variable, it will only be searched again if the corresponding entry in the cache file is set to false. -You can simply delete the ``CMakeCache.txt``, but all other custom settings will be lost as well. +You can delete the `CMakeCache.txt`, but all other custom settings will be lost. -## What are the most useful `make` targets? +### What are the most useful `make` targets? In Visual Studio you can see all targets on the left. For Makefiles type make help. However, this list is quite long. The most useful targets will be shown to you by calling the targets target, i.e. make targets. -## CMake can't seem to find a Qt library (usually QtCore)! What now? +### `CMake` can't seem to find a `Qt` library (usually `QtCore`). What now? -``CMake`` finds QT by looking for ``qmake`` in your PATH or for the Environment Variable ``QTDIR``! Set these accordingly. -If the problem still persists: do you have a second installation of Qt (especially the MinGW version?)? This might lead ``CMake`` to the wrong path (it's searching for the ``Qt*.lib`` files). -You should only move/delete the offending Qt version if you know what you are doing! -A save workaround is to edit the ``CMakeCache`` file (e.g. via ``ccmake``) and set all paths relating to QT (e.g. ``QT_LIBRARY_DIR``) manually. +`CMake` finds `QT` by looking for `qmake` in your PATH or for the Environment Variable `QTDIR`. Set these accordingly. +If the problem still persists: do you have a second installation of Qt (especially the MinGW version)? This might lead ``CMake`` to the wrong path (it's searching for the ``Qt*.lib`` files). +You should only move or delete the offending `Qt` version if you know what you are doing! +A save workaround is to edit the `CMakeCache` file (e.g. via `ccmake`) and set all paths relating to `QT` (e.g. `QT_LIBRARY_DIR`) manually. -## (Windows) What version of Visual Studio should I use? +### (Windows) What version of Visual Studio should I use? -Use the latest if you can. Get the latest ``CMake``, as its generator needs to support your VS. If your VS is too new and there is no ``CMake`` for that yet, you're gonna be faced with a lot of conversion issues. -This happens whenever the Build-System calls ``CMake`` (which can be quite often, e.g., after changes to ``CMakeLists.txt``). +Use the latest if possible. Get the latest `CMake`, as its generator needs to support your VS. If your VS is too new and there is no `CMake` for that yet, you're gonna be faced with a lot of conversion issues. +This happens whenever the Build-System calls `CMake` (which can be quite often, e.g., after changes to `CMakeLists.txt`). -## How do I add a new class MyClass to the build system? +### How do I add a new class to the build system? -1. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in ``src//include/OpenMS`` and the cpp file in ``src//source``, e.g., ``src/openms/include/OpenMS/FORMAT/NewFileFormat.h`` and ``src/openms/source/FORMAT/NewFileFormat.cpp``. -2. Add both to the respective sources.cmake file in the same directory (e.g., ``src/openms/source/FORMAT/`` and ``src/openms/include/OpenMS/FORMAT/``). -3. Add the corresponding class test to src/tests/class_tests// (e.g., ``src/tests/class_tests/openms/source/NewFileFormat_test.cpp``). -4. Add the test to the ``executables.cmake`` file in the test folder (e.g., ``src/tests/class_tests/openms/executables.cmake``). -5. Add them to git by using the command ``git add``. +1. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in `src//include/OpenMS` and the cpp file in `src//source`, e.g., `src/openms/include/OpenMS/FORMAT/NewFileFormat.h` and `src/openms/source/FORMAT/NewFileFormat.cpp`. +2. Add both to the respective sources.cmake file in the same directory (e.g., `src/openms/source/FORMAT/` and `src/openms/include/OpenMS/FORMAT/`). +3. Add the corresponding class test to src/tests/class_tests// (e.g., `src/tests/class_tests/openms/source/NewFileFormat_test.cpp`). +4. Add the test to the `executables.cmake` file in the test folder (e.g., `src/tests/class_tests/openms/executables.cmake`). +5. Add them to git by using the command `git add`. -## How do I add a new directory MYDIR to the build system? +### How do I add a new directory to the build system? -1. Create two new ``sources.cmake`` files (one for ``src//include/OpenMS/MYDIR``, one for ``src//source/MYDIR``), using existing ``sources.cmake`` files as template. -2. Add the new ``sources.cmake`` files to ``src//includes.cmake`` -3. If you created a new directory directly under ``src/openms/source``, then have a look at ``src/tests/class_tests/openms/executables.cmake``. +1. Create two new `sources.cmake` files (one for `src//include/OpenMS/MYDIR`, one for `src//source/MYDIR`), using existing `sources.cmake` files as template. +2. Add the new `sources.cmake` files to `src//includes.cmake` +3. If you created a new directory directly under `src/openms/source`, then have a look at `src/tests/class_tests/openms/executables.cmake`. 4. Add a new section that makes the unit testing system aware of the new (upcoming) tests. -5. Look at the very bottom and augment ``TEST_executables``. -6. Add a new group target to ``src/tests/class_tests/openms/CMakeLists.txt``. +5. Look at the very bottom and augment `TEST_executables`. +6. Add a new group target to `src/tests/class_tests/openms/CMakeLists.txt`. -## Class/Unit tests and TOPP/Tool tests +### Class/Unit tests and TOPP/Tool tests -Class tests are unit tests that typically test the functionality of a class. +Class or unit tests are built as standalone, additional executables that include the class to be tested and the testing utility classes to test outcomes of single functions of the class in question. -They get built as standalone, additional executables that include the class to be tested and the testing utility classes to test outcomes of single functions of the class in question. - -Unless you added functions that are intended to be used outside of your new additional mode, you don't need to add anything there. +Only add tests for functions added outside of your additional mode. Tool tests are using the tool executable that the user would also receive. We use those executables to run the full algorithm on a small test dataset, to ensure that from version to version the results stay the same and are meaningful. @@ -169,64 +172,68 @@ Each tool test consists of: * A `FuzzyDiff` call that compares the temporary output file of the last call and a reference test output that you have to provide. -* a line to add a dependency of the FuzzyDiff call on the actual executable call (so they get executed after each other). +* A line to add a dependency of the FuzzyDiff call on the actual executable call (so they get executed after each other). -Use e.g., ``ctest -V -R IDMapper`` to only test tests that include the regex ``IDMapper`` (-V is just verbose). Make sure to build the ``IDMapper`` and ``IDMapper_test`` (if edited) executable first everytime. -``ctest`` does not have any automatic dependency on the timestamps of the executables. +Use e.g., `ctest -V -R IDMapper` to only test tests that include the regex `IDMapper` (-V is just verbose). Make sure to build the `IDMapper` and `IDMapper_test` (if edited) executable first everytime. +`ctest` does not have any automatic dependency on the timestamps of the executables. -## How do I add a new test for the class MyClass? +### How do I add a test for a new class? You should always add a test alongside every new class added to OpenMS. + To add a new class test: -1. Add the class test to ``src/tests/class_tests//`` (e.g., ``src/tests/class_tests/openms/source/NewFileFormat_test.cpp``). -2. Add the test to the ``executables.cmake`` file in the test folder. -3. Add them to git using the ``git add`` command. +1. Add the class test to `src/tests/class_tests//` (e.g., `src/tests/class_tests/openms/source/NewFileFormat_test.cpp`). +2. Add the test to the `executables.cmake` file in the test folder. +3. Add them to git using the `git add` command. -A test template for your specific class can be generated by the ``create_test.php`` script found in ``tools/``. +A test template for your specific class can be generated by the `create_test.php` script found in `tools/`. -1. Make sure you generated XML files containing the class information make doc_xml -2. Call: +To generate a test template for your class: - `php tools/create_test.php /BUILD_DIRECTORY/ / PATH_TO_HEADER/MyClass.h \ "FIRSTNAME LASTNAME" > ./src/tests/class_tests/openms/source/MyClass_test.cpp` +1. Make sure your generated XML files containing the class information make doc_xml. +2. Call: +```bash +php tools/create_test.php /BUILD_DIRECTORY/ / PATH_TO_HEADER/MyClass.h \ "FIRSTNAME LASTNAME" > ./src/tests/class_tests/openms/source/MyClass_test.cpp +``` -## How do I add a new GUI test (for QT Gui classes) for the class MyClass? +### How do I add a new GUI test (for QT Gui classes) for the class `MyClass`? To add a new GUI test: -1. Create the ``MyClass_test.cpp`` in ``src/tests/class_tests/openms_gui/source``. -2. Add it to ``src/tests/class_tests/openms_gui/CMakeLists.txt`` in the GUI section. -3. Have a look at existing GUI tests, as they use the ``QT TestLib`` framework and not the OpenMS macros. +1. Create the `MyClass_test.cpp` in `src/tests/class_tests/openms_gui/source`. +2. Add it to `src/tests/class_tests/openms_gui/CMakeLists.txt` in the GUI section. +3. Have a look at existing GUI tests, as they use the `QT TestLib` framework and not the OpenMS macros. -## (Linux) All tests fail when you execute `make test` +### (Linux) All tests fail when you execute `make test` -Check the ``LD_LIBRARY_PATH`` environment variable: +Check the `LD_LIBRARY_PATH` environment variable: -You can print the ``LD_LIBRARY_PATH`` with ``echo $LD_LIBRARY_PATH``. If your ``/lib/`` folder is included, check that ``libOpenMS.so`` is present. -With the ``ldd`` command, you can show the libraries used by an executable, e.g. ``ldd /bin/ClassTest_test``. +You can print the `LD_LIBRARY_PATH` with `echo $LD_LIBRARY_PATH`. If your `/lib/` folder is included, check that `libOpenMS.so` is present. +With the `ldd` command, you can show the libraries used by an executable, e.g. `ldd /bin/ClassTest_test`. ## How can I speed up the compile process of OpenMS? -To spped up the compile process of OpenMS, use several threads. If you have several processors/cores, you can build OpenMS classes/tests and TOPP tools in in several threads. On Linux use the `make option -j: make -j8 OpenMS TOPP test_build`. +To speed up the compile process of OpenMS, use several threads. If you have several processors/cores, you can build OpenMS classes/tests and `TOPP` tools in several threads. On Linux, use the `make option -j: make -j8 OpenMS TOPP test_build`. -On Windows, Visual Studio solution files are automatically build with the /MP flag, such that VS uses all available cores of the machine. +On Windows, Visual Studio solution files are automatically build with the `/MP` flag, such that Visual Studio uses all available cores of the machine. -# Release +## Release see `Preparation-of-a-new-OpenMS-release `_ -# Continuous integration +## Continuous integration -## How does travis work? +### How does travis work? -`Travis `_ is an automated system for continuous integration and each new commit and pull request is automatically run through the travis build system. -This is controlled by a ``.travis.yaml`` file in the source tree. +`Travis `_ is an automated system for continuous integration. Each new commit and pull request is automatically run through the travis build system. +This is controlled by a `.travis.yaml` file in the source tree. -## What can we do if travis times out? +### What can we do if travis times out? -Try to simply restart travis, it sometimes hangs and since it builds on shared infrastructure, the next build may work better. This needs to be done by a OpenMS core developer. +Try to restart travis, it sometimes hangs and since it builds on shared infrastructure, the next build may work better. This needs to be done by a OpenMS core developer. Since we use extensive caching, the build may take much longer when many files are touched and may never complete in that case (running into the travis time limit). In that case we can rebuild the cache using the following approach: -``` +```bash $ git cherry-pick 89c5cd7f2d9d343b3d63fc6bab18e08dcd969c05 $ git push origin develop @@ -238,92 +245,74 @@ Since we use extensive caching, the build may take much longer when many files a $ git push origin develop ``` -# Working in IDE's - -## General: +## Working in Integrated Development Environments (IDEs) -Why are there no `source/TEST` and `source/APPLICATIONS/TOPP|UTILS` folder? +### Why are there no `source/TEST` and `source/APPLICATIONS/TOPP|UTILS` folder? -All source files added to an IDE are associated with their targets. You can find the source files for each test within its own subproject. The same is true for the ``TOPP`` and ``UTILS`` classes. +All source files added to an IDE are associated with their targets. You can find the source files for each test within its own subproject. The same is true for the `TOPP` and `UTILS` classes. -How can I easily update a lot of test files (e.g., after a small format change in result files)? -_________________________________________________________________________________________________ +### How can I easily update a lot of test files (e.g., after a small format change in result files)? -Using ``grep`` one can simply extract the lines starting with ``diff FILENAME1 FILENAME2`` and replace the ``diff`` by ``copy``. +Using `grep` one can simply extract the lines starting with `diff FILENAME1 FILENAME2` and replace the `diff` by `copy`. -Visual Studio: -^^^^^^^^^^^^^^ +### I'm getting the error "Error C2471: cannot update program database" -I'm getting the error "Error C2471: cannot update program database". -_____________________________________________________________________ +This is a bug in Visual Studio and there is a [bug fix] (http://code.msdn.microsoft.com/KB946040) Only apply it if you encounter the error. The bug fix might have unwanted side effects! -This is a bug in Visual Studio and there is a bugfix: http://code.msdn.microsoft.com/KB946040 Only apply it if you encounter the error. The bugfix might have unwanted side effects! +### Visual Studio can't read the clang-format file. - -Visual Studio can't read the clang-format file. -_______________________________________________ - -Depending on the Visual Studio version you're using you might get an error like "Error while formating with ClangFormat!". This is because Visual Studio is using an outdated version of clang-format. Unfortunately there is no easy way to update this using Visual Studio itself. -There is a plugin provided by LLVM designed to fix this exact problem, but the plugin doesn't work with every Visual Studio version. However, you can update clang-format by hand using the pre-build clang-format binary. Both the binary and a link to the plugin can be found here: https://llvm.org/builds/. +Depending on the Visual Studio version you're using you might get an error like `Error while formating with ClangFormat`. This is because Visual Studio is using an outdated version of clang-format. Unfortunately there is no easy way to update this using Visual Studio itself. +There is a plugin provided by LLVM designed to fix this problem, but the plugin doesn't work with every Visual Studio version. However, you can update clang-format by hand using the pre-build clang-format binary. Both the binary and a link to the plugin can be found here: https://llvm.org/builds/. To update clang-format by hand just download the binary and exchange it with the clang-format binary in your Visual Studio folder. -For Visual Studio 17 and 19 it should be located at: ``C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\bin``. +For Visual Studio 17 and 19 it should be located at: `C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\bin`. -Eclipse CDT: -^^^^^^^^^^^^ - -The indexer gets stuck at some file which ``#includes seqan`` -_____________________________________________________________ +### The indexer gets stuck at some file which ``#includes seqan`` It seems that SeqAn code is just too confusing for older eclipse C++ indexers. You should upgrade to eclipse galileo (CDT 6.0.x). Also, increase the available memory limit in eclipse.ini, e.g. -Xmx1024m for one gig. - -The parser is confused after OPENMS_DLLAPI and does not recognize standard C++ headers -______________________________________________________________________________________ +### The parser is confused after OPENMS_DLLAPI and does not recognize standard C++ headers Go to ``Project -> Properties -> C/C++ Include Paths and Preprocessor Symbols -> Add Preprocessor symbol -> "OPENMS_DLLAPI="``. This tells eclipse that the macro is defined empty. In the same dialog you can also add an external include path to e.g. ``/usr/include/c++/4.3.3/``, etc. The issue with C++ headers was fixed in the latest galileo release. Hints to resolve the OPENMS_DLLAPI issue using the ``cmake`` generator are welcome! -Debugging -********* +## Debugging -How do I run a single test? -^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The following section provides information about how to debug your code. + +### How do I run a single test? You can can execute an OpenMS class test using the CTest regular expressions: -.. code:: bash +```bash > ctest -V -R "^_test" # To build a class test, you simply call the respective make target in ./source/TEST: > make _test - +``` To run a TOPP test, you can use: -.. code:: bash +```bash > ctest -V -R "TOPP_" +``` To build the tool, use: -.. code:: bash +```bash > make +``` +### How do I debug uncaught exceptions? -How do I debug uncaught exceptions? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -There is a mechanism to have a core dumped if an uncaught exception occurs. - -To enable it, the environment variable ``OPENMS_DUMP_CORE`` has to be set. +You can dump a core if an uncaught exception occurs, by setting the environment variable `OPENMS_DUMP_CORE`. -Each time an uncaught exception occurs, the ``OPENMS_DUMP_CORE`` variable is checked and a segmentation fault is caused, if it is set. +Each time an uncaught exception occurs, the `OPENMS_DUMP_CORE` variable is checked and a segmentation fault is caused, if it is set. -(Linux) Why is no core dumped, although a fatal error occured? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +### (Linux) Why is no core dumped, although a fatal error occured? -Try the ``ulimit -c`` unlimited command. It sets the maximum size of a core to unlimited. +Try the `ulimit -c` unlimited command. It sets the maximum size of a core to unlimited. Note: We observed that, on some systems, no core is dumped even if the size of the core file is set to unlimited. We are not sure what causes this problem @@ -501,6 +490,6 @@ Common errors are: * ``'Invalid write/read ...'`` - Violation of container boundaries. * ``'... depends on uninitialized variable'`` - Uninitialized variables: * ``'... definitely lost'`` - Memory leak that has to be fixed -* ``'... possibly lost'`` - Possible wemory leak, so have a look at the code +* ``'... possibly lost'`` - Possible memory leak, so have a look at the code -For more information see the valgrind documentation at http://valgrind.org/docs/manual/. +For more information see the `valgrind` documentation at http://valgrind.org/docs/manual/. diff --git a/openms-wiki/reporting-bugs-and-issues.md b/openms-wiki/reporting-bugs-and-issues.md index fe7adba5..c3bc39ac 100644 --- a/openms-wiki/reporting-bugs-and-issues.md +++ b/openms-wiki/reporting-bugs-and-issues.md @@ -1,4 +1,5 @@ -# Reporting Bugs and Issues +Reporting Bugs and Issues +========================= A list of known issues in the current OpenMS release can be found here. Please check if your OpenMS version matches the current version and if the bug has already been reported. @@ -11,5 +12,4 @@ Include the following information in your bug report: * OpenMS version (e.g. "OpenMS 1.11.1", "Revision 63082 from the SVN repository") * OpenMS architecture ("32 bit" or "64 bit") -Please provide files that we need to reproduce the bug (e.g. TOPP INI files, data files — usually mzML) via a download link, via the mailing list or by directly contacting one of the developers. - +Please provide files that we need to reproduce the bug (e.g. `TOPP INI` files, data files — usually mzML) via a download link, via the mailing list or by directly contacting one of the developers. diff --git a/openms-wiki/users-quickstart-guide.md b/openms-wiki/users-quickstart-guide.md index f85a2e89..5be66a84 100644 --- a/openms-wiki/users-quickstart-guide.md +++ b/openms-wiki/users-quickstart-guide.md @@ -1,7 +1,8 @@ -# Users Quick Start Guide +Users Quick Start Guide +======================= -Download the current stable version of OpenMS from the [OpenMS download site](http://open-ms.de/downloads) or via the [OpenMS docker containers](alinkstob). +Download the current stable version of OpenMS from the [OpenMS download site](http://open-ms.de/downloads) or via the [OpenMS docker containers](). Familiarise yourself with OpenMS by reading [Röst et al, OpenMS: a flexible open-source software platform for mass spectrometry data analysis. Nat Methods. 2016](https://www.ncbi.nlm.nih.gov/pubmed/27575624) as well as the [Getting Started](http://www.openms.de/getting-started) page on openms.de. -Read the OpenMS documentation (especially for TOPP) available from the [OpenMS documentation site](http://www.openms.de/current_doxygen) or in the folder doc/index.html of stable releases. You can download some example workflows with optimised parameter settings from the [repository](alinkstob). To understand which tools are available, read the [TOPP Tool documentation page](http://www.openms.de/current_doxygen/html/TOPP_documentation.html) as well as the [UTILS Tool documentation page](http://www.openms.de/current_doxygen/html/UTILS_documentation.html). +Read the OpenMS documentation (especially for TOPP) available from the [OpenMS documentation site](http://www.openms.de/current_doxygen) or in the folder doc/index.html of stable releases. You can download some example workflows with optimised parameter settings from the [repository](). To understand which tools are available, read the [TOPP Tool documentation page](http://www.openms.de/current_doxygen/html/TOPP_documentation.html) as well as the [UTILS Tool documentation page](http://www.openms.de/current_doxygen/html/UTILS_documentation.html). From c14c24bdea0226bbf7b3d0bf44e3650ea1497470 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Fri, 20 May 2022 17:09:54 +0930 Subject: [PATCH 62/77] added coding convents and write and label github issues md files, edited several others --- ...penms-release.md => coding-conventions.md} | 0 openms-wiki/contributors-quickstart-guide.md | 6 +- openms-wiki/developer-faq.md | 187 +++++++++--------- openms-wiki/reporting-bugs-and-issues.md | 2 +- openms-wiki/users-quickstart-guide.md | 4 +- openms-wiki/write-and-label-github-issues.md | 0 6 files changed, 95 insertions(+), 104 deletions(-) rename openms-wiki/{preparation-of-a-new-openms-release.md => coding-conventions.md} (100%) create mode 100644 openms-wiki/write-and-label-github-issues.md diff --git a/openms-wiki/preparation-of-a-new-openms-release.md b/openms-wiki/coding-conventions.md similarity index 100% rename from openms-wiki/preparation-of-a-new-openms-release.md rename to openms-wiki/coding-conventions.md diff --git a/openms-wiki/contributors-quickstart-guide.md b/openms-wiki/contributors-quickstart-guide.md index 9715a714..f5ea36e1 100644 --- a/openms-wiki/contributors-quickstart-guide.md +++ b/openms-wiki/contributors-quickstart-guide.md @@ -5,7 +5,7 @@ If you would like to contribute to OpenMS: * Familiarise yourself with our [online documentation](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html). -* Learn how to [build OpenMS](https://github.com/OpenMS/OpenMS/wiki/Building-OpenMS). +* Learn how to [build OpenMS](build-openms-from-source.md). * Check out the [OpenMS tutorial for developers](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/OpenMS_tutorial.html). @@ -23,13 +23,13 @@ See the documentation for the [latest release] (https://abibuilder.informatik.un OpenMS follows the Gitflow development workflow that is described [here] (http://nvie.com/posts/a-successful-git-branching-model/). -We encourage every developer (even if they are eligible to push directly to OpenMS) to create their own fork (e.g. @username). The GitHub people provide documentation on [forking](https://help.github.com/articles/fork-a-repo) and how to [keep your fork up-to-date](https://help.github.com/articles/syncing-a-fork). With your own fork you can follow the Gitflow development model, but instead of merging into `develop` in your own fork you can open a [pull request] (https://help.github.com/articles/using-pull-requests). Before opening the pull request, please check the [checklist](alinkstob). +We encourage every developer (even if they are eligible to push directly to OpenMS) to create their own fork (e.g. @username). The GitHub people provide documentation on [forking](https://help.github.com/articles/fork-a-repo) and how to [keep your fork up-to-date](https://help.github.com/articles/syncing-a-fork). With your own fork you can follow the Gitflow development model, but instead of merging into `develop` in your own fork you can open a [pull request] (https://help.github.com/articles/using-pull-requests). Before opening the pull request, please check the [checklist](pull-request-checklist.md). Some more details and tips are collected [here](). ## Coding Conventions -See the manual for coding style recommended by OpenMS: [Coding conventions](). +See the manual for coding style recommended by OpenMS: [Coding conventions](coding-conventions.md). also see: [C++ Guide](). View the [manual]() for creating a new build unit (to be completed). diff --git a/openms-wiki/developer-faq.md b/openms-wiki/developer-faq.md index 596360d7..08cb76c1 100644 --- a/openms-wiki/developer-faq.md +++ b/openms-wiki/developer-faq.md @@ -211,7 +211,7 @@ Check the `LD_LIBRARY_PATH` environment variable: You can print the `LD_LIBRARY_PATH` with `echo $LD_LIBRARY_PATH`. If your `/lib/` folder is included, check that `libOpenMS.so` is present. With the `ldd` command, you can show the libraries used by an executable, e.g. `ldd /bin/ClassTest_test`. -## How can I speed up the compile process of OpenMS? +### How can I speed up the compile process of OpenMS? To speed up the compile process of OpenMS, use several threads. If you have several processors/cores, you can build OpenMS classes/tests and `TOPP` tools in several threads. On Linux, use the `make option -j: make -j8 OpenMS TOPP test_build`. @@ -219,7 +219,7 @@ On Windows, Visual Studio solution files are automatically build with the `/MP` ## Release -see `Preparation-of-a-new-OpenMS-release `_ +View [Preparation of a new OpenMS release](https://github.com/OpenMS/OpenMS/wiki/Preparation-of-a-new-OpenMS-release#release_developer) to learn more about contributing to releases. ## Continuous integration @@ -262,7 +262,7 @@ This is a bug in Visual Studio and there is a [bug fix] (http://code.msdn.micros ### Visual Studio can't read the clang-format file. Depending on the Visual Studio version you're using you might get an error like `Error while formating with ClangFormat`. This is because Visual Studio is using an outdated version of clang-format. Unfortunately there is no easy way to update this using Visual Studio itself. -There is a plugin provided by LLVM designed to fix this problem, but the plugin doesn't work with every Visual Studio version. However, you can update clang-format by hand using the pre-build clang-format binary. Both the binary and a link to the plugin can be found here: https://llvm.org/builds/. +There is a plugin provided by LLVM designed to fix this problem, but the plugin doesn't work with every Visual Studio version. However, you can update clang-format by hand using the pre-build clang-format binary. Both the binary and a link to the plugin can be found [here](https://llvm.org/builds/). To update clang-format by hand just download the binary and exchange it with the clang-format binary in your Visual Studio folder. For Visual Studio 17 and 19 it should be located at: `C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\bin`. @@ -286,23 +286,23 @@ You can can execute an OpenMS class test using the CTest regular expressions: ```bash - > ctest -V -R "^_test" +ctest -V -R "^_test" - # To build a class test, you simply call the respective make target in ./source/TEST: +# To build a class test, you simply call the respective make target in ./source/TEST: - > make _test +make _test ``` To run a TOPP test, you can use: ```bash - > ctest -V -R "TOPP_" +ctest -V -R "TOPP_" ``` To build the tool, use: ```bash - > make +make ``` ### How do I debug uncaught exceptions? @@ -316,156 +316,147 @@ Try the `ulimit -c` unlimited command. It sets the maximum size of a core to unl Note: We observed that, on some systems, no core is dumped even if the size of the core file is set to unlimited. We are not sure what causes this problem -(Linux) How can I set breakpoints in gdb to debug OpenMS? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +### (Linux) How can I set breakpoints in gdb to debug OpenMS? -Imagine you want to debug the TOPPView application and you want it to stop at line 341 of +Imagine you want to debug the TOPPView application and you want it to stop at line 341 of SpectrumMDIWindow.C. -.. code:: bash - SpectrumMDIWindow.C. - Run gdb: +1. Enter the following in your terminal: + + ```bash + Run gdb: shell> gdb TOPPView +``` -Start the application (and close it): +2. Start the application (and close it): -.. code:: bash + ```bash gdb> run [arguments] - -Set the breakpoint: - -.. code:: bash +``` +3. Set the breakpoint: + ```bash gdb> break SpectrumMDIWindow.C:341 +``` +4. Start the application again (with the same arguments): -Start the application again (with the same arguments): - -.. code:: bash + ```bash gdb> run + ``` -How can I find out which shared libraries are used by an application? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Linux: ``ldd`` +### How can I find out which shared libraries are used by an application? -Windows (Visual studio console): Try "Dependency Walker" (http://www.dependencywalker.com/) (use x86 for 32bit builds and the x64 version for 64bit builds. Using the wrong version of depends.exe will give wrong results!) or ``dumpbin /DEPENDENTS OpenMS.dll``. +Linux: Use `ldd`. -How can I get a list of the symbols defined in a (shared) library or object file? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Windows (Visual studio console): Try [Dependency Walker](http://www.dependencywalker.com/) (use x86 for 32bit builds and the x64 version for 64bit builds. Using the wrong version of depends.exe will give the wrong results) or ``dumpbin /DEPENDENTS OpenMS.dll``. -Linux: ``nm `` +### How can I get a list of the symbols defined in a (shared) library or object file? -Use ``nm -C`` to switch on demangling of low-level symbols into their C++-equivalent names. ``nm`` also accepts .a and .o files. +Linux: Use `nm `. -Windows (Visual studio console): ``dumpbin /ALL `` +Use `nm -C` to switch on demangling of low-level symbols into their C++-equivalent names. `nm` also accepts .a and .o files. -You can use dumpbin on object files (.o) or (shared) library files (.lib) or the DLL itself e.g. ``dumpbin /EXPORTS OpenMS.dll``. +Windows (Visual studio console): Use ``dumpbin /ALL ``. -Cross-platform thoughts -*********************** +You can use dumpbin on object files (.o) or (shared) library files (.lib) or the DLL itself e.g. `dumpbin /EXPORTS OpenMS.dll`. -OpenMS runs on three major platforms, each one having its own ways of doing things. Here are the most prominent causes of "it runs on Platform A, but not on B. What now?" +## Cross-platform thoughts -Reading/Writing binary files causes different behaviour ... Usually Linux does not make a difference between text-mode and binary-mode when reading files. This is quite different on Windows as some bytes are interpreted as EOF, which lead might to a premature end of the reading process. +OpenMS runs on three major platforms.. Here are the most prominent causes of "it runs on Platform A, but not on B. What now?" -Thus, if reading binary files make sure that you explicitly state that the file is binary when opening it! +### Reading or writing binary files +Reading or writing binary files causes different behaviour. Usually Linux does not make a difference between text-mode and binary-mode when reading files. This is quite different on Windows as some bytes are interpreted as `EOF`, which lead might to a premature end of the reading process. -During writing in text-mode on windows a line-break (\n) is expanded to (\r\n). Keep this in mind or use the eol-style property of subversion to ensure that line endings are correctly checked out on non-Windows systems. +If reading binary files, make sure that you explicitly state that the file is binary when opening it. -``unsigned int`` vs ``size_t`` (UInt and Size) UInt and Size are the same on Linux GCC (i.e. both have the same size, 32bit on 32bit systems, 64bit on 64 bit systems), however on Windows this only holds for 32bit. On a 64bit Windows the UInt type is still 32bit, Size is (obviously) 64bit. This might lead to warnings (at best) or overflows and other nasty stuff. -So make sure you do not rely on UInt being equal to Size - because they're not. +During writing in text-mode on Windows a line-break (`\n`) is expanded to (`\r\n`). Keep this in mind or use the `eol-style` property of subversion to ensure that line endings are correctly checked out on non-Windows systems. -Paths and system functions... +### `UInt` vs `Size` +Both `unsigned int` vs `size_t` `UInt` and `Size` have the same size on Linux GCC (32bit on 32bit systems, 64bit on 64 bit systems), however on Windows this only holds for 32bit. On a 64bit Windows, the `UInt` type is still 32bit, while the `Size` type is 64bit. This might lead to warnings (at best) or overflows and other drawbacks. +Therefore, do not assume that `UInt` is equal to `Size`. -This is trivial but hardcoding something like ``String tmp_dir = "/tmp";`` is a big no-no! This must fail on Windows! Use Qt's QDir to get a path to the systems temporary directory if required. +### Paths and system functions -Also calling things like uname which are only available on Linux: don't! +Avoid hardcoding e.g.`String tmp_dir = "/tmp";`. This will fail on Windows. Use Qt's `QDir` to get a path to the systems temporary directory if required. -When working with files or directories, it is usually safe to use "/" on all platforms. Even Windows understands that. Take care of spaces in directory names though. You should always quote paths if they are used in a system call to ensure that the subsequent interpreter takes the spaced path as a single entity. +Avoid names like uname which are only available on Linux. +When working with files or directories, it is usually safe to use "/" on all platforms. Take care of spaces in directory names though. You should always quote paths if they are used in a system call to ensure that the subsequent interpreter takes the spaced path as a single entity. -PyOpenMS - Trouble shooting -*************************** -How can I wrap my new method with PyOpenMS? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +## PyOpenMS - Troubleshooting -You will have to add an entry to ``src/pyOpenMS/pxds/CLASS_NAME.pxd`` with the signature of your new method(s). +The following section contains answers to common issues experienced in pyOpenMS. -How can I wrap my new class with PyOpenMS? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +### How can I wrap my new method with PyOpenMS? -You will have to create a new file ``src/pyOpenMS/pxds/CLASS_NAME.pxd`` which is explained `here `_. +You will have to add an entry to `src/pyOpenMS/pxds/CLASS_NAME.pxd` with the signature of your new method(s). -My method has multiple outputs. Can I use output parameters? I have trouble wrapping them for pyOpenMS. -******************************************************************************************************* +### How can I wrap my new class with PyOpenMS? -Python does not support passing primitive types (int, double etc) by reference, there fore void calculate(double &) will not work. +You will have to create a new file `src/pyOpenMS/pxds/CLASS_NAME.pxd` that is explained in the [pyOpenMS documentation](https://pyopenms.readthedocs.io/en/latest/wrap_classes.html?highlight=Wrapping%20classes#wrapping-workflow-and-wrapping-new-classes). -Doxygen documentation -********************* +### Can I use output parameters for methods with multiple outputs? -Where can I find the definition of the main page? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Python does not support passing primitive types (`int`, `double`, etc.) by reference. Therefore, `void calculate(double &)` will not work. -``OpenMS/doc/doxygen/public/Main.doxygen`` +## Doxygen Documentation -Where can I add a new module? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +### Where can I find the definition of the main page? -``OpenMS/doc/doxygen/public/Modules.doxygen`` +You can find a definition of the main page at ``OpenMS/doc/doxygen/public/Main.doxygen`` -How is the parameter documentation for classes derived from DefaultParamHandler created? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +### Where can I add a new module? -You have to add your class to the program ``OpenMS/doc/doxygen/parameters/DefaultParamHandlerDocumenter.cpp``. This program generates a html table with the parameters. This table can then be included in the class documentation using the following ``doxygen`` command: +You can add a new module at `OpenMS/doc/doxygen/public/Modules.doxygen` +### How is the parameter documentation for classes derived from DefaultParamHandler created? -``@htmlinclude OpenMS_.parameters`` +You have to add your class to the program ``OpenMS/doc/doxygen/parameters/DefaultParamHandlerDocumenter.cpp``. This program generates a html table with the parameters. This table can then be included in the class documentation using the following `doxygen` command:`@htmlinclude OpenMS_.parameters`. +> **_NOTE:_** parameter documentation is automatically generated for `TOPP/UTILS` included in the static `ToolHandler.cpp` tools list. -Note that parameter documentation is automatically generated for ``TOPP/UTILS`` included in the static ``ToolHandler.cpp`` tools list. To include TOPP/UTILS parameter documentation use following ``doxygen`` command: +To include TOPP/UTILS parameter documentation use following `doxygen` command: -``@htmlinclude TOPP_.parameters`` +`@htmlinclude TOPP_.parameters` or -``@htmlinclude UTILS_.parameters`` +`@htmlinclude UTILS_.parameters` -You can test if everything worked by calling make doc_param_internal. The parameters documentation is written to ``OpenMS/doc/doxygen/parameters/output/``. +You can test if everything worked by calling `make doc_param_internal`. The parameters documentation is written to `OpenMS/doc/doxygen/parameters/output/`. +### How is the command line documentation for TOPP/UTILS tools created? -How is the command line documentation for TOPP/UTILS tools created? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The program `OpenMS/doc/doxygen/parameters/TOPPDocumenter.cpp` creates the command line documentation for all classes that are included in the static `ToolHandler.cpp` tools list. It can be included in the documentation using the following `doxygen` command: -The program ``OpenMS/doc/doxygen/parameters/TOPPDocumenter.cpp`` creates the command line documentation for all classes that are included in the static ``ToolHandler.cpp`` tools list. It can be included in the documentation using the following ``doxygen`` command: +`@verbinclude TOPP_.cli` -``@verbinclude TOPP_.cli`` +You can test if everything worked by calling `make doc_param_internal`. The command line documentation is written to `OpenMS/doc/doxygen/parameters/output/`. -You can test if everything worked by calling ``make doc_param_internal``. The command line documentation is written to ``OpenMS/doc/doxygen/parameters/output/``. +### What are the important files for adding a new tutorial section? -## What are the important files for adding a new tutorial section? +View the following OpenMS tutorials: -OpenMS tutorial: +* `OpenMS/doc/OpenMS_tutorial/refman_overwrite.tex.in` (for PDF tutorials) +* `OpenMS/doc/doxygen/public/OpenMS_Tutorial_html.doxygen~` (for html tutorials) -* ``OpenMS/doc/OpenMS_tutorial/refman_overwrite.tex.in`` (for PDF tutorials) -* ``OpenMS/doc/doxygen/public/OpenMS_Tutorial_html.doxygen~`` (for html tutorials) +For TOPP and TOPPView tutorials, view: -TOPP and TOPPView tutorial: +* `OpenMS/doc/TOPP_tutorial/refman_overwrite.tex.in` (for PDF tutorials) +* `OpenMS/doc/doxygen/public/TOPP_Tutorial_html.doxygen` (for html tutorials) -* ``OpenMS/doc/TOPP_tutorial/refman_overwrite.tex.in`` (for PDF tutorials) -* ``OpenMS/doc/doxygen/public/TOPP_Tutorial_html.doxygen`` (for html tutorials) +## Bug Fixes -# Bug fixes - -## How to contribute a bugfix? +### How to contribute a bug fix? +To contribute to a bug fix: 1. Submit the bug as a GitHub issue. -2. Create a feature branch (e.g. ``feature/fix_missing_filename_issue_615``) from your (up-to-date) develop branch in your fork of OpenMS. +2. Create a feature branch (e.g. `feature/fix_missing_filename_issue_615`) from your (up-to-date) develop branch in your fork of OpenMS. 3. Fix the bug and add a test. 4. Create a pull request for your branch. 5. After approval and merge make sure the issue is closed. -## How can I profile my code? +### How can I profile my code? Try IBM's profiler, available for all platforms (and free for academic use): Purify(Plus) and/or Quantify. @@ -473,14 +464,14 @@ Windows: this is directly supported by Visual Studio (Depending on the edition: Linux: -* Build OpenMS in debug mode (set ``CMAKE_BUILD_TYPE`` to ``Debug``). -* Call the executable with valgrind: ``valgrind –tool=callgrind``. Note: other processes running on the same machine can influence the profiling. Make sure your application gets enough resources (memory, CPU time). -* You can start and stop the profiling while the executable is running e.g. to skip initialization steps: -* Start valgrind with the option ``–instr-atstart=no``. -* Call ``callgrind -i [on|off]`` to start/stop the profiling. -* The output can be viewed with ``kcachegrind callgrind.out``. +1. Build OpenMS in debug mode (set `CMAKE_BUILD_TYPE` to `Debug`). +2. Call the executable with valgrind: `valgrind –tool=callgrind`. Note: other processes running on the same machine can influence the profiling. Make sure your application gets enough resources (memory, CPU time). +3. You can start and stop the profiling while the executable is running e.g. to skip initialization steps: +4. Start valgrind with the option `–instr-atstart=no`. +5. Call `callgrind -i [on|off]` to start/stop the profiling. +6. The output can be viewed with `kcachegrind callgrind.out`. -## (Linux) How do I check my code for memory leaks? +### (Linux) How do I check my code for memory leaks? * Build OpenMS in debug mode (set ``CMAKE_BUILD_TYPE`` to ``Debug``). * Call the executable with ``valgrind: valgrind --suppressions=OpenMS/tools/valgrind/openms_external.supp –leak-check=full ``. @@ -492,4 +483,4 @@ Common errors are: * ``'... definitely lost'`` - Memory leak that has to be fixed * ``'... possibly lost'`` - Possible memory leak, so have a look at the code -For more information see the `valgrind` documentation at http://valgrind.org/docs/manual/. +For more information see the [`valgrind` documentation](http://valgrind.org/docs/manual/) . diff --git a/openms-wiki/reporting-bugs-and-issues.md b/openms-wiki/reporting-bugs-and-issues.md index c3bc39ac..8782f461 100644 --- a/openms-wiki/reporting-bugs-and-issues.md +++ b/openms-wiki/reporting-bugs-and-issues.md @@ -3,7 +3,7 @@ Reporting Bugs and Issues A list of known issues in the current OpenMS release can be found here. Please check if your OpenMS version matches the current version and if the bug has already been reported. -In order to report a new bug, please use either our [GitHub issues system](https://github.com/OpenMS/OpenMS/wiki/Writing-and-labelling-GitHub-issues) or contact us through the general OpenMS mailing list. +In order to report a new bug, please use either our [GitHub issues system](write-and-label-github-issues.md) or contact us through the general OpenMS mailing list. Include the following information in your bug report: * the command line (i.e. call) including the TOPP tool and the arguments you used, or the steps you followed in a GUI tool (e.g. TOPPView) - e.g. `FeatureFinderCentroided -in myfile.mzML -out myfile.featureXML` diff --git a/openms-wiki/users-quickstart-guide.md b/openms-wiki/users-quickstart-guide.md index 5be66a84..ac4131b0 100644 --- a/openms-wiki/users-quickstart-guide.md +++ b/openms-wiki/users-quickstart-guide.md @@ -3,6 +3,6 @@ Users Quick Start Guide Download the current stable version of OpenMS from the [OpenMS download site](http://open-ms.de/downloads) or via the [OpenMS docker containers](). -Familiarise yourself with OpenMS by reading [Röst et al, OpenMS: a flexible open-source software platform for mass spectrometry data analysis. Nat Methods. 2016](https://www.ncbi.nlm.nih.gov/pubmed/27575624) as well as the [Getting Started](http://www.openms.de/getting-started) page on openms.de. +Familiarise yourself with OpenMS by reading [Röst et al, OpenMS: a flexible open-source software platform for mass spectrometry data analysis. Nat Methods. 2016](https://www.ncbi.nlm.nih.gov/pubmed/27575624) as well as [Getting Started](http://www.openms.de/getting-started) on openms.de. -Read the OpenMS documentation (especially for TOPP) available from the [OpenMS documentation site](http://www.openms.de/current_doxygen) or in the folder doc/index.html of stable releases. You can download some example workflows with optimised parameter settings from the [repository](). To understand which tools are available, read the [TOPP Tool documentation page](http://www.openms.de/current_doxygen/html/TOPP_documentation.html) as well as the [UTILS Tool documentation page](http://www.openms.de/current_doxygen/html/UTILS_documentation.html). +Read the OpenMS documentation (especially for TOPP) available from the [OpenMS documentation site](http://www.openms.de/current_doxygen) or in the folder `doc/index.html` of stable releases. You can download some example workflows with optimised parameter settings from the [repository](). To understand which tools are available, read the [TOPP Tool documentation page](http://www.openms.de/current_doxygen/html/TOPP_documentation.html) as well as the [UTILS Tool documentation page](http://www.openms.de/current_doxygen/html/UTILS_documentation.html). diff --git a/openms-wiki/write-and-label-github-issues.md b/openms-wiki/write-and-label-github-issues.md new file mode 100644 index 00000000..e69de29b From 92cea6071021edbcb1e70cb74d8952f5e4f2684c Mon Sep 17 00:00:00 2001 From: greengypsy Date: Fri, 20 May 2022 17:15:45 +0930 Subject: [PATCH 63/77] added Notes to developer-faq.md plus other minor edits --- openms-wiki/build-openms-from-source.md | 2 +- openms-wiki/contributors-quickstart-guide.md | 7 +- openms-wiki/developer-faq.md | 16 +- openms-wiki/developer-faq.rst | 547 ------------------- 4 files changed, 15 insertions(+), 557 deletions(-) delete mode 100644 openms-wiki/developer-faq.rst diff --git a/openms-wiki/build-openms-from-source.md b/openms-wiki/build-openms-from-source.md index 9347d701..c0695375 100644 --- a/openms-wiki/build-openms-from-source.md +++ b/openms-wiki/build-openms-from-source.md @@ -4,7 +4,7 @@ Build OpenMS From Source To build OpenMS, please follow the build instructions for: * [Linux](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_linux.html) -* [OSX](ihttps://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_mac.html) +* [OSX](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_mac.html) * [Windows](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_win.html) Instructions to build pyOpenMS can be found in the [pyOpenMS documentation](https://pyopenms.readthedocs.io/en/latest/build_from_source.html). diff --git a/openms-wiki/contributors-quickstart-guide.md b/openms-wiki/contributors-quickstart-guide.md index f5ea36e1..60d6f82a 100644 --- a/openms-wiki/contributors-quickstart-guide.md +++ b/openms-wiki/contributors-quickstart-guide.md @@ -15,13 +15,14 @@ Any questions can be directed at the mailing list. Untested installers, containers, etc., known as the nightly snapshot, are released every night. They generally pass automated continuous integration tests but no manual tests. View the documentation for the nightly snapshot of [OpenMS develop branch](https://github.com/OpenMS/OpenMS/tree/develop) at the [build archive](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/nightly/html/index.html). -View the doxygen log from [here](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_nightly_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log). +View the [doxygen log](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_nightly_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log). -See the documentation for the [latest release] (https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html) ([doxygen log](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_release_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). +See the documentation for the [latest release](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html). +View the ([doxygen log](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_release_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). ## Development Model -OpenMS follows the Gitflow development workflow that is described [here] (http://nvie.com/posts/a-successful-git-branching-model/). +OpenMS follows the Gitflow development workflow that is described [here](http://nvie.com/posts/a-successful-git-branching-model/). We encourage every developer (even if they are eligible to push directly to OpenMS) to create their own fork (e.g. @username). The GitHub people provide documentation on [forking](https://help.github.com/articles/fork-a-repo) and how to [keep your fork up-to-date](https://help.github.com/articles/syncing-a-fork). With your own fork you can follow the Gitflow development model, but instead of merging into `develop` in your own fork you can open a [pull request] (https://help.github.com/articles/using-pull-requests). Before opening the pull request, please check the [checklist](pull-request-checklist.md). diff --git a/openms-wiki/developer-faq.md b/openms-wiki/developer-faq.md index 08cb76c1..d61b1fc1 100644 --- a/openms-wiki/developer-faq.md +++ b/openms-wiki/developer-faq.md @@ -24,7 +24,7 @@ A tool starts its lifecycle in `UTILS` and may exist without being thoroughly te ### I have written a class for OpenMS. What should I do? -Follow the OpenMS [coding conventions](). +Follow the [OpenMS coding conventions](coding-conventions.md). Coding style (brackets, variable names, etc.) must conform to the conventions. @@ -39,7 +39,7 @@ Login to the [wordpress admin area](www.openms.de/wp-admin) with your username a ### Can I use QT designer to create GUI widgets? -Yes! If you want to create a class called `Widget: Create .ui-File` with `QT designer` and store it as `Widget.ui.`, add the class to `sources.cmake`. +Yes. If you want to create a class called `Widget: Create .ui-File` with `QT designer` and store it as `Widget.ui.`, add the class to `sources.cmake`. From the .ui-File the file `include/OpenMS/VISUAL/UIC/ClassTemplate.h` is generated by the build system. DO NOT CHECK-IN THIS FILE, AS IT IS GENERATED AUTOMATICALLY, WHEN NEEDED!!! Derive the class `Widget` from `WidgetTemplate`. You need to check in the `Widget.h` and `Widget.cpp` files. @@ -76,7 +76,8 @@ View the [cmake website[(http://www.cmake.org) for more information. See Installation instructions for your platform. In general, you call `CMake(.exe)` with some parameters to create the native build-system. Afterwards you can (but usually don't have to edit the current configuration using a GUI named `ccmake` (or `CMake-GUI` in Windows), which ships with `CMake`). -Note: whenever `ccmake` is mentioned in this document, substitute this by `CMake-GUI` if your OS is Windows. You can also edit the `CMakeCache.txt` file directly. + +> **_NOTE:_** whenever `ccmake` is mentioned in this document, substitute this by `CMake-GUI` if your OS is Windows. You can also edit the `CMakeCache.txt` file directly. ### How do I generate a build-system for Eclipse, KDevelop, CodeBlocks etc? @@ -96,7 +97,8 @@ The following options are of interest: * `CMAKE_BUILD_TYPE` Define if you want to build Debug or Release version of OpenMS. Release is the default. -* `CMAKE_FIND_ROOT_PATH` The path to the `contrib` libraries. Note that you can also provide more then one value here (e.g., `-D CMAKE_FIND_ROOT_PATH="/path/to/contrib;/usr/"` will search in your `contrib` path and in `/usr` for the required libraries) +* `CMAKE_FIND_ROOT_PATH` The path to the `contrib` libraries. + > **_NOTE:_** that you can also provide more then one value here (e.g., `-D CMAKE_FIND_ROOT_PATH="/path/to/contrib;/usr/"` will search in your `contrib` path and in `/usr` for the required libraries) * `STL_DEBUG` Enables STL debug mode. @@ -314,7 +316,7 @@ Each time an uncaught exception occurs, the `OPENMS_DUMP_CORE` variable is check Try the `ulimit -c` unlimited command. It sets the maximum size of a core to unlimited. -Note: We observed that, on some systems, no core is dumped even if the size of the core file is set to unlimited. We are not sure what causes this problem +> **_NOTE:_** We observed that, on some systems, no core is dumped even if the size of the core file is set to unlimited. We are not sure what causes this problem ### (Linux) How can I set breakpoints in gdb to debug OpenMS? @@ -465,7 +467,9 @@ Windows: this is directly supported by Visual Studio (Depending on the edition: Linux: 1. Build OpenMS in debug mode (set `CMAKE_BUILD_TYPE` to `Debug`). -2. Call the executable with valgrind: `valgrind –tool=callgrind`. Note: other processes running on the same machine can influence the profiling. Make sure your application gets enough resources (memory, CPU time). +2. Call the executable with valgrind: `valgrind –tool=callgrind`. + > **_NOTE:_** other processes running on the same machine can influence the profiling. Make sure your application gets enough resources (memory, CPU time). + 3. You can start and stop the profiling while the executable is running e.g. to skip initialization steps: 4. Start valgrind with the option `–instr-atstart=no`. 5. Call `callgrind -i [on|off]` to start/stop the profiling. diff --git a/openms-wiki/developer-faq.rst b/openms-wiki/developer-faq.rst deleted file mode 100644 index 4624ea39..00000000 --- a/openms-wiki/developer-faq.rst +++ /dev/null @@ -1,547 +0,0 @@ -============= -Developer FAQ -============= - -This FAQ (formerly called Internal FAQ) is intended for developers. Note that some actions require special permissions like e.g. updating the website. - -.. contents:: What's on this page - -Troubleshooting -*************** - -OpenMS complains about boost not being found but I'm sure its there! -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -``CMake`` got confused. Set up a new build directory and try again. If you build in-source (not recommended), deleting the ``CMakeCache.txt`` and ``cmake`` directory might help. - -General information -******************* - -I am new to OpenMS. What should I do first? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -* Check out the development version of OpenMS (see website). -* Try and build OpenMS according to the installation instructions. -* Read the OpenMS Coding Convention. -* Read the OpenMS Tutorial. -* Create a GitHub account -* Register to the open-ms-general and open-ms-developers mailing list. (You can see the developers list only if you are logged in to Sourceforge and if you are a OpenMS developer). - -What is the difference between an OpenMS tool and util? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -A tool starts its lifecycle in UTILS and may exist without being thoroughly tested. Tools may be promoted from UTILS to TOOLS if they are stable enough, are fully tested, fully documented and a test workflow exists. - -I have written a class for OpenMS I want to contribute. What should I do? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Basically, you must conform to the OpenMS Coding conventions : - -Coding style (brackets, variable names, etc.) must conform to the conventions. - -* The class and all the members must be documented thoroughly. -* You can check your code with the tool ``tools/checker.php``. Call ``php tools/checker.php`` for detailed instructions. - -Please open a pull request and follow the `checklist `_. - -How do I update the `openms.de `_ website? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Login to the wordpress admin area at www.openms.de/wp-admin with your username and password assigned by the current Homepage maintainers. - -Can I use QT designer to create GUI widgets? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Yes! If you want to create a class called ``Widget: Create .ui-File`` with ``QT designer`` and store it as ``Widget.ui.``, add the class to ``sources.cmake``. -From the .ui-File the file ``include/OpenMS/VISUAL/UIC/ClassTemplate.h`` is generated by the build system. -DO NOT CHECK-IN THIS FILE, AS IT IS GENERATED AUTOMATICALLY, WHEN NEEDED!!! -Derive the class ``Widget`` from ``WidgetTemplate``. You need to check in the ``Widget.h`` and ``Widget.cpp`` files. - -Can the START_SECTION-macro not handle template methods that have two or more arguments? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Put round brackets around the method declaration. Then it should work. - -Where can I find the binary installers created? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/. -Please verify the creation date of the individual installers, as there may have been an error while creating the installer. - -Build system -************ - -What is cmake? -^^^^^^^^^^^^^^ - -``CMake`` builds BuildSystems for different platforms, e.g. VisualStudio Solutions on Windows, Makefiles on Linux etc. -This allows us to define in one central location (namely ``CMakeLists.txt``) how OpenMS is build and have the platform specific stuff handled by CMake. -See http://www.cmake.org for more information. - -How do I use cmake? -^^^^^^^^^^^^^^^^^^^ - -See Installation instructions for your platform. -In general, you call ``CMake(.exe)`` with some parameters to create the native build-system. -Afterwards you can (but usually don't have to edit the current configuration using a GUI named ``ccmake`` (or ``CMake-GUI`` in Windows), which ships with ``CMake``). -Note: whenever ``ccmake`` is mentioned in this document, substitute this by ``CMake-GUI`` if your OS is Windows. You can also edit the ``CMakeCache.txt`` file directly. - -How do I generate a build-system for Eclipse, KDevelop, CodeBlocks etc?! -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Type ``cmake`` into a console. This will list the available code generators available on your platform, which you can pass to ``CMake`` using the ``-G`` option. - -What are user definable cMake cache variables?! -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -They allow the user to pass options to ``CMake`` which will influence the build system. The most important option which should be given when calling ``CMake.exe`` is: - -``CMAKE_FIND_ROOT_PATH``, which is where ``CMake`` will search for additional libraries if they are not found in the default system paths. By default we add `OpenMS/contrib`. - -If your have installed all libraries on your system already there is no need to change ``CMAKE_FIND_ROOT_PATH``. If you need the `contrib` libraries, you will need to set this variable. -On Windows, you always need the ``contrib`` folder, as there are no system developer packages. To pass this variable to ``CMake`` use the ``-D`` switch e.g. ``cmake -D CMAKE_FIND_ROOT_PATH:PATH="D:\\somepath\\contrib"``. -Everything else can be edited using ``ccmake`` afterwards. - -The following options are of interest: - -* ``CMAKE_BUILD_TYPE`` Define if you want to build Debug or Release version of OpenMS. Release is the default. - -* ``CMAKE_FIND_ROOT_PATH`` The path to the ``contrib`` libraries. Note that you can also provide more then one value here (e.g., `-D CMAKE_FIND_ROOT_PATH="/path/to/contrib;/usr/"` will search in your `contrib` path and in `/usr` for the required libraries) - -* ``STL_DEBUG`` Enables STL debug mode. - -* ``DB_TEST`` (deprecated) Enables database testing. - -* ``QT_DB_PLUGIN`` (deprecated) Defines the db plugin used by Qt. - -* ``MT_CUDA_BUILD_TYPE`` ... - -Their description will be displayed when you call ``ccmake``. - -Can I use another solver than GLPK?! -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Yes, but by default the build system only links against GLPK (this is how OpenMS binary packages must be build!). -To use another solver try ``cmake ... -D USE_COINOR=1 ....`` and look at the documentation of the ``LPWrapper`` class. - -How do I switch to Debug/Release configuration?! -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -For Makefile generators (typically on Linux) you can set the ``CMAKE_BUILD_TYPE`` variable to either Debug or Release by calling ``ccmake``. -For Visual Studio, this is not necessary as all configurations are generated and you can choose the one you like within the IDE itself. -The 'Debug' configuration enabled debug information. The 'Release' configuration disables debug information and enables optimization. - -I changed the contrib path, but re-running CMake won't change the library paths? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Once a library is found and its location is stored in a cache variable, it will only be searched again if the corresponding entry in the cache file is set to false. -You can simply delete the ``CMakeCache.txt``, but all other custom settings will be lost as well. - -What are the most useful (make) targets? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -In Visual Studio you can see all targets on the left. For Makefiles type make help. However, this list is quite long. -The most useful targets will be shown to you by calling the targets target, i.e. make targets. - -CMake can't seem to find a Qt library (usually QtCore)! What now? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -``CMake`` finds QT by looking for ``qmake`` in your PATH or for the Environment Variable ``QTDIR``! Set these accordingly. -If the problem still persists: do you have a second installation of Qt (especially the MinGW version?)? This might lead ``CMake`` to the wrong path (it's searching for the ``Qt*.lib`` files). -You should only move/delete the offending Qt version if you know what you are doing! -A save workaround is to edit the ``CMakeCache`` file (e.g. via ``ccmake``) and set all paths relating to QT (e.g. ``QT_LIBRARY_DIR``) manually. - -(Windows) What version of Visual Studio should I use? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Use the latest if you can. Get the latest ``CMake``, as its generator needs to support your VS. If your VS is too new and there is no ``CMake`` for that yet, you're gonna be faced with a lot of conversion issues. -This happens whenever the Build-System calls ``CMake`` (which can be quite often, e.g., after changes to ``CMakeLists.txt``). - -How do I add a new class MyClass to the build system? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in ``src//include/OpenMS`` and the cpp file in ``src//source``, e.g., ``src/openms/include/OpenMS/FORMAT/NewFileFormat.h`` and ``src/openms/source/FORMAT/NewFileFormat.cpp``. -#. Add both to the respective sources.cmake file in the same directory (e.g., ``src/openms/source/FORMAT/`` and ``src/openms/include/OpenMS/FORMAT/``). -#. Add the corresponding class test to src/tests/class_tests// (e.g., ``src/tests/class_tests/openms/source/NewFileFormat_test.cpp``). -#. Add the test to the ``executables.cmake`` file in the test folder (e.g., ``src/tests/class_tests/openms/executables.cmake``). -#. Add them to git by using the command ``git add``. - -How do I add a new directory MYDIR to the build system? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#. Create two new ``sources.cmake`` files (one for ``src//include/OpenMS/MYDIR``, one for ``src//source/MYDIR``), using existing ``sources.cmake`` files as template. -#. Add the new ``sources.cmake`` files to ``src//includes.cmake`` -#. If you created a new directory directly under ``src/openms/source``, then have a look at ``src/tests/class_tests/openms/executables.cmake``. -#. Add a new section that makes the unit testing system aware of the new (upcoming) tests. -#. Look at the very bottom and augment ``TEST_executables``. -#. Add a new group target to ``src/tests/class_tests/openms/CMakeLists.txt``. - -Class/Unit tests and TOPP/Tool tests -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Class tests are unit tests that typically test the functionality of a class. - -They get build as standalone "additional" executables that include the class to be tested and our own testing utility classes to test outcomes of single functions of the class in question. - -Unless you added functions that are intended to be used outside of your new additional mode, you don't need to add anything there. - -Tool tests are using the tool executable that the user would also receive. We use those executables to run the full algorithm on a small test dataset, to ensure that from version to version the results stay the same/meaningful. - -Each tool test consists of: - -* An executable call on a test dataset (by using either fixed command line parameters or an ini file). - -* A FuzzyDiff call that compares the temporary output file of the last call and a reference test output that you have to provide. - -* a line to add a dependency of the FuzzyDiff call on the actual executable call (so they get executed after each other). - -Use e.g., ``ctest -V -R IDMapper`` to only test tests that include the regex ``IDMapper`` (-V is just verbose). Make sure to build the ``IDMapper`` and ``IDMapper_test`` (if edited) executable first everytime. -``ctest`` does not have any automatic dependency on the timestamps of the executables. - -How do I add a new test for the class MyClass? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You should always add a test alongside every new class added to OpenMS. - -#. Add the class test to ``src/tests/class_tests//`` (e.g., ``src/tests/class_tests/openms/source/NewFileFormat_test.cpp``). -#. Add the test to the ``executables.cmake`` file in the test folder. -#. Add them to git using the ``git add`` command. - -A test template for your specific class can be generated by the ``create_test.php`` script found in ``tools/``. - -#. Make sure you generated XML files containing the class information make doc_xml -#. Call: - -.. code:: bash - php tools/create_test.php /BUILD_DIRECTORY/ /PATH_TO_HEADER/MyClass.h \ - "FIRSTNAME LASTNAME" > ./src/tests/class_tests/openms/source/MyClass_test.cpp`` - -How do I add a new GUI test (for QT Gui classes) for the class MyClass? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#. Create the ``MyClass_test.cpp`` in ``src/tests/class_tests/openms_gui/source``. -#. Add it to ``src/tests/class_tests/openms_gui/CMakeLists.txt`` in the GUI section. -#. Have a look at existing GUI tests, as they use the ``QT TestLib`` framework and not the OpenMS macros. - -(Linux) When executing 'make test', all tests fail. -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Please check the ``LD_LIBRARY_PATH`` environment variable: - -You can print the ``LD_LIBRARY_PATH`` with ``echo $LD_LIBRARY_PATH``. If your ``/lib/`` folder is included, check that ``libOpenMS.so`` is present. -With the ``ldd`` command, you can show the libraries used by an executable, e.g. ``ldd /bin/ClassTest_test``. - -How can I speed up the compile process of OpenMS? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Build with several threads. If you have several processors/cores you can build OpenMS classes/tests and TOPP tools in in several threads. On Linux use the make option -j: make -j8 OpenMS TOPP test_build - -On Windows, Visual Studio solution files are automatically build with the /MP flag, such that VS uses all available cores of the machine. - -Release -******* - -see `Preparation-of-a-new-OpenMS-release `_ - -Continuous integration -********************** - -How does travis work? -^^^^^^^^^^^^^^^^^^^^^ - -`Travis `_ is an automated system for continuous integration and each new commit and pull request is automatically run through the travis build system. -This is controlled by a ``.travis.yaml`` file in the source tree. - -What can we do if travis times out? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The first thing to try is to simply restart travis, it sometimes hangs and since it builds on shared infrastructure, the next build may work better. This needs to be done by a OpenMS core developer. - -Since we use extensive caching, the build may take much longer when many files are touched and may never complete in that case (running into the travis time limit). In that case we can rebuild the cache using the following approach: - -.. code:: bash - - $ git cherry-pick 89c5cd7f2d9d343b3d63fc6bab18e08dcd969c05 - - $ git push origin develop - - # Now wait for the build to complete - - $ git revert 89c5cd7f2d9d343b3d63fc6bab18e08dcd969c05 - - $ git push origin develop - -Working in IDE's -**************** - -General: -^^^^^^^^ - -Why are there no source/TEST and source/APPLICATIONS/TOPP|UTILS folder? -_______________________________________________________________________ - -All source files added to an IDE are associated with their targets. You can find the source files for each test within its own subproject. The same is true for the ``TOPP`` and ``UTILS`` classes. - -How can I easily update a lot of test files (e.g., after a small format change in result files)? -_________________________________________________________________________________________________ - -Using ``grep`` one can simply extract the lines starting with ``diff FILENAME1 FILENAME2`` and replace the ``diff`` by ``copy``. - -Visual Studio: -^^^^^^^^^^^^^^ - -I'm getting the error "Error C2471: cannot update program database". -_____________________________________________________________________ - -This is a bug in Visual Studio and there is a bugfix: http://code.msdn.microsoft.com/KB946040 Only apply it if you encounter the error. The bugfix might have unwanted side effects! - - -Visual Studio can't read the clang-format file. -_______________________________________________ - -Depending on the Visual Studio version you're using you might get an error like "Error while formating with ClangFormat!". This is because Visual Studio is using an outdated version of clang-format. Unfortunately there is no easy way to update this using Visual Studio itself. -There is a plugin provided by LLVM designed to fix this exact problem, but the plugin doesn't work with every Visual Studio version. However, you can update clang-format by hand using the pre-build clang-format binary. Both the binary and a link to the plugin can be found here: https://llvm.org/builds/. -To update clang-format by hand just download the binary and exchange it with the clang-format binary in your Visual Studio folder. -For Visual Studio 17 and 19 it should be located at: ``C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\bin``. - -Eclipse CDT: -^^^^^^^^^^^^ - -The indexer gets stuck at some file which ``#includes seqan`` -_____________________________________________________________ - -It seems that SeqAn code is just too confusing for older eclipse C++ indexers. You should upgrade to eclipse galileo (CDT 6.0.x). Also, increase the available memory limit in eclipse.ini, e.g. -Xmx1024m for one gig. - - -The parser is confused after OPENMS_DLLAPI and does not recognize standard C++ headers -______________________________________________________________________________________ - -Go to ``Project -> Properties -> C/C++ Include Paths and Preprocessor Symbols -> Add Preprocessor symbol -> "OPENMS_DLLAPI="``. This tells eclipse that the macro is defined empty. In the same dialog you can also add an external include path to e.g. ``/usr/include/c++/4.3.3/``, etc. The issue with C++ headers was fixed in the latest galileo release. - -Hints to resolve the OPENMS_DLLAPI issue using the ``cmake`` generator are welcome! - -Debugging -********* - -How do I run a single test? -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can can execute an OpenMS class test using the CTest regular expressions: - -.. code:: bash - - > ctest -V -R "^_test" - - # To build a class test, you simply call the respective make target in ./source/TEST: - - > make _test - -To run a TOPP test, you can use: - -.. code:: bash - - > ctest -V -R "TOPP_" - -To build the tool, use: - -.. code:: bash - > make - -How do I debug uncaught exceptions? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -There is a mechanism to have a core dumped if an uncaught exception occurs. - -To enable it, the environment variable ``OPENMS_DUMP_CORE`` has to be set. - -Each time an uncaught exception occurs, the ``OPENMS_DUMP_CORE`` variable is checked and a segmentation fault is caused, if it is set. - -(Linux) Why is no core dumped, although a fatal error occured? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Try the ``ulimit -c`` unlimited command. It sets the maximum size of a core to unlimited. - -Note: We observed that, on some systems, no core is dumped even if the size of the core file is set to unlimited. We are not sure what causes this problem - -(Linux) How can I set breakpoints in gdb to debug OpenMS? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Imagine you want to debug the TOPPView application and you want it to stop at line 341 of - -.. code:: bash - SpectrumMDIWindow.C. - Run gdb: - shell> gdb TOPPView - -Start the application (and close it): - -.. code:: bash - gdb> run [arguments] - -Set the breakpoint: - -.. code:: bash - gdb> break SpectrumMDIWindow.C:341 - -Start the application again (with the same arguments): - -.. code:: bash - gdb> run - -How can I find out which shared libraries are used by an application? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Linux: ``ldd`` - -Windows (Visual studio console): Try "Dependency Walker" (http://www.dependencywalker.com/) (use x86 for 32bit builds and the x64 version for 64bit builds. Using the wrong version of depends.exe will give wrong results!) or ``dumpbin /DEPENDENTS OpenMS.dll``. - -How can I get a list of the symbols defined in a (shared) library or object file? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Linux: ``nm `` - -Use ``nm -C`` to switch on demangling of low-level symbols into their C++-equivalent names. ``nm`` also accepts .a and .o files. - -Windows (Visual studio console): ``dumpbin /ALL `` - -You can use dumpbin on object files (.o) or (shared) library files (.lib) or the DLL itself e.g. ``dumpbin /EXPORTS OpenMS.dll``. - -Cross-platform thoughts -*********************** - -OpenMS runs on three major platforms, each one having its own ways of doing things. Here are the most prominent causes of "it runs on Platform A, but not on B. What now?" - -Reading/Writing binary files causes different behaviour ... Usually Linux does not make a difference between text-mode and binary-mode when reading files. This is quite different on Windows as some bytes are interpreted as EOF, which lead might to a premature end of the reading process. - -Thus, if reading binary files make sure that you explicitly state that the file is binary when opening it! - -During writing in text-mode on windows a line-break (\n) is expanded to (\r\n). Keep this in mind or use the eol-style property of subversion to ensure that line endings are correctly checked out on non-Windows systems. - -``unsigned int`` vs ``size_t`` (UInt and Size) UInt and Size are the same on Linux GCC (i.e. both have the same size, 32bit on 32bit systems, 64bit on 64 bit systems), however on Windows this only holds for 32bit. On a 64bit Windows the UInt type is still 32bit, Size is (obviously) 64bit. This might lead to warnings (at best) or overflows and other nasty stuff. -So make sure you do not rely on UInt being equal to Size - because they're not. - -Paths and system functions... - -This is trivial but hardcoding something like ``String tmp_dir = "/tmp";`` is a big no-no! This must fail on Windows! Use Qt's QDir to get a path to the systems temporary directory if required. - -Also calling things like uname which are only available on Linux: don't! - -When working with files or directories, it is usually safe to use "/" on all platforms. Even Windows understands that. Take care of spaces in directory names though. You should always quote paths if they are used in a system call to ensure that the subsequent interpreter takes the spaced path as a single entity. - - -PyOpenMS - Trouble shooting -*************************** - -How can I wrap my new method with PyOpenMS? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You will have to add an entry to ``src/pyOpenMS/pxds/CLASS_NAME.pxd`` with the signature of your new method(s). - -How can I wrap my new class with PyOpenMS? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You will have to create a new file ``src/pyOpenMS/pxds/CLASS_NAME.pxd`` which is explained `here `_. - -My method has multiple outputs. Can I use output parameters? I have trouble wrapping them for pyOpenMS. -******************************************************************************************************* - -Python does not support passing primitive types (int, double etc) by reference, there fore void calculate(double &) will not work. - -Doxygen documentation -********************* - -Where can I find the definition of the main page? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -``OpenMS/doc/doxygen/public/Main.doxygen`` - -Where can I add a new module? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -``OpenMS/doc/doxygen/public/Modules.doxygen`` - -How is the parameter documentation for classes derived from DefaultParamHandler created? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You have to add your class to the program ``OpenMS/doc/doxygen/parameters/DefaultParamHandlerDocumenter.cpp``. This program generates a html table with the parameters. This table can then be included in the class documentation using the following ``doxygen`` command: - - -``@htmlinclude OpenMS_.parameters`` - - -Note that parameter documentation is automatically generated for ``TOPP/UTILS`` included in the static ``ToolHandler.cpp`` tools list. To include TOPP/UTILS parameter documentation use following ``doxygen`` command: - - -``@htmlinclude TOPP_.parameters`` - -or - -``@htmlinclude UTILS_.parameters`` - -You can test if everything worked by calling make doc_param_internal. The parameters documentation is written to ``OpenMS/doc/doxygen/parameters/output/``. - - -How is the command line documentation for TOPP/UTILS tools created? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The program ``OpenMS/doc/doxygen/parameters/TOPPDocumenter.cpp`` creates the command line documentation for all classes that are included in the static ``ToolHandler.cpp`` tools list. It can be included in the documentation using the following ``doxygen`` command: - -``@verbinclude TOPP_.cli`` - -You can test if everything worked by calling ``make doc_param_internal``. The command line documentation is written to ``OpenMS/doc/doxygen/parameters/output/``. - -What are the important files for adding a new tutorial section? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -OpenMS tutorial: - -* ``OpenMS/doc/OpenMS_tutorial/refman_overwrite.tex.in`` (for PDF tutorials) -* ``OpenMS/doc/doxygen/public/OpenMS_Tutorial_html.doxygen~`` (for html tutorials) - -TOPP and TOPPView tutorial: - -* ``OpenMS/doc/TOPP_tutorial/refman_overwrite.tex.in`` (for PDF tutorials) -* ``OpenMS/doc/doxygen/public/TOPP_Tutorial_html.doxygen`` (for html tutorials) - -Bug fixes -********* - -How to contribute a bugfix? -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#. Submit the bug as a GitHub issue. -#. Create a feature branch (e.g. ``feature/fix_missing_filename_issue_615``) from your (up-to-date) develop branch in your fork of OpenMS. -#. Fix the bug and add a test. -#. Create a pull request for your branch. -#. After approval and merge make sure the issue is closed. - -How can I profile my code? -^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Try IBM's profiler, available for all platforms (and free for academic use): Purify(Plus) and/or Quantify. - -Windows: this is directly supported by Visual Studio (Depending on the edition: Team and above). Follow their documentation. - -Linux: - -* Build OpenMS in debug mode (set ``CMAKE_BUILD_TYPE`` to ``Debug``). -* Call the executable with valgrind: ``valgrind –tool=callgrind``. Note: other processes running on the same machine can influence the profiling. Make sure your application gets enough resources (memory, CPU time). -* You can start and stop the profiling while the executable is running e.g. to skip initialization steps: -* Start valgrind with the option ``–instr-atstart=no``. -* Call ``callgrind -i [on|off]`` to start/stop the profiling. -* The output can be viewed with ``kcachegrind callgrind.out``. - -(Linux) How do I check my code for memory leaks? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -* Build OpenMS in debug mode (set ``CMAKE_BUILD_TYPE`` to ``Debug``). -* Call the executable with ``valgrind: valgrind --suppressions=OpenMS/tools/valgrind/openms_external.supp –leak-check=full ``. - -Common errors are: - -* ``'Invalid write/read ...'`` - Violation of container boundaries. -* ``'... depends on uninitialized variable'`` - Uninitialized variables: -* ``'... definitely lost'`` - Memory leak that has to be fixed -* ``'... possibly lost'`` - Possible wemory leak, so have a look at the code - -For more information see the valgrind documentation at http://valgrind.org/docs/manual/. From f7da7a08354af11e7398848ee8c6c079c7ee3b59 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Fri, 20 May 2022 18:15:18 +0930 Subject: [PATCH 64/77] added contributor-faq --- openms-wiki/contributor-faq.md | 375 +++++++++++++++++++++++++++++++++ openms-wiki/developer-faq.md | 6 +- 2 files changed, 378 insertions(+), 3 deletions(-) create mode 100644 openms-wiki/contributor-faq.md diff --git a/openms-wiki/contributor-faq.md b/openms-wiki/contributor-faq.md new file mode 100644 index 00000000..ce8fa9e7 --- /dev/null +++ b/openms-wiki/contributor-faq.md @@ -0,0 +1,375 @@ +Contributor FAQ +=============== + +The following contains answers to typical questions from developers about OpenMS. + +> **_NOTE:_** Some actions require special permissions like e.g. updating the website. + +## General + +The following section provides general information to new contributors. + +### I am new to OpenMS. What should I do first? + +* Check out the development version of OpenMS (see website). +* Try and build OpenMS according to the installation instructions. +* Read the OpenMS Coding Convention. +* Read the OpenMS Tutorial. +* Create a GitHub account +* Register to the open-ms-general and open-ms-developers mailing list. (You can see the developers list only if you are logged in to Sourceforge and if you are a OpenMS developer). + +### What is the difference between an OpenMS tool and util? + +A tool starts its lifecycle in `UTILS` and may exist without being thoroughly tested. Tools may be promoted from `UTILS` to `TOOLS` if they are stable enough, are fully tested, fully documented, and a test workflow exists. + +### I have written a class for OpenMS. What should I do? + +Follow the [OpenMS coding conventions](coding-conventions.md). + +Coding style (brackets, variable names, etc.) must conform to the conventions. + +* The class and all the members must be documented thoroughly. +* You can check your code with the tool `tools/checker.php`. Call `php tools/checker.php` for detailed instructions. + +Please open a pull request and follow the [checklist](pull-request-checklist.md). + +### How do I update the [openms.de](https://www.openms.de)? + +Login to the [wordpress admin area](www.openms.de/wp-admin) with your username and password assigned by the current Homepage maintainers. + +## Troubleshooting + +The following section provides information about how to troubleshoot common OpenMS issues. + +### OpenMS complains about boost not being found but I'm sure its there! + +`CMake` got confused. Set up a new build directory and try again. If you build in-source (not recommended), deleting the `CMakeCache.txt` and `cmake` directory might help. + +## Build System + +The following questions are related to the build system. + +### What is CMake? + +`CMake` builds BuildSystems for different platforms, e.g. VisualStudio Solutions on Windows, Makefiles on Linux etc. +This allows us to define in one central location (namely `CMakeLists.txt`) how OpenMS is build and have the platform specific stuff handled by `CMake`. +View the [cmake website[(http://www.cmake.org) for more information. + +### How do I use CMake? + +See Installation instructions for your platform. +In general, you call `CMake(.exe)` with some parameters to create the native build-system. +Afterwards you can (but usually don't have to edit the current configuration using a GUI named `ccmake` (or `CMake-GUI` in Windows), which ships with `CMake`). + +> **_NOTE:_** whenever `ccmake` is mentioned in this document, substitute this by `CMake-GUI` if your OS is Windows. You can also edit the `CMakeCache.txt` file directly. + +### How do I generate a build-system for Eclipse, KDevelop, CodeBlocks etc? + +Type `cmake` into a console. This will list the available code generators available on your platform, which you can pass to `CMake` using the `-G` option. + +### What are user definable CMake cache variables? + +They allow the user to pass options to `CMake` which will influence the build system. The most important option which should be given when calling `CMake.exe` is: + +`CMAKE_FIND_ROOT_PATH`, which is where `CMake` will search for additional libraries if they are not found in the default system paths. By default we add `OpenMS/contrib`. + +If your have installed all libraries on your system already there is no need to change `CMAKE_FIND_ROOT_PATH`. If you need the `contrib` libraries, you will need to set this variable. +On Windows, you always need the `contrib` folder, as there are no system developer packages. To pass this variable to `CMake` use the `-D` switch e.g. `cmake -D CMAKE_FIND_ROOT_PATH:PATH="D:\\somepath\\contrib"`. +Everything else can be edited using `ccmake` afterwards. + +The following options are of interest: + +* `CMAKE_BUILD_TYPE` Define if you want to build Debug or Release version of OpenMS. Release is the default. + +* `CMAKE_FIND_ROOT_PATH` The path to the `contrib` libraries. + > **_NOTE:_** that you can also provide more then one value here (e.g., `-D CMAKE_FIND_ROOT_PATH="/path/to/contrib;/usr/"` will search in your `contrib` path and in `/usr` for the required libraries) + +* `STL_DEBUG` Enables STL debug mode. + +* `DB_TEST` (deprecated) Enables database testing. + +* `QT_DB_PLUGIN` (deprecated) Defines the db plugin used by Qt. + +* `MT_CUDA_BUILD_TYPE` ... + +View the description for each option by calling `ccmake`. + +### How do I switch to debug or release configuration? + +For Makefile generators (typically on Linux), you can set the `CMAKE_BUILD_TYPE` variable to either Debug or Release by calling `ccmake`. +For Visual Studio, this is not necessary as all configurations are generated and you can choose the one you like within the IDE itself. +The 'Debug' configuration enabled debug information. The 'Release' configuration disables debug information and enables optimisation. + +### I changed the `contrib` path, but re-running `CMake` won't change the library paths? + +Once a library is found and its location is stored in a cache variable, it will only be searched again if the corresponding entry in the cache file is set to false. +You can delete the `CMakeCache.txt`, but all other custom settings will be lost. + +### What are the most useful `make` targets? + +In Visual Studio you can see all targets on the left. For Makefiles type make help. However, this list is quite long. +The most useful targets will be shown to you by calling the targets target, i.e. make targets. + +### `CMake` can't seem to find a `Qt` library (usually `QtCore`). What now? + +`CMake` finds `QT` by looking for `qmake` in your PATH or for the Environment Variable `QTDIR`. Set these accordingly. +If the problem still persists: do you have a second installation of Qt (especially the MinGW version)? This might lead ``CMake`` to the wrong path (it's searching for the ``Qt*.lib`` files). +You should only move or delete the offending `Qt` version if you know what you are doing! +A save workaround is to edit the `CMakeCache` file (e.g. via `ccmake`) and set all paths relating to `QT` (e.g. `QT_LIBRARY_DIR`) manually. + +### (Windows) What version of Visual Studio should I use? + +Use the latest if possible. Get the latest `CMake`, as its generator needs to support your VS. If your VS is too new and there is no `CMake` for that yet, you're gonna be faced with a lot of conversion issues. +This happens whenever the Build-System calls `CMake` (which can be quite often, e.g., after changes to `CMakeLists.txt`). + +### How do I add a new class to the build system? + +1. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in `src//include/OpenMS` and the cpp file in `src//source`, e.g., `src/openms/include/OpenMS/FORMAT/NewFileFormat.h` and `src/openms/source/FORMAT/NewFileFormat.cpp`. +2. Add both to the respective sources.cmake file in the same directory (e.g., `src/openms/source/FORMAT/` and `src/openms/include/OpenMS/FORMAT/`). +3. Add the corresponding class test to src/tests/class_tests// (e.g., `src/tests/class_tests/openms/source/NewFileFormat_test.cpp`). +4. Add the test to the `executables.cmake` file in the test folder (e.g., `src/tests/class_tests/openms/executables.cmake`). +5. Add them to git by using the command `git add`. + +### How do I add a new directory to the build system? + +1. Create two new `sources.cmake` files (one for `src//include/OpenMS/MYDIR`, one for `src//source/MYDIR`), using existing `sources.cmake` files as template. +2. Add the new `sources.cmake` files to `src//includes.cmake` +3. If you created a new directory directly under `src/openms/source`, then have a look at `src/tests/class_tests/openms/executables.cmake`. +4. Add a new section that makes the unit testing system aware of the new (upcoming) tests. +5. Look at the very bottom and augment `TEST_executables`. +6. Add a new group target to `src/tests/class_tests/openms/CMakeLists.txt`. + +### Class/Unit tests and TOPP/Tool tests + +Class or unit tests are built as standalone, additional executables that include the class to be tested and the testing utility classes to test outcomes of single functions of the class in question. + +Only add tests for functions added outside of your additional mode. + +Tool tests are using the tool executable that the user would also receive. We use those executables to run the full algorithm on a small test dataset, to ensure that from version to version the results stay the same and are meaningful. + +Each tool test consists of: + +* An executable call on a test dataset (by using either fixed command line parameters or an ini file). + +* A `FuzzyDiff` call that compares the temporary output file of the last call and a reference test output that you have to provide. + +* A line to add a dependency of the FuzzyDiff call on the actual executable call (so they get executed after each other). + +Use e.g., `ctest -V -R IDMapper` to only test tests that include the regex `IDMapper` (-V is just verbose). Make sure to build the `IDMapper` and `IDMapper_test` (if edited) executable first everytime. +`ctest` does not have any automatic dependency on the timestamps of the executables. + +### How do I add a test for a new class? + +You should always add a test alongside every new class added to OpenMS. + +To add a new class test: + +1. Add the class test to `src/tests/class_tests//` (e.g., `src/tests/class_tests/openms/source/NewFileFormat_test.cpp`). +2. Add the test to the `executables.cmake` file in the test folder. +3. Add them to git using the `git add` command. + +A test template for your specific class can be generated by the `create_test.php` script found in `tools/`. + +To generate a test template for your class: + +1. Make sure your generated XML files containing the class information make doc_xml. +2. Call: +```bash +php tools/create_test.php /BUILD_DIRECTORY/ / PATH_TO_HEADER/MyClass.h \ "FIRSTNAME LASTNAME" > ./src/tests/class_tests/openms/source/MyClass_test.cpp +``` + +### How do I add a new GUI test (for QT Gui classes) for the class `MyClass`? +To add a new GUI test: + +1. Create the `MyClass_test.cpp` in `src/tests/class_tests/openms_gui/source`. +2. Add it to `src/tests/class_tests/openms_gui/CMakeLists.txt` in the GUI section. +3. Have a look at existing GUI tests, as they use the `QT TestLib` framework and not the OpenMS macros. + +### (Linux) All tests fail when you execute `make test` + +Check the `LD_LIBRARY_PATH` environment variable: + +You can print the `LD_LIBRARY_PATH` with `echo $LD_LIBRARY_PATH`. If your `/lib/` folder is included, check that `libOpenMS.so` is present. +With the `ldd` command, you can show the libraries used by an executable, e.g. `ldd /bin/ClassTest_test`. + +## Release + +View [Preparation of a new OpenMS release](https://github.com/OpenMS/OpenMS/wiki/Preparation-of-a-new-OpenMS-release#release_developer) to learn more about contributing to releases. + +## Debugging + +The following section provides information about how to debug your code. + +### How do I run a single test? + +You can can execute an OpenMS class test using the CTest regular expressions: + +```bash + +ctest -V -R "^_test" + +# To build a class test, you simply call the respective make target in ./source/TEST: + +make _test +``` +To run a TOPP test, you can use: + +```bash + +ctest -V -R "TOPP_" +``` + +To build the tool, use: + +```bash +make +``` +### How do I debug uncaught exceptions? + +You can dump a core if an uncaught exception occurs, by setting the environment variable `OPENMS_DUMP_CORE`. + +Each time an uncaught exception occurs, the `OPENMS_DUMP_CORE` variable is checked and a segmentation fault is caused, if it is set. + +### (Linux) Why is no core dumped, although a fatal error occured? + +Try the `ulimit -c` unlimited command. It sets the maximum size of a core to unlimited. + +> **_NOTE:_** We observed that, on some systems, no core is dumped even if the size of the core file is set to unlimited. We are not sure what causes this problem + +### (Linux) How can I set breakpoints in gdb to debug OpenMS? + +Imagine you want to debug the TOPPView application and you want it to stop at line 341 of SpectrumMDIWindow.C. + +1. Enter the following in your terminal: + + ```bash + Run gdb: + shell> gdb TOPPView +``` + +2. Start the application (and close it): + + ```bash + gdb> run [arguments] +``` +3. Set the breakpoint: + ```bash + gdb> break SpectrumMDIWindow.C:341 +``` +4. Start the application again (with the same arguments): + + ```bash + gdb> run + ``` + +### How can I find out which shared libraries are used by an application? + +Linux: Use `ldd`. + +Windows (Visual studio console): Try [Dependency Walker](http://www.dependencywalker.com/) (use x86 for 32bit builds and the x64 version for 64bit builds. Using the wrong version of depends.exe will give the wrong results) or ``dumpbin /DEPENDENTS OpenMS.dll``. + +### How can I get a list of the symbols defined in a (shared) library or object file? + +Linux: Use `nm `. + +Use `nm -C` to switch on demangling of low-level symbols into their C++-equivalent names. `nm` also accepts .a and .o files. + +Windows (Visual studio console): Use ``dumpbin /ALL ``. + +You can use dumpbin on object files (.o) or (shared) library files (.lib) or the DLL itself e.g. `dumpbin /EXPORTS OpenMS.dll`. + +## Cross-platform thoughts + +OpenMS runs on three major platforms. Here are the most prominent causes of "it runs on Platform A, but not on B. What now?" + +### Reading or writing binary files +Reading or writing binary files causes different behaviour. Usually Linux does not make a difference between text-mode and binary-mode when reading files. This is quite different on Windows as some bytes are interpreted as `EOF`, which lead might to a premature end of the reading process. + +If reading binary files, make sure that you explicitly state that the file is binary when opening it. + +During writing in text-mode on Windows a line-break (`\n`) is expanded to (`\r\n`). Keep this in mind or use the `eol-style` property of subversion to ensure that line endings are correctly checked out on non-Windows systems. + +### `UInt` vs `Size` +Both `unsigned int` vs `size_t` `UInt` and `Size` have the same size on Linux GCC (32bit on 32bit systems, 64bit on 64 bit systems), however on Windows this only holds for 32bit. On a 64bit Windows, the `UInt` type is still 32bit, while the `Size` type is 64bit. This might lead to warnings (at best) or overflows and other drawbacks. +Therefore, do not assume that `UInt` is equal to `Size`. + +### Paths and system functions + +Avoid hardcoding e.g.`String tmp_dir = "/tmp";`. This will fail on Windows. Use Qt's `QDir` to get a path to the systems temporary directory if required. + +Avoid names like uname which are only available on Linux. + +When working with files or directories, it is usually safe to use "/" on all platforms. Take care of spaces in directory names though. You should always quote paths if they are used in a system call to ensure that the subsequent interpreter takes the spaced path as a single entity. + +## Doxygen Documentation + +### Where can I find the definition of the main page? + +You can find a definition of the main page [here](https://github.com/OpenMS/OpenMS/edit/develop/doc/doxygen/public/Main.doxygen). + +### Where can I add a new module? + +You can add a new module [here](https://github.com/OpenMS/OpenMS/edit/develop/doc/doxygen/public/Modules.doxygen). + + +### How is the command line documentation for TOPP/UTILS tools created? + +The program `OpenMS/doc/doxygen/parameters/TOPPDocumenter.cpp` creates the command line documentation for all classes that are included in the static `ToolHandler.cpp` tools list. It can be included in the documentation using the following `doxygen` command: + +`@verbinclude TOPP_.cli` + +You can test if everything worked by calling `make doc_param_internal`. The command line documentation is written to `OpenMS/doc/doxygen/parameters/output/`. + +### What are the important files for adding a new tutorial section? + +View the following OpenMS tutorials: + +* `OpenMS/doc/OpenMS_tutorial/refman_overwrite.tex.in` (for PDF tutorials) +* `OpenMS/doc/doxygen/public/OpenMS_Tutorial_html.doxygen~` (for html tutorials) + +For TOPP and TOPPView tutorials, view: + +* `OpenMS/doc/TOPP_tutorial/refman_overwrite.tex.in` (for PDF tutorials) +* `OpenMS/doc/doxygen/public/TOPP_Tutorial_html.doxygen` (for html tutorials) + +## Bug Fixes + +### How to contribute a bug fix? + +To contribute to a bug fix: +1. Submit the bug as a GitHub issue. +2. Create a feature branch (e.g. `feature/fix_missing_filename_issue_615`) from your (up-to-date) develop branch in your fork of OpenMS. +3. Fix the bug and add a test. +4. Create a pull request for your branch. +5. After approval and merge make sure the issue is closed. + +### How can I profile my code? + +Try IBM's profiler, available for all platforms (and free for academic use): Purify(Plus) and/or Quantify. + +Windows: this is directly supported by Visual Studio (Depending on the edition: Team and above). Follow their documentation. + +Linux: + +1. Build OpenMS in debug mode (set `CMAKE_BUILD_TYPE` to `Debug`). +2. Call the executable with valgrind: `valgrind –tool=callgrind`. + > **_NOTE:_** other processes running on the same machine can influence the profiling. Make sure your application gets enough resources (memory, CPU time). + +3. You can start and stop the profiling while the executable is running e.g. to skip initialization steps: +4. Start valgrind with the option `–instr-atstart=no`. +5. Call `callgrind -i [on|off]` to start/stop the profiling. +6. The output can be viewed with `kcachegrind callgrind.out`. + +### (Linux) How do I check my code for memory leaks? + +* Build OpenMS in debug mode (set ``CMAKE_BUILD_TYPE`` to ``Debug``). +* Call the executable with ``valgrind: valgrind --suppressions=OpenMS/tools/valgrind/openms_external.supp –leak-check=full ``. + +Common errors are: + +* ``'Invalid write/read ...'`` - Violation of container boundaries. +* ``'... depends on uninitialized variable'`` - Uninitialized variables: +* ``'... definitely lost'`` - Memory leak that has to be fixed +* ``'... possibly lost'`` - Possible memory leak, so have a look at the code + +For more information see the [`valgrind` documentation](http://valgrind.org/docs/manual/) . diff --git a/openms-wiki/developer-faq.md b/openms-wiki/developer-faq.md index d61b1fc1..99c92848 100644 --- a/openms-wiki/developer-faq.md +++ b/openms-wiki/developer-faq.md @@ -227,7 +227,7 @@ View [Preparation of a new OpenMS release](https://github.com/OpenMS/OpenMS/wiki ### How does travis work? -`Travis `_ is an automated system for continuous integration. Each new commit and pull request is automatically run through the travis build system. +[Travis](https://travis-ci.org/) is an automated system for continuous integration. Each new commit and pull request is automatically run through the travis build system. This is controlled by a `.travis.yaml` file in the source tree. ### What can we do if travis times out? @@ -404,11 +404,11 @@ Python does not support passing primitive types (`int`, `double`, etc.) by refer ### Where can I find the definition of the main page? -You can find a definition of the main page at ``OpenMS/doc/doxygen/public/Main.doxygen`` +You can find a definition of the main page [here](https://github.com/OpenMS/OpenMS/edit/develop/doc/doxygen/public/Main.doxygen). ### Where can I add a new module? -You can add a new module at `OpenMS/doc/doxygen/public/Modules.doxygen` +You can add a new module [here](https://github.com/OpenMS/OpenMS/edit/develop/doc/doxygen/public/Modules.doxygen). ### How is the parameter documentation for classes derived from DefaultParamHandler created? From d70bf58469b79667a9487ec93babe7de0dbc09b9 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Fri, 20 May 2022 20:34:26 +0930 Subject: [PATCH 65/77] added coding-convetions.md --- openms-wiki/coding-conventions.md | 174 ++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) diff --git a/openms-wiki/coding-conventions.md b/openms-wiki/coding-conventions.md index e69de29b..e3584d3b 100644 --- a/openms-wiki/coding-conventions.md +++ b/openms-wiki/coding-conventions.md @@ -0,0 +1,174 @@ +Coding Conventions +================== + +Familiarise yourself with the following code conventions. + +## Coding Style +The following section focuses on coding style. OpenMS uses coding style conventions that are automatically checked using `cpplint` (`/src/tests/coding/cpplint.py`). You can find a configuration file for the `CLion IDE` here. You can import it by selecting **Preferences** > **Code Style** > **Manage**. + +### Formatting + +#### Indentation + +OpenMS uses two spaces to indent. Tabulators in string literals should use the escape character `\t`. + +#### Spaces + +OpenMS uses spaces after built-in key words (e.g. `for`, `if`, `else`, etc.), and before and after binary mathematical operators. + +##### Line endings + +Native line endings should be allowed on each platform. This is desirable as Visual Studio for example will always insert `CRLF` even if the file is `LF` only, leading to a mixed line ending style for this file. Native `eol` style avoids this problem. + +#### Bracket placements + +Matching pairs of opening and closing curly braces should be set to the same column. See the following example: +```cpp +while (continue == true) +{ + for (int i = 0; i < 10; i++) + { + ... + } + if (x < 7) + { + .... + } +} +``` +The main reason for this rule is to avoid constructions like: +```cpp +if (isValid(a)) + error = 0; + return 0; +``` +which might later be changed to something like: +```cpp +if (isValid(a)) + error = 0; + return 0; +``` +Use braces around a block even if you use only single line. Single line constructs for trivial tests like: +```cpp +if (test) continue; +``` + +are allowed. + +One exception is several if/else statements, which can be written as: + +```cpp +if (cond1) +{ + ... +} +else if (cond2) +{ + ... +} +else if (cond3) +{ + ... +} +else +{ + ... +} +``` +This is safe because the first statement in each else branch is used, which is itself braced by the if branch. + +### Example class files + +### Example class interface + +## Naming Conventions +The following section describes the naming conventions followed by OpenMS developers. + +### Reserved words + +Reserved words of the C++ language and symbols defined e. g. in the `STL` or in the standard C library must not be used as names for classes or class members. Examples include but are not limited to: `set`, `map`, `exp` and `log`. + +### File names + +Header files and source files should be named as the classes they contain. Source files end in ".cpp", while header files end in ".h". File names should be capitalised exactly as the class they contain (see below). Each header/source file should contain one class only, although exceptions are possible for light-weight classes. + +### Underscores + +Usage of underscores in names has two different meanings: A trailing "_" at the end indicates that something is protected or private to a class. Apart from that, different parts of a name are sometimes separated by an underscore, and sometimes separated by capital letters. + +> **_NOTE:_** According to the C++ standard, names that start with an underscore are reserved for internal purposes of the language and its standard library (roughly speaking), so you should never use them. + +### Class / type / namespace names + +Class names and type names always start with a capital letter. Different parts of the name are separated by capital letters at the beginning of the word. No underscores are allowed in type names and class names, except for the names of protected types and classes in classes, which are suffixed by an underscore. The same conventions apply for namespaces. + +Here is an example of some classes written using the conventions described above: + +```cpp +class Simple; //ordinary class +class SimpleThing; //ordinary class +class PDBFile; //using an abbreviation +class Buffer_; //protected or private nested class +class ForwardIteratorTraits_; //protected or private nested class +``` + +### Variable names + +Variable names are written in lower case letters. Distinguished parts of the name are separated using underscores. If parts of the name are derived from common acronyms (e.g. MS) they should be in upper case. Private or protected member variables of classes are suffixed by an underscore. + +Here is an example of some variable names written using the conventions described above: + +```cpp +int simple; //ordinary variable +bool is_found; //ordinary variable +string MS_instrument; //using an abbreviation +int counter_; //protected or private member +int persistent_id_; //protected or private member +``` +### Method names + +Function names (including class method names) always start with a lower case letter. Parts of the name are separated using capital letters (as are types and class names). They should be comprehensible, but as short as possible. The same variable names must be used in the declaration and in the definition. Arguments that are actually not used in the implementation of a function have to be commented out - this avoids compiler warnings. The argument of void functions (empty argument list) must be omitted in both the declaration and the definition. If function arguments are pointers or references, the pointer or reference qualifier is appended to the variable type. It should not prefix the variable name. + +Here is an example of some method names written using the conventions described above: + +```cpp +void hello(); //ordinary function, no arguments +int countPeaks(PeakArray const& p); //ordinary function +bool ignore(string& /* name */); //ordinary function with an unused argument +bool isAdjacentTo(Peak const* const* const& p) const; //an ordinary function +bool doSomething_(int i, string& name); //protected or private member function +``` + +### Enum and preprocessor constants + +Enumerated values and preprocessor constants are all upper case letters. Parts of the name are separated by underscores. + +Here is an example of some enumerated values and preprocessor constants written using the conventions described above: + +```cpp +#define MYCLASS_SUPPORTS_MIN_MAX 0 //preprocessor constant +enum DimensionId { DIM_MZ = 0, DIM_RT = 1 }; //enumerated values +enum DimensionId_ { MZ = 0, RT = 1 }; //enumerated values +``` + +Avoid using the preprocessor. Normally, `const` and `enum` will suffice for most cases. + +### Parameters + +Parameters should consist of lower-case letters and underscores only. For numerical parameters, the range of reasonable values is given. Where applicable units are given in the description. This rule applies to all kinds of parameter strings, both keys and string-values. + +### File extensions + +The correct capitalisation of all data file extensions supported by OpenMS in documented in FileHandler::NamesOfTypes[]. The convention is to use only lowercase letters for file extensions. There are three exceptions: "ML" and "XML" are written in uppercase letters and "mzData" keeps its capital "D". Please remember to keep this consistent when adding new data files or writing new TOPP tools or UTILS (use correct capitalisation for file type restrictions, here). + +### + +## Exception Handling + +## Expose Methods to Python + +## Documentation + +## Testing + +## Version Control From 05e8e1e2b41a203531b38c1bac9ba872622c8b1b Mon Sep 17 00:00:00 2001 From: greengypsy Date: Fri, 20 May 2022 20:34:47 +0930 Subject: [PATCH 66/77] added contributor-faq.md --- openms-wiki/contributor-faq.md | 116 ++------------------------------- 1 file changed, 5 insertions(+), 111 deletions(-) diff --git a/openms-wiki/contributor-faq.md b/openms-wiki/contributor-faq.md index ce8fa9e7..844ce7da 100644 --- a/openms-wiki/contributor-faq.md +++ b/openms-wiki/contributor-faq.md @@ -33,10 +33,6 @@ Coding style (brackets, variable names, etc.) must conform to the conventions. Please open a pull request and follow the [checklist](pull-request-checklist.md). -### How do I update the [openms.de](https://www.openms.de)? - -Login to the [wordpress admin area](www.openms.de/wp-admin) with your username and password assigned by the current Homepage maintainers. - ## Troubleshooting The following section provides information about how to troubleshoot common OpenMS issues. @@ -67,54 +63,17 @@ Afterwards you can (but usually don't have to edit the current configuration usi Type `cmake` into a console. This will list the available code generators available on your platform, which you can pass to `CMake` using the `-G` option. -### What are user definable CMake cache variables? - -They allow the user to pass options to `CMake` which will influence the build system. The most important option which should be given when calling `CMake.exe` is: - -`CMAKE_FIND_ROOT_PATH`, which is where `CMake` will search for additional libraries if they are not found in the default system paths. By default we add `OpenMS/contrib`. - -If your have installed all libraries on your system already there is no need to change `CMAKE_FIND_ROOT_PATH`. If you need the `contrib` libraries, you will need to set this variable. -On Windows, you always need the `contrib` folder, as there are no system developer packages. To pass this variable to `CMake` use the `-D` switch e.g. `cmake -D CMAKE_FIND_ROOT_PATH:PATH="D:\\somepath\\contrib"`. -Everything else can be edited using `ccmake` afterwards. - -The following options are of interest: - -* `CMAKE_BUILD_TYPE` Define if you want to build Debug or Release version of OpenMS. Release is the default. - -* `CMAKE_FIND_ROOT_PATH` The path to the `contrib` libraries. - > **_NOTE:_** that you can also provide more then one value here (e.g., `-D CMAKE_FIND_ROOT_PATH="/path/to/contrib;/usr/"` will search in your `contrib` path and in `/usr` for the required libraries) - -* `STL_DEBUG` Enables STL debug mode. - -* `DB_TEST` (deprecated) Enables database testing. - -* `QT_DB_PLUGIN` (deprecated) Defines the db plugin used by Qt. - -* `MT_CUDA_BUILD_TYPE` ... - -View the description for each option by calling `ccmake`. - ### How do I switch to debug or release configuration? For Makefile generators (typically on Linux), you can set the `CMAKE_BUILD_TYPE` variable to either Debug or Release by calling `ccmake`. For Visual Studio, this is not necessary as all configurations are generated and you can choose the one you like within the IDE itself. The 'Debug' configuration enabled debug information. The 'Release' configuration disables debug information and enables optimisation. -### I changed the `contrib` path, but re-running `CMake` won't change the library paths? - -Once a library is found and its location is stored in a cache variable, it will only be searched again if the corresponding entry in the cache file is set to false. -You can delete the `CMakeCache.txt`, but all other custom settings will be lost. - -### What are the most useful `make` targets? - -In Visual Studio you can see all targets on the left. For Makefiles type make help. However, this list is quite long. -The most useful targets will be shown to you by calling the targets target, i.e. make targets. - -### `CMake` can't seem to find a `Qt` library (usually `QtCore`). What now? +### `CMake` can't seem to find a `Qt` library (usually `QtCore`). `CMake` finds `QT` by looking for `qmake` in your PATH or for the Environment Variable `QTDIR`. Set these accordingly. If the problem still persists: do you have a second installation of Qt (especially the MinGW version)? This might lead ``CMake`` to the wrong path (it's searching for the ``Qt*.lib`` files). -You should only move or delete the offending `Qt` version if you know what you are doing! +Take care when you move or delete the offending `Qt` version. A save workaround is to edit the `CMakeCache` file (e.g. via `ccmake`) and set all paths relating to `QT` (e.g. `QT_LIBRARY_DIR`) manually. ### (Windows) What version of Visual Studio should I use? @@ -126,7 +85,7 @@ This happens whenever the Build-System calls `CMake` (which can be quite often, 1. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in `src//include/OpenMS` and the cpp file in `src//source`, e.g., `src/openms/include/OpenMS/FORMAT/NewFileFormat.h` and `src/openms/source/FORMAT/NewFileFormat.cpp`. 2. Add both to the respective sources.cmake file in the same directory (e.g., `src/openms/source/FORMAT/` and `src/openms/include/OpenMS/FORMAT/`). -3. Add the corresponding class test to src/tests/class_tests// (e.g., `src/tests/class_tests/openms/source/NewFileFormat_test.cpp`). +3. Add the corresponding class test to `src/tests/class_tests//` (e.g., `src/tests/class_tests/openms/source/NewFileFormat_test.cpp`). 4. Add the test to the `executables.cmake` file in the test folder (e.g., `src/tests/class_tests/openms/executables.cmake`). 5. Add them to git by using the command `git add`. @@ -139,7 +98,7 @@ This happens whenever the Build-System calls `CMake` (which can be quite often, 5. Look at the very bottom and augment `TEST_executables`. 6. Add a new group target to `src/tests/class_tests/openms/CMakeLists.txt`. -### Class/Unit tests and TOPP/Tool tests +### What are class/unit tests and TOPP/Tool tests Class or unit tests are built as standalone, additional executables that include the class to be tested and the testing utility classes to test outcomes of single functions of the class in question. @@ -178,24 +137,6 @@ To generate a test template for your class: php tools/create_test.php /BUILD_DIRECTORY/ / PATH_TO_HEADER/MyClass.h \ "FIRSTNAME LASTNAME" > ./src/tests/class_tests/openms/source/MyClass_test.cpp ``` -### How do I add a new GUI test (for QT Gui classes) for the class `MyClass`? -To add a new GUI test: - -1. Create the `MyClass_test.cpp` in `src/tests/class_tests/openms_gui/source`. -2. Add it to `src/tests/class_tests/openms_gui/CMakeLists.txt` in the GUI section. -3. Have a look at existing GUI tests, as they use the `QT TestLib` framework and not the OpenMS macros. - -### (Linux) All tests fail when you execute `make test` - -Check the `LD_LIBRARY_PATH` environment variable: - -You can print the `LD_LIBRARY_PATH` with `echo $LD_LIBRARY_PATH`. If your `/lib/` folder is included, check that `libOpenMS.so` is present. -With the `ldd` command, you can show the libraries used by an executable, e.g. `ldd /bin/ClassTest_test`. - -## Release - -View [Preparation of a new OpenMS release](https://github.com/OpenMS/OpenMS/wiki/Preparation-of-a-new-OpenMS-release#release_developer) to learn more about contributing to releases. - ## Debugging The following section provides information about how to debug your code. @@ -262,22 +203,6 @@ Imagine you want to debug the TOPPView application and you want it to stop at li gdb> run ``` -### How can I find out which shared libraries are used by an application? - -Linux: Use `ldd`. - -Windows (Visual studio console): Try [Dependency Walker](http://www.dependencywalker.com/) (use x86 for 32bit builds and the x64 version for 64bit builds. Using the wrong version of depends.exe will give the wrong results) or ``dumpbin /DEPENDENTS OpenMS.dll``. - -### How can I get a list of the symbols defined in a (shared) library or object file? - -Linux: Use `nm `. - -Use `nm -C` to switch on demangling of low-level symbols into their C++-equivalent names. `nm` also accepts .a and .o files. - -Windows (Visual studio console): Use ``dumpbin /ALL ``. - -You can use dumpbin on object files (.o) or (shared) library files (.lib) or the DLL itself e.g. `dumpbin /EXPORTS OpenMS.dll`. - ## Cross-platform thoughts OpenMS runs on three major platforms. Here are the most prominent causes of "it runs on Platform A, but not on B. What now?" @@ -334,7 +259,7 @@ For TOPP and TOPPView tutorials, view: ## Bug Fixes -### How to contribute a bug fix? +### How do I contribute a bug fix? To contribute to a bug fix: 1. Submit the bug as a GitHub issue. @@ -342,34 +267,3 @@ To contribute to a bug fix: 3. Fix the bug and add a test. 4. Create a pull request for your branch. 5. After approval and merge make sure the issue is closed. - -### How can I profile my code? - -Try IBM's profiler, available for all platforms (and free for academic use): Purify(Plus) and/or Quantify. - -Windows: this is directly supported by Visual Studio (Depending on the edition: Team and above). Follow their documentation. - -Linux: - -1. Build OpenMS in debug mode (set `CMAKE_BUILD_TYPE` to `Debug`). -2. Call the executable with valgrind: `valgrind –tool=callgrind`. - > **_NOTE:_** other processes running on the same machine can influence the profiling. Make sure your application gets enough resources (memory, CPU time). - -3. You can start and stop the profiling while the executable is running e.g. to skip initialization steps: -4. Start valgrind with the option `–instr-atstart=no`. -5. Call `callgrind -i [on|off]` to start/stop the profiling. -6. The output can be viewed with `kcachegrind callgrind.out`. - -### (Linux) How do I check my code for memory leaks? - -* Build OpenMS in debug mode (set ``CMAKE_BUILD_TYPE`` to ``Debug``). -* Call the executable with ``valgrind: valgrind --suppressions=OpenMS/tools/valgrind/openms_external.supp –leak-check=full ``. - -Common errors are: - -* ``'Invalid write/read ...'`` - Violation of container boundaries. -* ``'... depends on uninitialized variable'`` - Uninitialized variables: -* ``'... definitely lost'`` - Memory leak that has to be fixed -* ``'... possibly lost'`` - Possible memory leak, so have a look at the code - -For more information see the [`valgrind` documentation](http://valgrind.org/docs/manual/) . From d432cd6ae55c1e26877fcf885bc027f08417cab0 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sat, 21 May 2022 11:53:03 +0930 Subject: [PATCH 67/77] updated pull request checklist md file --- openms-wiki/coding-conventions.md | 174 -------------------------- openms-wiki/pull-request-checklist.md | 48 +++++++ 2 files changed, 48 insertions(+), 174 deletions(-) delete mode 100644 openms-wiki/coding-conventions.md diff --git a/openms-wiki/coding-conventions.md b/openms-wiki/coding-conventions.md deleted file mode 100644 index e3584d3b..00000000 --- a/openms-wiki/coding-conventions.md +++ /dev/null @@ -1,174 +0,0 @@ -Coding Conventions -================== - -Familiarise yourself with the following code conventions. - -## Coding Style -The following section focuses on coding style. OpenMS uses coding style conventions that are automatically checked using `cpplint` (`/src/tests/coding/cpplint.py`). You can find a configuration file for the `CLion IDE` here. You can import it by selecting **Preferences** > **Code Style** > **Manage**. - -### Formatting - -#### Indentation - -OpenMS uses two spaces to indent. Tabulators in string literals should use the escape character `\t`. - -#### Spaces - -OpenMS uses spaces after built-in key words (e.g. `for`, `if`, `else`, etc.), and before and after binary mathematical operators. - -##### Line endings - -Native line endings should be allowed on each platform. This is desirable as Visual Studio for example will always insert `CRLF` even if the file is `LF` only, leading to a mixed line ending style for this file. Native `eol` style avoids this problem. - -#### Bracket placements - -Matching pairs of opening and closing curly braces should be set to the same column. See the following example: -```cpp -while (continue == true) -{ - for (int i = 0; i < 10; i++) - { - ... - } - if (x < 7) - { - .... - } -} -``` -The main reason for this rule is to avoid constructions like: -```cpp -if (isValid(a)) - error = 0; - return 0; -``` -which might later be changed to something like: -```cpp -if (isValid(a)) - error = 0; - return 0; -``` -Use braces around a block even if you use only single line. Single line constructs for trivial tests like: -```cpp -if (test) continue; -``` - -are allowed. - -One exception is several if/else statements, which can be written as: - -```cpp -if (cond1) -{ - ... -} -else if (cond2) -{ - ... -} -else if (cond3) -{ - ... -} -else -{ - ... -} -``` -This is safe because the first statement in each else branch is used, which is itself braced by the if branch. - -### Example class files - -### Example class interface - -## Naming Conventions -The following section describes the naming conventions followed by OpenMS developers. - -### Reserved words - -Reserved words of the C++ language and symbols defined e. g. in the `STL` or in the standard C library must not be used as names for classes or class members. Examples include but are not limited to: `set`, `map`, `exp` and `log`. - -### File names - -Header files and source files should be named as the classes they contain. Source files end in ".cpp", while header files end in ".h". File names should be capitalised exactly as the class they contain (see below). Each header/source file should contain one class only, although exceptions are possible for light-weight classes. - -### Underscores - -Usage of underscores in names has two different meanings: A trailing "_" at the end indicates that something is protected or private to a class. Apart from that, different parts of a name are sometimes separated by an underscore, and sometimes separated by capital letters. - -> **_NOTE:_** According to the C++ standard, names that start with an underscore are reserved for internal purposes of the language and its standard library (roughly speaking), so you should never use them. - -### Class / type / namespace names - -Class names and type names always start with a capital letter. Different parts of the name are separated by capital letters at the beginning of the word. No underscores are allowed in type names and class names, except for the names of protected types and classes in classes, which are suffixed by an underscore. The same conventions apply for namespaces. - -Here is an example of some classes written using the conventions described above: - -```cpp -class Simple; //ordinary class -class SimpleThing; //ordinary class -class PDBFile; //using an abbreviation -class Buffer_; //protected or private nested class -class ForwardIteratorTraits_; //protected or private nested class -``` - -### Variable names - -Variable names are written in lower case letters. Distinguished parts of the name are separated using underscores. If parts of the name are derived from common acronyms (e.g. MS) they should be in upper case. Private or protected member variables of classes are suffixed by an underscore. - -Here is an example of some variable names written using the conventions described above: - -```cpp -int simple; //ordinary variable -bool is_found; //ordinary variable -string MS_instrument; //using an abbreviation -int counter_; //protected or private member -int persistent_id_; //protected or private member -``` -### Method names - -Function names (including class method names) always start with a lower case letter. Parts of the name are separated using capital letters (as are types and class names). They should be comprehensible, but as short as possible. The same variable names must be used in the declaration and in the definition. Arguments that are actually not used in the implementation of a function have to be commented out - this avoids compiler warnings. The argument of void functions (empty argument list) must be omitted in both the declaration and the definition. If function arguments are pointers or references, the pointer or reference qualifier is appended to the variable type. It should not prefix the variable name. - -Here is an example of some method names written using the conventions described above: - -```cpp -void hello(); //ordinary function, no arguments -int countPeaks(PeakArray const& p); //ordinary function -bool ignore(string& /* name */); //ordinary function with an unused argument -bool isAdjacentTo(Peak const* const* const& p) const; //an ordinary function -bool doSomething_(int i, string& name); //protected or private member function -``` - -### Enum and preprocessor constants - -Enumerated values and preprocessor constants are all upper case letters. Parts of the name are separated by underscores. - -Here is an example of some enumerated values and preprocessor constants written using the conventions described above: - -```cpp -#define MYCLASS_SUPPORTS_MIN_MAX 0 //preprocessor constant -enum DimensionId { DIM_MZ = 0, DIM_RT = 1 }; //enumerated values -enum DimensionId_ { MZ = 0, RT = 1 }; //enumerated values -``` - -Avoid using the preprocessor. Normally, `const` and `enum` will suffice for most cases. - -### Parameters - -Parameters should consist of lower-case letters and underscores only. For numerical parameters, the range of reasonable values is given. Where applicable units are given in the description. This rule applies to all kinds of parameter strings, both keys and string-values. - -### File extensions - -The correct capitalisation of all data file extensions supported by OpenMS in documented in FileHandler::NamesOfTypes[]. The convention is to use only lowercase letters for file extensions. There are three exceptions: "ML" and "XML" are written in uppercase letters and "mzData" keeps its capital "D". Please remember to keep this consistent when adding new data files or writing new TOPP tools or UTILS (use correct capitalisation for file type restrictions, here). - -### - -## Exception Handling - -## Expose Methods to Python - -## Documentation - -## Testing - -## Version Control diff --git a/openms-wiki/pull-request-checklist.md b/openms-wiki/pull-request-checklist.md index e69de29b..1cd0bba7 100644 --- a/openms-wiki/pull-request-checklist.md +++ b/openms-wiki/pull-request-checklist.md @@ -0,0 +1,48 @@ +Pull Request Checklist +====================== + +Before you open a pull request, make sure you check the following: + +* **Does the code build?** + + Execute `make` (or your build system's equivalent, e.g., `cmake --build . --target ALL_BUILD --config Release` on Windows). +* **Do all tests pass?** + + To check if all tests have passed, execute `ctest`. + If a test that is unrelated to your changes fails, check the [nightly builds](http://cdash.openms.de/index.php?project=OpenMS) to see if the error is also in `develop`. If the error is in develop, [create a github issue](write-and-label-github-issues.md). +* **Is the code documented?** + + Document all new classes, including their methods and parameters. + It is also recommended that you also document non-public members and methods. +* **Does the code introduce changes to the API?** + + If the code introduces changes to the API, make sure that the documentation is up-to-date and that the Python bindings (pyOpenMS) still work. For each change in the C++ API, make a change in the Python API wrapper via the `pyOpenMS/pxds/` files. + +* **Have you completed regression testing?** + + Make sure that you include a test in the test suite for: + + * Public methods of a class + * TOPP tools + * Bug fixes + +Make sure to: +* **Rebase before you open a pull request.** + + To include all recent changes, rebase your branch on `develop` before you open a pull request. + + If you pushed your branch to `origin` before rebasing, git will most likely tell you after the rebase that your local branch and the remote branch have diverged. + + If you are sure that the remote branch does not contain any local commits in the rebased version, you can safely push using `git push -f origin ` to enforce overwrite. If not, contact your local git expert on how to get the changes into your local branch. + +* **Capture similar changes in a single commit** + + Each commit should represent one logical unit. Consolidate multiple commits if they belong together or split single commits if they are unrelated. For example, committing code formatting together with a one-line fix makes it very hard to figure out what the fix was and which changes were inconsequential. + +* **Create a pull request for a single feature or bug** + + If you have multiple features or fixes in a pull request, you might get asked to split your request and open multiple pull requests instead. + +* **Describe what you have changed in your pull request.** + + When opening the pull request, give a detailed overview of what has changed and why. Include a clear rationale for the changes and add benchmark data if available. See [this request](https://github.com/bitly/dablooms/pull/19) for an example. From 23388109d428e29730d68b7b063acd730138f790 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sat, 21 May 2022 12:52:34 +0930 Subject: [PATCH 68/77] updated write-and-label-github-issues --- openms-wiki/write-and-label-github-issues.md | 40 ++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/openms-wiki/write-and-label-github-issues.md b/openms-wiki/write-and-label-github-issues.md index e69de29b..7a899f1f 100644 --- a/openms-wiki/write-and-label-github-issues.md +++ b/openms-wiki/write-and-label-github-issues.md @@ -0,0 +1,40 @@ +Write and Label GitHub Issues +============================= + +## Create an issue + +To create an issue: + +1. Go to the [OpenMS codebase](https://github.com/OpenMS/OpenMS). +2. Click **Issues** in the menu at the top of the screen. +3. Click **New issue**. +4. Provide a title and a description to the issue. +5. [Label](write-and-label-github-issues.md) the issue. +6. Click **Submit new issue**. + +The issue will be listed under **Issues**. + +## Label an issue + +To label an issue: +1. On the right of the screen, select the cog icon under **Labels**. +2. Choose a label from the list. Normally, an issue can have one or more of the following labels: + * **defect** + + A defect refers to a bug in OpenMS. This is a high priority issue. + + * **enhancement** + + An enhancement refers to a feature idea to enhance the current OpenMS code. This is a medium priority issue. + + * **task** + + A task refers to a single piece of work that a developer can undertake. This is a medium priority issue. + + * **refactoring** + + A refactoring issue refers to a suggestion to streamline the code without changing how the code function. + + * **question** + + A question could trigger to a discussion about tools, parameters and scientific tasks. From ec567b93bbade5cd0ad3fb14f52ac61a5c0c38a0 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sat, 21 May 2022 13:40:56 +0930 Subject: [PATCH 69/77] made changes suggested in the review --- openms-wiki/about.md | 3 +- openms-wiki/build-openms-from-source.md | 2 +- openms-wiki/contributor-faq.md | 70 +++----------------- openms-wiki/contributors-quickstart-guide.md | 43 +++++++----- openms-wiki/developer-faq.md | 49 +++++++------- openms-wiki/reporting-bugs-and-issues.md | 6 +- openms-wiki/users-quickstart-guide.md | 4 +- openms-wiki/write-and-label-github-issues.md | 6 +- 8 files changed, 71 insertions(+), 112 deletions(-) diff --git a/openms-wiki/about.md b/openms-wiki/about.md index 9cd7a2dc..79d4233b 100644 --- a/openms-wiki/about.md +++ b/openms-wiki/about.md @@ -2,11 +2,12 @@ About ===== -OpenMS is an open-source C++ library for Mass Spectrometry (MS) data management and analyses. It offers an infrastructure for the rapid development of mass spectrometry-related software. OpenMS is free software available under the [three-clause BSD license](https://github.com/OpenMS/OpenMS-docs/blob/main/LICENSE). It is available for Windows, Mac OS X and Linux. +OpenMS is an open-source C++ library for Mass Spectrometry (MS) data management and analyses. It offers an infrastructure for the rapid development of mass spectrometry-related software. OpenMS is free software available under the [three-clause BSD license](https://github.com/OpenMS/OpenMS-docs/blob/main/LICENSE). It is available for Windows, macOS and Linux. OpenMS comes with a vast variety of pre-built and ready-to-use tools for proteomics and metabolomics data analysis (TOPP tools), and powerful 2D and 3D visualisation (TOPPView). It supports analyses for various quantification protocols, including label-free shotgun proteomics, SILAC, iTRAQ, SRM, and SWATH. It also provides built-in algorithms for peptide/protein identification, both de-novo and via database searching, as well as adapters to state-of-the-art tools like X! Tandem, Mascot, OMSSA, and others. Through the TOPP tools concept and unified parameter handling (CTD), OpenMS supports easy integration into workflow engines like TOPPAS (included), KNIME, Galaxy, and WS-PGRADE. + With pyOpenMS, OpenMS offers Python bindings to a large part of the API to enable rapid computational mass spectrometry development. OpenMS supports the Proteomics Standard Initiative (PSI) file formats for MS data. diff --git a/openms-wiki/build-openms-from-source.md b/openms-wiki/build-openms-from-source.md index c0695375..6dc18d47 100644 --- a/openms-wiki/build-openms-from-source.md +++ b/openms-wiki/build-openms-from-source.md @@ -4,7 +4,7 @@ Build OpenMS From Source To build OpenMS, please follow the build instructions for: * [Linux](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_linux.html) -* [OSX](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_mac.html) +* [macOS](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_mac.html) * [Windows](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_win.html) Instructions to build pyOpenMS can be found in the [pyOpenMS documentation](https://pyopenms.readthedocs.io/en/latest/build_from_source.html). diff --git a/openms-wiki/contributor-faq.md b/openms-wiki/contributor-faq.md index 844ce7da..00210b8b 100644 --- a/openms-wiki/contributor-faq.md +++ b/openms-wiki/contributor-faq.md @@ -1,9 +1,7 @@ Contributor FAQ =============== -The following contains answers to typical questions from developers about OpenMS. - -> **_NOTE:_** Some actions require special permissions like e.g. updating the website. +The following contains answers to typical questions from contributors about OpenMS. ## General @@ -13,10 +11,11 @@ The following section provides general information to new contributors. * Check out the development version of OpenMS (see website). * Try and build OpenMS according to the installation instructions. -* Read the OpenMS Coding Convention. +* Read the [OpenMS Coding Conventions](https://github.com/OpenMS/OpenMS/wiki/Coding-conventions). * Read the OpenMS Tutorial. -* Create a GitHub account -* Register to the open-ms-general and open-ms-developers mailing list. (You can see the developers list only if you are logged in to Sourceforge and if you are a OpenMS developer). +* Create a GitHub account. +* Subscribe to the [open-ms-general](https://sourceforge.net/projects/open-ms/lists/open-ms-general) and [open-ms-developers]() mailing lists. + > ***_NOTE:_*** You can see the developers list only if you are logged in to Sourceforge and if you are a OpenMS developer. ### What is the difference between an OpenMS tool and util? @@ -37,9 +36,9 @@ Please open a pull request and follow the [checklist](pull-request-checklist.md) The following section provides information about how to troubleshoot common OpenMS issues. -### OpenMS complains about boost not being found but I'm sure its there! +### OpenMS complains about boost not being found -`CMake` got confused. Set up a new build directory and try again. If you build in-source (not recommended), deleting the `CMakeCache.txt` and `cmake` directory might help. +`CMake` got confused. Set up a new build directory and try again. If you build from source, deleting the `CMakeCache.txt` and `cmake` directory might help. ## Build System @@ -69,18 +68,6 @@ For Makefile generators (typically on Linux), you can set the `CMAKE_BUILD_TYPE` For Visual Studio, this is not necessary as all configurations are generated and you can choose the one you like within the IDE itself. The 'Debug' configuration enabled debug information. The 'Release' configuration disables debug information and enables optimisation. -### `CMake` can't seem to find a `Qt` library (usually `QtCore`). - -`CMake` finds `QT` by looking for `qmake` in your PATH or for the Environment Variable `QTDIR`. Set these accordingly. -If the problem still persists: do you have a second installation of Qt (especially the MinGW version)? This might lead ``CMake`` to the wrong path (it's searching for the ``Qt*.lib`` files). -Take care when you move or delete the offending `Qt` version. -A save workaround is to edit the `CMakeCache` file (e.g. via `ccmake`) and set all paths relating to `QT` (e.g. `QT_LIBRARY_DIR`) manually. - -### (Windows) What version of Visual Studio should I use? - -Use the latest if possible. Get the latest `CMake`, as its generator needs to support your VS. If your VS is too new and there is no `CMake` for that yet, you're gonna be faced with a lot of conversion issues. -This happens whenever the Build-System calls `CMake` (which can be quite often, e.g., after changes to `CMakeLists.txt`). - ### How do I add a new class to the build system? 1. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in `src//include/OpenMS` and the cpp file in `src//source`, e.g., `src/openms/include/OpenMS/FORMAT/NewFileFormat.h` and `src/openms/source/FORMAT/NewFileFormat.cpp`. @@ -98,45 +85,6 @@ This happens whenever the Build-System calls `CMake` (which can be quite often, 5. Look at the very bottom and augment `TEST_executables`. 6. Add a new group target to `src/tests/class_tests/openms/CMakeLists.txt`. -### What are class/unit tests and TOPP/Tool tests - -Class or unit tests are built as standalone, additional executables that include the class to be tested and the testing utility classes to test outcomes of single functions of the class in question. - -Only add tests for functions added outside of your additional mode. - -Tool tests are using the tool executable that the user would also receive. We use those executables to run the full algorithm on a small test dataset, to ensure that from version to version the results stay the same and are meaningful. - -Each tool test consists of: - -* An executable call on a test dataset (by using either fixed command line parameters or an ini file). - -* A `FuzzyDiff` call that compares the temporary output file of the last call and a reference test output that you have to provide. - -* A line to add a dependency of the FuzzyDiff call on the actual executable call (so they get executed after each other). - -Use e.g., `ctest -V -R IDMapper` to only test tests that include the regex `IDMapper` (-V is just verbose). Make sure to build the `IDMapper` and `IDMapper_test` (if edited) executable first everytime. -`ctest` does not have any automatic dependency on the timestamps of the executables. - -### How do I add a test for a new class? - -You should always add a test alongside every new class added to OpenMS. - -To add a new class test: - -1. Add the class test to `src/tests/class_tests//` (e.g., `src/tests/class_tests/openms/source/NewFileFormat_test.cpp`). -2. Add the test to the `executables.cmake` file in the test folder. -3. Add them to git using the `git add` command. - -A test template for your specific class can be generated by the `create_test.php` script found in `tools/`. - -To generate a test template for your class: - -1. Make sure your generated XML files containing the class information make doc_xml. -2. Call: -```bash -php tools/create_test.php /BUILD_DIRECTORY/ / PATH_TO_HEADER/MyClass.h \ "FIRSTNAME LASTNAME" > ./src/tests/class_tests/openms/source/MyClass_test.cpp -``` - ## Debugging The following section provides information about how to debug your code. @@ -252,14 +200,14 @@ View the following OpenMS tutorials: * `OpenMS/doc/OpenMS_tutorial/refman_overwrite.tex.in` (for PDF tutorials) * `OpenMS/doc/doxygen/public/OpenMS_Tutorial_html.doxygen~` (for html tutorials) -For TOPP and TOPPView tutorials, view: +View the following TOPP and TOPPView tutorials: * `OpenMS/doc/TOPP_tutorial/refman_overwrite.tex.in` (for PDF tutorials) * `OpenMS/doc/doxygen/public/TOPP_Tutorial_html.doxygen` (for html tutorials) ## Bug Fixes -### How do I contribute a bug fix? +### How do I contribute to a bug fix? To contribute to a bug fix: 1. Submit the bug as a GitHub issue. diff --git a/openms-wiki/contributors-quickstart-guide.md b/openms-wiki/contributors-quickstart-guide.md index 60d6f82a..a387a9ac 100644 --- a/openms-wiki/contributors-quickstart-guide.md +++ b/openms-wiki/contributors-quickstart-guide.md @@ -9,46 +9,53 @@ If you would like to contribute to OpenMS: * Check out the [OpenMS tutorial for developers](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/OpenMS_tutorial.html). -Any questions can be directed at the mailing list. +For any questions, please [contact us](contact-us.md) at [open-ms-general]((https://sourceforge.net/projects/open-ms/lists/open-ms-general) mailing list. ## Technical Documentation -Untested installers, containers, etc., known as the nightly snapshot, are released every night. They generally pass automated continuous integration tests but no manual tests. +Untested installers and containers are known as the nightly snapshot, are released every night. They generally pass automated continuous integration tests but no manual tests. + View the documentation for the nightly snapshot of [OpenMS develop branch](https://github.com/OpenMS/OpenMS/tree/develop) at the [build archive](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/nightly/html/index.html). -View the [doxygen log](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_nightly_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log). +View the [doxygen log](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms/job/ntly/job/TstPkg/compiler=appleclang-11.0.0,os_label=catalina/lastBuild/artifact/build/doc/doxygen/doxygen-error.log). See the documentation for the [latest release](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html). -View the ([doxygen log](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_release_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log)). -## Development Model +View the [doxygen log](https://abibuilder.informatik.uni-tuebingen.de/jenkins/job/openms_release_packaging/lastBuild/compiler=appleclang-7.3.0,os_label=elcapitan/artifact/build/doc/doxygen/doxygen-error.log). + +## Contribution Guidelines + +Before contributing to OpenMS, read information on the development model and conventions followed to maintain a coherent code base. -OpenMS follows the Gitflow development workflow that is described [here](http://nvie.com/posts/a-successful-git-branching-model/). +### Development model -We encourage every developer (even if they are eligible to push directly to OpenMS) to create their own fork (e.g. @username). The GitHub people provide documentation on [forking](https://help.github.com/articles/fork-a-repo) and how to [keep your fork up-to-date](https://help.github.com/articles/syncing-a-fork). With your own fork you can follow the Gitflow development model, but instead of merging into `develop` in your own fork you can open a [pull request] (https://help.github.com/articles/using-pull-requests). Before opening the pull request, please check the [checklist](pull-request-checklist.md). +OpenMS follows the [Gitflow development workflow](http://nvie.com/posts/a-successful-git-branching-model/). -Some more details and tips are collected [here](). +Every contributor is encouraged to create their own fork (even if they are eligible to push directly to OpenMS). To create a fork: +1. Follow the documentation on [forking](https://help.github.com/articles/fork-a-repo). +2. Keep your fork [up-to-date](https://help.github.com/articles/syncing-a-fork). +3. Create a [pull request](https://help.github.com/articles/using-pull-requests). Before opening the pull request, please view the [checklist](pull-request-checklist.md). -## Coding Conventions +### Coding conventions -See the manual for coding style recommended by OpenMS: [Coding conventions](coding-conventions.md). -also see: [C++ Guide](). +See the manual for coding style recommended by OpenMS: [Coding conventions](https://github.com/OpenMS/OpenMS/wiki/Coding-conventions). +also see: [C++ Guide](https://github.com/OpenMS/OpenMS/wiki/Cpp-Guide). View the [manual]() for creating a new build unit (to be completed). -We automatically test for common coding convention violations using a modified version of `cpplint`. +OpenMS automatically tests for common coding convention violations using a modified version of `cpplint`. Style testing can be enabled using `cmake` options. We also provide a configuration file for `Uncrustify` for automated style corrections (see `tools/uncrustify.cfg`). -## Commit Messages +### Commit messages -View the guidelines for commit messages: [How to write commit messages] (alinkstob). +View the guidelines for commit messages: [How to write commit messages](https://github.com/OpenMS/OpenMS/wiki/HowTo---Write-Commit-Messages). -## Automated Unit Tests +### Automated unit tests -We perform nightly test runs on different platforms. Try to test on as many platforms as possible. This will save you time and surprises during continuous integration tests. +Nightly tests run on different platforms. It is recommended to test on different platforms. This will save you time and surprises during continuous integration tests. Nightly tests: [CDASH](http://cdash.openms.de/index.php?project=OpenMS) -## Further Developer Resources +## Further Contributor Resources You may want to consider the following resources: * **Guidelines for adding new dependency libraries** @@ -56,7 +63,7 @@ You may want to consider the following resources: View the guidelines for [adding new dependency libraries](). * **Experimental installers** - We automatically build installers for different platforms. These usually contain unstable or partially untested code. Use them at your own risk. + We automatically build installers for different platforms. These usually contain unstable or partially untested code. The nightly (unstable) installers are available at the [build archive](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/). * **Developer FAQ** diff --git a/openms-wiki/developer-faq.md b/openms-wiki/developer-faq.md index 99c92848..960387d1 100644 --- a/openms-wiki/developer-faq.md +++ b/openms-wiki/developer-faq.md @@ -3,8 +3,6 @@ Developer FAQ The following contains answers to typical questions from developers about OpenMS. -> **_NOTE:_** Some actions require special permissions like e.g. updating the website. - ## General The following section provides general information to new contributors. @@ -13,10 +11,11 @@ The following section provides general information to new contributors. * Check out the development version of OpenMS (see website). * Try and build OpenMS according to the installation instructions. -* Read the OpenMS Coding Convention. +* Read the [OpenMS Coding Conventions](https://github.com/OpenMS/OpenMS/wiki/Coding-conventions). * Read the OpenMS Tutorial. -* Create a GitHub account -* Register to the open-ms-general and open-ms-developers mailing list. (You can see the developers list only if you are logged in to Sourceforge and if you are a OpenMS developer). +* Create a GitHub account. +* Subscribe to the [open-ms-general](https://sourceforge.net/projects/open-ms/lists/open-ms-general) and [open-ms-developers]() mailing lists. + > ***_NOTE:_*** You can see the developers list only if you are logged in to Sourceforge and if you are a OpenMS developer. ### What is the difference between an OpenMS tool and util? @@ -28,10 +27,10 @@ Follow the [OpenMS coding conventions](coding-conventions.md). Coding style (brackets, variable names, etc.) must conform to the conventions. -* The class and all the members must be documented thoroughly. -* You can check your code with the tool `tools/checker.php`. Call `php tools/checker.php` for detailed instructions. +* The class and all the members should be properly documented. +* Check your code with the tool `tools/checker.php`. Call `php tools/checker.php` for detailed instructions. -Please open a pull request and follow the [checklist](pull-request-checklist.md). +Please open a pull request and follow the [pull request guidelines](pull-request-checklist.md). ### How do I update the [openms.de](https://www.openms.de)? @@ -39,14 +38,16 @@ Login to the [wordpress admin area](www.openms.de/wp-admin) with your username a ### Can I use QT designer to create GUI widgets? -Yes. If you want to create a class called `Widget: Create .ui-File` with `QT designer` and store it as `Widget.ui.`, add the class to `sources.cmake`. +Yes. Create a class called `Widget: Create .ui-File` with `QT designer` and store it as `Widget.ui.`, add the class to `sources.cmake`. From the .ui-File the file `include/OpenMS/VISUAL/UIC/ClassTemplate.h` is generated by the build system. -DO NOT CHECK-IN THIS FILE, AS IT IS GENERATED AUTOMATICALLY, WHEN NEEDED!!! -Derive the class `Widget` from `WidgetTemplate`. You need to check in the `Widget.h` and `Widget.cpp` files. + +> **_NOTE:_** Do not check in this file, as it is generated automatically when needed. + +Derive the class `Widget` from `WidgetTemplate`. For further details, see the `Widget.h` and `Widget.cpp` files. ### Can the START_SECTION-macro not handle template methods that have two or more arguments? -Put round brackets around the method declaration. Then it should work. +Insert round brackets around the method declaration. ### Where can I find the binary installers created? @@ -57,9 +58,9 @@ Please verify the creation date of the individual installers, as there may have The following section provides information about how to troubleshoot common OpenMS issues. -### OpenMS complains about boost not being found but I'm sure its there! +### OpenMS complains about boost not being found but I'm sure its there -`CMake` got confused. Set up a new build directory and try again. If you build in-source (not recommended), deleting the `CMakeCache.txt` and `cmake` directory might help. +`CMake` got confused. Set up a new build directory and try again. If you build from source (not recommended), deleting the `CMakeCache.txt` and `cmake` directory might help. ## Build System @@ -69,19 +70,19 @@ The following questions are related to the build system. `CMake` builds BuildSystems for different platforms, e.g. VisualStudio Solutions on Windows, Makefiles on Linux etc. This allows us to define in one central location (namely `CMakeLists.txt`) how OpenMS is build and have the platform specific stuff handled by `CMake`. -View the [cmake website[(http://www.cmake.org) for more information. + +View the [cmake website](http://www.cmake.org) for more information. ### How do I use CMake? See Installation instructions for your platform. -In general, you call `CMake(.exe)` with some parameters to create the native build-system. -Afterwards you can (but usually don't have to edit the current configuration using a GUI named `ccmake` (or `CMake-GUI` in Windows), which ships with `CMake`). +In general, call `CMake(.exe)` with some parameters to create the native build-system. -> **_NOTE:_** whenever `ccmake` is mentioned in this document, substitute this by `CMake-GUI` if your OS is Windows. You can also edit the `CMakeCache.txt` file directly. +> **_NOTE:_** whenever `ccmake` is mentioned in this document, substitute this by `CMake-GUI` if your OS is Windows. Edit the `CMakeCache.txt` file directly. ### How do I generate a build-system for Eclipse, KDevelop, CodeBlocks etc? -Type `cmake` into a console. This will list the available code generators available on your platform, which you can pass to `CMake` using the `-G` option. +Type `cmake` into a console. This will list the available code generators available on your platform; use them with `CMake` using the `-G` option. ### What are user definable CMake cache variables? @@ -89,7 +90,7 @@ They allow the user to pass options to `CMake` which will influence the build sy `CMAKE_FIND_ROOT_PATH`, which is where `CMake` will search for additional libraries if they are not found in the default system paths. By default we add `OpenMS/contrib`. -If your have installed all libraries on your system already there is no need to change `CMAKE_FIND_ROOT_PATH`. If you need the `contrib` libraries, you will need to set this variable. +If you have installed all libraries on your system already, there is no need to change `CMAKE_FIND_ROOT_PATH`. If you need the `contrib` libraries, set the variable `CMAKE_FIND_ROOT_PATH`. On Windows, you always need the `contrib` folder, as there are no system developer packages. To pass this variable to `CMake` use the `-D` switch e.g. `cmake -D CMAKE_FIND_ROOT_PATH:PATH="D:\\somepath\\contrib"`. Everything else can be edited using `ccmake` afterwards. @@ -110,10 +111,10 @@ The following options are of interest: View the description for each option by calling `ccmake`. -### Can I use another solver than GLPK? +### Can I use another solver other than GLPK? -Yes, but by default the build system only links against GLPK (this is how OpenMS binary packages must be build). -To to use another solver try `cmake ... -D USE_COINOR=1 ....` and look at the documentation of the `LPWrapper` class. +Other solvers can be used, but by default, the build system only links to GLPK (this is how OpenMS binary packages must be built). +To to use another solver, use `cmake ... -D USE_COINOR=1 ....` and refer to the documentation of the `LPWrapper` class. ### How do I switch to debug or release configuration? @@ -404,7 +405,7 @@ Python does not support passing primitive types (`int`, `double`, etc.) by refer ### Where can I find the definition of the main page? -You can find a definition of the main page [here](https://github.com/OpenMS/OpenMS/edit/develop/doc/doxygen/public/Main.doxygen). +You can find a definition of the main page [here](https://github.com/OpenMS/OpenMS/edit/develop/doc/doxygen/public/Main.doxygen). ### Where can I add a new module? diff --git a/openms-wiki/reporting-bugs-and-issues.md b/openms-wiki/reporting-bugs-and-issues.md index 8782f461..7d1db3b6 100644 --- a/openms-wiki/reporting-bugs-and-issues.md +++ b/openms-wiki/reporting-bugs-and-issues.md @@ -1,14 +1,14 @@ Reporting Bugs and Issues ========================= -A list of known issues in the current OpenMS release can be found here. Please check if your OpenMS version matches the current version and if the bug has already been reported. +A list of known issues in the current OpenMS release can be found [here](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/nightly/html/known_dev_bugs.html). Please check if your OpenMS version matches the current version and if the bug has already been reported. -In order to report a new bug, please use either our [GitHub issues system](write-and-label-github-issues.md) or contact us through the general OpenMS mailing list. +In order to report a new bug, please use either our [GitHub issues system](write-and-label-github-issues.md) or [contact us](contact-us.md). Include the following information in your bug report: * the command line (i.e. call) including the TOPP tool and the arguments you used, or the steps you followed in a GUI tool (e.g. TOPPView) - e.g. `FeatureFinderCentroided -in myfile.mzML -out myfile.featureXML` * the output of OpenMS/TOPP (or a screenshot in case of a GUI problem) -* operating system (e.g. "Windows XP 32bit", "Win 7 64bit", "Fedora 8 32bit", "MacOS 10.6 64bit") +* operating system (e.g. "Windows XP 32bit", "Win 7 64bit", "Fedora 8 32bit", "macOS 10.6 64bit") * OpenMS version (e.g. "OpenMS 1.11.1", "Revision 63082 from the SVN repository") * OpenMS architecture ("32 bit" or "64 bit") diff --git a/openms-wiki/users-quickstart-guide.md b/openms-wiki/users-quickstart-guide.md index ac4131b0..a57ae4ed 100644 --- a/openms-wiki/users-quickstart-guide.md +++ b/openms-wiki/users-quickstart-guide.md @@ -5,4 +5,6 @@ Download the current stable version of OpenMS from the [OpenMS download site](ht Familiarise yourself with OpenMS by reading [Röst et al, OpenMS: a flexible open-source software platform for mass spectrometry data analysis. Nat Methods. 2016](https://www.ncbi.nlm.nih.gov/pubmed/27575624) as well as [Getting Started](http://www.openms.de/getting-started) on openms.de. -Read the OpenMS documentation (especially for TOPP) available from the [OpenMS documentation site](http://www.openms.de/current_doxygen) or in the folder `doc/index.html` of stable releases. You can download some example workflows with optimised parameter settings from the [repository](). To understand which tools are available, read the [TOPP Tool documentation page](http://www.openms.de/current_doxygen/html/TOPP_documentation.html) as well as the [UTILS Tool documentation page](http://www.openms.de/current_doxygen/html/UTILS_documentation.html). +Read the OpenMS documentation (especially for TOPP) available from the [OpenMS documentation site](http://www.openms.de/current_doxygen) or in the folder `doc/index.html` of stable releases. + +Download some example workflows with optimised parameter settings from the [repository](). To understand which tools are available, read the [TOPP Tool documentation page](http://www.openms.de/current_doxygen/html/TOPP_documentation.html) as well as the [UTILS Tool documentation page](http://www.openms.de/current_doxygen/html/UTILS_documentation.html). diff --git a/openms-wiki/write-and-label-github-issues.md b/openms-wiki/write-and-label-github-issues.md index 7a899f1f..d788ca76 100644 --- a/openms-wiki/write-and-label-github-issues.md +++ b/openms-wiki/write-and-label-github-issues.md @@ -1,7 +1,7 @@ Write and Label GitHub Issues ============================= -## Create an issue +## Create an Issue To create an issue: @@ -9,12 +9,12 @@ To create an issue: 2. Click **Issues** in the menu at the top of the screen. 3. Click **New issue**. 4. Provide a title and a description to the issue. -5. [Label](write-and-label-github-issues.md) the issue. +5. Label the issue. 6. Click **Submit new issue**. The issue will be listed under **Issues**. -## Label an issue +## Label an Issue To label an issue: 1. On the right of the screen, select the cog icon under **Labels**. From ecc16ae59a3a2b00208f39d9e706cd89e1f99f87 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sat, 21 May 2022 13:52:06 +0930 Subject: [PATCH 70/77] updated folder structure as suggested in review --- {openms-wiki => docs/faqs}/contributor-faq.md | 1 + openms-wiki/build-openms-from-source.md | 10 ---------- 2 files changed, 1 insertion(+), 10 deletions(-) rename {openms-wiki => docs/faqs}/contributor-faq.md (99%) delete mode 100644 openms-wiki/build-openms-from-source.md diff --git a/openms-wiki/contributor-faq.md b/docs/faqs/contributor-faq.md similarity index 99% rename from openms-wiki/contributor-faq.md rename to docs/faqs/contributor-faq.md index 00210b8b..6e9a183f 100644 --- a/openms-wiki/contributor-faq.md +++ b/docs/faqs/contributor-faq.md @@ -215,3 +215,4 @@ To contribute to a bug fix: 3. Fix the bug and add a test. 4. Create a pull request for your branch. 5. After approval and merge make sure the issue is closed. + diff --git a/openms-wiki/build-openms-from-source.md b/openms-wiki/build-openms-from-source.md deleted file mode 100644 index 6dc18d47..00000000 --- a/openms-wiki/build-openms-from-source.md +++ /dev/null @@ -1,10 +0,0 @@ -Build OpenMS From Source -======================== - -To build OpenMS, please follow the build instructions for: - -* [Linux](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_linux.html) -* [macOS](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_mac.html) -* [Windows](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_win.html) - -Instructions to build pyOpenMS can be found in the [pyOpenMS documentation](https://pyopenms.readthedocs.io/en/latest/build_from_source.html). From c1fa0b91052f96f4a3b2c2634bf27be02bee95ac Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sat, 21 May 2022 14:01:30 +0930 Subject: [PATCH 71/77] added installations folder with build-openms-from-source.md as discussed --- docs/installations/build-openms-from-source.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 docs/installations/build-openms-from-source.md diff --git a/docs/installations/build-openms-from-source.md b/docs/installations/build-openms-from-source.md new file mode 100644 index 00000000..6dc18d47 --- /dev/null +++ b/docs/installations/build-openms-from-source.md @@ -0,0 +1,10 @@ +Build OpenMS From Source +======================== + +To build OpenMS, please follow the build instructions for: + +* [Linux](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_linux.html) +* [macOS](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_mac.html) +* [Windows](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/install_win.html) + +Instructions to build pyOpenMS can be found in the [pyOpenMS documentation](https://pyopenms.readthedocs.io/en/latest/build_from_source.html). From f1c7cf7eb0706408f5221c53aa158b2950b02e28 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sat, 21 May 2022 16:29:08 +0930 Subject: [PATCH 72/77] created openms-git-workflow.md and click-fork.png under new directories additional-resources and images --- .../openms-git-workflow.md | 176 ++++++++++++++++++ docs/images/click-fork.png | Bin 0 -> 107682 bytes 2 files changed, 176 insertions(+) create mode 100644 docs/additional-resources/openms-git-workflow.md create mode 100644 docs/images/click-fork.png diff --git a/docs/additional-resources/openms-git-workflow.md b/docs/additional-resources/openms-git-workflow.md new file mode 100644 index 00000000..3265846b --- /dev/null +++ b/docs/additional-resources/openms-git-workflow.md @@ -0,0 +1,176 @@ +OpenMS Git Workflow +=================== + +Before you get started, make sure you have a recent version of git installed to avoid problems like Github https authenitcation errors (see [Troubleshooting cloning errors](https://docs.github.com/en/repositories/creating-and-managing-repositories/troubleshooting-cloning-errors) and a solution using [ssh](https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories)). + +OpenMS follows the [git flow workflow](https://nvie.com/posts/a-successful-git-branching-model/).The difference is that merge commits are managed via pull requests instead of creating merge commits locally. + +The following page aims to provide a basic workflow. + +## Naming Conventions + +Naming conventions for the following apply: + +* A **local repository** is the repository that lies on your hard drive after cloning. +* A **remote repository** is a repository on a Git server such as Github. +* A **fork** is a copy of a repository. Forking a repository allows you to freely experiment with changes without affecting the original project. +* **Origin** refers to a remote repository that you have forked. Call this repository https://github.com/_YOURUSERNAME_/OpenMS. +* **Upstream** refers to the original remote OpenMS repository. Call this repository https://github.com/OpenMS/OpenMS. + +## Create your Fork + +Start by [forking](https://docs.github.com/en/get-started/quickstart/fork-a-repo) the OpenMS directory. + +To create a fork, click **Fork** under the main menu as shown below. + +![image info](../images/click-fork.png) + +## Clone your Fork + +To obtain a local repository copy, clone your fork using: + +```bash +$ git clone https://github.com/_YOURUSERNAME_/OpenMS.git +``` + +This will clone your fork (correctly labelled `origin` by default) into a local copy on your computer. + +## Link Remote Branches to your Local Working Repository + +After cloning your fork, your local repository should be named origin. Validate this by executing: + +```bash +$ git remote -v +origin https://github.com/_YOURUSERNAME_/OpenMS.git (fetch) +origin https://github.com/_YOURUSERNAME_/OpenMS.git (push) +``` + +Sync data between your local copy, your fork (`origin`) and the remote original OpenMS/OpenMS repository (`upstream`) by using the following command: +```bash +$ git remote add upstream https://github.com/OpenMS/OpenMS.git +``` +Verify that upstream was added correctly by calling: + +```bash +$ git remote -v +origin https://github.com/_YOURUSERNAME_/OpenMS.git (fetch) +origin https://github.com/_YOURUSERNAME_/OpenMS.git (push) +upstream https://github.com/OpenMS/OpenMS.git (fetch) +upstream https://github.com/OpenMS/OpenMS.git (push) + +``` + +Fetch changes and new branches from your fork (`origin`) as well as from the central, upstream OpenMS repository by executing: + +```bash +$ git fetch upstream +$ git fetch origin +``` +or + +```bash +$ git fetch --all +``` + +Create a local branch using the following: + +```bash +$ git checkout -b +``` +Call `git branch -va` to display the status of local and remote branches. You should see an output that looks like this: + +```bash +$ git branch -va +* develop 349ec48 Merge pull request #691 from cbielow/MGF_fix + feature/my_shiny_new_feature 3c05538 [FEATURE] added option to keep, ensure or reassign UIDs during conversion + remotes/origin/SILACAnalyzer 3ceae38 Fixed test. + remotes/origin/antilope 3fe5aa3 git-svn-id: https://open-ms.svn.sourceforge.net/svnroot/open-ms/branches/antilope@12117 6adb6e08-d915-0410-941f-83917bcadc18 + remotes/origin/develop 349ec48 Merge pull request #691 from cbielow/MGF_fix + remotes/origin/master b182ba5 [NOP] first commit after SVN import to git + remotes/origin/msnovogen 93a5e4c [OPT] For faster access to specific amino acids a ResidueServer was added. + remotes/upstream/HEAD -> upstream/develop + remotes/upstream/SILACAnalyzer 3ceae38 Fixed test. + remotes/upstream/antilope 3fe5aa3 git-svn-id: https://open-ms.svn.sourceforge.net/svnroot/open-ms/branches/antilope@12117 6adb6e08-d915-0410-941f-83917bcadc18 + remotes/upstream/develop 349ec48 Merge pull request #691 from cbielow/MGF_fix + remotes/upstream/master b182ba5 [NOP] first commit after SVN import to git + remotes/upstream/msnovogen 93a5e4c [OPT] For faster access to specific amino acids a ResidueServer was added. +``` + +## Keep your Fork in Sync + +Keep your fork (`origin`) in sync with the OpenMS repository (`upstream`) by following the [Github instructions](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork). +In summary, to keep your fork in sync: +1. Fetch changes from upstream and update your local branch. +2. Push your updated local branch to your fork (`origin`). + +> **_NOTE:_** To keep track of others repositories, use `git fetch --all --prune` to update them as well. The option `--prune` tells git to automatically remove tracked branches if they got removed in the remote repository. + +```bash +$ git fetch --all --prune +$ git checkout develop +$ git merge --ff-only upstream/develop +$ git push origin develop +``` +Feel free to experiment within your fork. However, for your code needs to meet OpenMS quality standards to be merged into the OpenMS repository, + +Follow these rules: +* Never commit directly to the `develop` or `master` branches as it will complicate the merge. +* Try to start every feature from develop and not base features on other features. +* Name the OpenMS remote `upstream` and always push directly to `origin` (`git push origin `). +* When updating your fork, consider using `git fetch upstream` followed by `git merge --ff-only upstream/develop` to avoid creating merge commits in `develop`. + If you never commit to `develop` this should always succeed and (if a commit accidentally went to develop) warn you instead of creating a merge commit. + +## Create a New Feature + +All features start from `develop`. + +```bash +$ git checkout develop +$ git checkout -b feature/your-cool-new-feature +``` +All commits related to this feature will then go into the branch `feature/your-cool-new-feature`. + +## Keeping your Feature Branch in Sync with Develop Branch + +While working on your feature branch, it is usual that development continues and new features get integrated into the main development branch. This means your feature branch lags behind `develop`. To get your feature branch up-to-date, rebase your feature branch on `develop` using: + +```bash +$ git checkout feature/myfeaturebranch +$ git rebase develop +``` + +The above commands: + +1. Performs a rewind of your commits until the branching point. +2. Applies all commits that have been integrated into `develop`. +3. Reapplies your commits on top of the commits integrated into `develop`. + +For more information, refer to a [visual explanation of rebasing](http://git-scm.com/book/en/v2/Git-Branching-Rebasing). + +> **_NOTE:_** Do not rebase published branches (e.g. branches that are part of a pull request). If you created a pull request, you should only add commits in your feature branch to fix things that have been discussed. After your pull request contains all fixes, you are ready to merge the pull request into develop without rebasing (see e.g. rebase-vs-merge). + +## Finish a Feature + +Features that should go into the main development line of OpenMS should be integrated via a [pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests). This allows the development community of OpenMS to discuss the changes and suggest possible improvements. + +After opening the pull request via the GitHub web site, GitHub will try to create the pull request against the branch that you branched off from. Please check the branch that you are opening the pull request against before submitting the pull request. If any changes are made, a new pull request is required. Select **Allow others to make changes to this pull request** so that maintainers can directly help to solve problems. + +Open pull requests only after checking code-style, documentation and passing tests. Pull requests that do not pass CI or code review will not be merged until the problems are solved. It is recommended that you read the [checklist](pull-request-checklist.md) before you submit a pull request. + +## Update Git Submodules + +Start in your local OpenMS/OpenMS repository (on your feature/pull request branch). + +The following example uses a submodule called `THIRDPARTY`. + +```bash +git submodule update --init THIRDPARTY +cd THIRDPARTY +# yes, in the submodules the default remote is origin +# usually you want to pull the changes from master (e.g. after your pull request to OpenMS/THIRDPARTY has been merged) +git pull origin master +cd .. +git status +# Make sure that you see "modified: THIRDPARTY (new commits)" +git commit -am "updated submodule" +``` diff --git a/docs/images/click-fork.png b/docs/images/click-fork.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca09e1e79cefb4955f3f0926c430cd73033bb09 GIT binary patch literal 107682 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 Date: Sat, 21 May 2022 16:33:14 +0930 Subject: [PATCH 73/77] minor changes --- docs/additional-resources/openms-git-workflow.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/additional-resources/openms-git-workflow.md b/docs/additional-resources/openms-git-workflow.md index 3265846b..58985007 100644 --- a/docs/additional-resources/openms-git-workflow.md +++ b/docs/additional-resources/openms-git-workflow.md @@ -3,9 +3,7 @@ OpenMS Git Workflow Before you get started, make sure you have a recent version of git installed to avoid problems like Github https authenitcation errors (see [Troubleshooting cloning errors](https://docs.github.com/en/repositories/creating-and-managing-repositories/troubleshooting-cloning-errors) and a solution using [ssh](https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories)). -OpenMS follows the [git flow workflow](https://nvie.com/posts/a-successful-git-branching-model/).The difference is that merge commits are managed via pull requests instead of creating merge commits locally. - -The following page aims to provide a basic workflow. +OpenMS follows the [git flow workflow](https://nvie.com/posts/a-successful-git-branching-model/). The difference is that merge commits are managed via pull requests instead of creating merge commits locally. ## Naming Conventions From b2f7f7be249c71cedf5ae68c3b3e9b8a488cde5c Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sat, 21 May 2022 16:34:57 +0930 Subject: [PATCH 74/77] fix spacing issues --- docs/additional-resources/openms-git-workflow.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/additional-resources/openms-git-workflow.md b/docs/additional-resources/openms-git-workflow.md index 58985007..7dd2c58d 100644 --- a/docs/additional-resources/openms-git-workflow.md +++ b/docs/additional-resources/openms-git-workflow.md @@ -51,18 +51,18 @@ Verify that upstream was added correctly by calling: ```bash $ git remote -v -origin https://github.com/_YOURUSERNAME_/OpenMS.git (fetch) -origin https://github.com/_YOURUSERNAME_/OpenMS.git (push) -upstream https://github.com/OpenMS/OpenMS.git (fetch) -upstream https://github.com/OpenMS/OpenMS.git (push) + origin https://github.com/_YOURUSERNAME_/OpenMS.git (fetch) + origin https://github.com/_YOURUSERNAME_/OpenMS.git (push) + upstream https://github.com/OpenMS/OpenMS.git (fetch) + upstream https://github.com/OpenMS/OpenMS.git (push) ``` Fetch changes and new branches from your fork (`origin`) as well as from the central, upstream OpenMS repository by executing: ```bash -$ git fetch upstream -$ git fetch origin + $ git fetch upstream + $ git fetch origin ``` or From 37dcfcc85849c73b8b0ef0cb39b134f39ff92ac8 Mon Sep 17 00:00:00 2001 From: greengypsy Date: Sat, 21 May 2022 16:37:00 +0930 Subject: [PATCH 75/77] fix alignment issues --- docs/additional-resources/openms-git-workflow.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/additional-resources/openms-git-workflow.md b/docs/additional-resources/openms-git-workflow.md index 7dd2c58d..ea05ccf6 100644 --- a/docs/additional-resources/openms-git-workflow.md +++ b/docs/additional-resources/openms-git-workflow.md @@ -39,8 +39,8 @@ After cloning your fork, your local repository should be named origin. Validate ```bash $ git remote -v -origin https://github.com/_YOURUSERNAME_/OpenMS.git (fetch) -origin https://github.com/_YOURUSERNAME_/OpenMS.git (push) + origin https://github.com/_YOURUSERNAME_/OpenMS.git (fetch) + origin https://github.com/_YOURUSERNAME_/OpenMS.git (push) ``` Sync data between your local copy, your fork (`origin`) and the remote original OpenMS/OpenMS repository (`upstream`) by using the following command: @@ -61,8 +61,8 @@ $ git remote -v Fetch changes and new branches from your fork (`origin`) as well as from the central, upstream OpenMS repository by executing: ```bash - $ git fetch upstream - $ git fetch origin +$ git fetch upstream +$ git fetch origin ``` or @@ -118,7 +118,7 @@ Follow these rules: * When updating your fork, consider using `git fetch upstream` followed by `git merge --ff-only upstream/develop` to avoid creating merge commits in `develop`. If you never commit to `develop` this should always succeed and (if a commit accidentally went to develop) warn you instead of creating a merge commit. -## Create a New Feature +## Create New Feature All features start from `develop`. From 9b1aba9d210a56f72337be7fc83f241f5e18d2b8 Mon Sep 17 00:00:00 2001 From: Tapasweni Pathak Date: Thu, 26 May 2022 04:01:33 +0530 Subject: [PATCH 76/77] Add a few more from https://github.com/OpenMS/OpenMS-docs/issues/4 --- .../openms-git-workflow.md | 71 ++-- .../pull-request-checklist.md | 44 ++ .../reporting-bugs-and-issues.md | 19 + .../write-and-label-github-issues.md | 24 ++ docs/faqs/contributor-faq.md | 116 +++-- docs/faqs/developer-faq.md | 399 ++++++++++++++++++ docs/guides/contributors-quickstart-guide.md | 75 ++++ .../{ => additional-resources}/click-fork.png | Bin docs/images/tutorials/proteowizard.png | Bin 0 -> 27640 bytes .../images/tutorials/topp/MetaDataBrowser.png | Bin 0 -> 38527 bytes .../tutorials/topp/TOPPView_statistics.png | Bin 0 -> 21420 bytes docs/images/tutorials/topp/TOPPView_tools.png | Bin 0 -> 40203 bytes docs/index.rst | 16 + 13 files changed, 698 insertions(+), 66 deletions(-) create mode 100644 docs/additional-resources/pull-request-checklist.md create mode 100644 docs/additional-resources/reporting-bugs-and-issues.md create mode 100644 docs/additional-resources/write-and-label-github-issues.md create mode 100644 docs/faqs/developer-faq.md create mode 100644 docs/guides/contributors-quickstart-guide.md rename docs/images/{ => additional-resources}/click-fork.png (100%) create mode 100644 docs/images/tutorials/proteowizard.png create mode 100644 docs/images/tutorials/topp/MetaDataBrowser.png create mode 100644 docs/images/tutorials/topp/TOPPView_statistics.png create mode 100644 docs/images/tutorials/topp/TOPPView_tools.png diff --git a/docs/additional-resources/openms-git-workflow.md b/docs/additional-resources/openms-git-workflow.md index ea05ccf6..32171d6c 100644 --- a/docs/additional-resources/openms-git-workflow.md +++ b/docs/additional-resources/openms-git-workflow.md @@ -1,11 +1,13 @@ OpenMS Git Workflow =================== -Before you get started, make sure you have a recent version of git installed to avoid problems like Github https authenitcation errors (see [Troubleshooting cloning errors](https://docs.github.com/en/repositories/creating-and-managing-repositories/troubleshooting-cloning-errors) and a solution using [ssh](https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories)). +Before getting started, install latest version of git to avoid problems like Github https authentication errors +(see [Troubleshooting cloning errors](https://docs.github.com/en/repositories/creating-and-managing-repositories/troubleshooting-cloning-errors) and a solution using [ssh](https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories)). -OpenMS follows the [git flow workflow](https://nvie.com/posts/a-successful-git-branching-model/). The difference is that merge commits are managed via pull requests instead of creating merge commits locally. +OpenMS follows the [git flow workflow](https://nvie.com/posts/a-successful-git-branching-model/). The difference is that +merge commits are managed via pull requests instead of creating merge commits locally. -## Naming Conventions +## Naming conventions Naming conventions for the following apply: @@ -15,15 +17,15 @@ Naming conventions for the following apply: * **Origin** refers to a remote repository that you have forked. Call this repository https://github.com/_YOURUSERNAME_/OpenMS. * **Upstream** refers to the original remote OpenMS repository. Call this repository https://github.com/OpenMS/OpenMS. -## Create your Fork +## Create fork -Start by [forking](https://docs.github.com/en/get-started/quickstart/fork-a-repo) the OpenMS directory. +Start by [forking](https://docs.github.com/en/get-started/quickstart/fork-a-repo) the OpenMS repository. To create a fork, click **Fork** under the main menu as shown below. -![image info](../images/click-fork.png) +![image info](../images/additional-resources/click-fork.png) -## Clone your Fork +## Clone your fork To obtain a local repository copy, clone your fork using: @@ -33,7 +35,7 @@ $ git clone https://github.com/_YOURUSERNAME_/OpenMS.git This will clone your fork (correctly labelled `origin` by default) into a local copy on your computer. -## Link Remote Branches to your Local Working Repository +## Link remote branches to your local working repository After cloning your fork, your local repository should be named origin. Validate this by executing: @@ -43,7 +45,9 @@ $ git remote -v origin https://github.com/_YOURUSERNAME_/OpenMS.git (push) ``` -Sync data between your local copy, your fork (`origin`) and the remote original OpenMS/OpenMS repository (`upstream`) by using the following command: +Sync data between your local copy, your fork (`origin`) and the remote original OpenMS/OpenMS repository (`upstream`) +by using the following command: + ```bash $ git remote add upstream https://github.com/OpenMS/OpenMS.git ``` @@ -75,6 +79,7 @@ Create a local branch using the following: ```bash $ git checkout -b ``` + Call `git branch -va` to display the status of local and remote branches. You should see an output that looks like this: ```bash @@ -94,14 +99,17 @@ $ git branch -va remotes/upstream/msnovogen 93a5e4c [OPT] For faster access to specific amino acids a ResidueServer was added. ``` -## Keep your Fork in Sync +## Keep your fork in sync Keep your fork (`origin`) in sync with the OpenMS repository (`upstream`) by following the [Github instructions](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork). In summary, to keep your fork in sync: 1. Fetch changes from upstream and update your local branch. 2. Push your updated local branch to your fork (`origin`). -> **_NOTE:_** To keep track of others repositories, use `git fetch --all --prune` to update them as well. The option `--prune` tells git to automatically remove tracked branches if they got removed in the remote repository. +```{tip} +To keep track of others repositories, use `git fetch --all --prune` to update them as well. The option `--prune` tells +git to automatically remove tracked branches if they got removed in the remote repository. +``` ```bash $ git fetch --all --prune @@ -109,16 +117,19 @@ $ git checkout develop $ git merge --ff-only upstream/develop $ git push origin develop ``` -Feel free to experiment within your fork. However, for your code needs to meet OpenMS quality standards to be merged into the OpenMS repository, +Feel free to experiment within your fork. However, for your code needs to meet OpenMS quality standards to be merged +into the OpenMS repository, Follow these rules: * Never commit directly to the `develop` or `master` branches as it will complicate the merge. * Try to start every feature from develop and not base features on other features. * Name the OpenMS remote `upstream` and always push directly to `origin` (`git push origin `). -* When updating your fork, consider using `git fetch upstream` followed by `git merge --ff-only upstream/develop` to avoid creating merge commits in `develop`. - If you never commit to `develop` this should always succeed and (if a commit accidentally went to develop) warn you instead of creating a merge commit. +* When updating your fork, consider using `git fetch upstream` followed by `git merge --ff-only upstream/develop` to + avoid creating merge commits in `develop`. +* If you never commit to `develop` this should always succeed and (if a commit accidentally went to develop) warn you + instead of creating a merge commit. -## Create New Feature +## Create new feature All features start from `develop`. @@ -128,9 +139,11 @@ $ git checkout -b feature/your-cool-new-feature ``` All commits related to this feature will then go into the branch `feature/your-cool-new-feature`. -## Keeping your Feature Branch in Sync with Develop Branch +## Keeping your feature branch in sync with develop branch -While working on your feature branch, it is usual that development continues and new features get integrated into the main development branch. This means your feature branch lags behind `develop`. To get your feature branch up-to-date, rebase your feature branch on `develop` using: +While working on your feature branch, it is usual that development continues and new features get integrated into the +main development branch. This means your feature branch lags behind `develop`. To get your feature branch up-to-date, +rebase your feature branch on `develop` using: ```bash $ git checkout feature/myfeaturebranch @@ -145,19 +158,29 @@ The above commands: For more information, refer to a [visual explanation of rebasing](http://git-scm.com/book/en/v2/Git-Branching-Rebasing). -> **_NOTE:_** Do not rebase published branches (e.g. branches that are part of a pull request). If you created a pull request, you should only add commits in your feature branch to fix things that have been discussed. After your pull request contains all fixes, you are ready to merge the pull request into develop without rebasing (see e.g. rebase-vs-merge). +```{tip} +Do not rebase published branches (e.g. branches that are part of a pull request). If you created a pull request, you +should only add commits in your feature branch to fix things that have been discussed. After your pull request contains +all fixes, you are ready to merge the pull request into develop without rebasing (see e.g. rebase-vs-merge). +``` -## Finish a Feature +## Adding a feature to OpenMS -Features that should go into the main development line of OpenMS should be integrated via a [pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests). This allows the development community of OpenMS to discuss the changes and suggest possible improvements. +Features that should go into the main development line of OpenMS should be integrated via a [pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests). This allows +the development community of OpenMS to discuss the changes and suggest possible improvements. -After opening the pull request via the GitHub web site, GitHub will try to create the pull request against the branch that you branched off from. Please check the branch that you are opening the pull request against before submitting the pull request. If any changes are made, a new pull request is required. Select **Allow others to make changes to this pull request** so that maintainers can directly help to solve problems. +After opening the pull request via the GitHub web site, GitHub will try to create the pull request against the branch +that you branched off from. Please check the branch that you are opening the pull request against before submitting the +pull request. If any changes are made, a new pull request is required. Select +**Allow others to make changes to this pull request** so that maintainers can directly help to solve problems. -Open pull requests only after checking code-style, documentation and passing tests. Pull requests that do not pass CI or code review will not be merged until the problems are solved. It is recommended that you read the [checklist](pull-request-checklist.md) before you submit a pull request. +Open pull requests only after checking code-style, documentation and passing tests. Pull requests that do not pass CI +or code review will not be merged until the problems are solved. It is recommended that you read the +[pull request guidelines](pull-request-checklist.md) before you submit a pull request. -## Update Git Submodules +## Update git submodules -Start in your local OpenMS/OpenMS repository (on your feature/pull request branch). +Start in your local `OpenMS/OpenMS` repository (on your feature/pull request branch). The following example uses a submodule called `THIRDPARTY`. diff --git a/docs/additional-resources/pull-request-checklist.md b/docs/additional-resources/pull-request-checklist.md new file mode 100644 index 00000000..ccb6487c --- /dev/null +++ b/docs/additional-resources/pull-request-checklist.md @@ -0,0 +1,44 @@ +Pull Request Checklist +====================== + +Before opening a pull request, check the following: + +1. **Does the code build?** + Execute `make` (or your build system's equivalent, e.g., `cmake --build . --target ALL_BUILD --config Release` on Windows). +2. **Do all tests pass?** + To check if all tests have passed, execute `ctest`. + If a test that is unrelated to your changes fails, check the [nightly builds](http://cdash.openms.de/index.php?project=OpenMS) + to see if the error is also in `develop`. If the error is in develop, [create a github issue](write-and-label-github-issues.md). +3. **Is the code documented?** + Document all new classes, including their methods and parameters. + It is also recommended to document non-public members and methods. +4. **Does the code introduce changes to the API?** + If the code introduces changes to the API, make sure that the documentation is up-to-date and that the Python bindings + (pyOpenMS) still work. For each change in the C++ API, make a change in the Python API wrapper via the `pyOpenMS/pxds/` files. +5. **Have you completed regression testing?** + Make sure that you include a test in the test suite for: + - Public methods of a class + - TOPP tools + - Bug fixes + +Make sure to: + +- **Rebase before you open a pull request.** + To include all recent changes, rebase your branch on `develop` before opening a pull request. + If you pushed your branch to `origin` before rebasing, git will most likely tell you after the rebase that your + local branch and the remote branch have diverged. If you are sure that the remote branch does not contain any local + commits in the rebased version, you can safely push using `git push -f origin ` to enforce overwrite. If + not, contact your local git expert on how to get the changes into your local branch. + +- **Capture similar changes in a single commit** + Each commit should represent one logical unit. Consolidate multiple commits if they belong together or split single + commits if they are unrelated. For example, committing code formatting together with a one-line fix makes it very hard + to figure out what the fix was and which changes were inconsequential. + +* **Create a pull request for a single feature or bug** + If you have multiple features or fixes in a pull request, you might get asked to split your request and open multiple + pull requests instead. + +* **Describe what you have changed in your pull request.** + When opening the pull request, give a detailed overview of what has changed and why. Include a clear rationale for the + changes and add benchmark data if available. See [this request](https://github.com/bitly/dablooms/pull/19) for an example. diff --git a/docs/additional-resources/reporting-bugs-and-issues.md b/docs/additional-resources/reporting-bugs-and-issues.md new file mode 100644 index 00000000..3ac63aeb --- /dev/null +++ b/docs/additional-resources/reporting-bugs-and-issues.md @@ -0,0 +1,19 @@ +Reporting Bugs and Issues +========================= + +A list of known issues in the current OpenMS release can be found [here](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/nightly/html/known_dev_bugs.html). Please check if your OpenMS version matches the current version and if the bug +has already been reported. + +In order to report a new bug, please create a [GitHub issue](write-and-label-github-issues.md) or [contact us](../contact-us.md). + +Include the following information in your bug report: + +1. The command line (i.e. call) including the TOPP tool and the arguments you used, or the steps you followed in a GUI + tool (e.g. TOPPView) - e.g. `FeatureFinderCentroided -in myfile.mzML -out myfile.featureXML`. +2. The output of OpenMS/TOPP (or a screenshot in case of a GUI problem). +3. Operating system (e.g. "Windows XP 32 bit", "Win 7 64 bit", "Fedora 8 32 bit", "macOS 10.6 64 bit"). +4. OpenMS version (e.g. "OpenMS 1.11.1", "Revision 63082 from the SVN repository"). +5. OpenMS architecture ("32 bit" or "64 bit") + +Please provide files that we need to reproduce the bug (e.g. `TOPP INI` files, data files — usually mzML) via a download +link, via the mailing list or by directly contacting one of the developers. diff --git a/docs/additional-resources/write-and-label-github-issues.md b/docs/additional-resources/write-and-label-github-issues.md new file mode 100644 index 00000000..f1f43192 --- /dev/null +++ b/docs/additional-resources/write-and-label-github-issues.md @@ -0,0 +1,24 @@ +Write and Label GitHub Issues +============================= + +## Create an Issue + +To create an issue: + +1. Go to the [OpenMS codebase](https://github.com/OpenMS/OpenMS). +2. Submit an [issue](https://github.com/OpenMS/OpenMS/issues/new). + +The issue will be listed under **Issues**. + +## Label an Issue + +To label an issue: + +1. On the right of the screen, select the cog icon under **Labels**. +2. Choose a label from the list. Normally, an issue can have one or more of the following labels: + - **defect**: A defect refers to a bug in OpenMS. This is a high priority issue. + - **enhancement**: An enhancement refers to a feature idea to enhance the current OpenMS code. This is a medium + priority issue. + - **task**: A task refers to a single piece of work that a developer can undertake. This is a medium priority issue. + - **refactoring**: A refactoring issue refers to a suggestion to streamline the code without changing how the code function. + - **question**: A question could trigger to a discussion about tools, parameters and scientific tasks. diff --git a/docs/faqs/contributor-faq.md b/docs/faqs/contributor-faq.md index 6e9a183f..714d10ac 100644 --- a/docs/faqs/contributor-faq.md +++ b/docs/faqs/contributor-faq.md @@ -9,28 +9,28 @@ The following section provides general information to new contributors. ### I am new to OpenMS. What should I do first? -* Check out the development version of OpenMS (see website). -* Try and build OpenMS according to the installation instructions. +* Check out the development version of OpenMS (see OpenMS [releases and installers](downloads/releases.md)). +* Build OpenMS according to the installation instructions. * Read the [OpenMS Coding Conventions](https://github.com/OpenMS/OpenMS/wiki/Coding-conventions). -* Read the OpenMS Tutorial. +* Read the [OpenMS Tutorial](../tutorials/user-tutorial.md). * Create a GitHub account. -* Subscribe to the [open-ms-general](https://sourceforge.net/projects/open-ms/lists/open-ms-general) and [open-ms-developers]() mailing lists. - > ***_NOTE:_*** You can see the developers list only if you are logged in to Sourceforge and if you are a OpenMS developer. +* Subscribe to the [open-ms-general](https://sourceforge.net/projects/open-ms/lists/open-ms-general) or [contact us](../contact-us.md). ### What is the difference between an OpenMS tool and util? -A tool starts its lifecycle in `UTILS` and may exist without being thoroughly tested. Tools may be promoted from `UTILS` to `TOOLS` if they are stable enough, are fully tested, fully documented, and a test workflow exists. +A tool starts its lifecycle in `UTILS` and may exist without being thoroughly tested. Tools may be promoted from `UTILS` +to `TOOLS` if they are stable enough, are fully tested, fully documented, and a test workflow exists. ### I have written a class for OpenMS. What should I do? -Follow the [OpenMS coding conventions](coding-conventions.md). +Follow the [OpenMS coding conventions](). Coding style (brackets, variable names, etc.) must conform to the conventions. * The class and all the members must be documented thoroughly. -* You can check your code with the tool `tools/checker.php`. Call `php tools/checker.php` for detailed instructions. +* Check your code with the tool `tools/checker.php`. Call `php tools/checker.php` for detailed instructions. -Please open a pull request and follow the [checklist](pull-request-checklist.md). +Please open a pull request and follow the [pull request guidelines](pull-request-checklist.md). ## Troubleshooting @@ -38,7 +38,8 @@ The following section provides information about how to troubleshoot common Open ### OpenMS complains about boost not being found -`CMake` got confused. Set up a new build directory and try again. If you build from source, deleting the `CMakeCache.txt` and `cmake` directory might help. +`CMake` got confused. Set up a new build directory and try again. Build from source, deleting the `CMakeCache.txt` +and `cmake` directory might help. ## Build System @@ -47,38 +48,49 @@ The following questions are related to the build system. ### What is CMake? `CMake` builds BuildSystems for different platforms, e.g. VisualStudio Solutions on Windows, Makefiles on Linux etc. -This allows us to define in one central location (namely `CMakeLists.txt`) how OpenMS is build and have the platform specific stuff handled by `CMake`. -View the [cmake website[(http://www.cmake.org) for more information. +This allows us to define in one central location (namely `CMakeLists.txt`) how OpenMS is build and have the platform +specific stuff handled by `CMake`. View the [cmake website](http://www.cmake.org) for more information. ### How do I use CMake? See Installation instructions for your platform. -In general, you call `CMake(.exe)` with some parameters to create the native build-system. -Afterwards you can (but usually don't have to edit the current configuration using a GUI named `ccmake` (or `CMake-GUI` in Windows), which ships with `CMake`). +In general, call `CMake(.exe)` with some parameters to create the native build-system. +Afterwards, (but usually) don't have to edit the current configuration using a GUI named `ccmake` +(or `CMake-GUI` in Windows), which ships with `CMake`). -> **_NOTE:_** whenever `ccmake` is mentioned in this document, substitute this by `CMake-GUI` if your OS is Windows. You can also edit the `CMakeCache.txt` file directly. +```{note} +Whenever `ccmake` is mentioned in this document, substitute this by `CMake-GUI` if your OS is Windows. Edit +the `CMakeCache.txt` file directly. +``` ### How do I generate a build-system for Eclipse, KDevelop, CodeBlocks etc? -Type `cmake` into a console. This will list the available code generators available on your platform, which you can pass to `CMake` using the `-G` option. +Type `cmake` into a console. This will list the available code generators available on your platform, pass them to `CMake` +using the `-G` option. ### How do I switch to debug or release configuration? -For Makefile generators (typically on Linux), you can set the `CMAKE_BUILD_TYPE` variable to either Debug or Release by calling `ccmake`. -For Visual Studio, this is not necessary as all configurations are generated and you can choose the one you like within the IDE itself. -The 'Debug' configuration enabled debug information. The 'Release' configuration disables debug information and enables optimisation. +For Makefile generators (typically on Linux), set the `CMAKE_BUILD_TYPE` variable to either Debug or Release by calling +`ccmake`. For Visual Studio, this is not necessary as all configurations are generated and choose the one you like within +the IDE itself. The 'Debug' configuration enabled debug information. The 'Release' configuration disables debug +information and enables optimisation. ### How do I add a new class to the build system? -1. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in `src//include/OpenMS` and the cpp file in `src//source`, e.g., `src/openms/include/OpenMS/FORMAT/NewFileFormat.h` and `src/openms/source/FORMAT/NewFileFormat.cpp`. -2. Add both to the respective sources.cmake file in the same directory (e.g., `src/openms/source/FORMAT/` and `src/openms/include/OpenMS/FORMAT/`). -3. Add the corresponding class test to `src/tests/class_tests//` (e.g., `src/tests/class_tests/openms/source/NewFileFormat_test.cpp`). +1. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in + `src//include/OpenMS` and the cpp file in `src//source`, e.g., + `src/openms/include/OpenMS/FORMAT/NewFileFormat.h` and `src/openms/source/FORMAT/NewFileFormat.cpp`. +2. Add both to the respective `sources.cmake` file in the same directory (e.g., `src/openms/source/FORMAT/` and + `src/openms/include/OpenMS/FORMAT/`). +3. Add the corresponding class test to `src/tests/class_tests//` + (e.g., `src/tests/class_tests/openms/source/NewFileFormat_test.cpp`). 4. Add the test to the `executables.cmake` file in the test folder (e.g., `src/tests/class_tests/openms/executables.cmake`). 5. Add them to git by using the command `git add`. ### How do I add a new directory to the build system? -1. Create two new `sources.cmake` files (one for `src//include/OpenMS/MYDIR`, one for `src//source/MYDIR`), using existing `sources.cmake` files as template. +1. Create two new `sources.cmake` files (one for `src//include/OpenMS/MYDIR`, one for + `src//source/MYDIR`), using existing `sources.cmake` files as template. 2. Add the new `sources.cmake` files to `src//includes.cmake` 3. If you created a new directory directly under `src/openms/source`, then have a look at `src/tests/class_tests/openms/executables.cmake`. 4. Add a new section that makes the unit testing system aware of the new (upcoming) tests. @@ -91,17 +103,17 @@ The following section provides information about how to debug your code. ### How do I run a single test? -You can can execute an OpenMS class test using the CTest regular expressions: +Execute an OpenMS class test using the CTest regular expressions: ```bash ctest -V -R "^_test" -# To build a class test, you simply call the respective make target in ./source/TEST: +# To build a class test, call the respective make target in ./source/TEST: make _test ``` -To run a TOPP test, you can use: +To run a TOPP test, use: ```bash @@ -115,19 +127,23 @@ make ``` ### How do I debug uncaught exceptions? -You can dump a core if an uncaught exception occurs, by setting the environment variable `OPENMS_DUMP_CORE`. +Dump a core if an uncaught exception occurs, by setting the environment variable `OPENMS_DUMP_CORE`. -Each time an uncaught exception occurs, the `OPENMS_DUMP_CORE` variable is checked and a segmentation fault is caused, if it is set. +Each time an uncaught exception occurs, the `OPENMS_DUMP_CORE` variable is checked and a segmentation fault is caused, +if it is set. ### (Linux) Why is no core dumped, although a fatal error occured? -Try the `ulimit -c` unlimited command. It sets the maximum size of a core to unlimited. +The `ulimit -c` unlimited command. It sets the maximum size of a core to unlimited. -> **_NOTE:_** We observed that, on some systems, no core is dumped even if the size of the core file is set to unlimited. We are not sure what causes this problem +```{attention} +We observed that, on some systems, no core is dumped even if the size of the core file is set to unlimited. We are not +sure what causes this problem +``` ### (Linux) How can I set breakpoints in gdb to debug OpenMS? -Imagine you want to debug the TOPPView application and you want it to stop at line 341 of SpectrumMDIWindow.C. +Debug the TOPPView application to stop at line 341 of SpectrumMDIWindow.C. 1. Enter the following in your terminal: @@ -141,10 +157,12 @@ Imagine you want to debug the TOPPView application and you want it to stop at li ```bash gdb> run [arguments] ``` + 3. Set the breakpoint: ```bash gdb> break SpectrumMDIWindow.C:341 ``` + 4. Start the application again (with the same arguments): ```bash @@ -156,49 +174,62 @@ Imagine you want to debug the TOPPView application and you want it to stop at li OpenMS runs on three major platforms. Here are the most prominent causes of "it runs on Platform A, but not on B. What now?" ### Reading or writing binary files -Reading or writing binary files causes different behaviour. Usually Linux does not make a difference between text-mode and binary-mode when reading files. This is quite different on Windows as some bytes are interpreted as `EOF`, which lead might to a premature end of the reading process. -If reading binary files, make sure that you explicitly state that the file is binary when opening it. +Reading or writing binary files causes different behaviour. Usually Linux does not make a difference between text-mode +and binary-mode when reading files. This is quite different on Windows as some bytes are interpreted as `EOF`, which +lead might to a premature end of the reading process. -During writing in text-mode on Windows a line-break (`\n`) is expanded to (`\r\n`). Keep this in mind or use the `eol-style` property of subversion to ensure that line endings are correctly checked out on non-Windows systems. +If reading binary files, make sure to explicitly state that the file is binary when opening it. + +During writing in text-mode on Windows a line-break (`\n`) is expanded to (`\r\n`). Keep this in mind or use the +`eol-style` property of subversion to ensure that line endings are correctly checked out on non-Windows systems. ### `UInt` vs `Size` -Both `unsigned int` vs `size_t` `UInt` and `Size` have the same size on Linux GCC (32bit on 32bit systems, 64bit on 64 bit systems), however on Windows this only holds for 32bit. On a 64bit Windows, the `UInt` type is still 32bit, while the `Size` type is 64bit. This might lead to warnings (at best) or overflows and other drawbacks. + +Both `unsigned int` vs `size_t` `UInt` and `Size` have the same size on Linux GCC (32 bit on 32 bit systems, 64 bit on +64 bit systems), however on Windows this only holds for 32 bit. On a 64 bit Windows, the `UInt` type is still 32 bit, +while the `Size` type is 64bit. This might lead to warnings (at best) or overflows and other drawbacks. + Therefore, do not assume that `UInt` is equal to `Size`. ### Paths and system functions -Avoid hardcoding e.g.`String tmp_dir = "/tmp";`. This will fail on Windows. Use Qt's `QDir` to get a path to the systems temporary directory if required. +Avoid hardcoding e.g.`String tmp_dir = "/tmp";`. This will fail on Windows. Use Qt's `QDir` to get a path to the systems +temporary directory if required. Avoid names like uname which are only available on Linux. -When working with files or directories, it is usually safe to use "/" on all platforms. Take care of spaces in directory names though. You should always quote paths if they are used in a system call to ensure that the subsequent interpreter takes the spaced path as a single entity. +When working with files or directories, it is usually safe to use "/" on all platforms. Take care of spaces in directory +names though. Always quote paths if they are used in a system call to ensure that the subsequent interpreter +takes the spaced path as a single entity. ## Doxygen Documentation ### Where can I find the definition of the main page? -You can find a definition of the main page [here](https://github.com/OpenMS/OpenMS/edit/develop/doc/doxygen/public/Main.doxygen). +Find a definition of the main page [here](https://github.com/OpenMS/OpenMS/edit/develop/doc/doxygen/public/Main.doxygen). ### Where can I add a new module? -You can add a new module [here](https://github.com/OpenMS/OpenMS/edit/develop/doc/doxygen/public/Modules.doxygen). +Add a new module [here](https://github.com/OpenMS/OpenMS/edit/develop/doc/doxygen/public/Modules.doxygen). ### How is the command line documentation for TOPP/UTILS tools created? -The program `OpenMS/doc/doxygen/parameters/TOPPDocumenter.cpp` creates the command line documentation for all classes that are included in the static `ToolHandler.cpp` tools list. It can be included in the documentation using the following `doxygen` command: +The program `OpenMS/doc/doxygen/parameters/TOPPDocumenter.cpp` creates the command line documentation for all classes +that are included in the static `ToolHandler.cpp` tools list. It can be included in the documentation using the following `doxygen` command: `@verbinclude TOPP_.cli` -You can test if everything worked by calling `make doc_param_internal`. The command line documentation is written to `OpenMS/doc/doxygen/parameters/output/`. +Test if everything worked by calling `make doc_param_internal`. The command line documentation is written to +`OpenMS/doc/doxygen/parameters/output/`. ### What are the important files for adding a new tutorial section? View the following OpenMS tutorials: * `OpenMS/doc/OpenMS_tutorial/refman_overwrite.tex.in` (for PDF tutorials) -* `OpenMS/doc/doxygen/public/OpenMS_Tutorial_html.doxygen~` (for html tutorials) +* `OpenMS/doc/doxygen/public/OpenMS_Tutorial_html.doxygen` (for html tutorials) View the following TOPP and TOPPView tutorials: @@ -210,6 +241,7 @@ View the following TOPP and TOPPView tutorials: ### How do I contribute to a bug fix? To contribute to a bug fix: + 1. Submit the bug as a GitHub issue. 2. Create a feature branch (e.g. `feature/fix_missing_filename_issue_615`) from your (up-to-date) develop branch in your fork of OpenMS. 3. Fix the bug and add a test. diff --git a/docs/faqs/developer-faq.md b/docs/faqs/developer-faq.md new file mode 100644 index 00000000..81b46548 --- /dev/null +++ b/docs/faqs/developer-faq.md @@ -0,0 +1,399 @@ +Developer FAQ +============= + +The following contains answers to typical questions from developers about OpenMS. + +## General + +The following section provides general information to new contributors. + +### I am new to OpenMS. What should I do first? + +* Check out the development version of OpenMS (see website). +* Build OpenMS by following the [installation instructions]() or [from source](../installations/build-openms-from-source.md). +* Read the [OpenMS Coding Conventions]() +* Read the [OpenMS Tutorial](../tutorials/user-tutorial.md). +* Create a GitHub account. +* Subscribe to the [open-ms-general](https://sourceforge.net/projects/open-ms/lists/open-ms-general) or [contact-us](../contact-us.md). + +### What is the difference between an OpenMS tool and util? + +A tool starts its lifecycle in `UTILS` and may exist without being thoroughly tested. Tools may be promoted from `UTILS` +to `TOOLS` if they are stable enough, are fully tested, fully documented, and a test workflow exists. + +### I have written a class for OpenMS. What should I do? + +Follow the [OpenMS coding conventions](). + +Coding style (brackets, variable names, etc.) must conform to the conventions. + +* The class and all the members should be properly documented. +* Check your code with the tool `tools/checker.php`. Call `php tools/checker.php` for detailed instructions. + +Please open a pull request and follow the [pull request guidelines](pull-request-checklist.md). + +### Can I use QT designer to create GUI widgets? + +Yes. Create a class called `Widget: Create .ui-File` with `QT designer` and store it as `Widget.ui.`, add the class to +`sources.cmake`. From the .ui-File the file `include/OpenMS/VISUAL/UIC/ClassTemplate.h` is generated by the build system. + +```{note} +Do not check in this file, as it is generated automatically when needed. +``` + +Derive the class `Widget` from `WidgetTemplate`. For further details, see the `Widget.h` and `Widget.cpp` files. + +### Can the START_SECTION-macro not handle template methods that have two or more arguments? + +Insert round brackets around the method declaration. + +### Where can I find the binary installers created? + +View the binary installers at the [build archive](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/). +Please verify the creation date of the individual installers, as there may have been an error while creating the installer. + +## Troubleshooting + +The following section provides information about how to troubleshoot common OpenMS issues. + +### OpenMS complains about boost not being found but I'm sure its there + +`CMake` got confused. Set up a new build directory and try again. If you build from source (not recommended), deleting +the `CMakeCache.txt` and `cmake` directory might help. + +## Build System + +The following questions are related to the build system. + +### What is CMake? + +`CMake` builds BuildSystems for different platforms, e.g. VisualStudio Solutions on Windows, Makefiles on Linux etc. +This allows to define in one central location (namely `CMakeLists.txt`) how OpenMS is build and have the platform specific +stuff handled by `CMake`. + +View the [cmake website](http://www.cmake.org) for more information. + +### How do I use CMake? + +See Installation instructions for your platform. +In general, call `CMake(.exe)` with some parameters to create the native build-system. + +```{tip} +whenever `ccmake` is mentioned in this document, substitute this by `CMake-GUI` if your OS is Windows. Edit the +`CMakeCache.txt` file directly. +``` + +### How do I generate a build-system for Eclipse, KDevelop, CodeBlocks etc? + +Type `cmake` into a console. This will list the available code generators available on your platform; use them with +`CMake` using the `-G` option. + +### What are user definable CMake cache variables? + +They allow the user to pass options to `CMake` which will influence the build system. The most important option which +should be given when calling `CMake.exe` is: + +`CMAKE_FIND_ROOT_PATH`, which is where `CMake` will search for additional libraries if they are not found in the default +system paths. By default we add `OpenMS/contrib`. + +If you have installed all libraries on your system already, there is no need to change `CMAKE_FIND_ROOT_PATH`. For +`contrib` libraries, set the variable `CMAKE_FIND_ROOT_PATH`. + +On Windows, `contrib` folder is required, as there are no system developer packages. To pass this variable to +`CMake` use the `-D` switch e.g. `cmake -D CMAKE_FIND_ROOT_PATH:PATH="D:\\somepath\\contrib"`. + +Everything else can be edited using `ccmake` afterwards. + +The following options are of interest: + +- `CMAKE_BUILD_TYPE` To build Debug or Release version of OpenMS. Release is the default. +- `CMAKE_FIND_ROOT_PATH` The path to the `contrib` libraries. + ```{tip} + Provide more then one value here (e.g., `-D CMAKE_FIND_ROOT_PATH="/path/to/contrib;/usr/"` will search in your + `contrib` path and in `/usr` for the required libraries) + ``` +- `STL_DEBUG` Enables STL debug mode. +- `DB_TEST` (deprecated) Enables database testing. +- `QT_DB_PLUGIN` (deprecated) Defines the db plugin used by Qt. + +View the description for each option by calling `ccmake`. + +### Can I use another solver other than GLPK? + +Other solvers can be used, but by default, the build system only links to GLPK (this is how OpenMS binary packages must +be built). To to use another solver, use `cmake ... -D USE_COINOR=1 ....` and refer to the documentation of the +`LPWrapper` class. + +### How do I switch to debug or release configuration? + +For Makefile generators (typically on Linux), set the `CMAKE_BUILD_TYPE` variable to either Debug or Release by +calling `ccmake`. For Visual Studio, this is not necessary as all configurations are generated and choose the one you +like within the IDE itself. The 'Debug' configuration enabled debug information. The 'Release' configuration disables +debug information and enables optimisation. + +### I changed the `contrib` path, but re-running `CMake` won't change the library paths? + +Once a library is found and its location is stored in a cache variable, it will only be searched again if the +corresponding entry in the cache file is set to false. + +```{warning} +If you delete the `CMakeCache.txt`, all other custom settings will be lost. +``` + +The most useful targets will be shown to you by calling the targets target, i.e. make targets. + +### `CMake` can't seem to find a `Qt` library (usually `QtCore`). What now? + +`CMake` finds `QT` by looking for `qmake` in your `PATH` or for the Environment Variable `QTDIR`. Set these accordingly. + +Make sure there is no second installation of Qt (especially the MinGW version) in your local environment. +```{warning} +This might lead ``CMake`` to the wrong path (it's searching for the ``Qt*.lib`` files). +You should only move or delete the offending `Qt` version if you know what you are doing! +``` + +A save workaround is to edit the `CMakeCache` file (e.g. via `ccmake`) and set all paths relating to `QT` +(e.g. `QT_LIBRARY_DIR`) manually. + +### (Windows) What version of Visual Studio should I use? + +It is recommended to use the latest version. Get the latest `CMake`, as its generator needs to support your VS. If +your VS is too new and there is no `CMake` for that yet, you're gonna be faced with a lot of conversion issues. +This happens whenever the Build-System calls `CMake` (which can be quite often, e.g., after changes to `CMakeLists.txt`). + +### How do I add a new class to the build system? + +1. Create the new class in the corresponding sub-folder of the sub-project. The header has to be created in `src//include/OpenMS` and the `.cpp` file in `src//source`, e.g., `src/openms/include/OpenMS/FORMAT/NewFileFormat.h` and `src/openms/source/FORMAT/NewFileFormat.cpp`. +2. Add both to the respective `sources.cmake` file in the same directory (e.g., `src/openms/source/FORMAT/` and `src/openms/include/OpenMS/FORMAT/`). +3. Add the corresponding class test to `src/tests/class_tests//` (e.g., `src/tests/class_tests/openms/source/NewFileFormat_test.cpp`). +4. Add the test to the `executables.cmake` file in the test folder (e.g., `src/tests/class_tests/openms/executables.cmake`). +5. Add them to git by using the command `git add`. + +### How do I add a new directory to the build system? + +1. Create two new `sources.cmake` files (one for `src//include/OpenMS/MYDIR`, one for `src//source/MYDIR`), using existing `sources.cmake` files as template. +2. Add the new `sources.cmake` files to `src//includes.cmake` +3. If you created a new directory directly under `src/openms/source`, then have a look at `src/tests/class_tests/openms/executables.cmake`. +4. Add a new section that makes the unit testing system aware of the new (upcoming) tests. +5. Look at the very bottom and augment `TEST_executables`. +6. Add a new group target to `src/tests/class_tests/openms/CMakeLists.txt`. + +### How can I speed up the compile process of OpenMS? + +To speed up the compile process of OpenMS, use several threads. If you have several processors/cores, build OpenMS +classes/tests and `TOPP` tools in several threads. On Linux, use the `make option -j: make -j8 OpenMS TOPP test_build`. + +On Windows, Visual Studio solution files are automatically build with the `/MP` flag, such that Visual Studio uses all +available cores of the machine. + +## Release + +View [preparation of a new OpenMS release](https://github.com/OpenMS/OpenMS/wiki/Preparation-of-a-new-OpenMS-release#release_developer) to learn more about contributing to releases. + + +## Working in Integrated Development Environments (IDEs) + +### Why are there no `source/TEST` and `source/APPLICATIONS/TOPP|UTILS` folder? + +All source files added to an IDE are associated with their targets. Find the source files for each test within +its own subproject. The same is true for the `TOPP` and `UTILS` classes. + +### I'm getting the error "Error C2471: cannot update program database" + +This is a bug in Visual Studio and there is a [bug fix](http://code.msdn.microsoft.com/KB946040) Only apply it if you +encounter the error. The bug fix might have unwanted side effects! + +### Visual Studio can't read the clang-format file. + +Depending on the Visual Studio version it might get an error like `Error while formating with ClangFormat`. +This is because Visual Studio is using an outdated version of clang-format. Unfortunately there is no easy way to update +this using Visual Studio itself. There is a plugin provided by LLVM designed to fix this problem, but the plugin doesn't +work with every Visual Studio version. In that case, update clang-format manually using the pre-build clang-format binary. +Both the binary and a link to the plugin can be found [here](https://llvm.org/builds/). +To update clang-format download the binary and exchange it with the clang-format binary in your Visual Studio folder. +For Visual Studio 17 and 19 it should be located at: `C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\bin`. + +### The indexer gets stuck at some file which ``#includes seqan`` + +It seems that SeqAn code is just too confusing for older eclipse C++ indexers. You should upgrade to eclipse galileo +(CDT 6.0.x). Also, increase the available memory limit in `eclipse.ini`, e.g. `-Xmx1024m` for one gig. + +### The parser is confused after OPENMS_DLLAPI and does not recognize standard C++ headers + +Go to ``Project -> Properties -> C/C++ Include Paths and Preprocessor Symbols -> Add Preprocessor symbol -> "OPENMS_DLLAPI="``. +This tells eclipse that the macro is defined empty. In the same dialog add an external include path to +e.g. ``/usr/include/c++/4.3.3/``, etc. The issue with C++ headers was fixed in the latest galileo release. + +Hints to resolve the OPENMS_DLLAPI issue using the ``cmake`` generator are welcome! + +## Debugging + +The following section provides information about how to debug your code. + +### How do I debug uncaught exceptions? + +Dump a core if an uncaught exception occurs, by setting the environment variable `OPENMS_DUMP_CORE`. + +Each time an uncaught exception occurs, the `OPENMS_DUMP_CORE` variable is checked and a segmentation fault is caused, +if it is set. + +### (Linux) Why is no core dumped, although a fatal error occured? + +The `ulimit -c` unlimited command. It sets the maximum size of a core to unlimited. + +```{warning} +We observed that, on some systems, no core is dumped even if the size of the core file is set to unlimited. We are not +sure what causes this problem. +``` + +### (Linux) How can I set breakpoints in gdb to debug OpenMS? + +Imagine you want to debug the TOPPView application and you want it to stop at line 341 of SpectrumMDIWindow.C. + +1. Enter the following in your terminal: + + ```bash + Run gdb: + shell> gdb TOPPView +``` + +2. Start the application (and close it): + + ```bash + gdb> run [arguments] +``` +3. Set the breakpoint: + ```bash + gdb> break SpectrumMDIWindow.C:341 +``` +4. Start the application again (with the same arguments): + + ```bash + gdb> run + ``` + +### How can I find out which shared libraries are used by an application? + +Linux: Use `ldd`. + +Windows (Visual studio console): See [Dependency Walker](http://www.dependencywalker.com/) (use x86 for 32 bit builds +and the x64 version for 64bit builds. Using the wrong version of depends.exe will give the wrong results) or +``dumpbin /DEPENDENTS OpenMS.dll``. + +### How can I get a list of the symbols defined in a (shared) library or object file? + +Linux: Use `nm `. + +Use `nm -C` to switch on demangling of low-level symbols into their C++-equivalent names. `nm` also accepts .a and .o files. + +Windows (Visual studio console): Use ``dumpbin /ALL ``. + +Use dumpbin on object files (.o) or (shared) library files (.lib) or the DLL itself e.g. `dumpbin /EXPORTS OpenMS.dll`. + +## Cross-platform thoughts + +OpenMS runs on three major platforms.. Here are the most prominent causes of "it runs on Platform A, but not on B. What now?" + +### Reading or writing binary files + +Reading or writing binary files causes different behaviour. Usually Linux does not make a difference between text-mode +and binary-mode when reading files. This is quite different on Windows as some bytes are interpreted as `EOF`, which lead +might to a premature end of the reading process. + +If reading binary files, make sure that you explicitly state that the file is binary when opening it. + +During writing in text-mode on Windows a line-break (`\n`) is expanded to (`\r\n`). Keep this in mind or use the +`eol-style` property of subversion to ensure that line endings are correctly checked out on non-Windows systems. + +### Paths and system functions + +Avoid hardcoding e.g.`String tmp_dir = "/tmp";`. This will fail on Windows. Use Qt's `QDir` to get a path to the systems +temporary directory if required. + +Avoid names like uname which are only available on Linux. + +When working with files or directories, it is usually safe to use "/" on all platforms. Take care of spaces in directory +names though. Quote paths if they are used in a system call to ensure that the subsequent interpreter +takes the spaced path as a single entity. + + +## Doxygen Documentation + +### Where can I find the definition of the main page? + +Find a definition of the main page [here](https://github.com/OpenMS/OpenMS/edit/develop/doc/doxygen/public/Main.doxygen). + +### Where can I add a new module? + +Add a new module [here](https://github.com/OpenMS/OpenMS/edit/develop/doc/doxygen/public/Modules.doxygen). + +### How is the parameter documentation for classes derived from DefaultParamHandler created? + +Add your class to the program ``OpenMS/doc/doxygen/parameters/DefaultParamHandlerDocumenter.cpp``. This program generates +a html table with the parameters. This table can then be included in the class documentation using the following +`doxygen` command:`@htmlinclude OpenMS_.parameters`. + +```{note} +Parameter documentation is automatically generated for `TOPP/UTILS` included in the static `ToolHandler.cpp` tools list. +``` + +To include TOPP/UTILS parameter documentation use following `doxygen` command: + + +`@htmlinclude TOPP_.parameters` + +or + +`@htmlinclude UTILS_.parameters` + +Test if everything worked by calling `make doc_param_internal`. The parameters documentation is written to +`OpenMS/doc/doxygen/parameters/output/`. + +### How is the command line documentation for TOPP/UTILS tools created? + +The program `OpenMS/doc/doxygen/parameters/TOPPDocumenter.cpp` creates the command line documentation for all classes +that are included in the static `ToolHandler.cpp` tools list. It can be included in the documentation using the following `doxygen` command: + +`@verbinclude TOPP_.cli` + +Test if everything worked by calling `make doc_param_internal`. The command line documentation is written to +`OpenMS/doc/doxygen/parameters/output/`. + +## Bug Fixes + +### How to contribute a bug fix? + +Read [contributor quickstart guide](../guides/contributors-quickstart-guide.md). + +### How can I profile my code? + +IBM's profiler, available for all platforms (and free for academic use): Purify(Plus) and/or Quantify. + +Windows: this is directly supported by Visual Studio (Depending on the edition: Team and above). Follow their documentation. + +Linux: + +1. Build OpenMS in debug mode (set `CMAKE_BUILD_TYPE` to `Debug`). +2. Call the executable with valgrind: `valgrind –tool=callgrind`. + ```{warning} + Other processes running on the same machine can influence the profiling. Make sure your application gets enough + resources (memory, CPU time). + ``` +3. Start and stop the profiling while the executable is running e.g. to skip initialization steps: +4. Start valgrind with the option `–instr-atstart=no`. +5. Call `callgrind -i [on|off]` to start/stop the profiling. +6. The output can be viewed with `kcachegrind callgrind.out`. + +### (Linux) How do I check my code for memory leaks? + +* Build OpenMS in debug mode (set ``CMAKE_BUILD_TYPE`` to ``Debug``). +* Call the executable with ``valgrind: valgrind --suppressions=OpenMS/tools/valgrind/openms_external.supp –leak-check=full ``. + +Common errors are: + +* ``'Invalid write/read ...'`` - Violation of container boundaries. +* ``'... depends on uninitialized variable'`` - Uninitialized variables: +* ``'... definitely lost'`` - Memory leak that has to be fixed +* ``'... possibly lost'`` - Possible memory leak, so have a look at the code + +For more information see the [`valgrind` documentation](http://valgrind.org/docs/manual/) . diff --git a/docs/guides/contributors-quickstart-guide.md b/docs/guides/contributors-quickstart-guide.md new file mode 100644 index 00000000..a6bb3ccc --- /dev/null +++ b/docs/guides/contributors-quickstart-guide.md @@ -0,0 +1,75 @@ +Contribute to OpenMS +==================== + +To contribute to OpenMS: + +- Familiarise yourself with the [OpenMS online documentation](../index.rst). +- Learn how to [build OpenMS](../installations/build-openms-from-source.md). +- Check out the [OpenMS tutorial for developers](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/OpenMS_tutorial.html). + +For any questions, please [contact us](../contact-us.md) at [open-ms-general]((https://sourceforge.net/projects/open-ms/lists/open-ms-general) mailing list. + +## Technical documentation + +```{note} +Untested installers and containers are known as the nightly snapshot, are released every night. They generally pass +automated continuous integration tests but no manual tests. +``` + +View the documentation for the nightly snapshot of [OpenMS develop branch](https://github.com/OpenMS/OpenMS/tree/develop) +at the [build archive](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/nightly/html/index.html). + +See the documentation for the [latest release](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/Documentation/release/latest/html/index.html). + +## Contribution guidelines + +Before contributing to OpenMS, read information on the development model and conventions followed to maintain a coherent +code base. + +### Development model + +OpenMS follows the [Gitflow development workflow](http://nvie.com/posts/a-successful-git-branching-model/). + +Every contributor is encouraged to create their own fork (even if they are eligible to push directly to OpenMS). +To create a fork: + +1. Follow the documentation on [forking](https://help.github.com/articles/fork-a-repo). +2. Keep your fork [up-to-date](https://help.github.com/articles/syncing-a-fork). +3. Create a [pull request](https://help.github.com/articles/using-pull-requests). Before opening the pull request, please + view the [pull request guidelines](../additional-resources/pull-request-checklist.md). + +### Coding conventions + +See the manual for coding style recommended by OpenMS: [Coding conventions](https://github.com/OpenMS/OpenMS/wiki/Coding-conventions). + +```{seealso} +[C++ Guide](https://github.com/OpenMS/OpenMS/wiki/Cpp-Guide). +``` + +OpenMS automatically tests for common coding convention violations using a modified version of `cpplint`. +Style testing can be enabled using `cmake` options. We also provide a configuration file for `Uncrustify` for automated +style corrections (see `tools/uncrustify.cfg`). + +### Commit messages + +View the guidelines for commit messages: [How to write commit messages](https://github.com/OpenMS/OpenMS/wiki/HowTo---Write-Commit-Messages). + +### Automated unit tests + +Nightly tests run on different platforms. It is recommended to test on different platforms. + +```{tip} +This saves time and increases productivity during continuous integration tests. +``` + +Nightly tests: [CDASH](http://cdash.openms.de/index.php?project=OpenMS). + +## Further contributor resources + +Consider the following resources for further information: + +- **Guidelines for adding new dependency libraries**: View the guidelines for [adding new dependency libraries](). +- **Experimental installers**: We automatically build installers for different platforms. These usually contain + unstable or partially untested code. + The nightly (unstable) installers are available at the [build archive](https://abibuilder.informatik.uni-tuebingen.de/archive/openms/OpenMSInstaller/nightly/). +- **Developer FAQ**: Visit the [Developer FAQ](../faqs/developer-faq.md) to get answers to frequently asked questions. diff --git a/docs/images/click-fork.png b/docs/images/additional-resources/click-fork.png similarity index 100% rename from docs/images/click-fork.png rename to docs/images/additional-resources/click-fork.png diff --git a/docs/images/tutorials/proteowizard.png b/docs/images/tutorials/proteowizard.png new file mode 100644 index 0000000000000000000000000000000000000000..64733b223a4cbd1e91402399c3d42d5154c34f19 GIT binary patch literal 27640 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 I4m*DO16rpM+W;T`+Zfn>ZW@C(b&7Xdv&kp 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 a;Qs-mBI%jF34t{L0000 Date: Thu, 26 May 2022 14:48:14 +0530 Subject: [PATCH 77/77] Fixes: review comments by @jpfeuffer --- .../openms-git-workflow.md | 18 +++++++++--------- docs/faqs/contributor-faq.md | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/additional-resources/openms-git-workflow.md b/docs/additional-resources/openms-git-workflow.md index 32171d6c..dfa2ee22 100644 --- a/docs/additional-resources/openms-git-workflow.md +++ b/docs/additional-resources/openms-git-workflow.md @@ -1,7 +1,7 @@ OpenMS Git Workflow =================== -Before getting started, install latest version of git to avoid problems like Github https authentication errors +Before getting started, install latest version of git to avoid problems like GitHub https authentication errors (see [Troubleshooting cloning errors](https://docs.github.com/en/repositories/creating-and-managing-repositories/troubleshooting-cloning-errors) and a solution using [ssh](https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories)). OpenMS follows the [git flow workflow](https://nvie.com/posts/a-successful-git-branching-model/). The difference is that @@ -12,7 +12,7 @@ merge commits are managed via pull requests instead of creating merge commits lo Naming conventions for the following apply: * A **local repository** is the repository that lies on your hard drive after cloning. -* A **remote repository** is a repository on a Git server such as Github. +* A **remote repository** is a repository on a git server such as GitHub. * A **fork** is a copy of a repository. Forking a repository allows you to freely experiment with changes without affecting the original project. * **Origin** refers to a remote repository that you have forked. Call this repository https://github.com/_YOURUSERNAME_/OpenMS. * **Upstream** refers to the original remote OpenMS repository. Call this repository https://github.com/OpenMS/OpenMS. @@ -101,7 +101,7 @@ $ git branch -va ## Keep your fork in sync -Keep your fork (`origin`) in sync with the OpenMS repository (`upstream`) by following the [Github instructions](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork). +Keep your fork (`origin`) in sync with the OpenMS repository (`upstream`) by following the [GitHub instructions](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork). In summary, to keep your fork in sync: 1. Fetch changes from upstream and update your local branch. 2. Push your updated local branch to your fork (`origin`). @@ -185,13 +185,13 @@ Start in your local `OpenMS/OpenMS` repository (on your feature/pull request bra The following example uses a submodule called `THIRDPARTY`. ```bash -git submodule update --init THIRDPARTY -cd THIRDPARTY +$ git submodule update --init THIRDPARTY +$ cd THIRDPARTY # yes, in the submodules the default remote is origin # usually you want to pull the changes from master (e.g. after your pull request to OpenMS/THIRDPARTY has been merged) -git pull origin master -cd .. -git status +$ git pull origin master +$ cd .. +$ git status # Make sure that you see "modified: THIRDPARTY (new commits)" -git commit -am "updated submodule" +$ git commit -am "updated submodule" ``` diff --git a/docs/faqs/contributor-faq.md b/docs/faqs/contributor-faq.md index 714d10ac..71e930ce 100644 --- a/docs/faqs/contributor-faq.md +++ b/docs/faqs/contributor-faq.md @@ -107,23 +107,23 @@ Execute an OpenMS class test using the CTest regular expressions: ```bash -ctest -V -R "^_test" +$ ctest -V -R "^_test" # To build a class test, call the respective make target in ./source/TEST: -make _test +$ make _test ``` To run a TOPP test, use: ```bash -ctest -V -R "TOPP_" +$ ctest -V -R "TOPP_" ``` To build the tool, use: ```bash -make +$ make ``` ### How do I debug uncaught exceptions?