To install:
-$ cd ..
-$ R CMD INSTALL cran2deb
+Please install a series of packages that you will need to
+run cran2deb successfully:
-copy cran2deb/exec/cran2deb into somewhere in your executable path (e.g.,
-/usr/local/bin, $home/bin)
+ sudo apt-get install pbuilder python-gpgme gnupg-agent
+You may install cran2deb manually
+
+ $ cd ..
+ $ R CMD INSTALL cran2deb
+
+ copy cran2deb/exec/cran2deb into somewhere in your executable path (e.g.,
+ /usr/local/bin, $home/bin)
+
+or prepare a Debian package for it
+
+ fakeroot debian/rules binary
+ sudo dpkg -i ../r-*cran2deb*.deb
To configure:
Let ROOT be the value returned by running: cran2deb root
Let SYS be the system you wish to build for (e.g., debian-amd64)
+Create user "c2d" who shall have write permissions to the archive.
2. create /etc/cran2deb
- a. copy ROOT/etc/* into /etc/cran2deb/sys/SYS/
- b. /etc/cran2deb/archive should be a symlink pointing to /var/www/cran2deb/
+ a. copy ROOT/etc/* into /etc/cran2deb/
+ b. ensure ROOT/etc/sys/SYS is set up
+ c. /etc/cran2deb/archive should be a symlink pointing to /var/www/cran2deb/
$ ln -s /var/www/cran2deb/ /etc/cran2deb/archive
$ mkdir /var/www/cran2deb/SYS
- c. modify OTHERMIRROR of /etc/cran2deb/pbuilderrc.in to point to your webserver
+ d. modify OTHERMIRROR of /etc/cran2deb/sys/SYS/pbuilderrc.in to point to your webserver.
+ As long as the packages on debian.cran.r-project.org are not signed with a
+ current key, just rebuild also the architecture-dependent packages or find
+ a way for pbuilder to ignore the failing gpg signature check.
+
+ Example:
+ OTHERMIRROR='deb http://master.dermacloud.uni-luebeck.de/cran2deb/rep testing main'
+
+ The above URL works for the reprepro tool. For mini-dinstall the URL
+ may be slightly different. Please check after the first packages have been
+ built that do not depend on other packages external to Debian.
+
+ e. run: cran2deb repopulate
3. cran2deb needs a persistent cache outside of R's control. therefore, create
/var/cache/cran2deb, writable by whichever user(s) will run cran2deb.
-4. run: cran2deb update
-5. Try building a simple package: cran2deb build zoo
+
+4. add to /etc/rc.local:
+ # one mini-dinstall daemon for each apt repo
+ for sys in debian-i386 debian-amd64
+ do
+ mini-dinstall -c /etc/cran2deb/sys/$sys/mini-dinstall.conf
+ done
+ and execute.
+
+5. manual change - allow cran2deb user to execute pdebuild as root via sudo
+ c2d ALL=(ALL) SETENV: NOPASSWD: /usr/sbin/pdebuild
+ The "SETENV:" is important.
+
+6. run: cran2deb update
+ This will also create the pbuilder environment if not already existing.
+
+7. manual changes - create a gpg key for your packages
+
+ gpg --genkey
+
+ and read through 'man gpg-agent' to set it up. Add that key to the
+ pbuilder environment so the packages you signed and uploaded are
+ indeed acceptable to the distribution.
+
+ sudo pbuilder --login --save-after-login \
+ --basetgz /var/cache/pbuilder/base-cran2deb-debian-amd64.tgz
+
+ Once logged in, in a separate shell perform as cran2deb user a
+
+ gpg --export -a
+
+ which should only be one (your) public key. Copy it with the mouse and
+ add it to your pbuilder login shell via
+
+ apt-key add -
+
+ (return) to expect the key from stdin. Paste it, press CTRL-D to end
+ the input. Another CTRL-D or 'exit' to leave the shell and have the
+ base.tgz updated.
+
+ Also, you should allow the arch-independent R packages to be retrieved
+ from the public cran2deb effort. This also requires that key to be
+ available. From a local shell copy again that key
+
+ gpg --recv-key BFAEA5C2
+ gpg --export -a BFAEA5C2
+
+ and use 'apt-key add -' as before.
+
+8. Try building a simple package: cran2deb build zoo
(The result will be in /var/cache/cran2deb/results/SYS)
+9. Check the specification of your pbuilder settings and run
+ 'cran2deb update'. Do not run 'cran2deb update full' which
+ creates a new pbuilder environment and will require the
+ adding of keys again.
+
+10. Educate yourself about the schema of the sqlite3 database,
+ which is likely to reside at ~/cache/cran2deb.db
+ and is directly accessible via calling from the
+ UNIX command line 'sqlite3 ~/cache/cran2deb.db' .
+
+ The sqlite3 shell will directly attach to the database.
+ See the tables first
+
+ sqlite> .tables
+ blacklist_packages debian_dependency license_override
+ builds forced_depends packages
+ database_versions license_hashes sysreq_override
+
+ and then the schema of the one or other table of interest, e.g.
+
+ sqlite> .schema debian_dependency
+ CREATE TABLE debian_dependency (
+ id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+ alias TEXT NOT NULL,
+ build INTEGER NOT NULL,
+ debian_pkg TEXT NOT NULL ,
+ UNIQUE (alias,build,debian_pkg) );
+ sqlite> .schema forced_depends
+ CREATE TABLE forced_depends (
+ r_name TEXT NOT NULL,
+ depend_alias TEXT NOT NULL,
+ PRIMARY KEY (r_name,depend_alias) );
+ sqlite> .schema blacklist_packages
+ CREATE TABLE blacklist_packages (
+ package TEXT PRIMARY KEY NOT NULL,
+ nonfree INTEGER NOT NULL DEFAULT 0,
+ obsolete INTEGER NOT NULL DEFAULT 0,
+ broken_dependency INTEGER NOT NULL DEFAULT 0,
+ unsatisfied_dependency INTEGER NOT NULL DEFAULT 0,
+ breaks_cran2deb INTEGER NOT NULL DEFAULT 0,
+ other INTEGER NOT NULL DEFAULT 0,
+ explanation TEXT NOT NULL);
+ sqlite> .schema builds
+ CREATE TABLE builds (
+ id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+ system TEXT NOT NULL ,package TEXT NOT NULL,
+ r_version TEXT NOT NULL ,deb_epoch INTEGER NOT NULL,
+ deb_revision INTEGER NOT NULL ,db_version INTEGER NOT NULL,
+ date_stamp TEXT NOT NULL ,time_stamp TEXT NOT NULL,
+ scm_revision TEXT NOT NULL ,success INTEGER NOT NULL,
+ log TEXT,
+ UNIQUE(package,system,r_version,deb_epoch,deb_revision,db_version));
+ sqlite> .schema database_versions
+ CREATE TABLE database_versions (
+ version INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+ version_date INTEGER NOT NULL,
+ base_epoch INTEGER NOT NULL );
+ sqlite> .schema license_hashes
+ CREATE TABLE license_hashes (
+ name TEXT NOT NULL,
+ sha1 TEXT PRIMARY KEY NOT NULL );
+ sqlite> .schema license_override
+ CREATE TABLE license_override (
+ name TEXT PRIMARY KEY NOT NULL,
+ accept INT NOT NULL );
+ sqlite> .schema packages
+ CREATE TABLE packages (
+ package TEXT PRIMARY KEY NOT NULL,
+ latest_r_version TEXT );
+ sqlite> .schema sysreq_override
+ CREATE TABLE sysreq_override (
+ depend_alias TEXT NOT NULL,
+ r_pattern TEXT PRIMARY KEY NOT NULL );
+
+ The sqlite3 shell allows to modify all those entries. For a
+ restart with defaults entries distributed via svn, run "cran2deb
+ repopulate". To update the data stored in svn, change to the data
+ directory and run "./pull". Caveat, prior to that, make sure the
+ license data was read in by you. This is not performed automatically in
+ repopulate, a bit to protect us and stress that everyone is reponsible
+ for their own respective interpretation of a license's constraints
+ and the effect on a redistribution of source and/or binary.
+
+11.Add licenses the way you think it is right. The script in
+ 'exec/repopulate' may offer ideas on how to mass-include what
+ you find in the svn. For new entries, you may prefer using
+ 'cran2deb' license that expects to learn from from the command
+ line how to treat individual licenses:
+
+ $ cran2deb license accept akima
+ I: cran2deb svn: 344 building for debian-amd64 at 2011-02-11 18:46:21
+ N: adding akima accept? TRUE
+
+ $ cran2deb license hash_sha1 akima 485316717b03afbd6d20f7810f9123b4445c8660
+ I: cran2deb svn: 344 building for debian-amd64 at 2011-02-11 18:46:37
+ N: adding hash 485316717b03afbd6d20f7810f9123b4445c8660 for akima
+
+ $ cran2deb license ls
+ I: cran2deb svn: 344 building for debian-amd64 at 2011-02-11 18:46:53
+ accept akima
+ hash_sha1 akima 485316717b03afbd6d20f7810f9123b4445c8660
+
+ What happens here is that a license file was read and if that is
+ having the same hash value, then it is mapped to the license 'akima'.
+ The license 'akima' then again is told to be acceptable. It happened
+ here that the license is of the same name as the package that it
+ occurs in.
+
+To think about
+
+1. After several updates of the repository, we have many outdated
+ Debian packages in the pbuilder's archive cache. I prefer removing
+ them with a skriptlet like
+
+ cd /var/cache/apt/archives \
+ && for i in $(ls | cut -f1 -d_ | uniq -c | egrep -v "^ *1 " | sed -e 's/^\s*[0-9]*\s//')
+ do
+ ls -t ${i}_* | tail -n +2 | xargs -r rm
+ done
+
+2. To investigate which packages are already available in your repository
+ and which ones are not, you may add your packages list to your /etc/apt/sources.list
+ and perform
+
+ sudo apt-get update
+ for i in `grep -i net all_pkgs `
+ do
+ a=`echo $i|tr 'A-Z' 'a-z'`
+ echo "$i:$a"
+ apt-cache search r-cran-$a
+ done
+
+To debug:
$ cran2deb help
will display a short summary of help for each cran2deb command.
+The -d option will prevent the cleaning of the unpacked source code.
+
+To improve:
+
+ * The runtime dependencies for Rgraphviz are outdated (there is no libraphviz4
+ any more). To get the package run this was not changed to "alias_run
+ libgraphviz libgraphviz-dev" but this can certainly be optimised
+ towards something less resource-hungry.
+
+
+Concerning data/:
+This contains scripts necessary to recreate the database should you lose the
+database. It's a backup that can be versioned by SVN. There is a script called
+pull that, when run from the data directory will recreate all the files from
+the database EXCEPT for the licenses. The licenses cannot be recreated because
+licenses can be based on one-way hashes. This process could certainly be
+improved.
+