From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by yquem.inria.fr (Postfix) with ESMTP id 369F0BC6C for ; Tue, 29 Jan 2008 11:56:45 +0100 (CET) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgAAAJeUnkfBL1AZh2dsb2JhbACQHgEBAQgKKZx1gXQ X-IronPort-AV: E=Sophos;i="4.25,269,1199660400"; d="scan'208";a="8482849" Received: from discorde.inria.fr ([192.93.2.38]) by mail3-smtp-sop.national.inria.fr with ESMTP; 29 Jan 2008 11:56:44 +0100 Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by discorde.inria.fr (8.13.6/8.13.6) with ESMTP id m0TAuiGS031326 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=OK) for ; Tue, 29 Jan 2008 11:56:44 +0100 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgAAAJeUnkfBL1AZh2dsb2JhbACQHgEBAQgKKZx1gXQ X-IronPort-AV: E=Sophos;i="4.25,269,1199660400"; d="scan'208";a="8482848" Received: from gw.exalead.com (HELO exalead.com) ([193.47.80.25]) by mail3-smtp-sop.national.inria.fr with ESMTP; 29 Jan 2008 11:56:43 +0100 Received: from [192.168.204.148] (madpc064.exalead.com [192.168.204.148]) (authenticated bits=0) by exalead.com (8.14.0/8.14.0) with ESMTP id m0TAuaT8032217 for ; Tue, 29 Jan 2008 11:56:40 +0100 Message-ID: <479F0664.2070706@exalead.com> Date: Tue, 29 Jan 2008 11:56:36 +0100 From: Berke Durak User-Agent: Thunderbird 1.5.0.10 (X11/20070221) MIME-Version: 1.0 To: Caml-list List Subject: [OSR] Ports-like package management system Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Miltered: at discorde with ID 479F066C.000 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; berke:01 durak:01 berke:01 durak:01 ocaml:01 markus:01 non-trivial:01 flags:01 compilations:01 gentoo:01 cvs:01 ocaml:01 haskell:01 violate:01 merging:01 Hello, Following Markus's message, discussions with Nicolas Pouillard and Sylvain Le Gall and others, and of course my previous work in the EDOS project, here are some thoughts about package management systems (PMSs) for Ocaml. First, the PMSs of Linux distributions are perfectly adequate for end users and administrators having to deploy and manage identical packages accross multiple machines. These are very complex systems including a substantial social part. But they are not very suitable for developers. As Markus pointed out, developers cannot go thru a packaging step to test the result of a change, much less wait for the fine Debian team. One reason is that most developers, including myself, cannot be bothered to package software for a Linux distribution, because correct packaging is complex and requires adherence to a set of rules must be remembered and which cannot all be checked by software. As packaging is not done very often, you tend to forget those rules, and that is why we have people who package often to not forget the rules: maintainers. Without maintainers, we would be in a world of pain to install any piece of non-trivial software and we are thankful to them. But developers absolutely need to be able to work on multiple versions of the same software component at once, patch those versions or compile them with unusual flags, and often use the absolutely latest unpackaged version. And that is the second reason why the Debian or Red Hat PMSs are not adequate. They have a single global state per system, which includes the installed files, and the package database, and cannot handle multiple versions of the same package, nor multiple compilations of the same version. (This also applies to Gentoo.) We thus need versions, and lots of them! We need to base our developer packages on a version control system, in the style of BSD ports. BSD ports are usually based on CVS, sometimes on Subversion. As we are looking to increase collaboration, having a single point of contention is a serious limitations of these centralized systems; we'll prefer more recent "distributed" version control system. Of available distributed VCSs with a serious user base, we have Darcs, Mercurial and Git. Basing a PMS for Ocaml on a VCS written in Haskell would violate the ``Trading with the Enemy'' act. Moreover Darcs has some performance problems of its own. Mercurial (Hg) is written in Python extended in C for performance. It is quite friendly and works well under Windows. However, its developers are not as elite as Git's, its merging features are less advanced and Python sux0rz. I have been using Hg for the past few months and been quite happy with it, but then I was mostly working alone. Git is certainly as good as Mercurial for that kind of usage and, as it is written in pure C, I advocate its use. Until someone writes a VCS in Ocaml, that is. Let's get back to the subject. BSD ports are also based on make, whose main limitation, the static dependency graph, has been addressed in ocamlbuild. I know there is Omake, but I think it suffers from the ``Yet Another Turing-Complete Language'' syndrome. So I am calling for a solution based on a ports-like system but based on a distributed VCS and on an improved ocamlbuild. Assume you are writing a program FOO and want to use a package BAR available from bar.org. You tell ocamlbuild by adding some tag such as : require(http://bar.org/repository/) And when you run ocamlbuild, it automatically checks out a copy of BAR, compiles and loads its myocamlbuild.ml module which adds the required flags. Of course it should be possible to specify a particular revision... And if BAR has itself dependencies, those too would be checked out. Note that Git has a nice option for cloning checked out repositories using hard links; that could be used to maintain a cache of checkouts, for instance in the user's ~/.ocamlbuild/checkouts/ directory. So basically I propose that we improve ocamlbuild to allow for multiple plugin files (using dynamic loading) and use that to define a BSD ports-like system targeted at developers. -- Berke DURAK