ABSTRACT:
  The primary target of this project is to enable Automake-generated
  Makefiles to exploit more features of GNU make.  The exact details
  of how and on what level this is to be implemented (e.g., at Automake
  time by the developer, at configure time by the user, or a mixture of
  both) is to be determined in the design phase of the project.

DETAILS:
  See attachements.

-*-*-

In all honesty, I'm not completely sure the deliverables promised in this
proposal are truly enough to warrant a GSoC assignation; but at the moment
I cannot think how to extend them without risking to make the proposal too
big, thus ending up with an incomplete (or worse malfunctioning) result.

Do you think the deliverables are enough?  If not, do you have suggestions
about how they could be extended/improved?

Also, if there are GNU make specific improvements you'd like to see in
Automake-generated Makefiles, but which are not listed in my proposal,
feel free to speak up.  Feedback is appreciated.

Thanks,
  Stefano
Student Identification
======================

 Name: Stefano Lattarini
 Email address: stefano.lattar...@gmail.com


The name of the project
=======================

 automake - Exploit more features of GNU make in Automake


Abstract
========

 The primary target of this project is to enable Automake-generated
 Makefiles to exploit more features of GNU make.  The exact details
 of how and on what level this is to be implemented (e.g., at Automake
 time by the developer, at configure time by the user, or a mixture
 of both) is to be determined in the design phase of the project.


Portability of Automake-generated Makefiles
===========================================

 One of the main goals of Automake is to produce Makefiles that are
 highly portable.  In fact, Automake-generated Makefiles are expected
 to work "out-of-the-box" not only with with GNU and BSD make (recent
 and older versions alike), but also with most vendor implementations
 of make (Solaris, AIX, HP-UX, IRIX, ...).

 This portability is much appreciated by many developers who use
 Automake; see for example these pots of a recent discussion on the
 automake mailing list:
   <http://lists.gnu.org/archive/html/automake/2011-01/msg00071.html>
   <http://lists.gnu.org/archive/html/automake/2011-01/msg00115.html>

 Automake is quite successful in this regard, managing to implement
 successfully and in portable fashion some advanced, and even tricky,
 features; among them, automatic dependency tracking, an advanced and
 highly parallelizable testsuite harness  (the "parallel-tests" option)
 and the ability to dynamically render make's output less verbose and
 more informative (the "silent-rules" option).

 Moreover, Automake goes to great length to work around known bugs and
 limitations of different make implementations, and to accommodate for
 incompatibilities between them (one example for all: the dreaded
 VPATH issues).

 But all this portability comes at a price ...


When portability brings disadvantages
=====================================

 The Makefiles generated by Automake are definitely suboptimal w.r.t.
 GNU make, which have much more advanced capabilities than those such
 Makefiles expect and use.  The Automake-generated Makefiles are thus
 slower, larger, and more difficult to understand then they would be
 by taking advantage of more GNU make features.

 And while, for example, Autoconf-generated configure scripts can
 dynamically search for a better shell and/or probe the shell features
 *at runtime* to try to activate optimized implementations of the
 offered primitives, a similar approach is nigh to impossible for the
 Automake-generated Makefiles, due to very limited nature of the
 make language (both as specified by POSIX, and as implemented by many
 make programs Automake strives to support).


Benefits of this proposal
=========================

 - Various optimizations in speed, size and clarity of the generated
   Makefiles, when GNU make is used or can be assumed.

 - Such optimizations would be particularly useful since they would
   benefit 80-90% of the user base.  In fact, GNU/Linux installations
   (for which GNU make is the system make) represent a high percentage
   of UNIX installations; moreover, GNU/make is also the default make
   program for the two more widespread UNIX-like environments for
   Microsoft Windows (Cygwin and MSYS/MinGW); finally, lots of BSD
   and Solaris users have GNU make installed in addition to their
   native make (FreeBSD offers a port and a package for it, and Sun
   ships it as third-party officially supported software).

 - Probably make the use of Automake more widespread and enticing.  In
   fact, in the present state of facts, some projects are scared away
   because the Automake Makefiles are ugly, complicated, and, worse of
   all, quite suboptimal when run with GNU make, which might very well
   be the only make implementation those projects want to support or
   can afford to support; see for example:
     <http://lists.gnu.org/archive/html/automake/2011-01/msg00091.html>


Deliverables
============

 Design decisions and documentation about how the developer, the user,
 or both can enable GNU make specific code in the generated Makefiles.

 Extend the automake script to implement these design decisions, thus
 offering a base or "scaffolding" upon which future GNU make specific
 optimizations and extensions might be build.

 Various optimizations/improvements for GNU make:
  - Get rid of complex VPATH search emulation and compatibility layer
    (this should offers small but nice enhancements in simplicity and
    speed).
  - Improve the parallel testsuite harness ("parallel-tests" option):
    make it faster, make its implementation simpler, and above all make
    it able to cope with very long $(TESTS) without exceeding system
    command-line length limits (or other system-specific length limits);
  - Similarly improve the dist target, optimizing it and removing limits
    on the length of $(DIST_FILES);
  - Handling of target-specific flags in Automake could be reimplemented
    using the GNU make support for "target-specific variable values" and
    the fact that GNU make defines the automatic variable '$<' also in
    normal (non-suffix) rules.

 And maybe some further optimizations/improvements that we'll implement
 only if not short of time (e.g.: build info files into builddir, not
 into srcdir; optimize install rules for speed and more parallelism; in
 the recipes, try, where possible, to handle text transformation using
 GNU make special macros instead of having to rely on forking external
 programs).


