This commit is contained in:
2025-11-07 17:01:29 +01:00
parent 84b5ff05ad
commit 6e3cd05cd2
12 changed files with 129 additions and 38 deletions

View File

@@ -1,5 +1,55 @@
#!/bin/bash
# ============================================================================
# CONFIGURACIÓN - Editar estas constantes para personalizar el script
# ============================================================================
# Detectar la ubicación del script y la raíz del proyecto
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Rutas del proyecto
DEFAULT_ANALYSIS_PATH="$PROJECT_ROOT/source"
INCLUDE_PATH="$PROJECT_ROOT/source"
SUPPRESSIONS_FILE="$SCRIPT_DIR/cppcheck_suppressions"
OUTPUT_DIR="$SCRIPT_DIR"
BUILD_DIR="$PROJECT_ROOT/build"
COMPILE_COMMANDS="$BUILD_DIR/compile_commands.json"
# Parámetros de compilación comunes (fallback para análisis de archivos específicos)
CPPCHECK_STD="--std=c++20"
# Calcular número de threads (cores - 1, mínimo 1)
THREADS=$(($(nproc) - 1))
[[ $THREADS -lt 1 ]] && THREADS=1
# ============================================================================
# Función para asegurar que compile_commands.json existe
ensure_compile_commands() {
if [[ ! -f "$COMPILE_COMMANDS" ]]; then
echo "⚠ compile_commands.json no encontrado en $BUILD_DIR"
echo "Generando compile_commands.json con CMake..."
# Crear directorio build si no existe
mkdir -p "$BUILD_DIR"
# Ejecutar CMake para generar compile_commands.json
(cd "$BUILD_DIR" && cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .. > /dev/null 2>&1)
if [[ ! -f "$COMPILE_COMMANDS" ]]; then
echo "❌ Error: No se pudo generar compile_commands.json"
echo "Por favor, ejecuta manualmente:"
echo " cd $BUILD_DIR && cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .."
exit 1
fi
echo "✓ compile_commands.json generado exitosamente"
else
echo "✓ Usando compile_commands.json existente: $COMPILE_COMMANDS"
fi
}
# Función para mostrar el uso del script
mostrar_uso() {
echo "Uso: $0 [OPCIÓN] [RUTA]"
@@ -10,7 +60,7 @@ mostrar_uso() {
echo " -u, --unused Ejecutar cppcheck para unusedFunction"
echo ""
echo "Opciones de ruta:"
echo " -p, --path <ruta> Especificar ruta a analizar (default: ../source/)"
echo " -p, --path <ruta> Especificar ruta a analizar (default: PROJECT_ROOT/source)"
echo " [RUTA] Ruta como último argumento posicional"
echo ""
echo "Ejemplos:"
@@ -22,7 +72,7 @@ mostrar_uso() {
# Inicializar las variables
opcion=""
ruta="../source/"
ruta="$DEFAULT_ANALYSIS_PATH"
# Procesar las opciones
while [[ $# -gt 0 ]]; do
@@ -76,30 +126,67 @@ fi
# Ejecutar según la opción seleccionada
case $opcion in
warning)
echo "Ejecutando cppcheck con warning, style, performance en: $ruta"
cppcheck --force --enable=warning,style,performance --std=c++20 \
--check-level=exhaustive \
--suppressions-list=./cppcheck_suppressions \
"$ruta" \
2>./cppcheck-result-warning-style-performance.txt
echo "Resultados guardados en: ./cppcheck-result-warning-style-performance.txt"
ensure_compile_commands
if [[ "$ruta" == "$DEFAULT_ANALYSIS_PATH" ]]; then
echo "Ejecutando cppcheck con warning, style, performance en proyecto completo (usando $THREADS threads)"
cppcheck --force --enable=warning,style,performance \
--check-level=exhaustive \
-j$THREADS \
--project="$COMPILE_COMMANDS" \
--suppressions-list="$SUPPRESSIONS_FILE" \
2>"$OUTPUT_DIR/cppcheck-result-warning-style-performance.txt"
else
echo "Ejecutando cppcheck con warning, style, performance en: $ruta (usando $THREADS threads)"
cppcheck --force --enable=warning,style,performance $CPPCHECK_STD \
--check-level=exhaustive \
-j$THREADS \
-I "$INCLUDE_PATH" \
--suppressions-list="$SUPPRESSIONS_FILE" \
"$ruta" \
2>"$OUTPUT_DIR/cppcheck-result-warning-style-performance.txt"
fi
echo "Resultados guardados en: $OUTPUT_DIR/cppcheck-result-warning-style-performance.txt"
;;
all)
echo "Ejecutando cppcheck con todas las opciones en: $ruta"
cppcheck --force --enable=all -I /usr/include --std=c++20 \
--suppress=missingIncludeSystem \
--suppressions-list=./cppcheck_suppressions \
"$ruta" \
2>./cppcheck-result-all.txt
echo "Resultados guardados en: ./cppcheck-result-all.txt"
ensure_compile_commands
if [[ "$ruta" == "$DEFAULT_ANALYSIS_PATH" ]]; then
echo "Ejecutando cppcheck con todas las opciones en proyecto completo (usando $THREADS threads)"
cppcheck --force --enable=all \
-j$THREADS \
--project="$COMPILE_COMMANDS" \
--suppress=missingIncludeSystem \
--suppressions-list="$SUPPRESSIONS_FILE" \
2>"$OUTPUT_DIR/cppcheck-result-all.txt"
else
echo "Ejecutando cppcheck con todas las opciones en: $ruta (usando $THREADS threads)"
cppcheck --force --enable=all -I /usr/include -I "$INCLUDE_PATH" $CPPCHECK_STD \
-j$THREADS \
--suppress=missingIncludeSystem \
--suppressions-list="$SUPPRESSIONS_FILE" \
"$ruta" \
2>"$OUTPUT_DIR/cppcheck-result-all.txt"
fi
echo "Resultados guardados en: $OUTPUT_DIR/cppcheck-result-all.txt"
;;
unused)
echo "Ejecutando cppcheck para unusedFunction en: $ruta"
cppcheck --enable=style --std=c++20 \
--suppressions-list=./cppcheck_suppressions \
"$ruta" \
2>./cppcheck-result-unusedFunction.txt
echo "Resultados guardados en: ./cppcheck-result-unusedFunction.txt"
ensure_compile_commands
if [[ "$ruta" == "$DEFAULT_ANALYSIS_PATH" ]]; then
echo "Ejecutando cppcheck para unusedFunction en proyecto completo (usando $THREADS threads)"
cppcheck --enable=style \
-j$THREADS \
--project="$COMPILE_COMMANDS" \
--suppressions-list="$SUPPRESSIONS_FILE" \
2>"$OUTPUT_DIR/cppcheck-result-unusedFunction.txt"
else
echo "Ejecutando cppcheck para unusedFunction en: $ruta (usando $THREADS threads)"
cppcheck --enable=style $CPPCHECK_STD \
-j$THREADS \
-I "$INCLUDE_PATH" \
--suppressions-list="$SUPPRESSIONS_FILE" \
"$ruta" \
2>"$OUTPUT_DIR/cppcheck-result-unusedFunction.txt"
fi
echo "Resultados guardados en: $OUTPUT_DIR/cppcheck-result-unusedFunction.txt"
;;
*)
echo "Error: Opción inválida"