On Nov 11, 2013, at 3:57 PM, William Gropp <[email protected]> wrote:
> I've been quiet on this list, but I do want to emphasize a point that Matt is
> making: The build system has a very, very hard job. Thus it must either be
> designed so that it creates actionable diagnostics if it fails or it must
> have unfailingly good, 24x7 support. Neither autoconf nor cmake have either,
> but autoconf, for all of its ickyness, lets a skilled user gain access to
> enough information (possibly by adding set -x) to act. I have given up on
> cmake projects in the past because I could not get useful diagnostics and
> could not get the project built.
Bill,
Thanks, you hit the nail on the head. That was actually my grip when I
sent out my email though I articulated it very badly; getting all possible
diagnostics somewhat reasonably organized is crucial.
Barry
>
> Other things that Matt mentions, particularly the ability to work with
> foreign packages, are also vital. But working in all environments, or at
> least being fixable, is an absolute requirement.
>
> Bill
>
> William Gropp
> Director, Parallel Computing Institute
> Deputy Director for Research
> Institute for Advanced Computing Applications and Technologies
> Thomas M. Siebel Chair in Computer Science
> University of Illinois Urbana-Champaign
>
>
>
>
> On Nov 11, 2013, at 3:09 PM, Matthew Knepley wrote:
>
>> On Mon, Nov 11, 2013 at 2:34 PM, "C. Bergström" <[email protected]>
>> wrote:
>> On 11/12/13 03:20 AM, Matthew Knepley wrote:
>> On Mon, Nov 11, 2013 at 1:21 PM, Barry Smith <[email protected]
>> <mailto:[email protected]>> wrote:
>>
>>
>> Man o man, it is worse than autoconf (how is that possible?)
>>
>>
>> Its the essential masochism of programming, where shitty interfaces are
>> elevated to
>> grand status because some people can cope with them. Notice that this
>> phenomenon
>> also appears in mathematics.
>> Just a drive-by comment, but I can't help add to some flames to this
>> Are you people on drugs?
>>
>> 1) My personal hands on experience - I'd rather deal with cmake syntax than
>> m4 any day of the week
>> 2) cmake is super easy to bootstrap everywhere - autocrap and all the auto*
>> stuff is a bitch by comparison
>> 3) cmake is more or less portable and adding new backends is possible (ninja)
>> 4) cmake projects typically lack the idiot proof ./configure --help option
>> list, but there is ccmake (which I've never used). (Internally we overcome
>> this with good documentation)
>> -------------
>> I know of some complaints about the cmake codebase itself - I'm not going to
>> comment on those.
>>
>> cmake may leave a rash, but better than having gangrene aka autoconf
>> --------------
>> More productively - Specific complaints about cmake? Have any of those
>> complaints been raised on the cmake developers list? In my experience they
>> are quite responsive
>>
>> I guess I cannot resist. I am starting a list of CMake badness. Here is the
>> first draft (and Jed kicks it off):
>>
>> We have used CMake, but are not greatly impressed by it. Some issues:
>>
>> * Configuration in batch environments: CMake requires "platform files";
>> we submit conftest so we work automatically in more places
>>
>> * Dependencies: CMake wants to convert all dependent packages to CMake
>> in order to build them, typically as a "submodule"; we download
>> optionally and use that project's native build system.
>>
>> * CMake does not produce good diagnostics for debugging configuration
>> systems by email and CMake itself crashes in some contexts, but
>> upstream has not been very responsive (I can point to mailing list
>> threads); we write everything needed to configure.log and use it to
>> debug thousands of broken environments per year (user error is the
>> most common: incompatible libraries/compiler/etc)
>>
>> * A CMake configuration mixes together lots of auto-discovered things
>> with those explicitly passed by the user. Compiler and
>> dependent-library upgrades can change what should be in
>> CMakeCache.txt, but it's hard to update or create configurations that
>> are similar to an existing configuration without storing the arguments
>> out-of-band.
>>
>> * CMake's scripting language is atrocious for writing logic of any sort.
>> Note that Trilinos/TriBITS contains 175k lines of cmakescript. All
>> Python code in PETSc, including BuildSystem and various other scripts
>> amounts to 30k lines, plus one GNU Makefile of 130 lines.
>>
>>
>> Regarding workflow, the PETSc team advocates an open development process
>> that makes it easier for external people to get involved. For example,
>> my first three years of PETSc development was entirely outside and there
>> are about 30 outside people that have contributed code to PETSc in the
>> last year. This openness also helps us collaborate on new features with
>> downstream applications, some of which we were not aware of when
>> starting the new feature. There is a significant price to be paid for
>> keeping all development secret, and we don't see "scooping" as an
>> especially great threat. Such anti-social behavior is also a lot easier
>> to call out when the commit history is public.
>>
>> The Git mechanics we use are different from MPAS and the git-flow model
>> that their approach is approximately based on (though MPAS rebases more
>> than git-flow recommends; rebasing is bad for downstream and invalidates
>> prior testing, which often leads to people chasing the same bugs
>> multiple times in different contexts). Anyway, after PETSc adopted our
>> current workflow (similar to gitworkflows(7)), I wrote the following
>> critique of git-flow for the FEniCS project, which has now adopted
>> PETSc's approach (along with the EPSI project (Center for Edge Physics
>> Simulation) and others).
>>
>> http://mail-archive.com/search?l=mid&[email protected]
>>
>>
>> Comparison to BuildSystem:
>>
>> - CMake runs simple autoconf tests
>> - check_function_exists() just checks the symbol
>> - will not do the right thing in C++ because you need a declaration
>> - will also fail for Windows name mangling
>> - try_compile() needs entire list of libraries in LIBS
>> - no easy way to get libs from other tests in modular fashion
>> - Sticks results in flat namespace of env vars
>> - No configure or build subpackages
>> - This would reduce complexity
>> - Find*.cmake are poorly maintained and almost every one is broken for
>> static libraries
>> - Cross-compilation support is very weak in the sense that it requires a
>> human expert to write a platform file
>> - If you have a dependent library that needs -lstdc++, but you are writing a
>> C project, you have to jump through insane hoops
>> - Compiler-private libraries are a mess because CMake wants to resolve full
>> paths
>> - Caching is broken
>> - CMake's not tracking dependencies between variables makes it very
>> difficult to write a Find*.cmake that properly resets itself if you change a
>> variable that it depends on
>>
>> BuildSystem:
>>
>> 1) Namespacing:
>>
>> BS tests are wrapped up in modules, which also hold the test results. Thus
>> you get the normal Python namespacing of
>> results. As simple as this sounds, SCons does not do it, nor CMake, nor
>> Autoconf. They all use one flat namespace. Also,
>> when we build up command lines, you can see where options came from, whereas
>> in the others, all flags are dumped into
>> reservoirs like INCLUDE and LIBS.
>>
>> 2) Explicit control flow
>>
>> These modules (one object comes from each module) are organized explicitly
>> in a DAG. The user indicates dependence with
>> a single call, requires('path.to.other.test'), which not only structures the
>> DAG, but returns the object so that this
>> test can use the results of the test it depends on. I think this is the most
>> elegant thing in BS.
>>
>> 3) Multi-languages tests
>>
>> We have explicit pushing and popping of languages, so builds can use any one
>> they want, all with their own compilers,
>> flags, libraries, etc. Thus its easy for us to do cross-language checks in a
>> few lines, whereas this is very hard in all
>> the others. PETSc does a lot of this.
>>
>> 4) Subpackages
>>
>> This is the most complicated and probably most useful part of BS. We have a
>> object scaffolding for including your
>> package (several people have used this) so that PETSc downloads, builds, and
>> tests it for inclusion. Its not that
>> elegants (lots of switches), but its really useful. For some packages,
>> people use them through PETSc because it will get
>> it and build it automatically. The other systems have no idea of hierarchy
>> (autoconfs subconfigures are laughable).
>>
>> Matt
>>
>> --
>> What most experimenters take for granted before they begin their experiments
>> is infinitely more interesting than any results to which their experiments
>> lead.
>> -- Norbert Wiener
>