windows system

This commit is contained in:
2026-10-06 13:23:15 +02:00
parent 03d2ece7d6
commit 208a3e9738
12 changed files with 93 additions and 16 deletions
+7
View File
@@ -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
+6
View File
@@ -1,3 +1,9 @@
build/ build/
*.o *.o
*.exe *.exe
# Volcados de memoria de valgrind
vgcore.*
# Binarios de Go compilados en Linux
goescpos/hello
+4 -1
View File
@@ -27,7 +27,10 @@
], ],
"windows": { "windows": {
"program": "${workspaceFolder}/build/hello.exe", "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}" }
]
} }
} }
] ]
+13
View File
@@ -1,6 +1,7 @@
{ {
"files.insertFinalNewline": true, "files.insertFinalNewline": true,
"files.trimTrailingWhitespace": true, "files.trimTrailingWhitespace": true,
"files.eol": "\n",
"files.associations": { "files.associations": {
"*.h": "c" "*.h": "c"
}, },
@@ -12,5 +13,17 @@
"[makefile]": { "[makefile]": {
"editor.insertSpaces": false, "editor.insertSpaces": false,
"editor.detectIndentation": 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"
} }
+16
View File
@@ -1,5 +1,18 @@
{ {
"version": "2.0.0", "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": [ "tasks": [
{ {
"label": "make", "label": "make",
@@ -24,6 +37,9 @@
"label": "valgrind", "label": "valgrind",
"type": "shell", "type": "shell",
"command": "valgrind --leak-check=full ./build/hello", "command": "valgrind --leak-check=full ./build/hello",
"windows": {
"command": "echo 'valgrind no existe en Windows: pruébalo en Fedora'"
},
"dependsOn": "make", "dependsOn": "make",
"problemMatcher": [] "problemMatcher": []
} }
+18 -13
View File
@@ -2,8 +2,8 @@
## Estado actual ## Estado actual
- **Fase 2**: buffer dinámico. La Fase 1 está cerrada en Fedora, pero falta - **Fase 2**: buffer dinámico. La Fase 1 está cerrada en Fedora y en Windows
probarla en Windows. (2026-10-05).
- Paso actual: 2.3b. `hello.c` ya usa bien `goto cleanup` (punteros a `NULL` - 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 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, Valgrind limpio. Falta `escpos_buffer_append`: el parámetro con la cantidad,
@@ -17,20 +17,23 @@
### Windows (sobremesa) ### Windows (sobremesa)
- Al llegar: `git pull` en la terminal UCRT64 y comprobar `gcc`, `make` y `gdb`. - Hay gcc, gdb y make en `C:\msys64`. Faltan clang y `xxd` (opcionales:
Si falta algo: `pacman -S mingw-w64-ucrt-x86_64-clang vim`; mientras, `hexdump -C`).
`pacman -S mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-gdb make`. - Fase 1 cerrada: `make`, `make run` y `Nothing to be done` funcionan sin
- Cerrar la Fase 1: `make` tiene que generar `build/hello.exe`. Falta en el `EXE` gracias a la emulación de `.exe` de MSYS2 (ver docs/06-make.md). El
Makefile el `ifeq ($(OS),Windows_NT)` de `docs/06-make.md`. `mkdir -p` y `ifeq ($(OS),Windows_NT)` se pospone a la Fase 4, cuando haga falta
`rm -rf` solo funcionan en la shell de MSYS2. `-lws2_32`.
- Probar F5 en VS Code: `.vscode/` ya tiene la configuración de Windows con - Probar en VS Code: terminal nueva (debe abrir UCRT64), Ctrl+Shift+B y F5.
rutas `C:/msys64/ucrt64/...`.
- El 2.3b se puede avanzar aquí; la comprobación de memoria queda para Fedora. - El 2.3b se puede avanzar aquí; la comprobación de memoria queda para Fedora.
### Fedora (portátil) ### Fedora (portátil)
- Validar con valgrind el 2.3b cuando esté hecho (y con ASan/UBSan antes de - Validar con valgrind el 2.3b cuando esté hecho (y con ASan/UBSan antes de
cerrar la Fase 2). 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 ## Hecho
@@ -80,13 +83,15 @@
- Estilo: nombres en `snake_case` y llave de apertura en línea aparte (estilo - Estilo: nombres en `snake_case` y llave de apertura en línea aparte (estilo
Allman) en funciones, structs y bloques. Allman) en funciones, structs y bloques.
- Lo generado va en `build/`, que se crea en las recetas con `mkdir -p` y no se - 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 ## Pendiente / puntos débiles
- Fase 1: probar el Makefile en Windows (MSYS2), con el sufijo `.exe`. - 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 - 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`. 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 - Punteros: le cuesta saber cuándo hace falta `*` y cuándo no, y distinguir la
+23
View File
@@ -224,3 +224,26 @@ endif
Más adelante (Fase 4) aquí irán también las librerías que cambian según la 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. 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.
+4
View File
@@ -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. | | `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. | | `strip hello.exe` | Quita símbolos e información de depuración. |
| `gcc -static ...` | Enlaza estáticamente todas las librerías posibles. | | `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 ## Make
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.