doc: improve documentation
This commit is contained in:
parent
aea0678f65
commit
d33b129e54
257
README.md
257
README.md
|
@ -15,252 +15,37 @@
|
||||||
## Table of contents
|
## Table of contents
|
||||||
|
|
||||||
- [Table of contents](#table-of-contents)
|
- [Table of contents](#table-of-contents)
|
||||||
- [Macros](#macros)
|
- [Introduction](#introduction)
|
||||||
- [`@latest`](#latest)
|
- [Quick-start](#quick-start)
|
||||||
- [`@uname`](#uname)
|
- [Example](#example)
|
||||||
- [`@include`](#include)
|
|
||||||
- [`@join`](#join)
|
|
||||||
- [`@concat`](#concat)
|
|
||||||
- [`@exec`](#exec)
|
|
||||||
- [Manifest file format](#manifest-file-format)
|
|
||||||
- [`id`](#id)
|
|
||||||
- [`type`](#type)
|
|
||||||
- [`description`](#description)
|
|
||||||
- [`enabledIf`](#enabledif)
|
|
||||||
- [`requires`](#requires)
|
|
||||||
- [`provides`](#provides)
|
|
||||||
- [Target file format](#target-file-format)
|
|
||||||
- [`id`](#id-1)
|
|
||||||
- [`type`](#type-1)
|
|
||||||
- [`props`](#props)
|
|
||||||
- [`tools`](#tools)
|
|
||||||
|
|
||||||
|
|
||||||
## Macros
|
## Introduction
|
||||||
|
|
||||||
|
**CuteKit** is a simple - yet - powerful build system and package manager for C and C++. It:
|
||||||
|
|
||||||
### `@latest`
|
- ✨ It uses **JSON**: Cutekit uses JSON instead of introducing a whole new programming language for describing the project. And also has macros to help the user experience (see [Jexpr](doc/spec/jexpr.md)).
|
||||||
|
- ✨ It's a **package manager**: Cutekit package manager is based on **Git**, nothing is centralized.
|
||||||
|
- ✨ It's **extendible**: Cutekit can be [extended](./doc/extends.md) by writing custom Python plugins.
|
||||||
|
- ✨ It's **easy**: the [**templates**](./doc/templates.md) help the user quick-start a project.
|
||||||
|
- ✨ It's **portable**: Cutekit can run on MacOS Gnu/Linux and Windows.
|
||||||
|
|
||||||
Find the latest version of a command in the path.
|
## Quick-start
|
||||||
|
|
||||||
```json
|
-> If you directly want to start using Cutekit for a new project, you can just run `$ ck I host` and it will create a new project in the host directory (you can rename it later).
|
||||||
"cc": {
|
|
||||||
"cmd": ["@latest", "clang"], // clang-14
|
|
||||||
/* ... */
|
|
||||||
```
|
|
||||||
|
|
||||||
### `@uname`
|
-> If you want to use Cutekit for writing operating systems, you can create a new [limine](https://github.com/limine-bootloader/limine/)-based project by running `$ ck I limine-barebone`.
|
||||||
|
|
||||||
Query the system for information about the current operating system.
|
## Example
|
||||||
|
|
||||||
|
If you want to see how it works you can read the [doc/cutekit.md](doc/cutekit.md) file.
|
||||||
|
|
||||||
```json
|
# License
|
||||||
"cc": {
|
|
||||||
"cmd": ["@uname", "machine"], // "x86_64"
|
|
||||||
/* ... */
|
|
||||||
```
|
|
||||||
|
|
||||||
### `@include`
|
<a href="https://opensource.org/licenses/MIT">
|
||||||
|
<img align="right" height="96" alt="MIT License" src="doc/mit.svg" />
|
||||||
|
</a>
|
||||||
|
|
||||||
Include a file
|
Cutekit is licensed under the **MIT License**.
|
||||||
|
|
||||||
### `@join`
|
The full text of the license can be accessed via [this link](https://opensource.org/licenses/MIT) and is also included in the [license.md](license.md) file of this software package.
|
||||||
|
|
||||||
Join two objects
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
```json
|
|
||||||
["@join", {"a": 1}, {"b": 2}] // {"a": 1, "b": 2}
|
|
||||||
```
|
|
||||||
|
|
||||||
### `@concat`
|
|
||||||
|
|
||||||
Concatenate strings
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
```json
|
|
||||||
["@concat", "a", "b", "c"] // "abc"
|
|
||||||
```
|
|
||||||
|
|
||||||
### `@exec`
|
|
||||||
|
|
||||||
Execute a command and return the output
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
```json
|
|
||||||
["@exec", "uname", "-m"] // "x86_64"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Manifest file format
|
|
||||||
|
|
||||||
### `id`
|
|
||||||
|
|
||||||
The id of the package. This is used to identify the package in the manifest file.
|
|
||||||
|
|
||||||
Exemple:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"id": "hello"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### `type`
|
|
||||||
|
|
||||||
The type of the package. This is used to identify the package in the manifest file.
|
|
||||||
|
|
||||||
Exemple:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"type": "exe"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### `description`
|
|
||||||
|
|
||||||
The description of the package for the user.
|
|
||||||
|
|
||||||
Exemple:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"description": "Hello world"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### `enabledIf`
|
|
||||||
|
|
||||||
A list of requirements for the package check agaisnt the build props. If the requirement is not met, the package will be disabled.
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"enabledIf": {
|
|
||||||
"freestanding": [
|
|
||||||
false
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### `requires`
|
|
||||||
|
|
||||||
Dependencies of the package. The name listed here must be the same as the id of the package or member of a provide list.
|
|
||||||
|
|
||||||
Exemple:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"requires": [
|
|
||||||
"libc",
|
|
||||||
"libm"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### `provides`
|
|
||||||
|
|
||||||
Alias for the package.
|
|
||||||
|
|
||||||
Exemple:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"provides": [
|
|
||||||
"hello"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Target file format
|
|
||||||
|
|
||||||
### `id`
|
|
||||||
|
|
||||||
The id of the target. This is used to identify the target in the target file.
|
|
||||||
|
|
||||||
### `type`
|
|
||||||
|
|
||||||
Should be `target`.
|
|
||||||
|
|
||||||
### `props`
|
|
||||||
|
|
||||||
A list of properties for the target.
|
|
||||||
|
|
||||||
Exemple:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"props": {
|
|
||||||
"arch": "x86_64",
|
|
||||||
"vendor": "pc",
|
|
||||||
"os": "linux",
|
|
||||||
"env": "gnu",
|
|
||||||
"abi": "elf",
|
|
||||||
"cpu": "x86_64",
|
|
||||||
"features": "fxsr,sse,sse2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Theses values are exposed the translation unit as `__ck_{prop}__`.
|
|
||||||
|
|
||||||
### `tools`
|
|
||||||
|
|
||||||
A list of tools for the target.
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"tools": {
|
|
||||||
"cc": {
|
|
||||||
"cmd": ["@latest", "clang"],
|
|
||||||
"args": [
|
|
||||||
"-target",
|
|
||||||
"x86_64-unknown-windows",
|
|
||||||
"-ffreestanding",
|
|
||||||
"-fno-stack-protector",
|
|
||||||
"-fshort-wchar",
|
|
||||||
"-mno-red-zone"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"cxx": {
|
|
||||||
"cmd": ["@latest", "clang++"],
|
|
||||||
"args": [
|
|
||||||
"-target",
|
|
||||||
"x86_64-unknown-windows",
|
|
||||||
"-ffreestanding",
|
|
||||||
"-fno-stack-protector",
|
|
||||||
"-fshort-wchar",
|
|
||||||
"-mno-red-zone"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ld": {
|
|
||||||
"cmd": ["@latest", "clang++"],
|
|
||||||
"args": [
|
|
||||||
"-target",
|
|
||||||
"x86_64-unknown-windows",
|
|
||||||
"-nostdlib",
|
|
||||||
"-Wl,-entry:efi_main",
|
|
||||||
"-Wl,-subsystem:efi_application",
|
|
||||||
"-fuse-ld=lld-link"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ar": {
|
|
||||||
"cmd": ["@latest", "llvm-ar"],
|
|
||||||
"args": [
|
|
||||||
"rcs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"as": {
|
|
||||||
"cmd": "nasm",
|
|
||||||
"args": [
|
|
||||||
"-f",
|
|
||||||
"win64"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
114
doc/cutekit.md
Normal file
114
doc/cutekit.md
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
# Cutekit
|
||||||
|
|
||||||
|
Cutekit is a build system that aims to be simple, fast and easy to use.
|
||||||
|
A project is described using json files.
|
||||||
|
|
||||||
|
## Project file
|
||||||
|
|
||||||
|
The project file is used to describe the project and its dependencies.
|
||||||
|
|
||||||
|
See: [doc/spec/project.md](doc/spec/project.md) for the full specification.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
> project.json
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"$schema": "https://schemas.cute.engineering/stable/cutekit.manifest.project.v1",
|
||||||
|
"id": "skift-org/skift",
|
||||||
|
"type": "project",
|
||||||
|
"description": "The Skift Operating System",
|
||||||
|
"extern": {
|
||||||
|
"cute-engineering/libheap": {
|
||||||
|
"git": "https://github.com/cute-engineering/libheap.git",
|
||||||
|
"tag": "v1.1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Here we describe a project with the id `skift-org/skift` and a dependency to `cute-engineering/libheap` at version `v1.1.0`.
|
||||||
|
|
||||||
|
## An executable package manifest
|
||||||
|
|
||||||
|
|
||||||
|
When you want to create an executable package, you need to create a `manifest.json` file in any directory under `src/`.
|
||||||
|
This is the file that describe an executable with its dependencies.
|
||||||
|
|
||||||
|
> src/nyan-cat-app/manifest.json
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"$schema": "https://schemas.cute.engineering/stable/cutekit.manifest.component.v1",
|
||||||
|
"id": "nyan-cat-app",
|
||||||
|
"type": "exe",
|
||||||
|
"description": "rainbows everywhere",
|
||||||
|
"requires": [
|
||||||
|
"easy-lib"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Here we describe an executable with the id `nyan-cat-app` and a dependency to `easy-lib` (which is a library built by the project).
|
||||||
|
|
||||||
|
You can run the executable by running `$ ck run nyan-cat-app`.
|
||||||
|
|
||||||
|
## A library package manifest
|
||||||
|
|
||||||
|
When you want to create a library package, you need to create a `manifest.json` file in any directory under `src/`, like an executable package.
|
||||||
|
|
||||||
|
> src/easy-lib/manifest.json
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"$schema": "https://schemas.cute.engineering/stable/cutekit.manifest.component.v1",
|
||||||
|
"id": "easy-lib",
|
||||||
|
"type": "lib",
|
||||||
|
"description": "easy to use library",
|
||||||
|
"requires": [
|
||||||
|
"cute-engineering/libheap"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Here we describe a library with the id `easy-lib` and a dependency to `cute-engineering/libheap` (which is an external dependency described above in the `project.json`).
|
||||||
|
|
||||||
|
## Using installed libraries
|
||||||
|
|
||||||
|
You can create a specific installed library through the use of `pkg-config` files.
|
||||||
|
For example here is how you add `SDL2` to your project:
|
||||||
|
|
||||||
|
|
||||||
|
> src/extern/sdl2/manifest.json
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"$schema": "https://schemas.cute.engineering/stable/cutekit.manifest.component.v1",
|
||||||
|
"id": "sdl2",
|
||||||
|
"type": "lib",
|
||||||
|
"description": "A cross-platform development library designed to provide low level access to hardware",
|
||||||
|
"tools": {
|
||||||
|
"cc": {
|
||||||
|
"args": [
|
||||||
|
"@exec",
|
||||||
|
"pkg-config",
|
||||||
|
"--cflags",
|
||||||
|
"sdl2"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"cxx": {
|
||||||
|
"args": [
|
||||||
|
"@exec",
|
||||||
|
"pkg-config",
|
||||||
|
"--cflags",
|
||||||
|
"sdl2"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"ld": {
|
||||||
|
"args": [
|
||||||
|
"@exec",
|
||||||
|
"pkg-config",
|
||||||
|
"--libs",
|
||||||
|
"sdl2"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
32
doc/extends.md
Normal file
32
doc/extends.md
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
|
||||||
|
# Extending cutekit
|
||||||
|
|
||||||
|
By writing custom Python plugins, you can extend Cutekit to do whatever you want.
|
||||||
|
|
||||||
|
First the file need to be located in `meta/plugins` and have the `.py` extension.
|
||||||
|
Then you can import cutekit and change/add whatever you want.
|
||||||
|
|
||||||
|
For example you can add a new command to the CLI:
|
||||||
|
|
||||||
|
```python
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import magic
|
||||||
|
import logging
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
from cutekit import shell, builder, const, project
|
||||||
|
from cutekit.cmds import Cmd, append
|
||||||
|
from cutekit.args import Args
|
||||||
|
from typing import Callable
|
||||||
|
|
||||||
|
|
||||||
|
def bootCmd(args: Args) -> None:
|
||||||
|
project.chdir()
|
||||||
|
print("Hello world!")
|
||||||
|
|
||||||
|
append(Cmd("h", "hello", "Print hello world", bootCmd))
|
||||||
|
```
|
||||||
|
|
||||||
|
This feature is used - for example - by [SkiftOS](https://github.com/skift-org/skift/blob/main/meta/plugins/start-cmd.py) to add the `start` command, that build packages and run a virtual machine.
|
92
doc/spec/jexpr.md
Normal file
92
doc/spec/jexpr.md
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
|
||||||
|
## Macros
|
||||||
|
|
||||||
|
To avoid headache, Cutekit extends JSON through simple macros, this is what we call **Jexpr**.
|
||||||
|
|
||||||
|
|
||||||
|
### `@latest`
|
||||||
|
|
||||||
|
Find the latest version of a command in the path.
|
||||||
|
|
||||||
|
```json
|
||||||
|
"cc": {
|
||||||
|
"cmd": ["@latest", "clang"], // clang-14
|
||||||
|
/* ... */
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### `@uname`
|
||||||
|
|
||||||
|
Query the system for information about the current operating system.
|
||||||
|
|
||||||
|
|
||||||
|
```json
|
||||||
|
"cc": {
|
||||||
|
"cmd": ["@uname", "machine"], // "x86_64"
|
||||||
|
/* ... */
|
||||||
|
```
|
||||||
|
|
||||||
|
The `@uname` commands has 1 argument that may be:
|
||||||
|
- `node`: to get the current machine hostname.
|
||||||
|
- `machine`: to get the current machine running architecture
|
||||||
|
- `aarch64` is renamed to `arm64`
|
||||||
|
- `AMD64` is renamed to `x86_64`
|
||||||
|
- `system`: to get the current machine running operating system:
|
||||||
|
- `Linux`
|
||||||
|
- `Windows`
|
||||||
|
- `release`: to get the current machine operating system's version
|
||||||
|
- `version`: to get more information about the host operating system.
|
||||||
|
|
||||||
|
### `@include`
|
||||||
|
|
||||||
|
Include a manifest file.
|
||||||
|
|
||||||
|
### `@read`
|
||||||
|
|
||||||
|
Read a Json file and output its value.
|
||||||
|
|
||||||
|
### `@join`
|
||||||
|
|
||||||
|
Join two objects
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
["@join", {"a": 1}, {"b": 2}] // {"a": 1, "b": 2}
|
||||||
|
```
|
||||||
|
|
||||||
|
### `@concat`
|
||||||
|
|
||||||
|
Concatenate strings
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
["@concat", "a", "b", "c"] // "abc"
|
||||||
|
```
|
||||||
|
|
||||||
|
### `@exec`
|
||||||
|
|
||||||
|
Execute a command and return the output
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
["@exec", "uname", "-m"] // "x86_64"
|
||||||
|
```
|
||||||
|
|
||||||
|
### `@eval`
|
||||||
|
|
||||||
|
Execute python code and return the output
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"32limit": ["@eval", "2**32"]
|
||||||
|
```
|
||||||
|
|
||||||
|
### `@abspath`
|
||||||
|
|
||||||
|
Returns the absolute path of a path.
|
||||||
|
|
||||||
|
|
102
doc/spec/manifest.md
Normal file
102
doc/spec/manifest.md
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
|
||||||
|
|
||||||
|
## Manifest file format
|
||||||
|
|
||||||
|
### `id`
|
||||||
|
|
||||||
|
The `id` of the package. This is used to identify the package in the manifest file.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"id": "hello"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### `type`
|
||||||
|
|
||||||
|
The type of the package. This is used to identify the package in the manifest file.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "exe"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
**Values:**
|
||||||
|
- `"exe"`
|
||||||
|
- `"lib"`
|
||||||
|
|
||||||
|
### `description`
|
||||||
|
|
||||||
|
The description of the package for the user.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"description": "Hello world"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### `enabledIf`
|
||||||
|
|
||||||
|
A list of requirements for the package check against the build props. If the requirement is not met, the package will be disabled.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"enabledIf": {
|
||||||
|
"freestanding": [
|
||||||
|
false
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Values:**
|
||||||
|
|
||||||
|
`enableIf` is a map of variable and values:
|
||||||
|
```
|
||||||
|
"variable-name": [array of expected value]
|
||||||
|
```
|
||||||
|
If `variable-name` is equal to one of the value in the table, then the package will be enabled.
|
||||||
|
|
||||||
|
|
||||||
|
### `requires`
|
||||||
|
|
||||||
|
Dependencies of the package. The name listed here must be the same as the `id` of the package or member of a provide list.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"requires": [
|
||||||
|
"libc",
|
||||||
|
"libm"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### `provides`
|
||||||
|
|
||||||
|
An alias for the package.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"provides": [
|
||||||
|
"hello"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This alias may be used by other package when using `requires`.
|
||||||
|
This is used when you have multiple package implementing the same features, but only one is enabled through `enableIf`.
|
||||||
|
|
||||||
|
**Value**:
|
||||||
|
- An array of `id`.
|
33
doc/spec/project.md
Normal file
33
doc/spec/project.md
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
## project.json
|
||||||
|
|
||||||
|
The project file is the main file of the project.
|
||||||
|
It describes the project and its dependencies.
|
||||||
|
|
||||||
|
### `id`
|
||||||
|
|
||||||
|
The `id` of the project. This is used to identify the project.
|
||||||
|
|
||||||
|
### `type`
|
||||||
|
|
||||||
|
Should be `project`.
|
||||||
|
|
||||||
|
### `description`
|
||||||
|
|
||||||
|
The description of the project for the user.
|
||||||
|
|
||||||
|
### `extern`
|
||||||
|
|
||||||
|
A list of external dependencies for the project, for example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
|
||||||
|
"externs": {
|
||||||
|
"cute-engineering/libheap": {
|
||||||
|
"git": "https://github.com/cute-engineering/libheap.git",
|
||||||
|
"tag": "v1.1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
You describe the project `id`, the `git` repository and the `tag` to use.
|
||||||
|
|
119
doc/spec/target.md
Normal file
119
doc/spec/target.md
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
|
||||||
|
## Target file format
|
||||||
|
|
||||||
|
A target file is used for describing a new cross-compiler to use.
|
||||||
|
Generally, a target file is named like this: `{target}-{arch}.json`. For example, you could have:
|
||||||
|
- `host-x86-64`
|
||||||
|
- `windows-arm`
|
||||||
|
- ...
|
||||||
|
|
||||||
|
### `id`
|
||||||
|
|
||||||
|
The `id` of the target. This is used to identify the target in the target file.
|
||||||
|
|
||||||
|
### `type`
|
||||||
|
|
||||||
|
Should be `target`.
|
||||||
|
|
||||||
|
### `props`
|
||||||
|
|
||||||
|
A list of properties for the target.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"props": {
|
||||||
|
"arch": "x86_64",
|
||||||
|
"vendor": "pc",
|
||||||
|
"os": "linux",
|
||||||
|
"env": "gnu",
|
||||||
|
"abi": "elf",
|
||||||
|
"cpu": "x86_64",
|
||||||
|
"features": "fxsr,sse,sse2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Theses may be accessed during compilation as C-Macros: `__ck_{prop}__`.
|
||||||
|
|
||||||
|
### `tools`
|
||||||
|
|
||||||
|
A list of tools for the target.
|
||||||
|
|
||||||
|
Each tool is described like this:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"name": {
|
||||||
|
"cmd": "",
|
||||||
|
"args": [
|
||||||
|
...
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Where:
|
||||||
|
- `cmd` describe the command to run
|
||||||
|
- `arg` describes each argument to use (note: each entry of the table correspond to ONE argument).
|
||||||
|
|
||||||
|
You have different tools names that you can use:
|
||||||
|
- "cc"
|
||||||
|
- "cxx"
|
||||||
|
- "ld"
|
||||||
|
- "ar"
|
||||||
|
- "as"
|
||||||
|
|
||||||
|
**Example**:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"tools": {
|
||||||
|
"cc": {
|
||||||
|
"cmd": ["@latest", "clang"],
|
||||||
|
"args": [
|
||||||
|
"-target",
|
||||||
|
"x86_64-unknown-windows",
|
||||||
|
"-ffreestanding",
|
||||||
|
"-fno-stack-protector",
|
||||||
|
"-fshort-wchar",
|
||||||
|
"-mno-red-zone"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"cxx": {
|
||||||
|
"cmd": ["@latest", "clang++"],
|
||||||
|
"args": [
|
||||||
|
"-target",
|
||||||
|
"x86_64-unknown-windows",
|
||||||
|
"-ffreestanding",
|
||||||
|
"-fno-stack-protector",
|
||||||
|
"-fshort-wchar",
|
||||||
|
"-mno-red-zone"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"ld": {
|
||||||
|
"cmd": ["@latest", "clang++"],
|
||||||
|
"args": [
|
||||||
|
"-target",
|
||||||
|
"x86_64-unknown-windows",
|
||||||
|
"-nostdlib",
|
||||||
|
"-Wl,-entry:efi_main",
|
||||||
|
"-Wl,-subsystem:efi_application",
|
||||||
|
"-fuse-ld=lld-link"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"ar": {
|
||||||
|
"cmd": ["@latest", "llvm-ar"],
|
||||||
|
"args": [
|
||||||
|
"rcs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"as": {
|
||||||
|
"cmd": "nasm",
|
||||||
|
"args": [
|
||||||
|
"-f",
|
||||||
|
"win64"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
40
doc/templates.md
Normal file
40
doc/templates.md
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
|
||||||
|
# Templates
|
||||||
|
|
||||||
|
Templates are based on this [repository (cute-engineering/cutekit-templates)](https://github.com/cute-engineering/cutekit-templates).
|
||||||
|
Each directory correspond to a template.
|
||||||
|
|
||||||
|
You can create a new Cutekit project with the `ck I {template-name}` command.
|
||||||
|
|
||||||
|
If you want to use another repository as a template, you can use the `ck I --repo="github-link" name` command. For example:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ck I --repo="cute-engineering/cutekit-templates.git" host
|
||||||
|
```
|
||||||
|
|
||||||
|
## Writing a template
|
||||||
|
|
||||||
|
When writing a template, you do it through a github repository (only github for now).
|
||||||
|
Then add a `registry.json` file at the root of the repository contaning a table of entry directories.
|
||||||
|
|
||||||
|
For example, if you have a UI library called `cute-ui`, you can add a `registry.json` file like this:
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "cute-ui-simple",
|
||||||
|
"description": "A simple template"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cute-ui-advanced",
|
||||||
|
"description": "A more advanced template"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
And each "id" will correspond to a directory in the repository:
|
||||||
|
|
||||||
|
- `cute-ui-simple` will be in `cute-ui-simple/`
|
||||||
|
- `cute-ui-advanced` will be in `cute-ui-advanced/`
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue