summaryrefslogtreecommitdiff
blob: 2c922feb183d614de2e827921ac47f3a3df65f3d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# Gentoo/NetBSD eclass
# Patrice Clement <charlieroot@free.fr>
inherit bsdmk

# @ECLASS: netbsd.eclass
# @MAINTAINER: charlieroot@free.fr
# @BLURB: functions and environment variables used to set up dirs, paths, names in ebuilds
# @DESCRIPTION:
# The netbsd eclass contains a suite of functions and environment variables used to setup many
# paths, directory names, and other things in Gentoo/NetBSD. I try to be as much explicit as I
# can. Read comments to understand how does the function work and what it does.

# Source directory.
# I wanted to let end-user the possiblity to set where he wants to push NetBSD sources on his machine. 
# It can now be achieved with a variable which have to be set in make.conf: NETBSD_SRC_DIR.
# ex: NETBSD_SRC_DIR="/usr" or "/docs/netbsd-5.0"
# Default, if not set, is "/usr"
if [ -z ${NETBSD_SRC_DIR} ]; then
  NETBSD_SRC_DIR="/usr"
fi

# CVS directory MUST ALWAYS be "src"
# that's why we set it as readonly.
readonly NETBSD_CVS_DIR="src"

# This is the global path of where sources are pushed on user's machine.
# We'll need it later.
NETBSD_SRC_DIR="${NETBSD_SRC_DIR}/${NETBSD_CVS_DIR}"
export NETBSD_SRC_DIR

# Tools directory.
# Default, if not set, is tooldir.NetBSD-5.0-i386
# Later, we can think about USE flags which would cross-compile
# tools and system in another directory, using ROOT option,
# in order to build the system for a different CPU architecture.
if [ -z ${NETBSD_SRC_TOOLDIR} ]; then
  NETBSD_SRC_TOOLDIR="tooldir-NetBSD-5.0-i386"
  #NETBSD_SRC_TOOLDIR="tooldir-`uname -s`-`uname -r`-`uname -m`
fi
export NETBSD_SRC_TOOLDIR

# In order to have the global path of where are tools on machine,
# and to avoid writing ${NETBSD_SRC_DIR}/${NETBSD_TOOLDIR} each times,
# we create a variable to assemble these two.
NETBSD_TOOLDIR="${NETBSD_SRC_DIR}/${NETBSD_SRC_TOOLDIR}"
export NETBSD_TOOLDIR

# Define mymakeopts environment variable.
# BSDSRCDIR = Real path of NetBSD sources on local machine.
# TOOLDIR = Real path of tools directory.
# USETOOLS=yes = We'll always use cross-compiling tools to build any part of the system.
mymakeopts="BSDSRCDIR=${NETBSD_SRC_DIR} TOOLDIR=${NETBSD_TOOLDIR} USETOOLS=yes"

# @FUNCTION: netbsd_create_dirs
# @USAGE: <pattern>
# @DESCRIPTION:
# This function is used before invoking "make install". A common problem, while invoking "make install",
# is that make doesn't create directories in DESTDIR before installing files.
# I've noticed that NetBSD system directory hierarchy is described in /etc/mtree so we just need
# to use this file to construct the hierarchy of the directory we want to build inside our DESTDIR.
# For example, if I want to create /usr/share directory hierarchy, I just need to use the function
# like this: netbsd_create_dirs usr/share and it will create every directories and sub-directories
# in DESTDIR (which is ${D}).
netbsd_create_dirs() {
  if [ ! ${1} ]; then
    eerror "You must provide an argument to match!"
    eerror "Please read netbsd.eclass for more information."
    die
  else
    grep "${1}" "${NETBSD_SRC_DIR}/etc/mtree/NetBSD.dist" | sed "s/^.\///g" | xargs dodir
  fi
}

# @FUNCTION: netbsd_clean_dirs
# @USAGE: <directory>
# @DESCRIPTION:
# Clean empty directories in target directory. 
# Useful after using netbsd_create_dirs functions (which could create a lot of directories.
netbsd_clean_dirs() {
  if [ ! ${1} ]; then
    eerror "You must provide a directory to search into!"
    eerror "Please read netbsd.eclass for more information."
    die
  else
    DIRS=`find ${1} -type d`
    for i in ${DIRS}
    do
      if [ ! "$(ls -A ${i})" ]; then
        rm -rf ${i}
      fi
    done
  fi
}

# @FUNCTION: netbsd_mk_prepatch
# @USAGE: <>
# @DESCRIPTION:
# Function used to copy original Makefile before applying patches.
netbsd_mk_prepatch() {
  if [ ! -e Makefile.orig ]; then
    cp Makefile Makefile.orig
  else
    cp Makefile.orig Makefile
  fi
}

# @FUNCTION: netbsd_src_compile
# @USAGE: <>
# @DESCRIPTION:
# Function used to compile sources, using bsdmake.
netbsd_src_compile() {
  mymakeopts="${mymakeopts}"

  [[ -z ${BMAKE} ]] && BMAKE="$(get_bmake)"
  ${BMAKE} ${MAKEOPTS} ${EXTRA_EMAKE} ${mymakeopts} "$@" || die "make failed"
}

# @FUNCTION: netbsd_src_install
# @USAGE: <>
# @DESCRIPTION:
# Function used to install sources, using bsdmake.
netbsd_src_install() {
  mymakeopts="${mymakeopts} DESTDIR=${D}"

  [[ -z ${BMAKE} ]] && BMAKE="$(get_bmake)"
  ${BMAKE} ${MAKEOPTS} ${EXTRA_EMAKE} ${mymakeopts} "$@" || die "make install failed"
}

# @FUNCTION: netbsd_src_unpack
# @USAGE: <>
# @DESCRIPTION:
# Function used to fetch sources through CVS
netbsd_src_unpack() {
  # We use CVS eclass
  inherit cvs

  # Set up ${NETBSD_SRC_DIR}
  if [ ! -d ${NETBSD_SRC_DIR} ]; then
      mkdir -p ${NETBSD_SRC_DIR}
  fi

  # For all the ebuilds I've coded, I've worked with NetBSD 5.0-RELEASE, which is the final release for 5.0 branch.
  # ex: NETBSD_CVS_TAG="netbsd-5-0-RELEASE"
  # Default, if not set, is "netbsd-5-0-RELEASE"
  if [ -z ${NETBSD_CVS_TAG} ]; then
      NETBSD_CVS_TAG="netbsd-5-0-RELEASE"
      export NETBSD_CVS_TAG
  fi

  # CVS options
  ECVS_SERVER="anoncvs.NetBSD.org:/cvsroot"
  ECVS_AUTH="pserver"
  ECVS_USER="anoncvs"
  ECVS_PASS="anoncvs"
  # We fetch the whole src directory
  ECVS_MODULE="-r ${NETBSD_CVS_TAG} -P src"
  ECVS_TOP_DIR=""

  # We finally fetch the sources 
  cd ${NETBSD_SRC_DIR}/..
  cvs_src_unpack
}