Patch title: Release 91 bulk changes
Abstract:
File: /fullpliant/kernel.pli
Key:
    Removed line
    Added line
abstract
  [This module will install, patch, and compile the Linux kernel source.]

module "/pliant/language/context.pli"
module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/admin/file.pli"
module "/pliant/admin/execute.pli"
module "/pliant/admin/asciifile.pli"
module "/pliant/admin/md5.pli"
submodule "computer.pli"


public
  constant kernel_source_path "file:/fullpliant/kernel/src/"
  constant kernel_binary_path "file:/fullpliant/kernel/bin/"


function command cmd subpath input -> err
  arg Str cmd subpath input ; arg Int err
  if (constant this_computer:env:"pliant":"system":"embedded")<>""
    var Array:Str env
    env += "PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin"
    var Array:Address ptrs
    ptrs size := env:size+1
    for (var Int i) 0 env:size-1
      if (env:i env:i:len-1 1)<>"[0]"
        env i += "[0]"
      ptrs i := env:i characters
    ptrs env:size := null
    var Address memo := linux_process_env
    linux_process_env := addressof Address ptrs:0
    err := execute cmd path "embedded:/usr/src/"+subpath root "embedded:/" input input quiet
    linux_process_env := memo
  else
    err := execute cmd path "embedded:/usr/src/"+subpath input input quiet

function command cmd subpath -> err
  arg Str cmd subpath ; arg Int err
  err := command cmd subpath ""


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

doc
  [installing the kernel source tree]


function kernel_signature c extended -> s
  arg Data:Computer c ; arg CBool extended ; arg Str s
  s := ""
  each cst c:env:"kernel":"constant"
    if keyof:cst<>"signature"
      s += "constant "+keyof:cst+" "+string:cst+"[lf]"
  each patch c:env:"patch"
    s += "patch "+(string patch:"file")
    if patch:"fuzzy"="true"
      s += " fuzzy"
    each f patch
      if (keyof:f parse "ignore" any)
        s += " ignore "+string:f
    s += "[lf]"
  if extended
    each k c:env:"kernel":"make"
      if k<>"n"
        s += "make "+keyof:k+"="+k+"[lf]"
   

function apply_patch file filter patch
  arg Str file filter patch
  var Str temp1 := replace file_temporary "file:/" "embedded:/" ; var Str temp2 := replace file_temporary "file:/" "embedded:/"
  file_copy file temp1
  execute filter root "embedded:/" input temp1 output temp2
  execute patch path "embedded:/usr/src/" root "embedded:/" input temp2
  file_delete temp1 ; file_delete temp2

