aboutsummaryrefslogtreecommitdiff
path: root/README.md
blob: ee7f7933f97485676b0a62a707d415c76321e427 (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
176
177
178
179
180
181
182
183
184
185
186
187
Turris repository builder
=========================
This implements simple script that alows you to build  additional packages for
Turris routers. Idea is that you can use this to create either permanent or
testing builds.

You have to use machine with amd64 architecture and GNU and Linux base
distribution because this tool uses precompiled OpenWRT SDK that was compiled on
such machine and won't work on any other architecture. Also you need dependencies
as for standard OpenWRT build (those can be found in OpenWRT documentation). On
top of that a ccache was used on original build machine so you have to have it
installed too.

Before first usage
------------------
Before first usage you have to create package that is going to define your
repository. This will give you an easy way to install your repository on router.
Let's create package `myrepo` for this (of course you should name it some more
appropriate way). First create directory names `myrepo` and then `Makefile` file
inside it. That `Makefile` should contain something like this:
```Makefile
include $(TOPDIR)/rules.mk

PKG_NAME:=<YOUR_REPO_NAME>
PKG_VERSION:=1
PKG_MAINTAINER:=<YOUR FULL NAME AND EMAIL>
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

define Package/myrepo
	TITLE:=$(PKG_NAME)
endef

define Build/Compile
	:
endef

define Package/$(PKG_NAME)/install
	$(INSTALL_DIR) $(1)/etc/updater/keys
	$(INSTALL_DATA) ./files/key.pub $(1)/etc/updater/keys/$(PKG_NAME).pub

	$(INSTALL_DIR) $(1)/etc/updater/conf.d
	$(INSTALL_CONF) ./files/updater.lua $(1)/etc/updater/conf.d/$(PKG_NAME).lua
endef

$(eval $(call BuildPackage,$(PKG_NAME)))
```
We will return to this `Makefile` later on. Now we need to create directory
`files` containing public key and configuration for updater-ng. Let's start with
updater's configuration. We want to write it to file named `updater.lua` because
that is name we have in `Makefile`. The content should be something like this:
```Lua
local board
if model:match('[Oo]mnia') then
	board = "omnia"
else
	board = "turris"
end
Repository("<YOUR_REPO_NAME>", "https://unknown.com/" .. board .. "/", {
	pubkey = "file:///etc/updater/keys/<OUR_REPO_NAME>.pub"
})
Install("<YOUR_REPO_NAME>")
Package("<YOUR_REPO_NAME>", { replan = "finished" })
```
Of course replace `<OUR_REPO_NAME>` with your chosen name and `unknown.com` with
real address where you plan host your repository. This tells updater where it can
found your repository. There is possibility that you want to disable some security
features such as OCSP or specify CRL file. For that you should look at [updater's
documentation](https://turris.pages.labs.nic.cz/updater/).

Now let's look to keys. For simplicity you can use `generate_keys.sh` script that
is in repository it self. It uses program called usign and to compile it you need
cmake on top of OpenWRT SDK dependencies. This script will generate two files for
you: `key.pub` and `key.sec`. Move `key.pub` to `files` directory of your
repository package and let `key.sec` in current working directory.

Now you can go back to `Makefile`. Make sure that all `<YOUR_REPO_NAME>` strings
are correctly replaced with name you desire and that you have filled in your name
and email as a maintainer of that package.

Latest thing that you want optionally do is to create your own script calling
`build_repo.sh` script and then immediately uploading repository to your server.

Now you should be ready to do first testing build. This build should build package
you have just created. You can run `build_repo.sh` script in directory where you
have directory with your new  repository package and with `key.sec` file. If
everything went well then you should have directory named `repo` in your working
directory  containing opkg repository with your new package.

_todo: We should probably also configure opkg._

Usage
-----
To build some package you have to place it to directory where you have your
`key.sec`. It can't be in some subdirectory because script `build_repo.sh` handles
only top level directories that contains file `Makefile` as packages. When you
have it there then you can just run `build_repo.sh` in that top level directory.
When script exits you should have directory `repo` with your new repository.

If build for some reason failed then you can run `build_repo.sh` with arguments
`-j1 V=99` to see exactly what went wrong.

In default `build_repo.sh` builds repository for Turris Omnia. You can specify
`turris` as first argument (has to be before `-j1` for example)  to build packages
for Turris 1.x. Or you can specify `all` to build both. Just to completeness
script also accepts `omnia` as first argument to build for Turris Omnia (default
behavior).

If you need some changes to configuration (such as enable/disable some additional
features for OpenWRT) then you can also create file `CONFIG` in top level
directory of your myrepo directory. Content of this file is appended to `.config`
in sdk and that way is used during build. But be aware that using `CONFIG` can
potentially cause rebuild of packages you haven't provided and you can end up with
dependency nightmare.

Always building latest commit
-----------------------------
As part of this repository is also a highly experimental pkgauto.mk extension.
This is deployed to common include paths of packages and allows you to always
build top most commit in specified branch. This is very handy for development
purposes.

Only supported protocol is git.

To use this you have to first define `PKG_NAME`, `PKG_SOURCE_URL` and
`PKG_SOURCE_BRANCH` variables (same as for any other OpenWRT package). Afterwards
you have to include file `$(INCLUDE_DIR)/pkgauto.mk`. This file will clone
repository specified by `PKG_SOURCE_URL` to directory `.pkgauto` in current
working directory. From this the variables `PKG_SOURCE_VERSION`, `PKG_VERSION` and
`PKG_RELEASE` are deduced as follows:

* `PKG_SOURCE_VERSION`: This is filed in with hash of latest commit from
  `PKG_SOURCE_BRANCH` branch.
* `PKG_VERSION`: This look for latest version tag on specified branch. Version
  tags are understood as all tags starting with `v`.  `v` is cut off and rest is
  considered as base version for this package. To ensure that this package will
  always be preferred no matter on `PKG_RELEASE` it also appends `.9999`. If it
  locates no such commit then it uses `9999` as `PKG_VERSION` and fills
  `PKG_RELEASE` with number of commit since initial commit.
* `PKG_RELEASE`: This is fill with number of commit since `PKG_VERSION`. To
  understand this more read description for `PKG_VERSION`.

On top of these variables it also defines some less dynamic variables. Following
variables are defined with specified values:
```Makefile
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
PKG_SOURCE_SUBDIR:=$(PKG_NAME)
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)
```

To give some example here is head of python3-periphery package Makefile with
explicit version:
```Makefile
include $(TOPDIR)/rules.mk

PKG_NAME:=python3-periphery
PKG_VERSION:=v1.1.0
PKG_RELEASE:=1
PKG_LICENSE:=MIT

PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/vsergeev/python-periphery.git
PKG_SOURCE_VERSION:=$(PKG_VERSION)
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)

include $(INCLUDE_DIR)/package.mk
$(call include_mk, python3-package.mk)
```
And here is same package with `pkgauto.mk` used:
```Makefile
include $(TOPDIR)/rules.mk

PKG_NAME:=python3-periphery
PKG_LICENSE:=MIT

PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/vsergeev/python-periphery.git
PKG_SOURCE_BRANCH:=HEAD

include $(INCLUDE_DIR)/pkgauto.mk
include $(INCLUDE_DIR)/package.mk
$(call include_mk, python3-package.mk)
```