aboutsummaryrefslogtreecommitdiff
path: root/README.md
blob: e024492c7eaa969e179fa276daa75eb42a0be288 (plain) (blame)
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
176
# Simple Package Manager (SPM)

[![CircleCI](https://circleci.com/gh/jhunkeler/spmc/tree/master.svg?style=svg)](https://circleci.com/gh/jhunkeler/spmc/tree/master)

A basic userland package management system with a few humble goals:

- To be simple and easy to use
- To support Linux, MacOS (not yet), and Windows (not yet)
- To avoid using `root` (or administrative accounts in general) to install software
- To keep your Monday mornings and Friday evenings pain free

## Build requirements

- cmake (https://cmake.org)
- curl (https://curl.haxx.se)
- gcc (https://gcc.gnu.org)
- make (https://www.gnu.org/software/make)
- openssl (https://www.openssl.org)
- bsdtar (https://www.libarchive.org)
  - OR gnutar (https://www.gnu.org/software/tar)
- which (https://carlowood.github.io/which)

## Runtime Requirements

- file (http://darwinsys.com/file)
- patchelf (https://nixos.org/patchelf.html)
- objdump (https://www.gnu.org/software/binutils)
- reloc (https://github.com/jhunkeler/reloc)
- rsync (https://rsync.samba.org)
- bsdtar (https://www.libarchive.org)
  - OR gnutar (https://www.gnu.org/software/tar)
- which (https://carlowood.github.io/which)

## Installation

### Dependencies

#### CentOS 7+

```bash
$ yum install epel-release
$ yum install -y binutils cmake3 curl-devel file gcc gcc-c++ gcc-gfortran glibc-devel \
    make openssl-devel patchelf rsync bsdtar which
```

#### Arch

```bash
$ pacman -S binutils cmake curl file gcc gcc-c++ gcc-gfortran openssl make patchelf \
    rsync libarchive which
```

### Install reloc

```bash
$ git clone https://github.com/jhunkeler/reloc
$ cd reloc
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=Release
```

### Install SPM

```bash
$ git clone https://github.com/jhunkeler/spmc
$ cd spmc
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=Release
$ make install
```

### Developing SPM

```bash
$ git clone https://github.com/jhunkeler/spm
$ cd spm
$ mkdir build
$ cmake ..
```

## Configuration

_TODO_

## Usage

```bash
$ spm --help
usage: spm [-hVvBIRrmMLS]
  -h,  --help                show this help message
  -V,  --version             show version
  -v,  --verbose             show more information (additive)
  -y   --yes                 do not prompt
  -B,  --build               build package(s)
  -I,  --install             install package(s)
  -R   --remove              remove package(s)
  -r,  --root                installation prefix (requires --install)
  -m   --manifest            specify a package manifest to use
  -M   --override-manifests  disable default package manifest location
  -L,  --list                list available packages
  -S,  --search              search for a package
       --cmd                 execute an internal spm command
       
$ spm --cmd
possible commands:
  mkprefixbin          - generate prefix manifest (binary)
  mkprefixtext         - generate prefix manifest (text)
  mkmanifest           - generate package repository manifest
  mkruntime            - emit runtime environment (stdout)
  mirror_clone         - mirror a mirror     
  rpath_set            - modify binary RPATH 
  rpath_autoset        - determine nearest lib directory and set RPATH
  get_package_ext      - show the default archive extension
  get_sys_target       - show this system's arch/platform
  check_rt_env         - check the integrity of the calling runtime environment       
```

### Example

#### List available packages
```bash
$ spm --list
#-------------------------------------------------------------------------------
# name               version        size     origin
#-------------------------------------------------------------------------------
autoconf             2.69-0      883.65K     https://astroconda.org/spm/Linux/x86_64
automake             1.16.1-0    656.70K     https://astroconda.org/spm/Linux/x86_64
binutils             2.34-0        6.33M     https://astroconda.org/spm/Linux/x86_64
bison                3.4.2-0     751.46K     https://astroconda.org/spm/Linux/x86_64
bzip2                1.0.8-0     229.04K     https://astroconda.org/spm/Linux/x86_64
cmake                3.15.5-0     14.37M     https://astroconda.org/spm/Linux/x86_64
curl                 7.66.0-0      1.01M     https://astroconda.org/spm/Linux/x86_64
diffutils            3.7-0       547.74K     https://astroconda.org/spm/Linux/x86_64
e2fsprogs            1.45.4-0     73.35K     https://astroconda.org/spm/Linux/x86_64
filesystem           1.0.0-0        567B     https://astroconda.org/spm/Linux/x86_64
findutils            4.7.0-0     777.81K     https://astroconda.org/spm/Linux/x86_64
gcc                  8.4.0-0      57.89M     https://astroconda.org/spm/Linux/x86_64
# [...]
```

#### Search for a package
```bash
$ spm --search python
#-------------------------------------------------------------------------------
# name               version        size     origin
#-------------------------------------------------------------------------------
python               3.8.2-0      26.05M     https://astroconda.org/spm/Linux/x86_64
```

#### Install a package
```bash
$ spm --root ~/spmenv123 --install "python" # [...]
```

#### Export environment variables

```bash
$ spm --mkruntime ~/spmenv123 > ~/spmenv123/bin/activate
$ source ~/spmenv123/bin/activate
```

#### Use package

```bash
$ python -m ensurepip
$ python -m venv ~/spmenv123/venv
$ source ~/spmenv123/venv/bin/activate
(venv) $ pip install https://github.com/spacetelescope/jwst.git#egg=jwst
# ... do work
```

## Building SPM Packages

See the [spm_packages](https://github.com/jhunkeler/spm_packages) repository.