Plan and Roadmap
================

 Q: How will you and your mentor track your progress as you work on the
    project?
 A: Since technical discussions about design and implementation of new
    Automake features take place on the public lists <automake@gnu.org>
    and/or <automake-patc...@gnu.org>, most measurable progresses are
    publicly available there, and thus quite easy to judge.  Also, every
    new feature going in Automake must have proper testsuite coverage,
    so that we can be confident that the new code will really works.
    Finally, the project mentor has been the Automake maintainer since
    4/5 years now, so that he's surely able to judge how a partial
    implementation if faring, and what the chances are for it to be
    completed in time.

 Q: How the mid-term evaluation of your project will be made?
 A: 1. The design for the new future must be clearly specified, and
       there has to be fair consensus about it in the community.
    2. Scaffolding for the new feature in the Automake script and
       scaffolding for enhanced coverage in the testsuite *must* be
       in place.
    3. These scaffolding must have been used to implement some first
       easy optimization (e.g. simplification of VPATH handling), to
       ensure that they really works.
    4. The improvements described above (in "Deliverables") to the
       parallel testsuite harnesses must have been implemented

 Q: Remember to mention any periods during the summer when you won't
    actually be available to work on the project (though remember, the
    Summer of Code project is expected to be your main activity).
 A: I plan to be available for basically all the period of the project.
    If not the whole day, at least half a day, basically each day (either
    morning and early afternoon, or later afternoon and evening).  There
    might be *very few* short periods (one, max two days) when I'll be
    completely off-line and "away from keyboard" -- I'll let the mentor
    know about them in advance, obviously.


Communication
=============

  First, I'm already in contact with the mentor, due to my on-going
  involvement with the Automake project.  I've also been in contact
  with the backup mentor, due to my (small) contributions to Autoconf.

  In the Automake projects, discussions about design and documentation,
  and proposals and reviews of patches are public, taking place on the
  project's pre-existing and well-established mailing lists.  The mentor
  reads them regularly, so that posting patches an ideas there is a sure
  way to have them considered and reviewed by him (and also by other
  mailing list readers, which might contribute with their own useful
  insights, questions, and experiences.

  Finally, my experiences have showed that real-time interaction with
  the mentor to work on a particular issue (either on-list or off-list)
  is not only possible, but also efficient and effective.


Qualification
=============

 I'm quite familiar with the policies of the Automake project (especially
 coding standards, patch review process, and portability concerns).
 Moreover, the copyright assignment to the Free Software Foundation that
 allows me to contribute code to the Automake official repository is
 already in place (and has been for more than a year and a half now).

 I've started contributing to the Automake project an year and a half
 ago.  During the last year, my involvement with the project has steadily
 increased: I've posted more patches and participated more actively to
 discussions on the mailing lists, I've been granted commit rights, and
 I've started helping with the bug tracker and related issues.  I plan
 to continue my involvement with Automake in the foreseeable future.

 I have access to some systems to test my work on: Debian GNU/Linux
 (with custom installation of older version of tools and compilers),
 FreeBSD 8.0, and Solaris 10.  This can help me in finding out early
 potential portability problems.

 Finally, I'm principally a GNU make user myself, and I have some
 personal projects which currently use Automake, but also require GNU
 make in their build system (an higher portability wouldn't be required
 nor really useful for them).  So I feel honestly motivated at making
 the user experience better for those who use GNU make.  In fact, in the
 recent past, I had even proposed (on the automake mailing list) that
 Automake should start supporting *only* GNU make; but many users pointed
 out that the extra portability currently offered by Automake is really
 valuable to them, thus rendering the hybrid approach advocated in this
 proposal a necessity.  Here is a link to the relevant discussion:
   <http://lists.gnu.org/archive/html/automake/2011-01/msg00050.html>
 Also, it's worth noting that the opinions and experiences expressed
 in that thread by real-world users helped shaping this proposal, which
 IMHO gives it more strength and sense of purpose.

Tentative roadmap for GSoC project "automake - Exploit more features
of GNU make in Automake".


1. COLLECT INFORMATION: Before April 20
----------------------------------------

 Read carefully the GNU make manual for the latest version (3.82).
 While I'm already quite familiar with GNU make, there are features of
 it I've never used, and worse, probably some advanced features I'm
 totally unaware of -- obtaining at least a theoretical knowledge of
 the latter is a must.

 Read the NEWS  of the GNU make distribution, to get a grasp of what
 features and bugs have been introduced when, what bugs have been fixed
 when, and to find out about possible incompatibilities between the
 various versions.

 Read/skim the documentation of older GNU make versions (at least
 back to 3.80, maybe also 3.79 and 3.78), and start experimenting with
 them.

 If there's enough time, take a look at Open Source project(s) which
 uses GNU make in an advanced fashion, and see what they can teach.


