diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..79866aa --- /dev/null +++ b/.gitattributes @@ -0,0 +1,7 @@ +# Finales de línea LF en las dos máquinas (Make exige tabuladores y LF) +* text=auto eol=lf + +# Bytes en crudo: git no debe tocarlos nunca +*.bin binary +*.exe binary +*.o binary diff --git a/.gitignore b/.gitignore index 87cc637..854542e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,9 @@ build/ *.o -*.exe \ No newline at end of file +*.exe + +# Volcados de memoria de valgrind +vgcore.* + +# Binarios de Go compilados en Linux +goescpos/hello diff --git a/.vscode/launch.json b/.vscode/launch.json index 78e47fd..76a1818 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -27,7 +27,10 @@ ], "windows": { "program": "${workspaceFolder}/build/hello.exe", - "miDebuggerPath": "C:/msys64/ucrt64/bin/gdb.exe" + "miDebuggerPath": "C:/msys64/ucrt64/bin/gdb.exe", + "environment": [ + { "name": "PATH", "value": "C:/msys64/ucrt64/bin;${env:PATH}" } + ] } } ] diff --git a/.vscode/settings.json b/.vscode/settings.json index 1cc56f0..64ed9d7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,7 @@ { "files.insertFinalNewline": true, "files.trimTrailingWhitespace": true, + "files.eol": "\n", "files.associations": { "*.h": "c" }, @@ -12,5 +13,17 @@ "[makefile]": { "editor.insertSpaces": false, "editor.detectIndentation": false - } + }, + "terminal.integrated.profiles.windows": { + "MSYS2 UCRT64": { + "path": "C:/msys64/usr/bin/bash.exe", + "args": ["--login", "-i"], + "env": { + "MSYSTEM": "UCRT64", + "CHERE_INVOKING": "1", + "MSYS2_PATH_TYPE": "inherit" + } + } + }, + "terminal.integrated.defaultProfile.windows": "MSYS2 UCRT64" } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index a2901dc..38d2a18 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,5 +1,18 @@ { "version": "2.0.0", + "windows": { + "options": { + "shell": { + "executable": "C:/msys64/usr/bin/bash.exe", + "args": ["--login", "-c"] + }, + "env": { + "MSYSTEM": "UCRT64", + "CHERE_INVOKING": "1", + "MSYS2_PATH_TYPE": "inherit" + } + } + }, "tasks": [ { "label": "make", @@ -24,6 +37,9 @@ "label": "valgrind", "type": "shell", "command": "valgrind --leak-check=full ./build/hello", + "windows": { + "command": "echo 'valgrind no existe en Windows: pruébalo en Fedora'" + }, "dependsOn": "make", "problemMatcher": [] } diff --git a/PROGRESO.md b/PROGRESO.md index 08de60f..3c692a8 100644 --- a/PROGRESO.md +++ b/PROGRESO.md @@ -2,8 +2,8 @@ ## Estado actual -- **Fase 2**: buffer dinámico. La Fase 1 está cerrada en Fedora, pero falta - probarla en Windows. +- **Fase 2**: buffer dinámico. La Fase 1 está cerrada en Fedora y en Windows + (2026-10-05). - Paso actual: 2.3b. `hello.c` ya usa bien `goto cleanup` (punteros a `NULL` uno por línea, `result`, un solo `return`), sin avisos con gcc ni clang, y Valgrind limpio. Falta `escpos_buffer_append`: el parámetro con la cantidad, @@ -17,20 +17,23 @@ ### Windows (sobremesa) -- Al llegar: `git pull` en la terminal UCRT64 y comprobar `gcc`, `make` y `gdb`. - Si falta algo: - `pacman -S mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-gdb make`. -- Cerrar la Fase 1: `make` tiene que generar `build/hello.exe`. Falta en el - Makefile el `ifeq ($(OS),Windows_NT)` de `docs/06-make.md`. `mkdir -p` y - `rm -rf` solo funcionan en la shell de MSYS2. -- Probar F5 en VS Code: `.vscode/` ya tiene la configuración de Windows con - rutas `C:/msys64/ucrt64/...`. +- Hay gcc, gdb y make en `C:\msys64`. Faltan clang y `xxd` (opcionales: + `pacman -S mingw-w64-ucrt-x86_64-clang vim`; mientras, `hexdump -C`). +- Fase 1 cerrada: `make`, `make run` y `Nothing to be done` funcionan sin + `EXE` gracias a la emulación de `.exe` de MSYS2 (ver docs/06-make.md). El + `ifeq ($(OS),Windows_NT)` se pospone a la Fase 4, cuando haga falta + `-lws2_32`. +- Probar en VS Code: terminal nueva (debe abrir UCRT64), Ctrl+Shift+B y F5. - El 2.3b se puede avanzar aquí; la comprobación de memoria queda para Fedora. ### Fedora (portátil) - Validar con valgrind el 2.3b cuando esté hecho (y con ASan/UBSan antes de cerrar la Fase 2). +- Tras el `git pull` del 2026-10-05, comprobar que `make` y F5 siguen igual + (se ha tocado `.vscode/` y se han añadido `.gitattributes` y `.gitignore`). + Los binarios de Go ya no se versionan: recompilarlos con `go build` si hacen + falta. ## Hecho @@ -80,13 +83,15 @@ - Estilo: nombres en `snake_case` y llave de apertura en línea aparte (estilo Allman) en funciones, structs y bloques. - Lo generado va en `build/`, que se crea en las recetas con `mkdir -p` y no se - versiona. + versiona. Tampoco se versionan ejecutables ni volcados (`vgcore.*`). +- Dos máquinas transparentes: `.gitattributes` fuerza LF en todo y marca + `*.bin` como binario (git no toca los bytes ESC/POS). En Windows, VS Code usa + la shell UCRT64 de MSYS2 para la terminal y las tareas, así que `make`, + `mkdir -p` y `rm -rf` funcionan igual que en Fedora. ## Pendiente / puntos débiles - Fase 1: probar el Makefile en Windows (MSYS2), con el sufijo `.exe`. -- `.gitignore` creado. Siguen versionados `emulator/escpos-emu.exe` y - `goruntime/goruntime.exe`. - Make: le costó entender que va hacia atrás desde el objetivo y que una regla patrón es una plantilla. Repasar con `docs/06-make.md`. - Punteros: le cuesta saber cuándo hace falta `*` y cuándo no, y distinguir la diff --git a/docs/06-make.md b/docs/06-make.md index fcaccbd..6b06e70 100644 --- a/docs/06-make.md +++ b/docs/06-make.md @@ -224,3 +224,26 @@ endif Más adelante (Fase 4) aquí irán también las librerías que cambian según la plataforma, como `-lws2_32` para Winsock en Windows. + +### La «magia .exe» de MSYS2 + +Sin `EXE`, el Makefile con objetivo `build/hello` parece funcionar en Windows: +el segundo `make` dice `Nothing to be done`. No es mérito del Makefile: + +- `make`, `ls` y la shell de `/usr/bin` son programas de MSYS2, que emula + POSIX encima de Windows. +- Si un programa de MSYS2 pregunta por `build/hello` y solo existe + `build/hello.exe`, la capa de emulación responde que existe y le da la fecha + del `.exe`. + +| Comando | Qué ve | +|---|---| +| `ls -l build/hello` | Pasa por la emulación: «existe». | +| `cmd //c dir build` | Pregunta a Windows: solo hay `hello.exe`. | + +Con un make nativo (`mingw32-make`) esa emulación no existe: no encuentra +`build/hello` y vuelve a enlazar cada vez. Por eso se pone el nombre real con +`$(EXE)`. + +**Comparación con Go:** `go build` añade `.exe` por sí mismo cuando +`GOOS=windows`. En C, el nombre del ejecutable lo decides tú en el Makefile. diff --git a/docs/cheatsheet.md b/docs/cheatsheet.md index 0479928..ec7fe56 100644 --- a/docs/cheatsheet.md +++ b/docs/cheatsheet.md @@ -76,6 +76,10 @@ Si juntas dos flags de parada (`-E -S`), gana la que para antes. | `objdump -p hello.exe \| grep "DLL Name"` | Lista las DLL de las que depende el ejecutable. | | `strip hello.exe` | Quita símbolos e información de depuración. | | `gcc -static ...` | Enlaza estáticamente todas las librerías posibles. | +| `uname -s` | Nombre del sistema: `Linux` en Fedora, `UCRT64_NT-...` en la terminal UCRT64 de Windows. | +| `echo $MSYSTEM` | Entorno de MSYS2 activo. Tiene que ser `UCRT64`. | +| `pacman -S mingw-w64-ucrt-x86_64-clang` | Instala clang para el entorno UCRT64. | +| `pacman -S vim` | Instala `xxd` (viene con vim). Sin él, usa `hexdump -C fichero.bin`. | ## Make diff --git a/emulator/escpos-emu.exe b/emulator/escpos-emu.exe deleted file mode 100644 index 82d9ec5..0000000 Binary files a/emulator/escpos-emu.exe and /dev/null differ diff --git a/goescpos/hello b/goescpos/hello deleted file mode 100755 index fd1f7ac..0000000 Binary files a/goescpos/hello and /dev/null differ diff --git a/goruntime/goruntime.exe b/goruntime/goruntime.exe deleted file mode 100644 index 5113c50..0000000 Binary files a/goruntime/goruntime.exe and /dev/null differ diff --git a/vgcore.57400 b/vgcore.57400 deleted file mode 100644 index 0c2c033..0000000 Binary files a/vgcore.57400 and /dev/null differ