Table of Contents
Abuild is purposely stealth about pinpointing specific locations of outdated constructs in trees that are not upgraded to encourage you to use the automated upgrade process. If you are working in a previously upgraded tree and some deprecated feature has snuck back in but you can't find where it is, the easiest way to find it is to run in 1.1-compatibility mode. Most outdated constructs will generate errors in 1.1-compatibility mode.
Abuild 1.1 offers many new capabilities relative to 1.0. These
are summarized in Appendix B, Major Changes from Version 1.0 to Version 1.1. Among the
most significant of these changes is the redesigned build tree
structure. When abuild 1.1 is run on a set of build trees that
were created to work with abuild 1.0, it internally maps the old
structure into its new representation. Abuild can make this
mapping explicit by actually upgrading your trees from 1.0 to 1.1.
To use abuild to upgrade your trees, you can run the command
abuild --upgrade-trees. Abuild will analyze
your build area and generate a file that you have to edit. By
editing this file, you supply the information that abuild can't
possibly know on its own. Once all the information is available,
abuild will rewrite your Abuild.conf
and
Abuild.backing
files. In this chapter, we
discuss a general strategy for upgrading and then proceed to
provide specific instructions.
Abuild 1.1 can operate in 1.0 compatibility mode. If you are testing out abuild 1.1 on a build tree that is still under active development with abuild 1.0, you should obviously wait before you try to upgrade the trees. Once you have upgraded your build trees, abuild 1.0 will no longer be able to build them.
As a general rule, it's best to start your upgrade process with build trees that don't have any backing areas. This will save you a lot of trouble. Most of the time, if you have backing areas and your backing areas are already upgraded, abuild's upgrade process can run without any intervention. But we'll come back to that in the next section.
Once you are ready to start upgrading, the first thing you should do is to make sure your build is working with abuild 1.0. You must be sure to start with this as a known baseline so you can be sure problems that you find during upgrade weren't already there.
The next thing you should do is to make sure your build still
works with abuild 1.1 running in 1.0-compatibility mode, which
you can enable by passing --compat-level="1.0"
on the command line or by setting the environment variable
ABUILD_COMPAT_LEVEL
to
“1.0
”. There are a small number
of non-compatible changes (Section B.1, “Non-compatible Changes”). If your build trees run
into any of those, you should try to fix them in a way that is
still compatible with abuild 1.0. You should fairly quickly be
able to reach a point where you have a build tree that builds the
same way under 1.0 and 1.1. Only when you have reached this
stage should you attempt to upgrade. If you run into trouble
during this process, ask for help or consult Section C.2, “Potential Upgrade Problems: Things to Watch Out For”.
Once you have your build trees in a state where your build
produces identical results with both abuild 1.0 and 1.1, you
should find a directory that is above all the trees you are
trying to upgrade. If your intention is to upgrade an entire
forest of trees at once, meaning that you wish to upgrade a
collection of build trees that refer to each other through
external-dirs, you should go to a common
ancestor of all those trees. This will be the root of your
upgraded build forest. If you only wish to upgrade specific
trees, you can just go to the root of the trees you are
upgrading. The upgrade process will allow you to upgrade your
forests a little bit at a time. This is especially important for
distributed development environments in which different trees are
maintained by different teams. Whichever case you pick, your
starting directory must either contain a root build item or be
above the top of trees with root build items. You can't pick a
directory that's in the middle of a build tree. For example, you
can't start in a directory that has a
parent-dir key or that is referred to as a
child in a higher Abuild.conf
file.
Once you have identified your start directory, you should run abuild --upgrade-trees and follow the upgrade process as described in Section C.3, “Upgrade Procedures”. At the end of that process, your trees will be upgraded, but you are not done yet! There are still a few ways in which things can be broken, so read on.
After you have finished this stage of the upgrade process, you should once again run abuild in 1.0-compatibility mode to make sure your build still works. If you run into problems, please consult Section C.2, “Potential Upgrade Problems: Things to Watch Out For”.
Once your build is once again working as it should, you will want
to address deprecation errors that are reported by the backends.
Mostly this would involve moving build item-supplied rules from
Rules.mk
to their new locations under
rules
(see Chapter 22, Build Item Rules and Automatically Generated Code ) and then replacing
BUILD_ITEM_RULES
with appropriate
RULES
entries by the items that use them. You
could also remove LINK_SHLIBS
variables that
you find. After you have done this, you should hopefully reach a
point where you are no longer getting any deprecation warnings.
When you think you have eliminated all deprecation warnings, you
should retry your build in 1.0-compatibility mode with the
--deprecation-is-error
flag. In this mode, any
deprecated features will be reported as errors instead of
warnings. Once your build gets past this point, then you can be
confident that you are no longer using any deprecated features.
If you have upgraded a tree that has externals that point into an area that has not yet been upgraded, though you won't be getting any deprecation warnings, abuild will still tell you that it sees deprecated features and that you should upgrade. This is because your root build item will still have a external-dirs key in it. Abuild is not warning you about it specifically because there's nothing you can do about it if the directory it points to is the root of a tree that hasn't been upgraded yet. The solution to this problem is to run the upgrade process from a higher level directory to upgrade the other tree. If you can't do that, you'll just have to wait until the other tree is upgraded. As soon as it is, abuild will notify you that you have an external-dirs that points to the root of an upgraded tree. Then you can run abuild --upgrade-trees again to let abuild replace the external-dirs key with tree-deps. In the mean time, you will continue to see the upgrade suggestion until all your build trees have been upgraded.
When you finally get to the point where all your build trees are
upgraded, you should once again run with the
--deprecation-is-error
flag. This will give you
one last check that you are not using any deprecated features.
Once that passes, you are finally ready to try running in
1.1-compatibility mode. To do this, either run abuild with
--compat-level=1.1
, set the
ABUILD_COMPAT_LEVEL
environment variable to the
value “1.1
”, or just unset
ABUILD_COMPAT_LEVEL
and don't specify a
compatibility level on the command line. If all goes well, you
should see no difference. Once you have reached this point, you
can be sure that your upgrade process is complete.