| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- // Copyright 2019-2020 Rene Rivera
- // Copyright 2003, 2006 Vladimir Prus
- // Distributed under the Boost Software License, Version 1.0.
- // (See accompanying file LICENSE.txt or https://www.bfgroup.xyz/b2/LICENSE.txt)
- = B2 contributor guidelines
- B2 is an open-source project. This means that we welcome and appreciate
- all contributions -- be it ideas, bug reports, or patches. This document
- contains guidelines which helps to assure that development goes on smoothly, and
- changes are made quickly.
- The guidelines are not mandatory, and you can decide for yourself which one to
- follow. But note, the 10 mins that you spare writing a comment, for example,
- might lead to significantly longer delay for everyone.
- == Additional resources include
- === The issue tracker
- https://github.com/bfgroup/b2/issues
- === Discussion forums
- https://github.com/bfgroup/b2/discussions
- == BUGS and PATCHES
- Both bugs and patches can be submitted to the GitHub tracker.
- When reporting a bug, please try to provide the following information:
- * What you did.
- * A minimal reproducible test case is very much appreciated.
- * Shell script with some annotations is much better than verbose
- description of the problem.
- * A regression test is the best (see test/test_system.html).
- * What you got.
- * What you expected.
- * What version of B2 did you use. If possible, please try to test with the
- main branch state.
- When submitting a patch, please:
- * Make a single patch for a single logical change
- * Follow the policies and coding conventions below
- * Send patches as pull requests to the main branch
- * Provide a good PR message together with the patch
- The purpose of message serves to communicate what was changed, and *why*.
- Without a good message, you might spend a lot of time later, wondering where
- a strange piece of code came from and why it was necessary.
- The good message mentions each changed file and each rule/method, saying
- what happened to it, and why. Consider, the following log message
- ----
- Better direct request handling.
- * new/build-request.jam
- (directly-requested-properties-adjuster): Redo.
- * new/targets.jam
- (main-target.generate-really): Adjust properties here.
- * new/virtual-target.jam
- (register-actual-name): New rule.
- (virtual-target.actualize-no-scanner): Call the above, to detected bugs,
- where two virtual target correspond to one Jam target name.
- ----
- The messages for the last two files are good. They tell what was changed.
- The change to the first file is clearly under-commented.
- It's okay to use terse messages for uninteresting changes, like ones induced
- by interface changes elsewhere.
- == POLICIES
- === Testing
- All serious changes must be tested. New rules must be tested by the module where
- they are declared. The test system (link:test/test_system.html[test/test_system.html])
- should be used to verify user-observable behavior.
- === Documentation
- It turns out that it's hard to have too much comments, but it's easy to have too
- little. Please prepend each rule with a comment saying what the rule does and
- what arguments mean. Stop for a minute and consider if the comment makes sense
- for anybody else, and completely describes what the rules does. Generic phrases
- like "adjusts properties" are really not enough.
- When applicable, make changes to the user documentation as well.
- == CODING CONVENTIONS
- 1. All names of rules and variables are lowercase with "-" to separate
- words.
- +
- ----
- rule call-me-ishmael ( ) ...
- ----
- 2. Names with dots in them are "intended globals". Ordinary globals use a
- dot prefix:
- +
- ----
- .foobar
- $(.foobar)
- ----
- 3. Pseudofunctions or associations are <parameter>.<property>:
- +
- ----
- $(argument).name = hello ;
- $($(argument).name)
- ----
- 4. Class attribute names are prefixed with "self.":
- +
- ----
- self.x
- $(self.x)
- ----
- 5. Builtin rules are called via their ALL_UPPERCASE_NAMES:
- +
- ----
- DEPENDS $(target) : $(sources) ;
- ----
- 6. Opening and closing braces go on separate lines:
- +
- ----
- if $(a)
- {
- #
- }
- else
- {
- #
- }
- ----
- == ENGINE
- Developing in the `b2` engine, the C++ part, requires two steps to be
- effective: building the "stable" engine, and developing the
- "in-progress" engine.
- What is the "stable" engine is up to you. It only refers to a build of the
- engine you know is at a good working state. When you are at a point the
- source is stable you can run `bootstrap.sh/bat` from the root. That will
- create the `b2` executable at the root. You can then use this version to run
- regular B2 builds as needed both within the B2 tree and in other projects.
- The "in-progress" engine is whatever build you happen to be testing at the
- moment. There are two ways to build this be engine. You can either
- (a) run `b2 b2` at the root, or (b) run `build.sh/bat` in `src/engine`.
- Using (a) will place, by default, a fully debuggable `b2` in the `.build`
- directories. You can run that one from a debugger with full symbols and
- stepping features. This should be the first choice in developing in the
- engine.
- After using (a) to implement functionality you can use (b) to fully test
- that functionality. The engine built from (b) is fully optimized and
- is the one used, by default, by the test system when running in the `test`
- directory. Before submitting patches it's required to build this way and
- run the tests in at least one toolset version (but preferably at least two).
|