Skip to content

Commit 38a49df

Browse files
authored
Merge pull request #4 from postfinance/feature/build-essential
feat(build-essential): add build-essential feature
2 parents 87eff6d + d397078 commit 38a49df

11 files changed

Lines changed: 175 additions & 0 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ jobs:
1616
matrix:
1717
feature: [
1818
"browsers",
19+
"build-essential",
1920
"docker-out",
2021
"git-lfs",
2122
"go",

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Below is a list with included features, click on the link for more details.
1616
| Name | Description |
1717
| --- | --- |
1818
| [browsers](./features/src/browsers/README.md) | A package which installs various browsers. |
19+
| [build-essential](./features/src/build-essential/README.md) | Installs essential build tools (e.g., gcc, g++, make, libc-dev) for compiling C/C++ and |
1920
| [docker-out](./features/src/docker-out/README.md) | A feature which installs the Docker client and re-uses the host socket. |
2021
| [git-lfs](./features/src/git-lfs/README.md) | A feature which installs Git LFS. |
2122
| [go](./features/src/go/README.md) | A feature which installs Go. |

build/build.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121

2222
var featureList = []string{
2323
"browsers",
24+
"build-essential",
2425
"docker-out",
2526
"git-lfs",
2627
"go",
@@ -62,6 +63,17 @@ func init() {
6263
return publishFeature("browsers")
6364
})
6465

66+
////////// build-essential
67+
gotaskr.Task("Feature:build-essential:Package", func() error {
68+
return packageFeature("build-essential")
69+
})
70+
gotaskr.Task("Feature:build-essential:Test", func() error {
71+
return testFeature("build-essential")
72+
})
73+
gotaskr.Task("Feature:build-essential:Publish", func() error {
74+
return publishFeature("build-essential")
75+
})
76+
6577
////////// docker-out
6678
gotaskr.Task("Feature:docker-out:Package", func() error {
6779
return packageFeature("docker-out")
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
## Notes
2+
3+
### System Compatibility
4+
5+
Debian, Ubuntu
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Build Essential (build-essential)
2+
3+
A package which installs build essentials like gcc.
4+
5+
## Example Usage
6+
7+
```json
8+
"features": {
9+
"ghcr.io/postfinance/devcontainer-features/build-essential:0.1.0": {
10+
"version": "latest"
11+
}
12+
}
13+
```
14+
15+
## Options
16+
17+
| Option | Description | Type | Default Value | Proposals |
18+
|-----|-----|-----|-----|-----|
19+
| version | The version of the build essential package to install. | string | latest | latest, 12.9 |
20+
21+
## Notes
22+
23+
### System Compatibility
24+
25+
Debian, Ubuntu
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"id": "build-essential",
3+
"version": "0.1.0",
4+
"name": "Build Essential",
5+
"description": "A package which installs build essentials like gcc.",
6+
"options": {
7+
"version": {
8+
"type": "string",
9+
"proposals": [
10+
"latest",
11+
"12.9"
12+
],
13+
"default": "latest",
14+
"description": "The version of the build essential package to install."
15+
}
16+
}
17+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
. ./functions.sh
2+
3+
"./installer_$(detect_arch)" \
4+
-version="${VERSION:-"latest"}"
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package main
2+
3+
import (
4+
"builder/installer"
5+
"flag"
6+
"fmt"
7+
"os"
8+
"regexp"
9+
"strings"
10+
11+
"github.com/roemer/gotaskr/execr"
12+
"github.com/roemer/gover"
13+
)
14+
15+
//////////
16+
// Configuration
17+
//////////
18+
19+
const packageName = "build-essential"
20+
21+
var versionOnlyRegex *regexp.Regexp = regexp.MustCompile(`[^\|]*\|\s+([^\|]*)\s+\|.*$`)
22+
var buildEssentialVersionRegex *regexp.Regexp = regexp.MustCompile(`^(?P<d1>\d+)\.(?P<d2>\d+)`)
23+
24+
//////////
25+
// Main
26+
//////////
27+
28+
func main() {
29+
if err := runMain(); err != nil {
30+
fmt.Printf("Error: %v\n", err)
31+
os.Exit(1)
32+
}
33+
}
34+
35+
func runMain() error {
36+
// Handle the flags
37+
version := flag.String("version", "latest", "The version of build-essential to install.")
38+
flag.Parse()
39+
40+
// Create and process the feature
41+
feature := installer.NewFeature("Build Essential", true,
42+
&buildEssentialComponent{
43+
ComponentBase: installer.NewComponentBase(packageName, *version),
44+
})
45+
return feature.Process()
46+
}
47+
48+
//////////
49+
// Implementation
50+
//////////
51+
52+
type buildEssentialComponent struct {
53+
*installer.ComponentBase
54+
}
55+
56+
func (c *buildEssentialComponent) GetAllVersions() ([]*gover.Version, error) {
57+
if err := execr.Run(true, "apt-get", "update"); err != nil {
58+
return []*gover.Version{}, err
59+
}
60+
61+
str1, _, err := execr.RunGetOutput(true, "apt-cache", "madison", packageName)
62+
if err != nil {
63+
return []*gover.Version{}, err
64+
}
65+
66+
allFiles := strings.Split(str1, "\n")
67+
allVersions := []*gover.Version{}
68+
for _, item := range allFiles {
69+
matches := versionOnlyRegex.FindStringSubmatch(item)
70+
if matches == nil {
71+
continue
72+
}
73+
allVersions = append(allVersions, gover.MustParseVersionFromRegex(matches[1], buildEssentialVersionRegex))
74+
}
75+
76+
return allVersions, nil
77+
}
78+
79+
func (c *buildEssentialComponent) InstallVersion(version *gover.Version) error {
80+
if version == gover.EmptyVersion {
81+
return installer.Tools.Apt.InstallDependencies(packageName, "pkg-config", "libpcsclite-dev")
82+
} else {
83+
return installer.Tools.Apt.InstallDependencies(fmt.Sprintf(packageName+"=%s", version.Raw), "pkg-config", "libpcsclite-dev")
84+
}
85+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/bin/bash
2+
set -e
3+
4+
[[ -f "$(dirname "$0")/../functions.sh" ]] && source "$(dirname "$0")/../functions.sh"
5+
[[ -f "$(dirname "$0")/functions.sh" ]] && source "$(dirname "$0")/functions.sh"
6+
7+
check_package_installed build-essential
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"install": {
3+
"build": {
4+
"dockerfile": "Dockerfile",
5+
"options": [
6+
"--add-host=host.docker.internal:host-gateway"
7+
]
8+
},
9+
"features": {
10+
"./build-essential": {}
11+
}
12+
}
13+
}

0 commit comments

Comments
 (0)