Patch title: Release 94 bulk changes
Abstract:
File: /pliant/fullpliant/install.pli
Key:
    Removed line
    Added line
   
abstract
  [This module will install a ready to operate FullPliant sy


module "/pliant/protocol/http/site.pli"
module "/pliant/protocol/dns/name.pli"
module "/pliant/util/crypto/rsa.pli"
abstract
  [This module will install a ready to operate FullPliant sy


module "/pliant/protocol/http/site.pli"
module "/pliant/protocol/dns/name.pli"
module "/pliant/util/crypto/rsa.pli"
module "/pliant/util/crypto/legal.pli"


function grub_copy path
  arg Str path
  file_tree_copy "file:/usr/share/grub/i386-pc/" path+"boot/
  file_tree_copy "file:/usr/lib/grub/i386-pc/" path+"boot/gr


function grub_copy path
  arg Str path
  file_tree_copy "file:/usr/share/grub/i386-pc/" path+"boot/
  file_tree_copy "file:/usr/lib/grub/i386-pc/" path+"boot/gr
  file_tree_copy "file:/lib/grub/i386-pc/" path+"boot/grub/"
  file_tree_copy "file:/boot/grub/" path+"boot/grub/"


function grub_install root_path grub_boot_drive grub_boot_pa
  arg Str root_path grub_boot_drive grub_boot_partition ; ar
  var Str temp := file_temporary
  (var Stream kbd) open temp out+safe
  kbd writeline "root ("+grub_boot_partition+")"
  file_tree_copy "file:/boot/grub/" path+"boot/grub/"


function grub_install root_path grub_boot_drive grub_boot_pa
  arg Str root_path grub_boot_drive grub_boot_partition ; ar
  var Str temp := file_temporary
  (var Stream kbd) open temp out+safe
  kbd writeline "root ("+grub_boot_partition+")"
  var Str stage1 := shunt (grub_boot_drive parse "fd" any) "
  var Str stage1 := "stage1" # shunt (grub_boot_drive parse "fd" any) "stage1" "stage1_lba"
  var Str stage2 := "stage2"
  kbd writeline "install /boot/grub/"+stage1+" ("+grub_boot_
  kbd writeline "quit"
  kbd close
  var Str stage2 := "stage2"
  kbd writeline "install /boot/grub/"+stage1+" ("+grub_boot_
  kbd writeline "quit"
  kbd close
  var Int err := execute "grub --batch" input temp quiet
  var Int err := execute "grub --batch" input temp # quiet
  file_delete temp
  status := shunt err=0 success failure


function grub_configure c root_path grub_boot_drive grub_boo
  arg Data:Computer c ; arg Str root_path grub_boot_drive gr
  (var Stream menu) open root_path+"boot/grub/menu.lst" out+
  menu writeline "timeout 2"
  menu writeline "title FullPliant"
  menu writeline "root ("+grub_boot_partition+")"
  file_delete temp
  status := shunt err=0 success failure


function grub_configure c root_path grub_boot_drive grub_boo
  arg Data:Computer c ; arg Str root_path grub_boot_drive gr
  (var Stream menu) open root_path+"boot/grub/menu.lst" out+
  menu writeline "timeout 2"
  menu writeline "title FullPliant"
  menu writeline "root ("+grub_boot_partition+")"
  menu writeline "kernel /boot/kernel root="+file_os_name:ke
  if (file_query root_path+"boot/initrd.img" standard)=success
    menu writeline "kernel /boot/kernel root=/dev/ram0"+(shunt kernel_options<>"" " " "")+kernel_options
    menu writeline "initrd /boot/initrd.img"
  else
    menu writeline "kernel /boot/kernel root="+file_os_name:kernel_root+(shunt kernel_options<>"" " " "")+kernel_options
  each p c:env:"partition" filter keyof:p<>"root"
    if p:"os"<>"" and (p:"device" parse any (var Int i))
      menu writeline "title "+keyof:p
      menu writeline "rootnoverify (hd0,"+(string i-1)+")"
      menu writeline "makeactive"
      menu writeline "chainloader +1"
  menu close


function lilo_install c root_path lilo_boot_device kernel_ro
  arg Data:Computer c ; arg Str root_path lilo_boot_device k
  (var Stream s) open root_path+"boot/lilo.conf" out+safe
  if s=failure
    console "Failed to create lilo configuration file" eol
    return failure
  menu close


function lilo_install c root_path lilo_boot_device kernel_ro
  arg Data:Computer c ; arg Str root_path lilo_boot_device k
  (var Stream s) open root_path+"boot/lilo.conf" out+safe
  if s=failure
    console "Failed to create lilo configuration file" eol
    return failure
  s writeline "read-only"
  s writeline "ignore-table"
  s writeline "boot="+file_os_name:lilo_boot_device
  s writeline "delay=50"
  s writeline "lock"
  s writeline "delay=50"
  s writeline "lock"
  s writeline "boot="+file_os_name:lilo_boot_device
  s writeline "read-only"
  s writeline "image=/boot/kernel"
  s writeline "  label=fullpliant"
  s writeline "image=/boot/kernel"
  s writeline "  label=fullpliant"
  s writeline "  root="+file_os_name:kernel_root
  if (file_query root_path+"boot/initrd.img" standard)=success
    s writeline "  initrd=/boot/initrd.img"
    s writeline "  root=/dev/ram0"
  else
    s writeline "  root="+file_os_name:kernel_root
  s writeline "  append=[dq]"+kernel_options+"[dq]"
  if c:env:"partition":"root":"video_bios_mode"<>""
    s writeline "  vga="+c:env:"partition":"root":"video_bio
  eif c:env:"hardware":"video":"bios_mode"<>""
    s writeline "  vga="+c:env:"hardware":"video":"bios_mode
  if (file_query root_path+"boot/recover" standard)=defined
    s writeline "image=/boot/recover"
    s writeline "  label=recover"
    s writeline "  root="+file_os_name:kernel_root
    s writeline "  append=[dq]"+kernel_options+"[dq]"
    if c:env:"partition":"root":"video_bios_mode"<>""
      s writeline "  vga="+c:env:"partition":"root":"video_b
    eif c:env:"hardware":"video":"bios_mode"<>""
      s writeline "  vga="+c:env:"hardware":"video":"bios_mo
  s writeline "  append=[dq]"+kernel_options+"[dq]"
  if c:env:"partition":"root":"video_bios_mode"<>""
    s writeline "  vga="+c:env:"partition":"root":"video_bio
  eif c:env:"hardware":"video":"bios_mode"<>""
    s writeline "  vga="+c:env:"hardware":"video":"bios_mode
  if (file_query root_path+"boot/recover" standard)=defined
    s writeline "image=/boot/recover"
    s writeline "  label=recover"
    s writeline "  root="+file_os_name:kernel_root
    s writeline "  append=[dq]"+kernel_options+"[dq]"
    if c:env:"partition":"root":"video_bios_mode"<>""
      s writeline "  vga="+c:env:"partition":"root":"video_b
    eif c:env:"hardware":"video":"bios_mode"<>""
      s writeline "  vga="+c:env:"hardware":"video":"bios_mo
  if (file_query root_path+"boot/once" standard)=defined
    s writeline "image=/boot/once"
    s writeline "  label=once"
    s writeline "  root="+file_os_name:kernel_root
    s writeline "  append=[dq]"+kernel_options+"[dq]"
    if c:env:"partition":"root":"video_bios_mode"<>""
      s writeline "  vga="+c:env:"partition":"root":"video_bios_mode"
    eif c:env:"hardware":"video":"bios_mode"<>""
      s writeline "  vga="+c:env:"hardware":"video":"bios_mode"
  each p c:env:"partition" filter keyof:p<>"root"
    if p:"kernel"<>""
      if (filesystem_mount p:"device" "file:/mnt/"+keyof:p+"
        console "Failed to mount " p:"device" " partition" e
      s writeline "image=/mnt/"+keyof:p+"/boot/"+p:"kernel"
      s writeline "  label="+keyof:p
      s writeline "  root="+(file_os_name p:"device")
      s writeline "  append=[dq]"+p:"kernel_options"+"[dq]"
      if p:"video_bios_mode"<>""
        s writeline "  vga="+p:"video_bios_mode"
      eif c:env:"hardware":"video":"bios_mode"<>""
        s writeline "  vga="+c:env:"hardware":"video":"bios_
    eif p:"os"<>""
  each p c:env:"partition" filter keyof:p<>"root"
    if p:"kernel"<>""
      if (filesystem_mount p:"device" "file:/mnt/"+keyof:p+"
        console "Failed to mount " p:"device" " partition" e
      s writeline "image=/mnt/"+keyof:p+"/boot/"+p:"kernel"
      s writeline "  label="+keyof:p
      s writeline "  root="+(file_os_name p:"device")
      s writeline "  append=[dq]"+p:"kernel_options"+"[dq]"
      if p:"video_bios_mode"<>""
        s writeline "  vga="+p:"video_bios_mode"
      eif c:env:"hardware":"video":"bios_mode"<>""
        s writeline "  vga="+c:env:"hardware":"video":"bios_
    eif p:"os"<>""
      s writeline "other="+(file_os_name p:"device")
      s writeline "  label="+keyof:p
      (var Stream disk) open p:"device" in+safe
      var Str sector := repeat 512 " "
      disk raw_read sector:characters sector:len
      disk close
      if sector:1FEh=character:55h and sector:1FFh=character:0AAh
        s writeline "other="+(file_os_name p:"device")
        s writeline "  label="+keyof:p
        s writeline "  optional"
  if (file_query root_path+"boot/memtest86.bin" standard)=su
    s writeline "image=/boot/memtest86.bin"
    s writeline "  label=memtest"
  s close
  var Str flags := ""
  var Str geometry := lilo_options option "geometry" Str
  flags += (shunt geometry="chs" "" geometry="lba32" " -L" "
  var Int err := execute "lilo -C /boot/lilo.conf"+flags roo
  if err<>0 and geometry=""
    err := execute "lilo -C /boot/lilo.conf -L" root root_pa
    if err<>0 and geometry=""
      err := execute "lilo -C /boot/lilo.conf" root root_pat
  # file_delete root_path+"boot/lilo.conf"
  each p c:env:"partition"
    if p:"kernel"<>""
      filesystem_dismount "file:/mnt/"+keyof:p+"/"
  status := shunt err=0 success failure
  if (file_query root_path+"boot/memtest86.bin" standard)=su
    s writeline "image=/boot/memtest86.bin"
    s writeline "  label=memtest"
  s close
  var Str flags := ""
  var Str geometry := lilo_options option "geometry" Str
  flags += (shunt geometry="chs" "" geometry="lba32" " -L" "
  var Int err := execute "lilo -C /boot/lilo.conf"+flags roo
  if err<>0 and geometry=""
    err := execute "lilo -C /boot/lilo.conf -L" root root_pa
    if err<>0 and geometry=""
      err := execute "lilo -C /boot/lilo.conf" root root_pat
  # file_delete root_path+"boot/lilo.conf"
  each p c:env:"partition"
    if p:"kernel"<>""
      filesystem_dismount "file:/mnt/"+keyof:p+"/"
  status := shunt err=0 success failure
  if status=success and (file_query root_path+"boot/once" standard)=defined
    execute "lilo -C /boot/lilo.conf -R once"
    file_delete "file:/boot/twice"
    file_move "file:/boot/once" "file:/boot/twice"






function install_initrd c path loindex -> status
  arg Data:Computer c ; arg Str path ; arg Int loindex ; arg ExtendedStatus status
  kernel_make_device path+"dev/ram0"
  var Str temp := file_temporary
  (var Stream s) open temp out+safe
  var Address buf := memory_zallocate 1024 null
  for (var Int i) 0 1023
    s raw_write buf 1024
  s close
  memory_free buf
  partition_format temp "ext2" "standard"
  kernel_load_module "loop"
  kernel_make_device "device:/loop"+string:loindex
  execute "losetup /dev/loop"+string:loindex+" "+file_os_name:temp
  if (filesystem_mount "device:/loop"+string:loindex "file:/mnt/loop/" "")=failure
    return failure:"Failed to mount initrd image (maybe loopback device is not supported by this kernel)"
  if (file_copy fullpliant_binary_path+"linuxrc" "file:/mnt/loop/bin/init" extended)=failure
    filesystem_dismount "file:/mnt/loop/"
    return failure:"Failed to build /linuxrc"
  kernel_make_device "file:/mnt/loop/dev/console"
  kernel_make_device "file:/mnt/loop/dev/tty0"
  for (var Int i) 0 3
    kernel_make_device "file:/mnt/loop/dev/hd"+(character "a":number+i)
  for (var Int i) 0 11
    kernel_make_device "file:/mnt/loop/dev/sd"+(character "a":number+i)
  file_tree_create "file:/mnt/loop/mnt/root/"
  filesystem_dismount "file:/mnt/loop/"
  execute "losetup -d /dev/loop"+string:loindex
  file_copy temp "gzip:"+path+"boot/initrd.img" reduced
  file_delete temp
  file_tree_create path+"mnt/initrd/"
  status := success


#--------------------------------------------------------------------


function copy_floppy src_name dest_name -> status
  arg Str src_name dest_name ; arg Status status
  (var Stream src) open src_name in+nocache+safe
  if src=failure
    return failure
  (var Stream dest) open dest_name out+nocache+safe
  var Address buffer := memory_zallocate 512 null
  for (var Int i) 1 2880
    src raw_read buffer 512
    dest raw_write buffer 512
  status := shunt src=success and dest=success success failu
  src close ; dest close
  if status=failure and not (dest_name parse "device:" any)
    file_delete dest_name



function install_floppy c file kernel_root kernel_options ->
  arg Data:Computer c ; arg Str file kernel_root kernel_opti
  kernel_load_module "floppy"
  if (file_query "file:/fullpliant/unix/bin/floppy" standard
    status := build_grub_floppy
    if status=failure
      return
  if (file_copy "file:/fullpliant/unix/bin/floppy" file)=fai
    return failure:"No boot floppy image available"
  file_tree_create "file:/mnt/floppy/"
  filesystem_dismount "file:/mnt/floppy/"
  if (file parse "device:" any)
    if (filesystem_mount file "file:/mnt/floppy/" "")=failur
      return failure:"Failed to mount boot floppy image"
  else
    kernel_load_module "loop"
    kernel_make_device "device:/loop0"
    execute "losetup /dev/loop0"+" "+file_os_name:file
    if (filesystem_mount "device:/loop0" "file:/mnt/floppy/"
      return failure:"Failed to mount boot floppy image (may
function copy_floppy src_name dest_name -> status
  arg Str src_name dest_name ; arg Status status
  (var Stream src) open src_name in+nocache+safe
  if src=failure
    return failure
  (var Stream dest) open dest_name out+nocache+safe
  var Address buffer := memory_zallocate 512 null
  for (var Int i) 1 2880
    src raw_read buffer 512
    dest raw_write buffer 512
  status := shunt src=success and dest=success success failu
  src close ; dest close
  if status=failure and not (dest_name parse "device:" any)
    file_delete dest_name



function install_floppy c file kernel_root kernel_options ->
  arg Data:Computer c ; arg Str file kernel_root kernel_opti
  kernel_load_module "floppy"
  if (file_query "file:/fullpliant/unix/bin/floppy" standard
    status := build_grub_floppy
    if status=failure
      return
  if (file_copy "file:/fullpliant/unix/bin/floppy" file)=fai
    return failure:"No boot floppy image available"
  file_tree_create "file:/mnt/floppy/"
  filesystem_dismount "file:/mnt/floppy/"
  if (file parse "device:" any)
    if (filesystem_mount file "file:/mnt/floppy/" "")=failur
      return failure:"Failed to mount boot floppy image"
  else
    kernel_load_module "loop"
    kernel_make_device "device:/loop0"
    execute "losetup /dev/loop0"+" "+file_os_name:file
    if (filesystem_mount "device:/loop0" "file:/mnt/floppy/"
      return failure:"Failed to mount boot floppy image (may
  grub_configure c "file:/mnt/floppy/" "fd0" "fd0" kernel_ro
  var Str kversion := c:env:"kernel":"constant":"linux_versi
  var Str sign := c:env:"kernel":"constant":"signature"
  file_tree_delete "file:/tmp/kernel/"
  file_extract kernel_binary_path+"kernel-"+kversion+"-"+sig
  if (file_copy "file:/tmp/kernel/boot/kernel" "file:/mnt/fl
    status := failure "The kernel image "+kversion+" "+sign+
  else
    status := success
  file_tree_delete "file:/tmp/kernel/"
  var Str kversion := c:env:"kernel":"constant":"linux_versi
  var Str sign := c:env:"kernel":"constant":"signature"
  file_tree_delete "file:/tmp/kernel/"
  file_extract kernel_binary_path+"kernel-"+kversion+"-"+sig
  if (file_copy "file:/tmp/kernel/boot/kernel" "file:/mnt/fl
    status := failure "The kernel image "+kversion+" "+sign+
  else
    status := success
  file_tree_delete "file:/tmp/kernel/"
  status := install_initrd c "file:/mnt/floppy/" 1
  if status=failure
    return
  grub_configure c "file:/mnt/floppy/" "fd0" "fd0" kernel_root kernel_options ""
  filesystem_dismount "file:/mnt/floppy/"
  if not (file parse "device:" any)
  filesystem_dismount "file:/mnt/floppy/"
  if not (file parse "device:" any)
    execute file_os_name:"embedded:/sbin/losetup"+" -d "+fil
    # execute file_os_name:"embedded:/sbin/losetup"+" -d "+file_os_name:"embedded:/dev/loop0"
    execute "losetup -d /dev/loop0"



function enumerate_partitions c partitions disks
  arg Data:Computer c ; arg_rw Dictionary partitions disks
  partitions := var Dictionary empty_dictionary
  disks := var Dictionary empty_dictionary
  each pa c:env:"partition"
    var Pointer:DiskPartition p :> partitions kmap pa:"devic
    p name := keyof pa
    p device := pa "device"
    p raid_devices := pa "raid_devices"
    p mountpoint := pa "mountpoint"
    if (pa:"size_mb" parse (var Int mb))
      p size := mb*2n^20
    p filesystem := shunt pa:"filesystem"<>"" pa:"filesystem
    p options := pa "options"



function enumerate_partitions c partitions disks
  arg Data:Computer c ; arg_rw Dictionary partitions disks
  partitions := var Dictionary empty_dictionary
  disks := var Dictionary empty_dictionary
  each pa c:env:"partition"
    var Pointer:DiskPartition p :> partitions kmap pa:"devic
    p name := keyof pa
    p device := pa "device"
    p raid_devices := pa "raid_devices"
    p mountpoint := pa "mountpoint"
    if (pa:"size_mb" parse (var Int mb))
      p size := mb*2n^20
    p filesystem := shunt pa:"filesystem"<>"" pa:"filesystem
    p options := pa "options"
    if pa:"disk_image"<>""
      p options += " disk_image "+(string pa:"disk_image")
    disks kmap p:disk Str := p disk
    var Str devices := p raid_devices
    while devices<>""
      if not (devices parse any:(var Str device) _ any:(var 
        device := devices ; remain := ""
      var Str device := shunt (device search ":" -1)=(-1) "d
      var Pointer:DiskPartition p :> partitions kmap device 
      p device := device
      p filesystem := "raid"
      disks kmap p:disk Str := p disk
      devices := remain
  disks remove "device:/md" null



  var Str distrib := c:env:"pliant":"system":"distribution"
    disks kmap p:disk Str := p disk
    var Str devices := p raid_devices
    while devices<>""
      if not (devices parse any:(var Str device) _ any:(var 
        device := devices ; remain := ""
      var Str device := shunt (device search ":" -1)=(-1) "d
      var Pointer:DiskPartition p :> partitions kmap device 
      p device := device
      p filesystem := "raid"
      disks kmap p:disk Str := p disk
      devices := remain
  disks remove "device:/md" null



  var Str distrib := c:env:"pliant":"system":"distribution"
  if distrib<>"fullpliant"
  if distrib<>"fullpliant" and not (options option "force")
    return failure:"This script can only install a FullPlian


  console "Resolving shared libraries dependencies" eol
  var (Dictionary Str Str) dlls
  (var DebianDistribution debian) bind c
  (var Stream log) open "file:/tmp/packages.log" out+safe
  (var Stream log2) open "file:/tmp/dll.log" out+safe
  each p c:env:"package"
    var Str name := keyof p
    if (debian unpack1 name p:"file" "file:/tmp/package/")=s
      var Str list := file_temporary
      if (execute "tar -zt -f "+file_os_name:"file:/tmp/pack
        (var Stream s) open list in+safe
        while not s:atend
          if (s:readline parse "." any:(var Str filename)) a
            var Str libpath := filename 0 (filename search_l
            var Str libname := filename (filename search_las
            if libpath="/lib/" or libpath="/usr/lib/"
              dlls insert libname string:name+" "+string:fil
      else
        console "Failed to list package " name eol
        log writeline name+": failed to list"
      file_delete list
    else
      console "Failed to unpack package " name eol
      log writeline name+": failed to unpack"
  each p c:env:"package"
    var Str name := keyof p
    var CBool some := false
    each f p
      if (keyof:f parse "/" any) and (f parse "/bin/" any)
        some := true
    if some
      if (debian unpack1 name p:"file" "file:/tmp/package/")
        file_tree_delete "file:/tmp/files/"
        file_extract "file:/tmp/package/data.tar.gz" "file:/
        each f p
    return failure:"This script can only install a FullPlian


  console "Resolving shared libraries dependencies" eol
  var (Dictionary Str Str) dlls
  (var DebianDistribution debian) bind c
  (var Stream log) open "file:/tmp/packages.log" out+safe
  (var Stream log2) open "file:/tmp/dll.log" out+safe
  each p c:env:"package"
    var Str name := keyof p
    if (debian unpack1 name p:"file" "file:/tmp/package/")=s
      var Str list := file_temporary
      if (execute "tar -zt -f "+file_os_name:"file:/tmp/pack
        (var Stream s) open list in+safe
        while not s:atend
          if (s:readline parse "." any:(var Str filename)) a
            var Str libpath := filename 0 (filename search_l
            var Str libname := filename (filename search_las
            if libpath="/lib/" or libpath="/usr/lib/"
              dlls insert libname string:name+" "+string:fil
      else
        console "Failed to list package " name eol
        log writeline name+": failed to list"
      file_delete list
    else
      console "Failed to unpack package " name eol
      log writeline name+": failed to unpack"
  each p c:env:"package"
    var Str name := keyof p
    var CBool some := false
    each f p
      if (keyof:f parse "/" any) and (f parse "/bin/" any)
        some := true
    if some
      if (debian unpack1 name p:"file" "file:/tmp/package/")
        file_tree_delete "file:/tmp/files/"
        file_extract "file:/tmp/package/data.tar.gz" "file:/
        each f p
          if (keyof:f parse "/" any) and ((f parse "/bin/" a
          if (keyof:f parse "/" any) and (f parse "/bin/" any)
            var List:Str libraries := file_libraries (file_o
            each lib libraries
              if exists:(dlls first lib) and ((dlls first li
                log2 writeline f+" requires "+lib+" in "+pac
                c "package" packname filename := "/lib/"+lib
              else
                console "Failed to find package containing l
                log writeline name+": find package containin


            var List:Str libraries := file_libraries (file_o
            each lib libraries
              if exists:(dlls first lib) and ((dlls first li
                log2 writeline f+" requires "+lib+" in "+pac
                c "package" packname filename := "/lib/"+lib
              else
                console "Failed to find package containing l
                log writeline name+": find package containin


  console "Building the custom Linux kernel" eol
  status := kernel_compile c
  if status=failure
    return
  var Str kversion := c:env:"kernel":"constant":"linux_versi
  var Str sign := c:env:"kernel":"constant":"signature"
  file_extract kernel_binary_path+"kernel-"+kversion+"-"+sig
  file_tree_delete "target:/sbin/"
  file_tree_delete "target:/etc/"
  file_tree_delete "target:/usr/"
  file_tree_delete "target:/var/"
  file_copy kernel_binary_path+"kernel-"+kversion+"-"+sign+"
  if not (options option "nokernel")
    console "Building the custom Linux kernel" eol
    status := kernel_compile c
    if status=failure
      return
    var Str kversion := c:env:"kernel":"constant":"linux_version"
    var Str sign := c:env:"kernel":"constant":"signature"
    file_extract kernel_binary_path+"kernel-"+kversion+"-"+sign+".tgz" "target:/"
    file_tree_delete "target:/sbin/"
    file_tree_delete "target:/etc/"
    file_tree_delete "target:/usr/"
    file_tree_delete "target:/var/"
    file_copy kernel_binary_path+"kernel-"+kversion+"-"+sign+".tgz" "target:/boot/modules.tgz"

  console "Copying Pliant tree" eol
  file_tree_copy "/pliant/" "target:/pliant/pliant/" extende
  file_copy "/index.page" "target:/pliant/index.page"
  var Str compiler := "gcc"
  var Str include_options := ""
  var Str compiler_options := "-O2 -m486 -mregparm=3 -mrtd -
  var Str debug0_options := "-s -D_NOCHECK_ -fomit-frame-poi
  var Str debug1_options := "-s -D_NOCHECK_ -D_LISTING_"
  var Str debug2_options := "-s -D_CHECK_"
  var Str debug_options := shunt debugging_level=0 debug0_op
  var Str link_options := "-nostdlib"
  var Str exe_options := pliant_root_path+"pliant/language/s

  console "Copying Pliant tree" eol
  file_tree_copy "/pliant/" "target:/pliant/pliant/" extende
  file_copy "/index.page" "target:/pliant/index.page"
  var Str compiler := "gcc"
  var Str include_options := ""
  var Str compiler_options := "-O2 -m486 -mregparm=3 -mrtd -
  var Str debug0_options := "-s -D_NOCHECK_ -fomit-frame-poi
  var Str debug1_options := "-s -D_NOCHECK_ -D_LISTING_"
  var Str debug2_options := "-s -D_CHECK_"
  var Str debug_options := shunt debugging_level=0 debug0_op
  var Str link_options := "-nostdlib"
  var Str exe_options := pliant_root_path+"pliant/language/s
  if not static
  if false # not static
    exe_options += " -ldl -D_SO2_"
    if (file_query "file:/lib/libdl.so" standard)=undefined
      file_link "file:/lib/libdl.so.2" "file:/lib/libdl.so"
  var Str context_options := "-D_i386_ -D_LINUX_API_ -D_LINU
  if static
    context_options += " -D_STATIC_"
  var Str extra_options := ""
  var Str detail := "-debug"+(string debugging_level)+"-stat
  if (file_query fullpliant_binary_path+"init" standard)=und
    console "Compiling init executable" eol
    file_tree_create fullpliant_binary_path
    execute compiler+" "+compiler_options+" "+include_option
    (var Stream t) open "file:/tmp/compile.log" out+safe
    t writeline compiler+" "+compiler_options+" "+include_op
    t close
    file_configure fullpliant_binary_path+"init" "mode "+(st
  if (file_copy fullpliant_binary_path+"init" "target:/bin/i
    return failure:"Failed to build /bin/init"
    exe_options += " -ldl -D_SO2_"
    if (file_query "file:/lib/libdl.so" standard)=undefined
      file_link "file:/lib/libdl.so.2" "file:/lib/libdl.so"
  var Str context_options := "-D_i386_ -D_LINUX_API_ -D_LINU
  if static
    context_options += " -D_STATIC_"
  var Str extra_options := ""
  var Str detail := "-debug"+(string debugging_level)+"-stat
  if (file_query fullpliant_binary_path+"init" standard)=und
    console "Compiling init executable" eol
    file_tree_create fullpliant_binary_path
    execute compiler+" "+compiler_options+" "+include_option
    (var Stream t) open "file:/tmp/compile.log" out+safe
    t writeline compiler+" "+compiler_options+" "+include_op
    t close
    file_configure fullpliant_binary_path+"init" "mode "+(st
  if (file_copy fullpliant_binary_path+"init" "target:/bin/i
    return failure:"Failed to build /bin/init"
  if (file_query fullpliant_binary_path+"linuxrc" standard)=undefined
    console "Compiling linuxrc executable" eol
    file_tree_create fullpliant_binary_path
    execute compiler+" "+compiler_options+" "+include_options+" "+debug_options+" "+link_options+" "+exe_options+" "+context_options+" "+extra_options+" -o "+(file_os_name fullpliant_binary_path+"linuxrc")+" "+file_os_name:"/pliant/fullpliant/linuxrc.c"
    (var Stream t) open "file:/tmp/compile.log" out+safe
    t writeline compiler+" "+compiler_options+" "+include_options+" "+debug_options+" "+link_options+" "+exe_options+" "+context_options+" "+extra_options+" -o "+(file_os_name fullpliant_binary_path+"linuxrc")+" "+file_os_name:"/pliant/fullpliant/linuxrc.c"
    t close
    file_configure fullpliant_binary_path+"linuxrc" "mode "+(string 7*8^2+5*8+5)
  if static
    file_tree_delete "target:/pliant/binary/"
    file_tree_create "target:/pliant/binary/" 
    if (file_query fullpliant_binary_path+"pliant"+detail st
      console "Compiling static Pliant executable" eol
      file_tree_create fullpliant_binary_path
      execute compiler+" "+compiler_options+" "+include_opti
    file_copy fullpliant_binary_path+"pliant"+detail "target
  else
    file_tree_copy "/binary/" "target:/pliant/binary/" exten
    var Array:FileInfo files := file_list "target:/pliant/bi
    for (var Int i) 0 files:size-1
      if files:i:extension=".dump"
        file_delete files:i:name
    file_link "/binary/pliant-debug"+string:debugging_level+


  if medium="cdrom"
  if static
    file_tree_delete "target:/pliant/binary/"
    file_tree_create "target:/pliant/binary/" 
    if (file_query fullpliant_binary_path+"pliant"+detail st
      console "Compiling static Pliant executable" eol
      file_tree_create fullpliant_binary_path
      execute compiler+" "+compiler_options+" "+include_opti
    file_copy fullpliant_binary_path+"pliant"+detail "target
  else
    file_tree_copy "/binary/" "target:/pliant/binary/" exten
    var Array:FileInfo files := file_list "target:/pliant/bi
    for (var Int i) 0 files:size-1
      if files:i:extension=".dump"
        file_delete files:i:name
    file_link "/binary/pliant-debug"+string:debugging_level+


  if medium="cdrom"
    file_copy "data:/pliant/fullpliant/pci_device_listing1.t
    file_copy "data:/pliant/fullpliant/pci_device_listing2.t
    (var Stream s) open "target:/etc/mtab" out+mkdir+safe # 
    s close
    (var Stream s) open "target:/etc/mtab" out+mkdir+safe # 
    s close

  if medium="cdrom" or medium="usb"
    file_copy "data:/pliant/fullpliant/pci_device_listing.txt" "target:/pliant_data/pliant/fullpliant/pci_device_listing.txt"
    console "Building initrd image" eol
    status := install_initrd c "target:/" 0
    if status=failure
      return
  if c:env:"pliant":"browser":"console"="true"
    console "Copying browser extra files" eol
    file_copy "security:/keyboard.pdb" security+"keyboard.pdb"
    file_copy "security:/font.pdb" security+"font.pdb"
    file_tree_copy "file:/pliant_data/pliant/font/free/" "target:/pliant_data/pliant/font/free/"
    kernel_make_device "target:/dev/tty0"
    kernel_make_device "target:/dev/tty2"
    # kernel_make_device "target:/dev/input/keyboard"
    kernel_make_device "target:/dev/input/mice"
    kernel_make_device "target:/dev/fb0"
  each tb c:env:"tarball"
    var Str tbfile := tb "file"
    if tbfile<>""
      if (tbfile search "/" -1)=(-1)
        tbfile := "file:/fullpliant/download/"+tbfile
      var Str tbpath := tb "path"
      if tbpath=""
        tbpath := "target:/"
      file_extract tbfile tbpath
  pliant_multi_file_system dismount "target:/"
  console "done." eol
  status := success
  
export install_tree
  pliant_multi_file_system dismount "target:/"
  console "done." eol
  status := success
  
export install_tree