function kernel_install c -> status
  arg Data:Computer c ; arg ExtendedStatus status
  var Str linux_version := c:env:"kernel":"constant":"linux_version"
  if not (linux_version parse (var Int v1) "." (var Int v2) "." (var Int v3) any:(var Str v4))
    return (failure "Incorrect kernel version ("+linux_version+")")
  var Str pcmcia_version := c:env:"kernel":"constant":"pcmcia_version"
  var Str alsa_version := c:env:"kernel":"constant":"alsa_version"
  var Str alsa_version := shunt v1=2 and v2=4 c:env:"kernel":"constant":"alsa_version" ""
  var Int base := 0
  var Int final := v3
  var Int maxi := 0 ; var Str v := ""
  var Array:FileInfo files := file_list kernel_source_path standard+relative
  for (var Int i) 0 files:size-1
    if (files:i:name parse "linux-" (var Int vi1) "." (var Int vi2) "." (var Int vi3) ".tar.gz")
      if vi1=v1 and vi2=v2 and (vi3>base and vi3<=v3)
        base := vi3
  part check_for_same
    (var Stream sign) open "embedded:/usr/src/linux/.pliant" in+safe
    var Str s := ""
    while not sign:atend
      s += sign:readline+"[lf]"
    sign close
    if s=(kernel_signature c false)
      return success
  console "  installing Linux kernel " linux_version " source" eol
  status := success
  if (file_query "embedded:/usr/src/linux-"+linux_version+"/" standard)=defined
    console "    removing old kernel source" eol
    file_tree_delete "embedded:/usr/src/linux-"+linux_version+"/"
  console "    unpacking linux-"+string:v1+"."+string:v2+"."+string:base+".tar.gz" eol
  file_delete "embedded:/usr/src/linux"
  file_tree_delete "embedded:/usr/src/linux/"
  file_tree_delete "embedded:/usr/src/linux-"+string:v1+"."+string:v2+"."+string:base+"/"
  if (file_extract kernel_source_path+"linux-"+string:v1+"."+string:v2+"."+string:base+".tar.gz" "embedded:/usr/src/")=failure
    return failure:"Failed to extract Linux source"
  file_link "linux-"+string:v1+"."+string:v2+"."+string:base+"/" "embedded:/usr/src/linux/"
  if pcmcia_version<>""
    if (file_query "embedded:/usr/src/pcmcia-cs-"+pcmcia_version+"/" standard)=defined
      console "    removing old pcmcia source" eol
      file_tree_delete "embedded:/usr/src/pcmcia-cs-"+pcmcia_version+"/"
    file_delete "embedded:/usr/src/pcmcia-cs" ; file_tree_delete "embedded:/usr/src/pcmcia-cs/"
    var Str pcmcia_tar := "pcmcia-cs-"+pcmcia_version+".tar.gz"
    console "    unpacking "+pcmcia_tar eol
    if (file_extract kernel_source_path+pcmcia_tar "embedded:/usr/src/")=failure
      return failure:"Failed to extract PCMCIA source"
    file_link "pcmcia-cs-"+pcmcia_version+"/" "embedded:/usr/src/pcmcia-cs/"
  if alsa_version<>""
    if (file_query "embedded:/usr/src/alsa-driver-"+alsa_version+"/" standard)=defined
      console "    removing old ALSA source" eol
      file_tree_delete "embedded:/usr/src/alsa-driver-"+alsa_version+"/"
    var Str alsa_tar := "alsa-driver-"+alsa_version+".tar.bz2"
    console "    unpacking "+alsa_tar eol
    if (file_extract kernel_source_path+alsa_tar "embedded:/usr/src/")=failure
      return failure:"Failed to extract ALSA source"
  for i base+1 final
    console "    applying patch-"+string:v1+"."+string:v2+"."+string:i+".gz" eol
    file_tree_delete "embedded:/usr/src/linux-"+string:v1+"."+string:v2+"."+string:i+"/"
    # file_tree_delete "embedded:/usr/src/linux-"+string:v1+"."+string:v2+"."+string:i+"/"
    file_tree_delete "os_file:"+(file_os_name "embedded:/usr/src/linux-"+string:v1+"."+string:v2+"."+string:i+"/") # there are some ..tmp files
    each patch c:env:"patch"
      if patch:"file"="patch-"+string:v1+"."+string:v2+"."+string:i+".gz"
        each f patch
          if (keyof:f parse "ignore" any)
            console "    ignoring " f eol
            file_copy "embedded:/usr/src/linux/"+f "embedded:/usr/src/linux/"+f+".original"
    if v1>2 or (v1>=2 and v2>=6)
      file_link "linux-"+string:v1+"."+string:v2+"."+(string i-1)+"/" "embedded:/usr/src/a/"
      file_link "linux-"+string:v1+"."+string:v2+"."+(string i-1)+"/" "embedded:/usr/src/b/"
    apply_patch kernel_source_path+"patch-"+string:v1+"."+string:v2+"."+string:i+".gz" "gzip -d" "patch -p0 -s"
    if v1>2 or (v1>=2 and v2>=6)
      file_delete "embedded:/usr/src/a/"
      file_delete "embedded:/usr/src/b/"
    each patch c:env:"patch"
      if patch:"file"="patch-"+string:v1+"."+string:v2+"."+string:i+".gz"
        each f patch
          if (keyof:f parse "ignore" any)
            file_copy "embedded:/usr/src/linux/"+f+".original" "embedded:/usr/src/linux/"+f
            file_delete "embedded:/usr/src/linux/"+f+".original"
    file_move "embedded:/usr/src/linux-"+string:v1+"."+string:v2+"."+(string i-1)+"/" "embedded:/usr/src/linux-"+string:v1+"."+string:v2+"."+string:i+"/"
    file_delete "embedded:/usr/src/linux"
    file_link "linux-"+string:v1+"."+string:v2+"."+string:i+"/" "embedded:/usr/src/linux/"
  each patch c:env:"patch"
    each f patch
      if (keyof:f parse "alias" any)
        file_link "linux-"+string:v1+"."+string:v2+"."+string:final+"/" "embedded:/usr/src/"+f+"/"
    each f patch
      if (keyof:f parse "ignore" any)
        file_copy "embedded:/usr/src/linux/"+f "embedded:/usr/src/linux/"+f+".original"
    var Str file := patch "file"
    var Str options := shunt patch:"fuzzy"="true" " -N -F 10000" ""
    console "    applying "+file eol
    var Str cmd := ""
    if (file search ".gz" -1)<>(-1)
      apply_patch kernel_source_path+file "gzip -d" "patch -p0 -s"+options
    eif (file search ".bz2" -1)<>(-1)
      apply_patch kernel_source_path+file "bzip2 -d" "patch -p0 -s"+options
    else
      apply_patch kernel_source_path+file "cat" "patch -p0 -l -s"+options
    each f patch
      if (keyof:f parse "ignore" any)
        file_copy "embedded:/usr/src/linux/"+f+".original" "embedded:/usr/src/linux/"+f
        file_delete "embedded:/usr/src/linux/"+f+".original"
    each f patch
      if (keyof:f parse "alias" any)
        file_delete "embedded:/usr/src/"+f+"/"
  if v1=2 and v2=2 and computer_fullname="hubert.heliogroup.fr" and c:env:"hardware":"processor":"model"="i586" and c:env:"hardware":"processor":"count">="2"
    # dirty hack for my HP XU 5/90C SMP systems
    (var AsciiFile apic) load "embedded:/usr/src/linux/arch/i386/kernel/io_apic.c"
    apic set "static inline int" "irq_polarity" "static inline int irq_polarity(int idx) { return default_EISA_polarity(idx); } static inline int irq_polarity0(int idx)"
    apic set "static inline int" "irq_trigger" "static inline int irq_trigger(int idx) { return default_EISA_trigger(idx); } static inline int irq_trigger0(int idx)"
    apic store
  if true # no console blanking
    (var AsciiFile console) load "embedded:/usr/src/linux/drivers/char/console.c"
    console set "static void" "timer_do_blank_screen" "static void timer_do_blank_screen(int entering_gfx, int from_timer_handler)[lf]{}[lf]static void dropped_code(int entering_gfx, int from_timer_handler)"
    console store
  if status=success
    (var Stream sign) open "embedded:/usr/src/linux/.pliant" out
    sign writechars (kernel_signature c false)
  else
    file_delete "embedded:/usr/src/linux/.pliant"


