summaryrefslogtreecommitdiff
path: root/poky/documentation/tools/build-docs-container
blob: 6b4d4254342bd00a1c1ba6758075bd1720334888 (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
166
167
168
169
170
171
172
173
174
175
#!/usr/bin/env bash
# -*- vim: set expandtab tabstop=2 shiftwidth=2:
#
# Build a container ready to build the documentation be reading the dependencies
# listed in shell scripts in documentation/tools/host_packages_scripts, and
# start a documentation build in this container.
#
# Usage:
#
#   ./documentation/tools/build-docs-container <image> [<make target>]
#
# e.g.:
#
#   ./documentation/tools/build-docs-container ubuntu:24.04 html
#
# Will build the docs in an Ubuntu 24.04 container in html.
#
# The container engine can be selected by exporting CONTAINERCMD in the
# environment. The default is docker, but podman can also be used.

set -eu -o pipefail

SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
CONTAINERCMD=${CONTAINERCMD:-docker}
DOCS_DIR="$SCRIPT_DIR/../.."
SH_DIR="$SCRIPT_DIR/host_packages_scripts"

function usage()
{
  echo "$0 -- script to build documentation from within a container

$0 OCI_IMAGE [make arguments...]

   OCI_IMAGE is an image:tag of an OCI image hosted on hub.docker.com. It is one
   of:
     - debian:12
     - fedora:38
     - fedora:39
     - fedora:40
     - leap:15.4
     - leap:15.5
     - ubuntu:22.04
     - ubuntu:24.04

   [make arguments] is one or more argument to pass to the make command of
   documentation/Makefile, see that file for what's supported. This is typically
   intended to be used to provide specific make targets.
   Default: publish
"
}

main ()
{
  if [ "$#" -lt 1 ]; then
    usage
    exit 1
  fi

  local image="$1"
  shift

  OCI=$(which "$CONTAINERCMD")

  # docker build doesn't accept 2 colons, so "sanitize" the name
  local sanitized_dockername
  sanitized_dockername=$(echo "$image" | tr ':.' '-')

  local version
  version=$(echo "$image" | awk -F: '{print $NF}')

  case $image in
    # Missing latexmk texlive-gnu-freefont packages at the very least
    # "almalinux:8"*|\
    # "almalinux:9"*)
    #   containerfile=Containerfile.almalinux
    #   docs=almalinux_docs.sh
    #   docs_pdf=almalinux_docs_pdf.sh
    #   pip3=pip3_docs.sh
    #   ;;
    # Missing python3-saneyaml
    # "debian:11"*|\
    "debian:12"*)
      containerfile=Containerfile.debian
      docs=ubuntu_docs.sh
      docs_pdf=ubuntu_docs_pdf.sh
      ;;
    "fedora:38"*|\
    "fedora:39"*|\
    "fedora:40"*)
      containerfile=Containerfile.fedora
      docs=fedora_docs.sh
      docs_pdf=fedora_docs_pdf.sh
      pip3=pip3_docs.sh
      ;;
    "leap:15.4"*|\
    "leap:15.5"*)
    # Seems like issue with permissions package, c.f.
    #
    # Updating /etc/sysconfig/security ...
    # /dev/zero: chown: Permission denied
    # /dev/null: chown: Permission denied
    # /dev/full: chown: Permission denied
    # ERROR: not all operations were successful.
    # Checking permissions and ownerships - using the permissions files
    # 	/etc/permissions
    # 	/etc/permissions.easy
    # 	/etc/permissions.local
    # setting / to root:root 0755. (wrong permissions 0555)
    # setting /dev/zero to root:root 0666. (wrong owner/group 65534:65534)
    # setting /dev/null to root:root 0666. (wrong owner/group 65534:65534)
    # setting /dev/full to root:root 0666. (wrong owner/group 65534:65534)
    # warning: %post(permissions-20240826-150600.10.12.1.x86_64) scriptlet failed, exit status 1
    #
    # "leap:15.6"*)
      image=opensuse/leap:$version
      containerfile=Containerfile.zypper
      docs=opensuse_docs.sh
      docs_pdf=opensuse_docs_pdf.sh
      pip3=pip3_docs.sh
      ;;
    # Missing python3-saneyaml
    # "ubuntu:18.04"*|\
    # "ubuntu:20.04"*|\
    # Cannot fetch packages anymore
    # "ubuntu:23.04"*|\
    "ubuntu:22.04"*|\
    "ubuntu:24.04"*)
      containerfile=Containerfile.ubuntu
      docs=ubuntu_docs.sh
      docs_pdf=ubuntu_docs_pdf.sh
      ;;
    *)
      echo "$image not supported!"
      usage
      exit 1
      ;;
  esac

  $OCI build \
    --tag "yocto-docs-$sanitized_dockername:latest" \
    --build-arg ARG_FROM="docker.io/$image" \
    --build-arg DOCS="$docs" \
    --build-arg DOCS_PDF="$docs_pdf" \
    --build-arg PIP3="${pip3:-}" \
    --file "$SCRIPT_DIR/$containerfile" \
    "$SH_DIR/"

  local -a args_run=(
    --rm
    --interactive
    --tty
    --volume="$DOCS_DIR:/docs:rw"
    --workdir=/docs
    --security-opt label=disable
  )

  if [ "$OCI" = "docker" ]; then
    args_run+=(
      --user="$(id -u)":"$(id -g)"
    )
  elif [ "$OCI" = "podman" ]; then
    # we need net access to fetch bitbake terms
    args_run+=(
      --cap-add=NET_RAW
      --userns=keep-id
    )
  fi

  $OCI run \
    "${args_run[@]}" \
    "yocto-docs-$sanitized_dockername" \
    "$@"
}

main "$@"