mirror of
https://git.savannah.gnu.org/git/make.git
synced 2024-11-24 12:19:02 +00:00
828906b6dc
* README.git: Add some notes about using ASAN. * src/makeint.h: Declare skip_references(). * src/misc.c (skip_reference): A new function that will skip over a variable reference, counting matching open paren/brace characters. * src/implicit.c (get_next_word): Replace code with skip_reference(). * src/read.c (conditional_line): Ditto. (find_map_unquote): Ditto. (get_next_mword): Ditto. (parse_variable_definition): Ditto. * src/function.c (handle_function): Make clear that the passed in pointers are not modified if the function returns false. * src/expand.c (expand_string_buf): Don't create local variables to call handle_function() since it doesn't modify its arguments. * src/job.c (new_job): Small simplifications.
408 lines
14 KiB
Text
408 lines
14 KiB
Text
-*-text-*-
|
|
|
|
-------------------------------------------------------------------------------
|
|
Copyright (C) 2002-2024 Free Software Foundation, Inc.
|
|
This file is part of GNU Make.
|
|
|
|
GNU Make is free software; you can redistribute it and/or modify it under the
|
|
terms of the GNU General Public License as published by the Free Software
|
|
Foundation; either version 3 of the License, or (at your option) any later
|
|
version.
|
|
|
|
GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along with
|
|
this program. If not, see <https://www.gnu.org/licenses/>.
|
|
-------------------------------------------------------------------------------
|
|
|
|
Obtaining Git Code
|
|
------------------
|
|
|
|
This seems redundant, since if you're reading this you most likely have
|
|
already performed this step; however, for completeness, you can obtain the GNU
|
|
make source code via Git from the FSF's Savannah project
|
|
<https://savannah.gnu.org/projects/make/>:
|
|
|
|
$ git clone git://git.savannah.gnu.org/make.git
|
|
|
|
|
|
Changes using Git
|
|
-----------------
|
|
|
|
If you do not have push privileges to the GNU Make Git repository, see the
|
|
README file section "Submitting Patches" for information.
|
|
|
|
If you have push privileges to the GNU Make Git repository keep this
|
|
information in mind:
|
|
|
|
Starting with GNU Make 4.0 we no longer keep a separate ChangeLog file in
|
|
source control. We use the Gnulib git-to-changelog conversion script to
|
|
convert the Git comments into ChangeLog-style entries for release. As a
|
|
result, please format your Git comments carefully so they will look clean
|
|
after conversion. In particular, each line of your comment will have a TAB
|
|
added before it so be sure your comment lines are not longer than 72
|
|
characters; prefer 70 or less. Please use standard ChangeLog formats for
|
|
your commit messages (sans the leading TAB of course).
|
|
|
|
Rule #1: Don't rewrite pushed history on master (no "git push --force").
|
|
Rule #2: Feel free to rewrite pushed history on personal branches.
|
|
Rule #3: Squash-merge or rebase + merge --ff-only, rather than merging from
|
|
personal branches into master.
|
|
|
|
Typical simple workflow might be:
|
|
|
|
* Edit files / make / make check
|
|
* Use "git status" and "git diff" to verify your changes
|
|
* Use "git add" to stage the changes you want to make
|
|
* Use "git commit" to commit the staged changes to your local repository
|
|
* Use "git pull -r" to accept new changes from the upstream repository
|
|
* Use "git push" to push your commits back to the upstream repository
|
|
|
|
For Emacs users, there are many options for Git integration but I strongly
|
|
recommend Magit: https://magit.vc/ It makes the workflow much clearer, and
|
|
has advanced features such as constructing multiple commits from various files
|
|
and even from different diff chunks in the same file. There is a video
|
|
available which helps a lot.
|
|
|
|
|
|
Coding Standards
|
|
----------------
|
|
|
|
GNU Make code adheres to the GNU Coding Standards. Please use only spaces and
|
|
no TAB characters in source code.
|
|
|
|
Additionally, GNU Make is a foundational bootstrap package for the GNU
|
|
project; as such it is conservative about language features it expects.
|
|
However, GNU Make does rely on the Gnulib portability library, and Gnulib
|
|
currently requires a ISO C99 compiler. So features in ISO C99 can be
|
|
assumed.
|
|
|
|
|
|
Building From Git for POSIX
|
|
---------------------------
|
|
|
|
To build GNU Make from Git on POSIX systems such as GNU/Linux, you will
|
|
need to install the following extra software:
|
|
|
|
* autoconf >= 2.69
|
|
* automake >= 1.16.1
|
|
* autopoint
|
|
* texinfo (for makeinfo)
|
|
* gettext
|
|
* pkg-config
|
|
* GCC
|
|
* GNU Make (POSIX make is not sufficient)
|
|
|
|
And any tools that those utilities require (GNU m4, etc.)
|
|
|
|
To run the tests you must install Perl.
|
|
|
|
To create dist files you will additionally need:
|
|
|
|
* lzip (to create tar.lz dist files)
|
|
* texlive (or some other TeX package)
|
|
|
|
GNU Make requires Gnulib to provide some facilities. If you want to maintain
|
|
a local installation of gnulib you can set GNULIB_SRCDIR to point to it.
|
|
Otherwise, ./bootstrap will obtain a clone for you.
|
|
|
|
Due to issues with gnulib's getloadavg, you must have automake 1.16.1 or
|
|
above. This version may not yet be available through GNU/Linux package
|
|
managers. If you need to install from source be sure to set ACLOCAL_PATH to
|
|
point to the pkg-config location (e.g., /usr/share/aclocal).
|
|
|
|
If you want to build from Git with a non-GCC compiler, add "MAKE_CFLAGS=" to
|
|
your make command line (or at least remove any flags your compiler does not
|
|
support).
|
|
|
|
When building from Git you must build in the source directory: "VPATH
|
|
builds" from remote directories are not supported. Once you've created
|
|
a distribution, of course, you can unpack it and do a VPATH build from
|
|
there.
|
|
|
|
After checking out the code, you will need to run the bootstrap script:
|
|
|
|
$ ./bootstrap
|
|
|
|
Alternatively you can just pull content from remote locations with:
|
|
|
|
$ ./bootstrap --pull
|
|
|
|
And/or just re-generate auto-generatable files with:
|
|
|
|
$ ./bootstrap --gen
|
|
|
|
(Running ./bootstrap does both in one step.)
|
|
|
|
At this point you have successfully brought your Git copy of the GNU
|
|
make source directory up to the point where it can be treated
|
|
more-or-less like the official package you would get from ftp.gnu.org.
|
|
That is, you can just run:
|
|
|
|
$ ./configure
|
|
$ make check
|
|
|
|
to build and test GNU Make.
|
|
|
|
NOTE! This method builds GNU Make in "maintainer mode". Make programs built
|
|
in this mode will be slower, possibly MUCH slower: there are various
|
|
sanity checks enabled. Further this mode assumes a modern GCC, GNU
|
|
libc, and well-formed system headers and enables a high level of
|
|
warnings AND enables -Werror to turn warnings into failures.
|
|
|
|
If you want to build from Git with "maintainer mode" disabled, add
|
|
"MAKE_MAINTAINER_MODE=" to the make command line. If you want to turn
|
|
off the extra warning flags, add "MAKE_CFLAGS=" to the make command
|
|
line.
|
|
|
|
For example:
|
|
$ ./configure
|
|
$ make check MAKE_MAINTAINER_MODE= MAKE_CFLAGS=
|
|
$ make install
|
|
|
|
|
|
Building From Git for Windows
|
|
-----------------------------
|
|
|
|
If you have a UNIX emulation like CYGWIN you can opt to run the general build
|
|
procedure above; it will work. Consult README.W32 for information on options
|
|
you might want to use when running ./configure.
|
|
|
|
If you can't or don't want to do that, then first run the .\bootstrap.bat
|
|
script to "prime" your Git workspace:
|
|
|
|
> .\bootstrap.bat
|
|
|
|
Next, follow the instructions in the README.W32 file.
|
|
|
|
Note, neither of these methods are tested regularly by the GNU Make
|
|
maintainers. Building for Windows from a distribution tarball IS tested
|
|
regularly.
|
|
|
|
NOTE! "Maintainer mode" (see above) IS ENABLED when building from Git using
|
|
the build_w32.bat file.
|
|
|
|
|
|
Debugging and Testing
|
|
---------------------
|
|
|
|
These instructions have been tested on GNU systems. I have no idea if they
|
|
work on non-GNU systems (Windows, MacOS, etc.)
|
|
|
|
* Alternate Configurations:
|
|
The maintMakefile has a rule for running configure with various different
|
|
options, with and without packages. Run:
|
|
|
|
make check-alt-config
|
|
|
|
* Valgrind:
|
|
You can run all tests under valgrind by passing the -memcheck option:
|
|
|
|
(cd tests && ./run_make_tests -make ../make -memcheck)
|
|
|
|
Note, this is slow! Also some tests will fail because of invoking valgrind.
|
|
|
|
* ASAN:
|
|
You can build with ASAN and run tests, like this:
|
|
|
|
make clean
|
|
make -j8 CFLAGS='-ggdb3 -fsanitize=address' LDFLAGS='-ggdb3 -fsanitize=address'
|
|
|
|
Then to check for corruption only but not memory leaks run:
|
|
|
|
ASAN_OPTIONS='detect_stack_after_use_return=true:detect_leaks=false' make check
|
|
|
|
To check for leaks too run:
|
|
|
|
make check
|
|
|
|
Note that ASAN is reporting many more errors than valgrind. I don't know
|
|
which one is wrong: I haven't looked at them closely.
|
|
|
|
|
|
Creating a Package
|
|
------------------
|
|
|
|
Once you have performed the above steps (including the configuration and
|
|
build) you can create a GNU Make package. This is very simple, just
|
|
run:
|
|
|
|
$ make dist-gzip
|
|
|
|
and, if you like:
|
|
|
|
$ make dist-lzip
|
|
|
|
Even better, you should run this:
|
|
|
|
$ make distcheck
|
|
|
|
Which will build both .gz and .lz package files, then unpack one into a
|
|
temporary location, try to build it and repack it, then verifying that
|
|
everything works, you get the same results, _and_ no extraneous files are
|
|
left over after the "distclean" rule.
|
|
|
|
This package can be unpacked and built to give a "normal" (non-maintainer
|
|
mode) result.
|
|
|
|
|
|
Steps to Release
|
|
----------------
|
|
|
|
Here are the things that need to be done (in more or less this order)
|
|
before making an official release. If something breaks such that you need to
|
|
change code, be sure to start over again sufficiently that everything is
|
|
consistent (that's why we don't finalize the Git tag, etc. until the end).
|
|
|
|
* Update the configure.ac file with the new release number.
|
|
* Update the EDITION value in the doc/make.texi file.
|
|
* Update the doc/make.1 file with the release date.
|
|
* Update the NEWS file with the release number and date.
|
|
* Ensure the Savannah bug list URL in the NEWS file uses the correct
|
|
"Fixed Release" ID number.
|
|
* Run "make distcheck" to be sure it all works.
|
|
* Run "make check-alt-config" to be sure alternative configurations work
|
|
* run "make tag-release" to create a Git tag for the release
|
|
* Push everything:
|
|
git push --tags origin master
|
|
|
|
The safest thing is to create an entirely new repository and build the final
|
|
package from there:
|
|
|
|
git clone git://git.savannah.gnu.org/make.git make-release
|
|
cd make-release
|
|
|
|
If you don't want to create a new repository then run "git clean -fdx".
|
|
Then:
|
|
|
|
./bootstrap
|
|
./configure
|
|
make distcheck
|
|
|
|
Perform test builds on whichever systems you have access to.
|
|
|
|
Use a previous announcement as a template to create an announcement in a text
|
|
file then sign it with GPG:
|
|
|
|
gpg --clearsign <announcement.txt>
|
|
|
|
Or, use your mail client's PGP/GPG signing capabilities.
|
|
|
|
NOTE! In order to publish a package on the FSF FTP site you need to have my
|
|
GPG private key, and my passphrase to unlock it.
|
|
|
|
Depending on your distribution (whether GnuPG is integrated with your
|
|
keyring etc.) the upload operation will either pop up a window asking
|
|
for the GPG key passphrase one time, or else it will use the CLI to ask
|
|
for the GPG passphrase _THREE_ times. Sigh.
|
|
|
|
|
|
Publishing a Release Candidate
|
|
------------------------------
|
|
|
|
Usually I publish one or two release candidates for people to test before
|
|
making an official release. Release candidates use a GNU numbering scheme,
|
|
which add a ".9x" release number to the PREVIOUS major release. So the first
|
|
release candidate for GNU Make 4.4 would be GNU Make 4.3.90, the second
|
|
release candidate would be 4.3.91, etc.
|
|
|
|
Upload a release candidate using:
|
|
|
|
make upload-alpha
|
|
|
|
Announce a release candidate to these mailing lists:
|
|
|
|
To: bug-make@gnu.org
|
|
BCC: help-make@gnu.org, make-w32@gnu.org, make-alpha@gnu.org
|
|
|
|
You will have to approve the BCC's on the mailing list admin sites. Send
|
|
separate copies to (don't use CC as replies will go to these lists):
|
|
|
|
* coordinator@translationproject.org
|
|
* platform-testers@gnu.org
|
|
|
|
|
|
Publishing a Release
|
|
--------------------
|
|
|
|
When publishing a final release there are extra steps that need to be taken:
|
|
|
|
* Run "make update-makeweb" to get a copy of the GNU Make web pages
|
|
* Run "make update-gnuweb" to get a copy of the GNU website boilerplate pages
|
|
* Update the web page boilerplate if necessary:
|
|
( cd ~/src/make/make-web \
|
|
&& ~/src/gnu-www/www/server/standards/patch-from-parent \
|
|
make.html \
|
|
~/src/gnu-www/www/server/standards/boilerplate.html )
|
|
* Run "make gendocs" (requires gnulib) to generate the manual files for
|
|
the GNU Make web pages.
|
|
* Follow the directions from gendocs for the web page repository
|
|
|
|
Manage the Savannah project for GNU Make:
|
|
|
|
* In Savannah edit the "Component Version" field and choose the "SCM" entry.
|
|
Modify the "Value", "Rank", and "Description" values for the to refer to
|
|
the new release. The "Rank" field should be 10 less than the previous
|
|
release so it orders properly.
|
|
|
|
* In Savannah edit the "Fixed Release" field and choose the "SCM" entry.
|
|
Modify the "Value", "Rank", and "Description" values for the to refer to
|
|
the new release. The "Rank" field should be 10 less than the previous
|
|
release so it orders properly.
|
|
|
|
* In Savannah create a new entry for the "Component Version" field:
|
|
- Value: SCM
|
|
- Rank: 20
|
|
- Descr: Issues found in code retrieved from Source Code Management (Git), rather than a distributed version. Please include the SHA you are working with.
|
|
|
|
* In Savannah create a new entry for the "Fix Release" field:
|
|
- Value: SCM
|
|
- Rank: 20
|
|
- Descr: Fixed in Source Code Management (Git). The fix will be included in the next release of GNU Make.
|
|
|
|
Upload a release using:
|
|
|
|
make upload-ftp
|
|
|
|
Announce a release to these mailing lists:
|
|
|
|
To: info-gnu@gnu.org, bug-make@gnu.org
|
|
BCC: help-make@gnu.org, make-w32@gnu.org, make-alpha@gnu.org
|
|
|
|
You will have to approve the BCC's on the mailing list admin sites. Send
|
|
separate copies to (don't use CC as replies will go to these lists):
|
|
|
|
* coordinator@translationproject.org
|
|
* platform-testers@gnu.org
|
|
|
|
Announce on Savannah:
|
|
|
|
* Add a news item to the Savannah project site.
|
|
|
|
Start the next release:
|
|
|
|
* Update configure.ac and add a ".90" to the release number.
|
|
* Update the NEWS file with a new section for the release / date.
|
|
* Update the Savannah URL for the bugs fixed in the NEWS section.
|
|
|
|
|
|
Appendix A - For The Brave
|
|
--------------------------
|
|
|
|
For those of you who trust me implicitly, or are just brave (or
|
|
foolhardy), here is a canned sequence of commands to build a GNU Make
|
|
distribution package from a virgin Git source checkout (assuming all the
|
|
prerequisites are available of course).
|
|
|
|
This list is eminently suitable for a quick swipe o' the mouse and a
|
|
swift click o' mouse-2 into an xterm. Go for it!
|
|
|
|
For a debugging version:
|
|
|
|
./bootstrap && ./configure CFLAGS=-g && make check
|
|
|
|
For an optimized version
|
|
|
|
./bootstrap && ./configure && make check
|