English version of this post.
Hace ya bastante tiempo cuando empecé a diseñar Phoxonics tuve un problema relacionado a los includes de módulos. Phoxonics cuenta con diversos módulos los cuales tienen dependencias entre ellos, al momento de agregar una nueva clase era necesario agregar una entrada en el archivo de módulo global para saber que dicha clase era parte del módulo.
Decidí hacer un pequeño script para automatizar esta sencilla tarea la cual se volvía un poco tediosa por el hecho de tener que recordar cuales encabezados se habían incluido en cada módulo. Con este script ya no es necesario recordar que archivo de clase se agregó a cada módulo y en qué tiempo, ya que en el target de compilación se manda llamar el script que genera el archivo de módulo con todas las dependencias de dicho módulo las cuales son deducidas al momento de compilación.
Aquí se anexa el código del script en bash para la generación automática de encabezados de módulos, espero que a alguien le sea de utilidad.
module_name="${1}" module_name_upper=${module_name^^} # Module name in uppercase # Run as user, -e allows to interpret new line \n echo -e "\n \ ********************************************************** \n \ ** Automatic header generation for module ${module_name} \n \ **********************************************************" inc_dir="${2}" out_file="${3}" # "ls -l $inc_dir" = get a directory listing # --time-style="long-iso" = makes sure that the same format for the date-time string is the same in all environments. # "| egrep '^d'" = pipe to egrep and select only the directories # "awk '{print $8}'" = pipe the result from egrep to awk and print only the 8th field inc_dirs=`ls -l --time-style="long-iso" $inc_dir | egrep '^d' | awk '{print $8}'` cat <<EOF >"${out_file}" /* * ${module_name}.hpp * * Auto-Generated module header file, do not modify directly * to prevent changes loss, to modify please change GenHeaders.sh * * Created on: 2014 * Author: nano */ #ifndef ${module_name_upper}_HPP_ #define ${module_name_upper}_HPP_ // Include all headers that are part of the ${module_name} module EOF # Loop through the directories for dir in ${inc_dirs}; do echo -e "\n${dir}"; curr_dir=${inc_dir}/${dir} file_cnt=$( find ${curr_dir} -name "*.h*" | wc -l ) curr_files=$( find ${curr_dir} -name "*.h*" ) if [ ${file_cnt} -gt 0 ]; then # check if we have headers in dir for file in ${curr_files}; do # Loop through files and add includes echo "#include \"${file}\"" >> ${out_file}; echo "${file}"; done fi done echo -e "\n"; # Add closing ifdef echo "" >> ${out_file} echo "#endif /* ${module_name_upper}_HPP_ */" >> ${out_file}
A continuación se muestra el resultado de un módulo de código autogenerado.
/* * common.hpp * * Auto-Generated module header file, do not modify directly * to prevent changes loss, to modify please change GenHeaders.sh * * Created on: 2014 * Author: nano */ #ifndef COMMON_HPP_ #define COMMON_HPP_ // Include all headers that are part of the common module #include "./include/common/CommonBase.hpp" #include "./include/data/Config.hpp" #include "./include/data/Programs.hpp" #include "./include/data/VersionInfo.hpp" #include "./include/exception/CustomException.hpp" #include "./include/hdf5/Hdf5Grid2D.hpp" #include "./include/hdf5/Hdf5Grid2DSlice.hpp" #include "./include/hdf5/Hdf5Grid1DSlice.hpp" #include "./include/hdf5/Hdf5Grid1D.hpp" #include "./include/hdf5/Hdf5Base.hpp" #include "./include/io/Folder.hpp" #include "./include/io/File.hpp" #include "./include/utils/DateTime.hpp" #include "./include/utils/Logger.hpp" #include "./include/utils/Formatter.hpp" #include "./include/utils/ArrSizeHelper.hpp" #include "./include/utils/Matrix.hpp" #include "./include/utils/Utilities.hpp" #include "./include/utils/Strings.hpp" #include "./include/utils/Command.hpp" #include "./include/utils/SingleLoggerConfig.hpp" #endif /* COMMON_HPP_ */
pd. El código generado es C++, el lenguaje de programación ¡más poderoso que existe!
¡Saludos!
-Yohan