2. EXPERIMENTING: April 20 - May 15  (Before the official coding time)
-----------------------------------------------------------------------

 Start to think about, and experiment with, some possible improvements
 to Automake-generated Makefiles that can be introduced when GNU make is
 assumed.

 The best way to do so is probably starting to study and tweak
 Automake-generated Makefiles of real-world, medium-size projects
 (e.g., GNU coreutils or GNU grep).

 This phase should help with the subsequent "real" implementation, by
 providing some ideas, and quite likely also code (incomplete of course,
 but probably good as a starting point and/or for "cut & paste"), and
 tentative testcases.


3. BASIC DESIGN: May 15 - June 5  (Official coding period starts May 23)
-------------------------------------------------------------------------

 The mentor has some unfinished patches relevant to this project: see
 and discuss them.

 Try to find out what is the best strategy to produce GNU make specific
 code in the generated Makefile.  There might be multiple approaches,
 not necessarily mutually exclusive; for example:
  - GNU make specific code could be guarded by Automake conditionals;
    i.e., it could be activated/deactivated at configure time, either
    on autodetection or upon explicit request from the user.
  - Automake could support an option instructing it to output *only*
    GNU make-specific code in the generated Makefile.in.
  - Automake could generate side by side, from a single Makefile.am,
    both a Makefile.in and a GNUmakefile.in, both to be shipped; or
    offer a more flexible variation of this approach.
 These approaches should of course be discussed with the mentor *and*
 on the Automake public mailing lists, before a final decision can be
 reached.

 Ideally, (almost) all the test cases of the Automake testsuite should
 continue to pass when running with GNU make and with the GNU make
 specific output active.  What is the best way to automatize this check
 without invasive testsuite modifications?  This might not be obvious,
 and will require some consideration and thinking.

 Finally, in this phase, we could also write some early test cases
 and documentation.


4. WRITE BASIC TESTCASES AND DOCUMENTATION: June 5 - June 12
-------------------------------------------------------------

 Once we got the design right, the documentation shouldn't be that
 difficult to write, mainly because most of the changes should be
 transparent to the user (the functionalities of Automake-generated
 Makefile wouldn't change, only their implementation would).
 And we could use parts of this proposal as a base for the new
 documentation ;-)

 Also, most (probably almost all, 95% or more) of the pre-existing
 testsuite should be reusable to offer coverage of the new GNU make
 specific Makefile snippets, so we won't need many new tests.


5. CODING, PART 1: June 12 - July 6  (Until mid-term evaluation)
----------------------------------------------------------------

 Preparation: put in place the scaffolding to inject GNU make specific
 fragments in the generated Makefiles.  This fragments can be just
 dummy at first.

 Testsuite enhancements: put in place some scaffolding allowing to
 easily run the testsuite with the GNU make specific output enabled
 everywhere.

 Simple optimization: get rid of VPATH hacks, as we can assume GNU
 make VPATH semantics.

 More substantial optimization: simplify the parallel-tests driver,
 both in term of size of generated Makefiles and use of recursive make
 invocation; more importantly, enhance it so that it will be able to
 cope with very long $(TESTS) (no more "system command-line length
 limit exceeded" kind of errors).

 Add new testcases where deemed necessary.


5. CODING, PART 2: July 6 - July 23
------------------------------------

 Dist-related targets optimization: allow very long $(DIST_FILES) (no
 more "system command-line length limit exceeded" kind of errors); some
 simplifications and speed optimizations would be nice.

 Target-specific flags: experiment how to accomplish this using the GNU
 make feature "target-specific variable values", and the fact that '$<'
 is defined by GNU make also for "normal" (non-suffix) rules.

 Other optimizations (depending on how much time is left):
  - saner rules to build info files: put the generated files the build
    directory, not in the source directory, as this does not cause any
    problem with GNU make (it does with BSD make, sadly); adjust tests
    accordingly;
  - speed optimization for install rules (maybe allowing for higher
    parellelizability?);
  - look for other low-hanging fruits.

 Add testcases where deemed necessary.


7. STRESS AND PORTABILITY TESTING: July 23 - Until done
--------------------------------------------------------

 Test the code on other systems which Automake strives to support (e.g.,
 Cygwin, MSYS/MinGW, AIX, HP-UX, IRIX), and (try to) fix all the problems
 and incompatibilities that show up.  This might require some more help
 from the mentor, which has access to an impressive array of testing
 systems (all the major proprietary Unix implementations are among them).


8. FINAL CLEANUP: All the time that's left (if any)
----------------------------------------------------

 Use this period to polish documentation and code, pick some visible
 low-hanging fruits (if any), and maybe add more tests about corner
 cases (if such tests seem required).

Reply via email to