function kernel_remove
  file_tree_delete "embedded:/usr/src/linux/"
  file_tree_delete "embedded:/usr/src/pcmcia/"
  var Array:FileInfo files := file_list "embedded:/usr/src/" standard+directories+relative
  for (var Int i) 0 files:size-1
    if (files:i:name parse "linux-" any:(var Str v) "/")
      file_tree_delete "embedded:/usr/src/"+files:i:name
    if (files:i:name parse "pcmcia-cs-" any:(var Str v) "/")
      file_tree_delete "embedded:/usr/src/"+files:i:name
  file_delete "embedded:/usr/src/linux"
  file_delete "embedded:/usr/src/pcmcia-cs"
  file_tree_delete kernel_binary_path


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

doc
  [creating the kernel configuration file]

function set_implicit_kernel_settings c conf
  arg Data:Computer c ; arg_rw Stream conf
  var Array:FileInfo files := file_list "embedded:/usr/src/linux/" standard+recursive
  for (var Int i) 0 files:size-1
    if (lower files:i:name_without_path)="config.in"
      (var Stream s) open files:i:name in
      while not s:atend
        var Str l := s readline
        var Str option default
        if (l parse word:"bool" "'" any "'" _ any:option _ any) or (l parse word:"bool" "'" any "'" _ any:option)
          default := "n"
        eif (l parse word:"tristate" "'" any "'" _ any:option _ any) or (l parse word:"tristate" "'" any "'" _ any:option)
          default := "n"
        eif (l parse word:"dep_tristate" "'" any "'" _ any:option _ any) or (l parse word:"dep_tristate" "'" any "'" _ any:option)
          default := "n"
        eif (l parse word:"int" "'" any "'" _ any:option _ any:default)
          void
        eif (l parse word:"string" "'" any "'" _ any:option _ any:default)
          void
        else
          option := ""
        if option<>"" and not (exists c:env:"kernel":"make":option)
          if default<>"n"
            conf writeline option+"="+default
          else
            conf writeline "# "+option+" is not set"
    eif files:i:name_without_path="Kconfig"
      (var Stream s) open files:i:name in
      while not s:atend
        if (s:readline parse word:"config" any:(var Str option))
          option := "CONFIG_"+option
          var Str default := "n"
          while { var Str l := s readline ; not l:parse and not (l parse word:"help") }
            if (l parse word:"default" (var Str value))
              default := value
          while l<>""
            l := s readline
          if not (exists c:env:"kernel":"make":option)
            if default<>"n"
              conf writeline option+"="+default
            else
              conf writeline "# "+option+" is not set"

