Los comandos
Cada subcomando, sus opciones, el código de salida que devuelve y qué imprime en una terminal o en una tubería.
Todos los comandos encuentran tu proyecto subiendo desde el directorio actual, así que funcionan desde cualquier subdirectorio.
| Comando | Opciones |
|---|---|
molto new <nombre> |
— |
molto init |
— |
molto build |
-p/--profile, --refresh-toolchain, -j/--jobs |
molto run [-- args] |
-p/--profile, --refresh-toolchain, -j/--jobs |
molto test |
-p/--profile, --refresh-toolchain, -j/--jobs |
molto clean |
-a/--all |
molto fmt |
-c/--check, -d/--diff, --refresh-tools, --refresh-analysis, -j |
molto lint |
-p/--profile, -f/--format, --refresh-toolchain, --refresh-tools, --refresh-analysis, -j |
molto add <dep>[@<versión>] |
--dev, --git, --path, --archive, --registry |
molto remove <dep> |
— |
molto metadata |
-o/--output, --include-dev |
molto login |
-r/--registry, -e/--email, -t/--token |
molto publish |
--recipe, -f/--file, --dry-run |
molto bench, molto migrate y molto update existen en la CLI y salen con 5: el comando se
reconoce, el comportamiento no está implementado. update se queda así a propósito —
molto add <nombre> es la actualización, igual que lo es npm install.
El parser acepta --opt valor, --opt=valor, -o valor y flags booleanos. Todo lo que va tras
-- se reenvía al programa bajo molto run. --help y --version vienen de serie.
Empezar un proyecto
molto new my_app # un directorio nuevo con manifiesto, src/, include/, tests/ y .gitignore
molto init # lo mismo, en el directorio donde ya estás
Ninguno de los dos sobrescribe un archivo que ya exista, y ninguno inicializa git.
Construir y ejecutar
molto build # en build/debug/
molto build -p release # en build/release/
molto run -- --flag valor # construye, ejecuta y reenvía todo lo que va tras --
molto test # por defecto, un binario por archivo de tests/
molto run propaga literalmente el código de salida del programa, y reporta 128 + N cuando
muere por la señal N. Es el único comando cuyo código de salida no es de Molto.
-j <n> limita el pool de workers; si no está, usa todos los núcleos. Se rechaza salvo que sea un
número entre 1 y 1024, y nunca se registra ni entra en la huella: dos builds que sólo se
diferencien en -j producen los mismos objetos.
Estructura de salida
| Ruta | Contenido |
|---|---|
build/<perfil>/<paquete> |
El ejecutable |
build/<perfil>/obj/src/**/*.c.o |
Objetos intermedios |
build/<perfil>/tests/<nombre> |
Un binario por archivo de test (per_file) |
build/<perfil>/tests/<paquete>_tests |
El binario único de tests (single) |
.bin/wsdb |
Estado incremental y la respuesta cacheada de la toolchain |
compile_commands.json |
La base de datos de compilación, en la raíz del proyecto |
Molto.lock |
El grafo de dependencias resuelto |
build/ y .bin/ son de Molto y están en el gitignore. Molto.lock se genera y se commitea.
molto clean borra build/; molto clean --all borra además .bin/. Ninguno toca ~/.molto.
compile_commands.json lo escribe un build, y manda el último: molto build cubre src/ más
las dependencias, molto test cubre eso y tests/, y -p release deja una base de datos que
describe release. fmt y lint no escriben ninguna. Se escribe incluso cuando el build falla.
Códigos de salida
| Código | Significado |
|---|---|
| 0 | Éxito |
| 1 | Fallo de build; fmt --check encontró archivos sin formatear; lint produjo un error |
| 2 | Manifiesto o configuración inválidos |
| 3 | Fallo de dependencias |
| 4 | Error de uso |
| 5 | El comando existe pero no está implementado |
Un warning de lint se reporta y aun así sale con 0. Sólo la severidad error hace fallar el
comando.
Qué imprime un build
Todo va a stderr, así que molto build > log sigue mostrando el build y molto run > out
captura sólo tu programa.
En una terminal dibuja un inventario, luego una región viva, y retira la región cuando el trabajo para:
◆ registry sqlite3 v3.50.3
◇ modules network
● project 62 files
○ cached 20 files
● project services/build_service.c
◆ sqlite3 btree.c
… and 5 more
████████░░░░░░░░ 22% 47/210
Una dependencia ocupa una línea, tenga las fuentes que tenga: un paquete es una unidad de
trabajo. Nada que ya esté al día se lista; se cuenta en cached, así que una reconstrucción sin
cambios son tres líneas y ninguna región.
Redirige stderr —una tubería, un archivo, un job de CI— y obtienes una línea por fuente, sin
región, sin barra y sin una sola secuencia de escape. Ese es el registro completo, y es lo que la
CI debería guardar. NO_COLOR=1 quita el color en una terminal pero no la región, que va de
movimiento. El cursor nunca se oculta, así que Ctrl-C deja la terminal como la encontró.
Una unidad que falla se reporta en un marco con la línea de código, un cursor bajo el carácter que
la herramienta señaló y un pie que dice de quién era el código. El diagnóstico entero se compone y
se entrega al informe en una sola llamada, así que dos workers nunca pueden entrelazarse. Un build
que falla no imprime línea de Finished.
Variables de entorno
| Variable | Efecto |
|---|---|
MOLTO_PICKUP |
Ruta al binario de pickup cuando no está en el PATH |
C_COMPILER |
Fuerza el driver de C: se salta pickup y se salta la verificación de requires |
CPP_COMPILER |
Fuerza el driver de C++, con la misma salvedad |
MOLTO_CLANG_FORMAT |
Ruta al formateador; evita la resolución y no se cachea |
MOLTO_CLANG_TIDY |
Ruta al linter; igual |
MOLTO_CACHE |
Raíz de la caché compartida de dependencias; si no, ~/.molto/cache |
NO_COLOR |
Lo respeta el runner de tests |
Molto imprime un aviso en stderr cuando se usa C_COMPILER, porque un compilador elegido a mano
nunca se contrastó con [target].requires.
Dónde entra pickup
Molto no elige compilador. Un manifiesto declara las capacidades que necesita el código; pickup responde qué binario local las proporciona, y la respuesta se cachea en la base de datos del workspace: la pregunta se hace una vez, no en cada build.
pickup list # todas las toolchains de esta máquina
pickup doctor # qué impide construir aquí, y cómo arreglarlo
pickup install clang
pickup tools # el formateador y el linter, y dónde están
Si pickup resolve reporta un runtime_dirs para una toolchain que instaló él, lo que Molto
enlaza lleva el -rpath consigo, así que el binario sigue ejecutándose vaya donde vaya.
Plataforma
Sólo POSIX, y a propósito: usa fork/exec, flock y sysconf directamente, y la CI corre Ubuntu.
Windows y macOS se prometieron para la 0.2, se movieron a la 0.4 y siguen aparcados hasta que el
ecosistema tenga suficiente profundidad en una plataforma como para merecer portarlo a tres.