windows system
This commit is contained in:
@@ -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
|
||||||
+7
-1
@@ -1,3 +1,9 @@
|
|||||||
build/
|
build/
|
||||||
*.o
|
*.o
|
||||||
*.exe
|
*.exe
|
||||||
|
|
||||||
|
# Volcados de memoria de valgrind
|
||||||
|
vgcore.*
|
||||||
|
|
||||||
|
# Binarios de Go compilados en Linux
|
||||||
|
goescpos/hello
|
||||||
|
|||||||
Vendored
+4
-1
@@ -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}" }
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Vendored
+14
-1
@@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+16
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user