|
| 1 | +# Módulo de Compilación - Documentación |
| 2 | + |
| 3 | +## Descripción General |
| 4 | + |
| 5 | +El módulo de compilación (`compile.py`) permite verificar que los archivos modificados del kernel Linux compilan correctamente después de aplicar los fixes automáticos. Esta funcionalidad es crucial para asegurar que las correcciones no introduzcan errores de compilación. |
| 6 | + |
| 7 | +## Características Principales |
| 8 | + |
| 9 | +### ✅ Compilación Individual |
| 10 | +- Compila archivos uno por uno usando el sistema de build del kernel (`make`) |
| 11 | +- Solo compila archivos `.c` (los archivos `.h` se incluyen automáticamente) |
| 12 | +- Usa el Makefile del kernel para garantizar compatibilidad |
| 13 | + |
| 14 | +### ✅ Limpieza Automática |
| 15 | +- Elimina archivos `.o` generados después de la compilación |
| 16 | +- También elimina archivos auxiliares (`.cmd`, `.d`) |
| 17 | +- No deja rastro de archivos compilados en el árbol del kernel |
| 18 | + |
| 19 | +### ✅ Gestión de Backups |
| 20 | +- Puede restaurar archivos desde sus backups (`.bak`) antes de compilar |
| 21 | +- Opción para restaurar backups después de compilar |
| 22 | +- Útil para probar compilación sin afectar el código modificado |
| 23 | + |
| 24 | +### ✅ Reportes Completos |
| 25 | +- **HTML**: Reporte visual con estadísticas y detalles de errores |
| 26 | +- **JSON**: Resultados estructurados para procesamiento automático |
| 27 | +- **Consola**: Resumen en tiempo real del progreso |
| 28 | + |
| 29 | +## Uso |
| 30 | + |
| 31 | +### Comando Básico |
| 32 | + |
| 33 | +```bash |
| 34 | +python3 main.py --compile \ |
| 35 | + --json-input json/fixed.json \ |
| 36 | + --kernel-root /path/to/kernel/linux |
| 37 | +``` |
| 38 | + |
| 39 | +### Opciones Disponibles |
| 40 | + |
| 41 | +| Opción | Descripción | |
| 42 | +|--------|-------------| |
| 43 | +| `--json-input` | Archivo JSON con lista de archivos a compilar (requerido) | |
| 44 | +| `--kernel-root` | Directorio raíz del kernel Linux (requerido) | |
| 45 | +| `--restore-before` | Restaurar backups antes de compilar | |
| 46 | +| `--restore-after` | Restaurar backups después de compilar | |
| 47 | +| `--no-cleanup` | No limpiar archivos `.o` después de compilar | |
| 48 | +| `--html` | Ruta del archivo HTML de salida (default: `html/compile.html`) | |
| 49 | +| `--json-out` | Ruta del archivo JSON de salida (default: `json/compile.json`) | |
| 50 | + |
| 51 | +### Ejemplos de Uso |
| 52 | + |
| 53 | +#### 1. Compilar y verificar archivos modificados |
| 54 | + |
| 55 | +```bash |
| 56 | +# Después de aplicar fixes, compilar para verificar |
| 57 | +python3 main.py --compile \ |
| 58 | + --json-input json/fixed.json \ |
| 59 | + --kernel-root ~/src/kernel/linux |
| 60 | +``` |
| 61 | + |
| 62 | +#### 2. Compilar y restaurar después |
| 63 | + |
| 64 | +```bash |
| 65 | +# Útil para probar sin afectar los archivos |
| 66 | +python3 main.py --compile \ |
| 67 | + --json-input json/fixed.json \ |
| 68 | + --kernel-root ~/src/kernel/linux \ |
| 69 | + --restore-after |
| 70 | +``` |
| 71 | + |
| 72 | +#### 3. Compilar sin limpieza (debug) |
| 73 | + |
| 74 | +```bash |
| 75 | +# Mantener .o files para inspección |
| 76 | +python3 main.py --compile \ |
| 77 | + --json-input json/fixed.json \ |
| 78 | + --kernel-root ~/src/kernel/linux \ |
| 79 | + --no-cleanup |
| 80 | +``` |
| 81 | + |
| 82 | +## Flujo Completo |
| 83 | + |
| 84 | +El flujo recomendado es: |
| 85 | + |
| 86 | +```bash |
| 87 | +# 1. Analizar archivos |
| 88 | +python3 main.py --analyze /path/to/kernel/linux --paths init |
| 89 | + |
| 90 | +# 2. Aplicar fixes |
| 91 | +python3 main.py --fix --json-input json/checkpatch.json |
| 92 | + |
| 93 | +# 3. Compilar para verificar |
| 94 | +python3 main.py --compile \ |
| 95 | + --json-input json/fixed.json \ |
| 96 | + --kernel-root /path/to/kernel/linux \ |
| 97 | + --restore-after |
| 98 | + |
| 99 | +# O usar el script automatizado |
| 100 | +./run |
| 101 | +``` |
| 102 | + |
| 103 | +## Formato del JSON de Entrada |
| 104 | + |
| 105 | +El módulo acepta dos formatos de JSON: |
| 106 | + |
| 107 | +### Formato 1: JSON de Autofix (recomendado) |
| 108 | + |
| 109 | +```json |
| 110 | +{ |
| 111 | + "/path/to/file1.c": { |
| 112 | + "error": [...], |
| 113 | + "warning": [...] |
| 114 | + }, |
| 115 | + "/path/to/file2.c": { |
| 116 | + "error": [...], |
| 117 | + "warning": [...] |
| 118 | + } |
| 119 | +} |
| 120 | +``` |
| 121 | + |
| 122 | +Solo compila archivos que tienen al menos un fix aplicado (`fixed: true`). |
| 123 | + |
| 124 | +### Formato 2: JSON de Checkpatch |
| 125 | + |
| 126 | +```json |
| 127 | +[ |
| 128 | + { |
| 129 | + "file": "/path/to/file1.c", |
| 130 | + "error": [...], |
| 131 | + "warning": [...] |
| 132 | + }, |
| 133 | + { |
| 134 | + "file": "/path/to/file2.c", |
| 135 | + "error": [...], |
| 136 | + "warning": [...] |
| 137 | + } |
| 138 | +] |
| 139 | +``` |
| 140 | + |
| 141 | +Compila todos los archivos listados. |
| 142 | + |
| 143 | +## Formato del JSON de Salida |
| 144 | + |
| 145 | +```json |
| 146 | +{ |
| 147 | + "summary": { |
| 148 | + "total": 3, |
| 149 | + "successful": 2, |
| 150 | + "failed": 1, |
| 151 | + "success_rate": 66.67, |
| 152 | + "total_duration": 4.5, |
| 153 | + "avg_duration": 1.5 |
| 154 | + }, |
| 155 | + "results": [ |
| 156 | + { |
| 157 | + "file": "/path/to/file1.c", |
| 158 | + "success": true, |
| 159 | + "duration": 1.2, |
| 160 | + "stdout": "CC init/main.o", |
| 161 | + "stderr": "", |
| 162 | + "error_message": "" |
| 163 | + }, |
| 164 | + { |
| 165 | + "file": "/path/to/file2.c", |
| 166 | + "success": false, |
| 167 | + "duration": 0.8, |
| 168 | + "stdout": "", |
| 169 | + "stderr": "error: implicit declaration...", |
| 170 | + "error_message": "error: implicit function declaration" |
| 171 | + } |
| 172 | + ] |
| 173 | +} |
| 174 | +``` |
| 175 | + |
| 176 | +## Reporte HTML |
| 177 | + |
| 178 | +El reporte HTML incluye: |
| 179 | + |
| 180 | +### Sección de Estadísticas |
| 181 | +- **Total Files**: Número de archivos compilados |
| 182 | +- **Successful**: Archivos compilados exitosamente |
| 183 | +- **Failed**: Archivos con errores de compilación |
| 184 | +- **Success Rate**: Porcentaje de éxito |
| 185 | +- **Total Time**: Tiempo total de compilación |
| 186 | +- **Avg Time**: Tiempo promedio por archivo |
| 187 | + |
| 188 | +### Cajas de Resumen |
| 189 | +- ✅ **Caja verde**: Todos los archivos compilaron exitosamente |
| 190 | +- ⚠️ **Caja roja**: Algunos archivos fallaron |
| 191 | + |
| 192 | +### Detalles por Archivo |
| 193 | +- **Failed Compilations**: Lista de archivos con errores (expandibles) |
| 194 | + - Muestra mensaje de error |
| 195 | + - Incluye stderr completo en detalles |
| 196 | +- **Successful Compilations**: Lista de archivos exitosos (expandibles) |
| 197 | + - Muestra tiempo de compilación |
| 198 | + - Incluye stdout si está disponible |
| 199 | + |
| 200 | +## Salida en Consola |
| 201 | + |
| 202 | +``` |
| 203 | +[COMPILE] Compilando 3 archivos... |
| 204 | +[COMPILE] [1/3] Compiling: init/main.c |
| 205 | +[COMPILE] ✓ Success (1.2s) |
| 206 | +[COMPILE] [2/3] Compiling: init/version.c |
| 207 | +[COMPILE] ✗ Failed (0.8s) |
| 208 | +[COMPILE] Error: error: implicit function declaration |
| 209 | +[COMPILE] [3/3] Compiling: init/calibrate.c |
| 210 | +[COMPILE] ✓ Success (0.9s) |
| 211 | +
|
| 212 | +[CLEANUP] Limpiando 2 archivos compilados... |
| 213 | +[CLEANUP] Removed: init/main.o |
| 214 | +[CLEANUP] Removed: init/calibrate.o |
| 215 | +
|
| 216 | +============================================================ |
| 217 | +RESUMEN DE COMPILACIÓN |
| 218 | +============================================================ |
| 219 | +Total de archivos: 3 |
| 220 | +Compilados con éxito: 2 (66.7%) |
| 221 | +Fallidos: 1 (33.3%) |
| 222 | +Tiempo total: 2.9s |
| 223 | +Tiempo promedio: 1.0s |
| 224 | +============================================================ |
| 225 | +
|
| 226 | +Archivos con errores de compilación: |
| 227 | + ✗ version.c |
| 228 | + error: implicit function declaration |
| 229 | +
|
| 230 | +[COMPILE] ✓ Informe HTML generado: html/compile.html |
| 231 | +[COMPILE] ✓ JSON generado: json/compile.json |
| 232 | +``` |
| 233 | + |
| 234 | +## Requisitos del Sistema |
| 235 | + |
| 236 | +### Kernel Linux |
| 237 | +- Debe tener el sistema de build configurado (`make` debe funcionar) |
| 238 | +- `scripts/checkpatch.pl` debe existir |
| 239 | +- Los archivos a compilar deben estar en el árbol del kernel |
| 240 | + |
| 241 | +### Dependencias Python |
| 242 | +- Python 3.6+ |
| 243 | +- Módulo `pathlib` (incluido en Python 3.4+) |
| 244 | +- Módulo `json` (incluido en stdlib) |
| 245 | +- Módulo `subprocess` (incluido en stdlib) |
| 246 | + |
| 247 | +## Manejo de Errores |
| 248 | + |
| 249 | +### Timeout de Compilación |
| 250 | +- Cada archivo tiene un timeout de 5 minutos |
| 251 | +- Si se excede, se marca como fallido con mensaje de timeout |
| 252 | + |
| 253 | +### Errores de Compilación |
| 254 | +- Los errores se capturan del stderr |
| 255 | +- Se muestran las primeras 5 líneas con "error:" |
| 256 | +- El stderr completo está disponible en el reporte HTML |
| 257 | + |
| 258 | +### Archivos No Existentes |
| 259 | +- Si un archivo del JSON no existe, se salta con warning |
| 260 | + |
| 261 | +## Tests Unitarios |
| 262 | + |
| 263 | +El módulo incluye tests completos en `test_compile.py`: |
| 264 | + |
| 265 | +```bash |
| 266 | +# Ejecutar todos los tests |
| 267 | +python3 test_compile.py -v |
| 268 | + |
| 269 | +# Tests incluidos: |
| 270 | +# - CompilationResult creation and serialization |
| 271 | +# - Result summarization |
| 272 | +# - JSON report generation |
| 273 | +# - Backup restoration |
| 274 | +# - Full workflow integration |
| 275 | +``` |
| 276 | + |
| 277 | +Todos los tests son independientes y no requieren kernel Linux. |
| 278 | + |
| 279 | +## Integración con Dashboard |
| 280 | + |
| 281 | +El reporte de compilación se integra en el dashboard con: |
| 282 | +- Tab "Compile" en la navegación |
| 283 | +- Breadcrumb: Dashboard → Compile |
| 284 | +- Estilo consistente con analyzer y autofix |
| 285 | + |
| 286 | +## Limitaciones Conocidas |
| 287 | + |
| 288 | +1. **Solo archivos .c**: Los archivos `.h` no se compilan directamente |
| 289 | +2. **Requiere kernel configurado**: El kernel debe tener `.config` generado |
| 290 | +3. **Dependencias del kernel**: Si el archivo depende de módulos no compilados, puede fallar |
| 291 | +4. **Tiempo de compilación**: Puede ser lento para muchos archivos |
| 292 | + |
| 293 | +## Solución de Problemas |
| 294 | + |
| 295 | +### Error: "Kernel root no encontrado" |
| 296 | +- Verificar que la ruta al kernel es correcta |
| 297 | +- Usar ruta absoluta: `--kernel-root ~/src/kernel/linux` |
| 298 | + |
| 299 | +### Error: "make: *** No rule to make target" |
| 300 | +- El archivo puede no estar en el Makefile del kernel |
| 301 | +- Verificar que el archivo es parte del kernel |
| 302 | + |
| 303 | +### Compilación lenta |
| 304 | +- Usar menos archivos en el JSON |
| 305 | +- Verificar que el kernel está configurado correctamente |
| 306 | + |
| 307 | +### No se limpian los .o |
| 308 | +- Verificar que no se usa `--no-cleanup` |
| 309 | +- Verificar permisos de escritura en el directorio |
| 310 | + |
| 311 | +## Mejoras Futuras |
| 312 | + |
| 313 | +- [ ] Compilación paralela de múltiples archivos |
| 314 | +- [ ] Soporte para compilar módulos completos |
| 315 | +- [ ] Detección automática de dependencias |
| 316 | +- [ ] Caché de resultados de compilación |
| 317 | +- [ ] Integración con herramientas de análisis estático |
| 318 | + |
| 319 | +## Referencias |
| 320 | + |
| 321 | +- [Documentación del kernel Linux](https://www.kernel.org/doc/html/latest/) |
| 322 | +- [Sistema de build del kernel (Kbuild)](https://www.kernel.org/doc/html/latest/kbuild/index.html) |
| 323 | +- [Checkpatch.pl](https://www.kernel.org/doc/html/latest/dev-tools/checkpatch.html) |
0 commit comments