function write_kernel_configuration c
  arg_rw Data:Computer c
  (var AsciiFile makefile) load "embedded:/usr/src/linux/Makefile"
  makefile set "EXTRAVERSION" "=" "EXTRAVERSION ="
  if c:env:"kernel":"make":"CONFIG_SMP"="y"
    makefile fuzzy_set "SMP" "=" "SMP = 1"
  else
    makefile fuzzy_set "SMP" "=" "# SMP = 1"
  if c:env:"kernel":"constant":"gcc"<>""
    makefile set "HOSTCC" "=" "HOSTCC = "+c:env:"kernel":"constant":"gcc"
    makefile set "CC" "=" "CC = $(CROSS_COMPILE)"+c:env:"kernel":"constant":"gcc"
  makefile store
  var Str port := c:env:"kernel":"constant":"de620/io_port"
  if port=""
    port := "0x378"
  # 0x3BC for Thinkpad 750
  (var AsciiFile de620) load "embedded:/usr/src/linux/drivers/net/de620.c"
  de620 set "#define" "DE620_IO" "#define DE620_IO "+port
  de620 store
  (var Stream conf) open "embedded:/usr/src/linux/.config" out
  conf writeline "# This file has been automatically generated by Pliant"
  conf writeline "# module /pliant/linux/kernel/build.pli"
  conf writeline "# (Pliant is available at http://pliant.cx/)"
  conf writeline "#"
  conf writeline "# Pliant extra informations:"
  (var Stream version) open "embedded:/usr/src/linux/.pliant" in
  while not version:atend
    conf writeline "#   "+version:readline
  conf writeline "#"
  conf writeline "# Linux kernel standard informations:"
  each k c:env:"kernel":"make"
    if k<>"n"
      conf writeline keyof:k+"="+k
    else
      conf writeline "# "+keyof:k+" is not set"
  set_implicit_kernel_settings c conf
  conf close
  (var AsciiFile f) load "embedded:/usr/src/linux/include/net/sock.h"
  f set "#define" "PROT_SOCK" "#define PROT_SOCK 0"
  f store


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

