feat: add arch packaging
This commit is contained in:
parent
5469fdcf92
commit
ccd07141f5
3
.gitignore
vendored
3
.gitignore
vendored
@ -2,3 +2,6 @@ out/
|
|||||||
examples/
|
examples/
|
||||||
compile_commands.json
|
compile_commands.json
|
||||||
.cache/
|
.cache/
|
||||||
|
*.tar.gz
|
||||||
|
*.log
|
||||||
|
*.zst
|
||||||
|
59
Makefile
59
Makefile
@ -2,9 +2,13 @@
|
|||||||
# See LICENSE file for copyright and license details.
|
# See LICENSE file for copyright and license details.
|
||||||
# Note: If you're confused by the makefile, I do emplore you to read the info-page: $ info make
|
# Note: If you're confused by the makefile, I do emplore you to read the info-page: $ info make
|
||||||
.POSIX:
|
.POSIX:
|
||||||
|
|
||||||
NAME=sci
|
NAME=sci
|
||||||
DESCRIPTION=$(NAME) is a simple contiuous integration system.
|
DESCRIPTION=$(NAME) is a simple contiuous integration system.
|
||||||
VERSION = 0.1.0
|
VERSION = 1.0.0
|
||||||
|
PREFIX = /usr/local
|
||||||
|
MANPREFIX = $(PREFIX)/share/man
|
||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
OUTDIR := out/
|
OUTDIR := out/
|
||||||
OBJDIR := out/obj
|
OBJDIR := out/obj
|
||||||
@ -14,11 +18,11 @@ CFLAGS += -DSCI_NAME="\"$(NAME)\""
|
|||||||
CFLAGS += -DSCI_DESCRIPTION="\"$(DESCRIPTION)\""
|
CFLAGS += -DSCI_DESCRIPTION="\"$(DESCRIPTION)\""
|
||||||
CFLAGS += -D_POSIX_C_SOURCE=2
|
CFLAGS += -D_POSIX_C_SOURCE=2
|
||||||
CFLAGS += -D_GNU_SOURCE
|
CFLAGS += -D_GNU_SOURCE
|
||||||
CFLAGS += -Wall -Werror -std=c23 -g
|
CFLAGS += -Wall -Werror -std=c11 -g
|
||||||
CFLAGS += -Iinclude
|
CFLAGS += -Iinclude
|
||||||
CFLAGS += -lpthread -luuid
|
CFLAGS += -lpthread -luuid
|
||||||
|
|
||||||
.PHONY: all clean
|
.PHONY: all clean dist install
|
||||||
|
|
||||||
all: out/bin/sci
|
all: out/bin/sci
|
||||||
|
|
||||||
@ -38,6 +42,7 @@ out/bin/sci: $(OBJ) | $(BINDIR)
|
|||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf $(OUTDIR)
|
rm -rf $(OUTDIR)
|
||||||
|
rm -rf $(NAME)-$(VERSION)
|
||||||
|
|
||||||
$(OUTDIR):
|
$(OUTDIR):
|
||||||
mkdir -p $@
|
mkdir -p $@
|
||||||
@ -48,20 +53,34 @@ $(OBJDIR): $(OUTDIR)
|
|||||||
$(BINDIR): $(OUTDIR)
|
$(BINDIR): $(OUTDIR)
|
||||||
mkdir -p $@
|
mkdir -p $@
|
||||||
|
|
||||||
# dist: clean
|
dist:
|
||||||
# mkdir -p st-$(VERSION)
|
mkdir -p $(NAME)-$(VERSION)
|
||||||
# cp -R FAQ LEGACY TODO LICENSE Makefile README config.mk\
|
cp -R \
|
||||||
# config.def.h st.info st.1 arg.h st.h win.h $(SRC)\
|
TODO.md README.md\
|
||||||
# st-$(VERSION)
|
Makefile src include\
|
||||||
# tar -cf - st-$(VERSION) | gzip > st-$(VERSION).tar.gz
|
$(NAME)-$(VERSION)
|
||||||
# rm -rf st-$(VERSION)
|
tar -cf - $(NAME)-$(VERSION) | gzip > $(NAME)-$(VERSION).tar.gz
|
||||||
#
|
rm -rf $(NAME)-$(VERSION)
|
||||||
# install: st
|
|
||||||
# mkdir -p $(DESTDIR)$(PREFIX)/bin
|
# NOTE: DESTDIR is meant for making packaging easier.
|
||||||
# cp -f st $(DESTDIR)$(PREFIX)/bin
|
# If you want to install in a different directory than the default, please
|
||||||
# chmod 755 $(DESTDIR)$(PREFIX)/bin/st
|
# use: # make install PREFIX=/custom/path
|
||||||
# mkdir -p $(DESTDIR)$(MANPREFIX)/man1
|
install: out/bin/sci
|
||||||
# sed "s/VERSION/$(VERSION)/g" < st.1 > $(DESTDIR)$(MANPREFIX)/man1/st.1
|
mkdir -p $(DESTDIR)$(PREFIX)/bin
|
||||||
# chmod 644 $(DESTDIR)$(MANPREFIX)/man1/st.1
|
# install binaries
|
||||||
# tic -sx st.info
|
cp -f out/bin/sci $(DESTDIR)$(PREFIX)/bin
|
||||||
# @echo Please see the README file regarding the terminfo entry of st.
|
chmod 755 $(DESTDIR)$(PREFIX)/bin/sci
|
||||||
|
# install libraries
|
||||||
|
# install services (only if system is using systemd though)
|
||||||
|
# install manpages
|
||||||
|
mkdir -p $(DESTDIR)$(MANPREFIX)/man1
|
||||||
|
sed "s/VERSION/$(VERSION)/g" < src/sci.1 > $(DESTDIR)$(MANPREFIX)/man1/sci.1
|
||||||
|
chmod 644 $(DESTDIR)$(MANPREFIX)/man1/sci.1
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
# uninstall binaries
|
||||||
|
rm -f $(DESTDIR)$(PREFIX)/bin/sci
|
||||||
|
# uninstall libraries
|
||||||
|
# uninstall services (only if system is using systemd though)
|
||||||
|
# uninstall manpages
|
||||||
|
rm -f $(DESTDIR)$(MANPREFIX)/man1/sci.1
|
||||||
|
36
PKGBUILD
Normal file
36
PKGBUILD
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
# Maintainer: Asger Gitz-Johansen <asger.gitz@hotmail.com>
|
||||||
|
pkgname=sci
|
||||||
|
pkgver=1.0.0
|
||||||
|
pkgrel=1
|
||||||
|
epoch=
|
||||||
|
pkgdesc="A simple / minimal CI (Continuous Integration) system"
|
||||||
|
arch=('x86_64') # TODO: also arm64 when you're not tired
|
||||||
|
url="gitea.local:3000/agj/sci"
|
||||||
|
license=('GPL-3.0-or-later') # TODO: add LICENSE file and header
|
||||||
|
groups=()
|
||||||
|
depends=("glibc"
|
||||||
|
"util-linux-libs")
|
||||||
|
makedepends=()
|
||||||
|
checkdepends=()
|
||||||
|
optdepends=()
|
||||||
|
provides=()
|
||||||
|
conflicts=()
|
||||||
|
replaces=()
|
||||||
|
backup=()
|
||||||
|
options=()
|
||||||
|
install=
|
||||||
|
changelog=
|
||||||
|
source=("$pkgname-$pkgver.tar.gz")
|
||||||
|
noextract=()
|
||||||
|
sha256sums=("948092bdcc3591afcdc205263832a06c838aa9d524c762b061e91cffa04b7d63")
|
||||||
|
validpgpkeys=()
|
||||||
|
|
||||||
|
build() {
|
||||||
|
cd "$pkgname-$pkgver"
|
||||||
|
make
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
cd "$pkgname-$pkgver"
|
||||||
|
make DESTDIR="$pkgdir/" PREFIX="/usr" install
|
||||||
|
}
|
100
README.md
100
README.md
@ -1,6 +1,68 @@
|
|||||||
# Suckless/Simple Continous Integration
|
# Simple CI (Continous Integration)
|
||||||
Jenkins, Travis, GitHub Actions, GitLab CI. The list goes on.
|
Jenkins, Travis, GitHub Actions, GitLab CI. The list goes on.
|
||||||
This is a minimal tool for fulfilling the CI (Continous Integration) use case.
|
There are many CI systems.
|
||||||
|
All of them overcomplicate an extremely simple use case:
|
||||||
|
"I want to trigger custom scripts (usually just a list of simple shell commands) on a server.
|
||||||
|
Either automatically, or manually.
|
||||||
|
And then I want to be follow and see any errors that may happen."
|
||||||
|
|
||||||
|
There's no need to invent the wheel 10 different times.
|
||||||
|
Most of the actions required by the CI use case can be handled with most UNIX tools such as `tail`,
|
||||||
|
`cat`, `inotify` etc.
|
||||||
|
At the core of CI must be a triggering system that can be dynamically configured to run a pipeline script.
|
||||||
|
|
||||||
|
This program provides that simple triggering system where you simply `touch` a file, and the associated
|
||||||
|
pipeline will then be executed.
|
||||||
|
You can then follow the log via `tail`.
|
||||||
|
|
||||||
|
The operation of sci is configured through a pipelines.conf configuration file (see sci(7) for
|
||||||
|
configuration language details) and each pipeline will have an associated pipeline trigger file
|
||||||
|
that can be By default, pipeline triggers are placed in /tmp/sci but this can be overridden with
|
||||||
|
the `-T` flag (WIP feature). For more commandline options see the manpage `sci(1)` or use the `--help` option.
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
Just GNU/Linux! `sci` is just using the POSIX api, so it should work with *NIX, but it has only been tested on GNU/Linux
|
||||||
|
systems.
|
||||||
|
NOTE: Not tested with `muslc` systems yet, `sci` use some libc GNU extensions, but it would be nice to support alpine
|
||||||
|
linux some time in the future.
|
||||||
|
|
||||||
|
## Build
|
||||||
|
Build the project using `make`:
|
||||||
|
```sh
|
||||||
|
make
|
||||||
|
```
|
||||||
|
|
||||||
|
## Install
|
||||||
|
Install the project:
|
||||||
|
```sh
|
||||||
|
make
|
||||||
|
sudo make install
|
||||||
|
```
|
||||||
|
|
||||||
|
By default, `sci` is installed to `/usr/local` but this can be overridden by providing the `PREFIX` var:
|
||||||
|
```sh
|
||||||
|
make
|
||||||
|
sudo make install PREFIX=/some/path
|
||||||
|
```
|
||||||
|
|
||||||
|
## Package
|
||||||
|
`sci` can be packaged for multiple distributions:
|
||||||
|
|
||||||
|
### Arch Linux
|
||||||
|
It is recommended that you use an arch linux distribution when building.
|
||||||
|
<!-- TODO: add a dockerfile for arch building -->
|
||||||
|
```sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Debian
|
||||||
|
It is recommended that you use the `deb-builder.dockerfile` docker image to build the debian image.
|
||||||
|
```sh
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Building the debian builer docker image
|
||||||
|
```sh
|
||||||
|
docker build -t debbuilder deb-builder.dockerfile .
|
||||||
|
```
|
||||||
|
|
||||||
## Brainstorm
|
## Brainstorm
|
||||||
If you dont want to congest your CI server. Too bad. Write faster ci suites. (TODO: implement runners)
|
If you dont want to congest your CI server. Too bad. Write faster ci suites. (TODO: implement runners)
|
||||||
@ -75,37 +137,3 @@ I choose `c`!
|
|||||||
|
|
||||||
I also choose `Makefile`s! - Just to force myself to use another build system than CMake!
|
I also choose `Makefile`s! - Just to force myself to use another build system than CMake!
|
||||||
If you want `compile_commands.json` files, you should use [bear](https://github.com/rizsotto/Bear) as it works well
|
If you want `compile_commands.json` files, you should use [bear](https://github.com/rizsotto/Bear) as it works well
|
||||||
|
|
||||||
### Progress
|
|
||||||
- [x] Zeroth things first, let's create a simple CLI application with `--verbosity VAL` and `--help` options.
|
|
||||||
- [x] First things first, let's implement something that reacts when some provided file changes (not poll please).
|
|
||||||
- [x] Second things second, implement a simple logging system with differing levels of verbosity and configurable
|
|
||||||
output file using cli options.
|
|
||||||
- [x] Third things third, implement a thing that simultaneously watches two different files (multithreading).
|
|
||||||
it should be cancellable with ctrl+c, but it should just contiuously print event notifications.
|
|
||||||
- [x] Fourth things fourth, implement a prototype that reads a space-separated file and populates a struct.
|
|
||||||
- [x] Fifth things fifth, implement a prototype that spawns a new thread that executes a shell command.
|
|
||||||
- [ ] Sixth things sixth, daemonize it!
|
|
||||||
- [ ] Seventh things seventh, package the sucker (arch, debian, alpine, docker)
|
|
||||||
- [ ] Eight things eight, try it out! - maybe even write the python webhook extension.
|
|
||||||
- [ ] Ninth things ninth, fix bugs, see below
|
|
||||||
- [ ] Tenth things tenth, write manpages
|
|
||||||
- [ ] Eleventh things last, release!
|
|
||||||
|
|
||||||
#### Bugs
|
|
||||||
- [ ] command output is being inherited. It should be piped into some random log-file
|
|
||||||
- [ ] pretty sure that `ctrl+c` / SIGINT is not graceful yet.
|
|
||||||
- [ ] missing license
|
|
||||||
- [ ] I am deliberately not using `Restart=on-failure` in the `scid.service` file because we are using `Type=exec`
|
|
||||||
and not `Type=notify` (yet) - which would require a `sd_notify` call of `READY=1` (see `man systemd.service`)
|
|
||||||
|
|
||||||
### Note Regarding `inotify` usage
|
|
||||||
From the manpage:
|
|
||||||
```
|
|
||||||
With careful programming, an application can use inotify to efficiently monitor and cache the state of a set of
|
|
||||||
filesystem objects. However, robust applications should allow for the fact that bugs in the monitoring logic or races
|
|
||||||
of the kind described below may leave the cache inconsistent with the filesystem state. It is probably wise to do some
|
|
||||||
consistency checking, and re‐build the cache when inconsistencies are detected.
|
|
||||||
```
|
|
||||||
i.e., we should _also_ poll the watched files every once in a while (maybe once per minute? idk) to ensure that we catch
|
|
||||||
all events.
|
|
||||||
|
61
TODO.md
Normal file
61
TODO.md
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
### Progress
|
||||||
|
- [x] Zeroth things first, let's create a simple CLI application with `--verbosity VAL` and `--help` options.
|
||||||
|
- [x] First things first, let's implement something that reacts when some provided file changes (not poll please).
|
||||||
|
- [x] Second things second, implement a simple logging system with differing levels of verbosity and configurable
|
||||||
|
output file using cli options.
|
||||||
|
- [x] Third things third, implement a thing that simultaneously watches two different files (multithreading).
|
||||||
|
it should be cancellable with ctrl+c, but it should just contiuously print event notifications.
|
||||||
|
- [x] Fourth things fourth, implement a prototype that reads a space-separated file and populates a struct.
|
||||||
|
- [x] Fifth things fifth, implement a prototype that spawns a new thread that executes a shell command.
|
||||||
|
- [x] Sixth things sixth, daemonize it!
|
||||||
|
- [ ] Seventh things seventh, package the sucker (arch, debian, alpine, docker)
|
||||||
|
- [x] archlinux
|
||||||
|
- https://wiki.archlinux.org/title/Creating_packages
|
||||||
|
- [ ] debian
|
||||||
|
- see `/home/agj/documents/Projects/packaging/deb-packaging-tutorial.pdf`
|
||||||
|
- just use docker.
|
||||||
|
- [ ] alpine
|
||||||
|
- [ ] docker
|
||||||
|
- [ ] Eight things eight, try it out! - maybe even write the python webhook extension.
|
||||||
|
- [ ] Ninth things ninth, fix bugs, see below
|
||||||
|
- [ ] Tenth things tenth, write manpages, choose license
|
||||||
|
- [ ] Eleventh things Eleventh, polish
|
||||||
|
- [ ] Twelveth things last, release!
|
||||||
|
- Setup gitea.gtz.dk (will learn you how to set up subdomains (useful for shop.gtz.dk))
|
||||||
|
|
||||||
|
BOOKMARK: You were reading :Man system.unit and :Man systemd.service as preperation on making a systemd unit file
|
||||||
|
This will be needed for the .deb package, as well as the arch linux package.
|
||||||
|
alpine linux is using OpenRC (cool), which complicates things a little bit, but shouldn't be too bad. The wiki is
|
||||||
|
generally really well written. Otherwise, I am sure that both wiki.gentoo and wiki.archlinux have great pages too
|
||||||
|
docker is super easy, just make a dockerfile - only concern is the trigger files.
|
||||||
|
|
||||||
|
#### Bugs / Missing Features
|
||||||
|
- [x] command output is being inherited. It should be piped into some random log-file
|
||||||
|
- [ ] pretty sure that `ctrl+c` / SIGINT is not graceful yet.
|
||||||
|
- [ ] missing license (heavily considering GPLv3)
|
||||||
|
- [ ] pipeline scripts should be executed in a unique `/tmp` dir
|
||||||
|
- [ ] Some way for third parties to see which pipelines are currently running and their status.
|
||||||
|
- Could be as simple as looking in the logs directory.
|
||||||
|
- How to mark a run as failed / success / warn?
|
||||||
|
- Third parties may need to extract artifacts.
|
||||||
|
or maybe the scripts themselves would upload artifacts?
|
||||||
|
- [ ] I am deliberately not using `Restart=on-failure` in the `scid.service` file because we are using `Type=exec`
|
||||||
|
and not `Type=notify` (yet) - which would require a `sd_notify` call of `READY=1` (see `man systemd.service`)
|
||||||
|
|
||||||
|
### Note Regarding `inotify` usage
|
||||||
|
From the manpage:
|
||||||
|
```
|
||||||
|
With careful programming, an application can use inotify to efficiently monitor and cache the state of a set of
|
||||||
|
filesystem objects. However, robust applications should allow for the fact that bugs in the monitoring logic or races
|
||||||
|
of the kind described below may leave the cache inconsistent with the filesystem state. It is probably wise to do some
|
||||||
|
consistency checking, and re‐build the cache when inconsistencies are detected.
|
||||||
|
```
|
||||||
|
i.e., we should _also_ poll the watched files every once in a while (maybe once per minute? idk) to ensure that we catch
|
||||||
|
all events.
|
||||||
|
|
||||||
|
### Useful manpages
|
||||||
|
- `hier(7)`
|
||||||
|
- `daemon(7)` and `daemon(3)`
|
||||||
|
- `PKGBUILD(5)`
|
||||||
|
- `info make`
|
||||||
|
- `https://wiki.archlinux.org/title/Creating_packages`
|
18
deb-builder.dockerfile
Normal file
18
deb-builder.dockerfile
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
FROM debian:latest
|
||||||
|
# TODO: Remove busybox from this list once you're done experimenting (you only need vi)
|
||||||
|
RUN apt-get update ; apt-get install -y build-essential devscripts dh-make busybox
|
||||||
|
ARG DOCKER_USER=deb
|
||||||
|
|
||||||
|
# Set user and group
|
||||||
|
ARG user=appuser
|
||||||
|
ARG group=appuser
|
||||||
|
ARG uid=1000
|
||||||
|
ARG gid=1000
|
||||||
|
RUN groupadd -g ${gid} ${group}
|
||||||
|
RUN useradd -u ${uid} -g ${group} -s /bin/sh -m ${user} # <--- the '-m' create a user home directory
|
||||||
|
ENV USER=${user}
|
||||||
|
|
||||||
|
# Switch to user
|
||||||
|
USER ${uid}:${gid}
|
||||||
|
|
||||||
|
ENTRYPOINT ["bash", "--login"]
|
@ -1,6 +1,7 @@
|
|||||||
#ifndef SCI_LOG_H
|
#ifndef SCI_LOG_H
|
||||||
#define SCI_LOG_H
|
#define SCI_LOG_H
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
LOG_TRACE = 4,
|
LOG_TRACE = 4,
|
||||||
|
20
scripts/build.sh
Normal file
20
scripts/build.sh
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e # exit immediately on error
|
||||||
|
|
||||||
|
git clone -b dev "$SCI_PIPELINE_URL" "$SCI_PIPELINE_NAME"
|
||||||
|
echo "clone success"
|
||||||
|
|
||||||
|
cd "$SCI_PIPELINE_NAME"
|
||||||
|
|
||||||
|
cmake -B build
|
||||||
|
echo "configure success"
|
||||||
|
|
||||||
|
cmake --build build
|
||||||
|
echo "build success"
|
||||||
|
|
||||||
|
cpack build
|
||||||
|
echo "packaging success"
|
||||||
|
|
||||||
|
# TODO: upload artifacts to some artifact store
|
||||||
|
# curl "build/dist/your-package.deb" > ftp://example.com/artifacts
|
||||||
|
# echo "artifacts upload success"
|
@ -72,7 +72,7 @@ void log_log(const char* file, int line, int level, const char* fmt, ...) {
|
|||||||
else
|
else
|
||||||
fprintf(g_log_settings.out_file, "%s %-5s %s:%d: ", timestamp, level_name, file, line);
|
fprintf(g_log_settings.out_file, "%s %-5s %s:%d: ", timestamp, level_name, file, line);
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, format);
|
va_start(args, fmt);
|
||||||
vfprintf(g_log_settings.out_file, fmt, args);
|
vfprintf(g_log_settings.out_file, fmt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
fprintf(g_log_settings.out_file, "\n");
|
fprintf(g_log_settings.out_file, "\n");
|
||||||
|
@ -148,7 +148,7 @@ int main(int argc, char** argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!args.config_file.has_value) {
|
if(!args.config_file.has_value) {
|
||||||
fprintf(stderr, "no file provided see -h for usage\n");
|
fprintf(stderr, "no pipeline config file provided see -h for usage\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,11 +170,6 @@ int main(int argc, char** argv) {
|
|||||||
pool = threadpool_create(args.executors);
|
pool = threadpool_create(args.executors);
|
||||||
per_line(args.config_file.value, &config_interpret_line);
|
per_line(args.config_file.value, &config_interpret_line);
|
||||||
|
|
||||||
// BOOKMARK: You were reading :Man system.unit and :Man systemd.service as preperation on making a systemd unit file
|
|
||||||
// This will be needed for the .deb package, as well as the arch linux package.
|
|
||||||
// alpine linux is using OpenRC (cool), which complicates things a little bit, but shouldn't be too bad. The wiki is
|
|
||||||
// generally really well written. Otherwise, I am sure that both wiki.gentoo and wiki.archlinux have great pages too
|
|
||||||
// docker is super easy, just make a dockerfile - only concern is the trigger files.
|
|
||||||
pipeline_loop();
|
pipeline_loop();
|
||||||
threadpool_destroy(pool);
|
threadpool_destroy(pool);
|
||||||
}
|
}
|
||||||
|
57
src/sci.1
Normal file
57
src/sci.1
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
.\" Hey, EMACS: -*- nroff -*-
|
||||||
|
.\" (C) Copyright 2024 unknown <asger.gitz@hotmail.com>,
|
||||||
|
.\"
|
||||||
|
.\" First parameter, NAME, should be all caps
|
||||||
|
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||||
|
.\" other parameters are allowed: see man(7), man(1)
|
||||||
|
.TH Sci SECTION "August 18 2024"
|
||||||
|
.\" Please adjust this date whenever revising the manpage.
|
||||||
|
.\"
|
||||||
|
.\" Some roff macros, for reference:
|
||||||
|
.\" .nh disable hyphenation
|
||||||
|
.\" .hy enable hyphenation
|
||||||
|
.\" .ad l left justify
|
||||||
|
.\" .ad b justify to both left and right margins
|
||||||
|
.\" .nf disable filling
|
||||||
|
.\" .fi enable filling
|
||||||
|
.\" .br insert line break
|
||||||
|
.\" .sp <n> insert n+1 empty lines
|
||||||
|
.\" for manpage-specific macros, see man(7)
|
||||||
|
.SH NAME
|
||||||
|
sci \- program to do something
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B sci
|
||||||
|
.RI [ options ] " files" ...
|
||||||
|
.br
|
||||||
|
.B bar
|
||||||
|
.RI [ options ] " files" ...
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This manual page documents briefly the
|
||||||
|
.B sci
|
||||||
|
and
|
||||||
|
.B bar
|
||||||
|
commands.
|
||||||
|
.PP
|
||||||
|
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
|
||||||
|
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
|
||||||
|
.\" respectively.
|
||||||
|
\fBsci\fP is a program that...
|
||||||
|
.SH OPTIONS
|
||||||
|
These programs follow the usual GNU command line syntax, with long
|
||||||
|
options starting with two dashes ('\-').
|
||||||
|
A summary of options is included below.
|
||||||
|
For a complete description, see the Info files.
|
||||||
|
.TP
|
||||||
|
.B \-h, \-\-help
|
||||||
|
Show summary of options.
|
||||||
|
.TP
|
||||||
|
.B \-v, \-\-version
|
||||||
|
Show version of program.
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR bar (1),
|
||||||
|
.BR baz (1).
|
||||||
|
.br
|
||||||
|
The programs are documented fully by
|
||||||
|
.IR "The Rise and Fall of a Fooish Bar" ,
|
||||||
|
available via the Info system.
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user