summaryrefslogtreecommitdiff
path: root/habitat/plan.sh
blob: 6e113e8a9543375bd332e60b3a566d90fc830882 (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
pkg_name=chef-infra-client
pkg_origin=chef
pkg_maintainer="The Chef Maintainers <humans@chef.io>"
pkg_description="The Chef Infra Client"
pkg_license=('Apache-2.0')
pkg_bin_dirs=(bin)
_chef_client_ruby="core/ruby27"
pkg_build_deps=(
  core/make
  core/gcc
  core/git
)
pkg_deps=(
  core/glibc
  $_chef_client_ruby
  core/libxml2
  core/libxslt
  core/libiconv
  core/xz
  core/zlib
  core/openssl
  core/cacerts
  core/libffi
  core/coreutils
  core/libarchive
)
pkg_svc_user=root

pkg_version() {
  cat "${SRC_PATH}/VERSION"
}

do_before() {
  do_default_before
  update_pkg_version
  # We must wait until we update the pkg_version to use the pkg_version
  pkg_filename="${pkg_name}-${pkg_version}.tar.gz"
}

do_download() {
  build_line "Locally creating archive of latest repository commit at ${HAB_CACHE_SRC_PATH}/${pkg_filename}"
  # source is in this repo, so we're going to create an archive from the
  # appropriate path within the repo and place the generated tarball in the
  # location expected by do_unpack
  ( cd "${SRC_PATH}" || exit_with "unable to enter hab-src directory" 1
    git archive --prefix="${pkg_name}-${pkg_version}/" --output="${HAB_CACHE_SRC_PATH}/${pkg_filename}" HEAD
  )
}

do_verify() {
  build_line "Skipping checksum verification on the archive we just created."
  return 0
}

do_prepare() {
  export OPENSSL_LIB_DIR=$(pkg_path_for openssl)/lib
  export OPENSSL_INCLUDE_DIR=$(pkg_path_for openssl)/include
  export SSL_CERT_FILE=$(pkg_path_for cacerts)/ssl/cert.pem

  build_line "Setting link for /usr/bin/env to 'coreutils'"
  if [ ! -f /usr/bin/env ]; then
    ln -s "$(pkg_interpreter_for core/coreutils bin/env)" /usr/bin/env
  fi
}

do_build() {
  local _libxml2_dir
  local _libxslt_dir
  local _zlib_dir
  export CPPFLAGS
  export GEM_HOME
  export GEM_PATH
  export NOKOGIRI_CONFIG

  _libxml2_dir=$(pkg_path_for libxml2)
  _libxslt_dir=$(pkg_path_for libxslt)
  _zlib_dir=$(pkg_path_for zlib)

  CPPFLAGS="${CPPFLAGS} ${CFLAGS}"
  GEM_HOME=${pkg_prefix}/bundle
  GEM_PATH=${GEM_HOME}
  NOKOGIRI_CONFIG="--use-system-libraries \
    --with-zlib-dir=${_zlib_dir} \
    --with-xslt-dir=${_libxslt_dir} \
    --with-xml2-include=${_libxml2_dir}/include/libxml2 \
    --with-xml2-lib=${_libxml2_dir}/lib"

  build_line "Executing bundle install inside hab-cache path. ($CACHE_PATH/chef-config)"
  ( cd "$CACHE_PATH/chef-config" || exit_with "unable to enter hab-cache directory" 1
    bundle config --local build.nokogiri "${NOKOGIRI_CONFIG}"
    bundle config --local silence_root_warning 1
    _bundle_install "${pkg_prefix}/bundle"
  )

  build_line "Executing bundle install inside source path. ($SRC_PATH)"
  _bundle_install "${pkg_prefix}/bundle"
}

do_install() {
  build_line "Copying directories from source to pkg_prefix"
  mkdir -p "${pkg_prefix}/chef"
  for dir in bin chef-bin chef-config chef-utils lib chef.gemspec Gemfile Gemfile.lock; do
    cp -rv "${SRC_PATH}/${dir}" "${pkg_prefix}/chef/"
  done

  # If we generated them on install, bundler thinks our source is in $HAB_CACHE_SOURCE_PATH
  build_line "Generating binstubs with the correct path"
  ( cd "$pkg_prefix/chef" || exit_with "unable to enter pkg prefix directory" 1
    _bundle_install \
      "${pkg_prefix}/bundle" \
      --local \
      --quiet \
      --binstubs "${pkg_prefix}/bin"
  )

  build_line "Fixing bin/ruby and bin/env interpreters"
  fix_interpreter "${pkg_prefix}/bin/*" core/coreutils bin/env
  fix_interpreter "${pkg_prefix}/bin/*" "$_chef_client_ruby" bin/ruby
}

do_end() {
  if [ "$(readlink /usr/bin/env)" = "$(pkg_interpreter_for core/coreutils bin/env)" ]; then
    build_line "Removing the symlink we created for '/usr/bin/env'"
    rm /usr/bin/env
  fi
}

do_strip() {
  return 0
}

# Helper function to wrap up some repetitive bundle install flags
_bundle_install() {
  local path
  path="$1"
  shift

  bundle install ${*:-} \
    --jobs "$(nproc)" \
    --without development:test:docgen \
    --path "$path" \
    --shebang="$(pkg_path_for "$_chef_client_ruby")/bin/ruby" \
    --no-clean \
    --retry 5 \
    --standalone
}