[Distutils] Compiler abstractiom model

David Ascher da@ski.org
Mon, 29 Mar 1999 22:03:00 -0800 (Pacific Standard Time)

On Mon, 29 Mar 1999, Greg Ward wrote:
>   * At the highest level, we should just be able to say "I know nothing,
>     just give me a compiler object".  This implies a factory function
>     returning instances of concrete classes derived from an abstract
>     CCompiler class.  These compiler objects must know how to:
>       - compile .c -> .o (or local equivalent)
>       - compile multiple .c's to matching .o's
>       - be able to define/undefine preprocessor macros/tokens
>       - be able to supply preprocessor search directories
>       - link multiple .o's to static library (libfoo.a, or local equiv.)
>       - link multiple .o's to shared library (libfoo.so, or local equiv.)
>       - link multiple .o's to shared object (foo.so, or local equiv.)
>       - for all link steps:
>           + be able to supply explicit libraries (/foo/bar/libbaz.a)
>           + be able to supply implicit libraries (-lbaz)
>           + be able to supply search directories for implicit libraries
>       - do all this with timestamp-based dependency analysis
>         (non-trivial because it requires analyzing header dependencies!)

On windows, it is sometimes needed to specify other files which aren't .c
files, but .def files (possibly all can be done with command line options,
but might as well build this in).  I don't know how these should fit in...

>   add_include_dir (dir)
>     add 'dir' to the list of directories that will be searched by
>     the preprocessor for header files
>   set_include_dir ([dirs])
>     reset the list of preprocessor search directories; 'dirs' should
>     be a list or tuple of directory names; if not supplied, the list
>     is cleared

Why not expose a list object and have the user modify it?

obj.includes.insert(3, dir)
obj.includes.extend(dir1, dir2)

>   add_lib (libname)
>     add a library name to the list of implicit libraries ("-lfoo")
>     to link with
>   set_libs ([libnames])
>     reset the list of implicit libraries (or clear if 'libnames'
>     not supplied)
>   add_lib_dir (dir)
>     add a directory to the list of library search directories
>     ("-L/foo/bar/baz") used when we link
>   set_lib_dirs ([dirs])
>     reset (or clear) the list of library search directorie


> Things to think about: should there be explicit support for "explicit
> libraries" (eg. where you put "/foo/bar/libbaz.a" on the command line
> instead of trusting "-lbaz" to figure it out)? 

Yes.  In general, I think it's not a bad idea to give control over the
command line -- there are too many weird compilers out there with strange
options, syntaxes, etc.