doc
  [lazy compiling the custom kernel]


function kernel_compile c -> status
  arg_rw Data:Computer c ; arg ExtendedStatus status
  (var AsciiFile makefile) load "embedded:/usr/src/linux/Makefile"
  var Str computer_name := c:env:"pliant":"identity":"name"
  var Str kernel_version := c:env:"kernel":"constant":"linux_version"
  var Str extra_version := makefile get "EXTRAVERSION" "="
  var Str pcmcia_version := c:env:"kernel":"constant":"pcmcia_version"
  var Str alsa_version := c:env:"kernel":"constant":"alsa_version"
  kernel_version parse (var Int v1) "." (var Int v2)  "." (var Int v3) any
  var Str alsa_version := shunt v1=2 and v2=4 c:env:"kernel":"constant":"alsa_version" ""
  status := kernel_install c
  if status=failure
    return
  var Str sign := string_md5_hexa_signature:(kernel_signature c true)
  if (file_query kernel_binary_path+"kernel-"+kernel_version+"-"+sign+".tgz" standard)=defined
    return success
  console "  configuring the kernel" eol
  write_kernel_configuration c
  var Str temp := file_temporary
  (var Stream s) open temp out
  for (var Int i) 1 4096
    s writeline ""
  s close
  command "make oldconfig" "linux/" temp
  file_delete temp
  var Str kernel_image := shunt v1>2 or v2>=2 "bzImage" "zImage"
  var CBool modules := true
  file_tree_delete "embedded:/tmp/kernel/" ; file_tree_create "embedded:/tmp/kernel/"
  if true # build the kernel
    command "make dep" "linux/"
    command "make clean" "linux/"
    console "  compiling the kernel (be patient)" eol
    if (command "make "+kernel_image "linux/")<>0
      return (failure "Failed to build kernel for computer "+computer_name+" !")
  if modules # build the modules
    console "  compiling the modules (be patient)" eol
    (var AsciiFile makefile) load "embedded:/usr/src/linux/Makefile"
    makefile fuzzy_set "INSTALL_MOD_PATH" "" "INSTALL_MOD_PATH=/tmp/kernel"
    makefile store
    if (command "make modules" "linux/")<>0
      return (failure "Failed to build kernel modules for computer "+computer_name+" !")
    command "make modules_install" "linux/"
    var Str mpath := "embedded:/tmp/kernel/lib/modules/"+string:v1+"."+string:v2+"."+string:v3+"/"
    file_delete mpath+"build"
    if false
      file_tree_copy mpath+"kernel/drivers/" mpath ; file_tree_delete mpath+"kernel/drivers/"
      file_tree_copy mpath+"kernel/" mpath ; file_tree_delete mpath+"kernel/"
  if modules and c:env:"kernel":"make":"CONFIG_PCMCIA"="y" and pcmcia_version<>"" # build pcmcia support
    console "  compiling PCMCIA support (be patient)" eol
    (var AsciiFile config_in) load "embedded:/usr/src/pcmcia-cs/config.in"
    config_in set "RC_DIR" "=" "RC_DIR=/etc"
    config_in set "SYSV_INIT" "=" "SYSV_INIT=y"
    config_in store
    file_delete "embedded:/usr/src/pcmcia-cs/config.out"
    var Str params := " --noprompt"
    params += " --kernel=/usr/src/linux"
    params += " --target=/tmp/kernel"
    params += " --moddir=/lib/modules/"+string:v1+"."+string:v2+"."+string:v3
    params += " --cc=gcc"
    params += " --ld=ld"
    params += " --debug=[dq][dq]"
    params += " --trust"
    params += shunt c:env:"kernel":"make":"CONFIG_CARDBUS"="y" " --cardbus" " --nocardbus"
    params += " --srctree"
    command "Configure"+params "pcmcia-cs/"
    if (command "make all" "pcmcia-cs/")<>0
      return (failure "Failed to build pcmcia support for computer "+computer_name+" !")
    command "make install" "pcmcia-cs/"
  if modules and alsa_version<>"" # build ALSA sound support
    console "  compiling ALSA sound support (be patient)" eol
    command "configure" "alsa-driver-"+alsa_version+"/"
    command "make" "alsa-driver-"+alsa_version+"/"
    (var AsciiFile mk_conf) load "embedded:/usr/src/alsa-driver-"+alsa_version+"/Makefile.conf"
    mk_conf set "moddir" "=" "moddir = /tmp/kernel/lib/modules/"+string:v1+"."+string:v2+"."+string:v3+"/kernel/sound"
    mk_conf store
    command "make install" "alsa-driver-"+alsa_version+"/"
  if modules and (file_query kernel_source_path+"vmmon.tar" standard)=defined
    console "  compiling VMWare modules" eol
    file_tree_delete "embedded:/usr/src/vmmon-only/"
    file_extract kernel_source_path+"vmmon.tar" "embedded:/usr/src/"
    (var AsciiFile f) load "embedded:/usr/src/vmmon-only/Makefile"
    if c:env:"kernel":"make":"CONFIG_SMP"="y"
      f fuzzy_set "SUPPORT_SMP" "=" "SUPPORT_SMP=1"
    f set "DESTDIR" "=" "DESTDIR = driver"
    f set_all "DRIVERNAME" "=" "DRIVERNAME = vmmon.o"
    f store
    command "make" "vmmon-only/"
    file_copy "embedded:/usr/src/vmmon-only/driver/vmmon.o" "embedded:/tmp/kernel/lib/modules/"+kernel_version+extra_version+"/misc/vmmon.o"
  if modules and (file_query kernel_source_path+"vmnet.tar" standard)=defined
    file_tree_delete "embedded:/usr/src/vmnet-only/"
    file_extract kernel_source_path+"vmnet.tar" "embedded:/usr/src/"
    f load "embedded:/usr/src/vmnet-only/Makefile"
    if c:env:"kernel":"make":"CONFIG_SMP"="y"
      f fuzzy_set "SUPPORT_SMP" "=" "SUPPORT_SMP=1"
    f set_all "DRIVERNAME" "=" "DRIVERNAME = vmnet.o"
    f store
    command "make" "vmnet-only/"
    file_copy "embedded:/usr/src/vmnet-only/vmnet.o" "embedded:/tmp/kernel/lib/modules/"+kernel_version+extra_version+"/misc/vmnet.o"
  if modules and (file_query kernel_source_path+"vmppuser.tar" standard)=defined
    file_tree_delete "embedded:/usr/src/vmppuser-only/"
    file_extract kernel_source_path+"vmppuser.tar" "embedded:/usr/src/"
    f load "embedded:/usr/src/vmppuser-only/Makefile"
    if c:env:"kernel":"make":"CONFIG_SMP"="y"
      f fuzzy_set "SUPPORT_SMP" "=" "SUPPORT_SMP=1"
    f set_all "DRIVERNAME" "=" "DRIVERNAME = vmppuser.o"
    f store
    command "make" "vmppuser-only/"
    file_copy "embedded:/usr/src/vmppuser-only/vmppuser.o" "embedded:/tmp/kernel/lib/modules/"+kernel_version+extra_version+"/misc/vmppuser.o"
  void ?
  console "  storing the newly compiled kernel." eol
  file_tree_create kernel_binary_path
  file_copy "embedded:/usr/src/linux/arch/i386/boot/"+kernel_image "embedded:/tmp/kernel/boot/kernel"
  file_copy "embedded:/usr/src/linux/System.map" "embedded:/tmp/kernel/boot/System.map"
  execute "tar -zc -f "+file_os_name:kernel_binary_path+"kernel-"+kernel_version+"-"+sign+".tgz ." path "embedded:/tmp/kernel/"
  file_tree_delete "embedded:/tmp/kernel/"
  status := success

export kernel_signature
export kernel_install kernel_remove
export kernel_compile