Git Product home page Git Product logo

so-project-template's Introduction

so-project-template

Templates para facilitar la creación de proyectos en Lenguaje C.

meme

Tan simple como...

# crear una carpeta con el nombre del proyecto
mkdir mi-nuevo-proyecto && cd mi-nuevo-proyecto

# descargar el template
wget -qO- https://github.com/RaniAgus/so-project-template/releases/download/v4.0.3/project-v4.0.3.tar.gz \
  | tar -xzvf - --strip-components 1

# compilar con make
make

# ejecutar
./bin/mi-nuevo-proyecto.out

Para agregar bibliotecas, compartir código entre proyectos, importar en Eclipse o Visual Studio Code y otras features, consultar la guía de uso.

Contacto

Si encontrás algun error en la configuración de tu proyecto o tenés alguna sugerencia, ¡no dudes en abrir un issue en este repositorio!

so-project-template's People

Contributors

raniagus avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

so-project-template's Issues

Testear modulos - Posibilidad de integrar funciones de los modulos a los Tests

Buenas Rani, tuvimos un inconveniente con los tests en el TP de operativos, al tratar de testear los módulos, el problema es que no nos permite incluir las funciones de dichos modulos al usar la macro #include en los archivos de test.

Queríamos testear las funciones del módulo Kernel, más específicamente del archivo planificador.c
y por tanto incluímos planificador.h en planificador_tests.h pero a la hora de compilar nos figura el siguiente log:

En el fichero incluido desde src/planificador_test.c:1:
include/planificador_test.h:9:10: error fatal: planificador.h: No existe el fichero o el directorio
    9 | #include "planificador.h"
      |          ^~~~~~~~~~~~~~~~

compilación terminada.
make[1]: *** [makefile:92: obj/src/planificador_test.o] Error 1
make: *** [makefile:7: tests] Error 2

Queríamos saber si es posible con la estructura presente de hacer esto, poder incluir códigos de módulos concretos en el módulo de tests.

Gracias

Ver cómo generar prerrequisitos automáticamente

Hay que ver si se puede hacer que las dependencias de un *.o se generen automáticamente así se recompilan en caso de que alguna sea modificada.

Esto podría arreglar el problema que hay al cambiar el tipo de retorno de una función sin editar otros sources que la usen: no se recompilan entonces GCC no falla al compilar, ya que el chequeo de tipos se hace antes del linkeo. Incluso los makefiles generados por Eclipse fallan en esto.

Pruebas varias a la fecha

Muy buenas Rani,
paso a reflejar algunos casos de uso que estuve probando.

Casos de #includes

Abstrayéndome de si existe sentido en hacerlo, probé los 4 casos:

  1. SharedLib1 incluye a SharedLib2
  2. SharedLib incluye a StaticLib
  3. StaticLib incluye a SharedLib
  4. StaticLib1 incluye a StaticLib2

Todos fueron exitosos, salvo para el caso 2. Los logs que me dieron (luego de haber hecho el clean):

$ make
make -C utils
make[1]: se entra en el directorio '/home/user/Documentos/template-tests/utils'
../compilation.mk:43: el objetivo 'obj/' se proporcionó más de una vez en la misma regla
../compilation.mk:43: el objetivo 'obj/' se proporcionó más de una vez en la misma regla
../compilation.mk:43: el objetivo 'obj/' se proporcionó más de una vez en la misma regla
../compilation.mk:43: el objetivo 'obj/' se proporcionó más de una vez en la misma regla
mkdir -pv obj/
mkdir: se ha creado el directorio 'obj/'
gcc -g -Wall -DDEBUG -c -o "obj/stream.o" src/stream.c -I./include
gcc -g -Wall -DDEBUG -c -o "obj/module_config.o" src/module_config.c -I./include
gcc -g -Wall -DDEBUG -c -o "obj/connections.o" src/connections.c -I./include
gcc -g -Wall -DDEBUG -c -o "obj/common_utils.o" src/common_utils.c -I./include
gcc -g -Wall -DDEBUG -c -o "obj/buffer.o" src/buffer.c -I./include
mkdir -pv bin/
mkdir: se ha creado el directorio 'bin/'
ar rcs -o "bin/libutils.a" obj/stream.o obj/module_config.o obj/connections.o obj/common_utils.o obj/buffer.o
make[1]: se sale del directorio '/home/user/Documentos/template-tests/utils'
make -C matelib
make[1]: se entra en el directorio '/home/user/Documentos/template-tests/matelib'
mkdir -pv obj/
mkdir: se ha creado el directorio 'obj/'
gcc -g -Wall -DDEBUG -fPIC -c -o "obj/matelib.o" src/matelib.c -I../utils/include -I./include
mkdir -pv bin/
mkdir: se ha creado el directorio 'bin/'
gcc -g -Wall -DDEBUG -shared -o "bin/libmatelib.so" obj/matelib.o -L../utils/bin -lutils -lcommons
/usr/bin/ld: ../utils/bin/libutils.a(connections.o): warning: relocation against `stderr@@GLIBC_2.2.5' in read-only section `.text'
/usr/bin/ld: ../utils/bin/libutils.a(connections.o): relocation R_X86_64_PC32 against símbolo `stderr@@GLIBC_2.2.5' can not be used when making un objeto compartido; recompile con -fPIC
/usr/bin/ld: falló el enlace final: bad value
collect2: error: ld devolvió el estado de salida 1
make[1]: *** [../compilation.mk:38: bin/libmatelib.so] Error 1
make[1]: se sale del directorio '/home/user/Documentos/template-tests/matelib'
make: *** [makefile:11: matelib] Error 2

Casos de módulos de test (en CUnit)

Probé los 2 casos como lo recomendaba la guía. El makefile del módulo de tests se encuentra coherente para la "opción 2: en una carpeta aparte del repo", pero no para la opción 1. Para la opción 1 tuve que modificar el makefile del módulo de tests:

# Original
...

################################################################################

include ../compilation.mk

################################################################################

include ../execution.mk
# Adaptado para la Opción 1
...

################################################################################

include ../../compilation.mk

################################################################################

include ../../execution.mk

Probé también en hacer un módulo de test exclusivamente para la shared lib y funcionó (para ambas opciones). La posibilidad de hacer esto no se encuentra explícito en la guía.

Declaraciones globales

Tuve casos en donde las declaraciones globales, en el archivo excluído por:

# Excluded source files (eg: main() function)
EXCLUDE=main.c

deben ser declaradas en sus archivos de test, ya que de lo contrario no los reconoce:

/home/user/Documentos/template-tests/kernel/tests/../src/scheduler.c:51: referencia a `kernelLogger' sin definir

Este aspecto no se encuentra reflejado en la guía.

Saludos Rani 😄

error al importar las commons

Hola, estube siguiendo tu tutorial sobre el template y la verdad esta kuy bien hecho. El problema es que me es imposible agregar las commons. Copie y pegue tu comando sin problemas (gcc src/main.c -o bin/ejemplo.out -lcommons) y tmb agregue la linea # Libraries
LIBS=commons. Por favor sabes cual seria el problema?

Makefile + Git - Compilación de módulos según rama de git

Buenas, estamos usando éste gran template para nuestro tp de sisop, y va genial, pero estabamos agregandole algunos features a medida que lo necesitamos. Queria saber si nos podías guiar de como adaptarlo con git, de paso quizás también te sirve como feature.

Sólo le agregamos algunas reglas para que según en que rama de git esté uno parado, te compile o no ciertos módulos, al parecer ejecuta las reglas en los directorios indicados, pero no del todo porque cuando vemos el directorio bin no aparece nada.

# este es nuestro makefile en la raíz de proyecto
GIT_BRANCH = $(shell git rev-parse --abbrev-ref HEAD) # new feature here
KERNEL_PROJECT=kernel
MEMORIA_PROJECT=memoria swamp
PROJECTS:=carpincho_dummy carpincho_dummy2 carpincho_dummy3 tests
LIBS=static matelib

all: $(PROJECTS) git_branch

$(PROJECTS): $(LIBS) $(CHECK_GIT)
	$(MAKE) --no-print-directory -C $@ all

 # new feature here
$(CHECK_GIT):
ifeq ($(GIT_BRANCH), dev/kernel)
  PROJECTS:=$(KERNEL_PROJECT) $(PROJECTS)
else ifeq ($(GIT_BRANCH), dev/memoria)
  PROJECTS:=$(MEMORIA_PROJECT) $(PROJECTS)
else ifeq ($(GIT_BRANCH), dev/swap)
  PROJECTS:=$(MEMORIA_PROJECT) $(PROJECTS)
else
  PROJECTS:=$(KERNEL_PROJECT) $(MEMORIA_PROJECT) $(PROJECTS)
endif

$(LIBS):
	$(MAKE) --no-print-directory -C $@ all

 # new feature here
git_branch:
	@echo "Usaste makefile para la rama \"$(GIT_BRANCH)\" y compilaste \"$(PROJECTS)\""

clean:
	$(foreach P, $(LIBS) $(PROJECTS), $(MAKE) --no-print-directory -C $P clean;)

release:
	$(foreach P, $(LIBS) $(PROJECTS), $(MAKE) --no-print-directory -C $P release;)

.PHONY: all $(PROJECTS) $(LIBS) $(CHECK_GIT) clean release git_branch

Por cierto, si sirve como otro feature, nosotros agregamos una regla extra en los makefile de cada módulo para que elimine los archivos generados por valgrind cuando debugeamos con vscode

clean: cleanvalgrindfiles
	$(RM) $(OBJDIR) $(BINARY)

cleanvalgrindfiles:
	$(RM) vgcore.*

Espero nos puedas guiar, y alguno de estos features sirva también en tu proyecto,
Gracias

Obtener SRCDIR y BINDIR en el proyecto

Por ahora ambos paths están hardcodeados, lo cual funciona pero es erróneo: si alguien modifica SRCDIR y BINDIR, va a dejar de funcionar

INCLUDES = $(LIBRARY_PATHS:%=-I"%/src")
LINKS = $(LIBRARY_PATHS:%=-L"%/bin") $(LIBRARIES:%=-l%)

Se tiene que poder incluir SRCDIR y BINDIR de cada library forma automática (¿relacionado con #4?)

Static Lib referenciable como Shared Lib

Muy buenas rani, yo de nuevo 😅
Encontré un caso (de casualidad y despistado) de redundancia entre las dos variables para referenciar a los dos tipos de bibliotecas.

Caso de uso: biblioteca estática referenciada como biblioteca dinámica

Precondición

Existe una biblioteca Utils que es una biblioteca estática.

Settings

Se da la posibilidad, en otros módulos/bibliotecas, de:

# En módulo Kernel
...
# Custom libraries' paths
SHARED_LIBPATHS=../utils
STATIC_LIBPATHS=
...

En otras palabras, es posible referenciar a una biblioteca estática como si fuese una biblioteca compartida.
El caso contrario (biblioteca dinámica referenciada como biblioteca estática) falla como debe.


Comprobé la integridad para los casos reflejados en #28 y todo anda joya 👍🏻

Saludos rani 😄

Aceptar otras estructuras de carpetas

Algunos suman a la estructura de proyectos una carpeta include, para lo cual no soy muy fan pero estaría bueno soportar:

.
│  
└─── <project>/
      └─── include/  # Acá van los .h
      └─── src/      # Acá van los .c
      └─── makefile

Para esto, primero hay que resolver #6

Agregar soporte para CSpec

Agregar una variable ENTRYPOINT para diferenciar al archivo *.c que contiene el main del resto. De esa forma, se pueden compilar y linkear a un proyecto de test con CSpec.

Mudar docu a la wiki

Ya son bastantes las features y me está quedando un readme bastante largo explicando cómo usarlas todas. También quiero dejar mejor documentado cómo está armado, y claramente eso no entra en un readme.

Biblioteca compartida no reconoce a una función de una biblioteca estática

Muy buenas Rani,
me acerco a consultar un caso que surgió probando cosas en el trabajo práctico de operativos.
Estuve desarrollando la matelib, más específicamente la función mate_init. Obtuve lo siguiente en los logs del makefile, en carpincho-dummy (el cual invoca mate_init):

$ make start 
gcc -I../matelib/include/ -I../static/include/ -Iinclude/ -Wall -DDEBUG -g -o "bin/carpincho-dummy.out" obj/src/carpincho.o -L../matelib/bin/ -L../static/bin/ -lstatic -lmatelib -lcommons
/usr/bin/ld: ../matelib/bin//libmatelib.so: referencia a `conectar_a_servidor' sin definir
collect2: error: ld devolvió el estado de salida 1
make: *** [makefile:84: bin/carpincho-dummy.out] Error 1

Estructuramos el proyecto con los respectivos módulos, 1 biblioteca estática y 1 biblioteca compartida. La función conectar_a_servidor estaría en la biblioteca estática.

El siguiente sería los logs para matelib (ejecutado el make clean all desde el directorio raíz):

make -C matelib all
make[1]: se entra en el directorio '/home/samsepi0l/Documentos/tp-2021-2c-La-Cosa-Operativa/matelib'
mkdir -pv obj/src/
mkdir: se ha creado el directorio 'obj'
mkdir: se ha creado el directorio 'obj/src/'
gcc -I../static/include/ -Iinclude/ -Wall -DDEBUG -g -c -fmessage-length=0 -fPIC -MMD -MP -MF"obj/src/matelib.d" -MT"obj/src/matelib.d" -o "obj/src/matelib.o" "src/matelib.c"
gcc -shared -o "bin/libmatelib.so" obj/src/matelib.o
make[1]: se sale del directorio '/home/samsepi0l/Documentos/tp-2021-2c-La-Cosa-Operativa/matelib'

Estuve viendo unos posts de stackoverflow y me encontré con este post.

Siento que en la ante última línea de los logs le estaría faltando de alguna forma especificar que se compile contra la static library. Probé también cambiando el orden de compilación entre la biblioteca compartida y estática (para que primero compile la estática), pero honestamente no llegué a ninguna solución.
Quería saber si me podías dar una mano con este aspecto. Cualquier otra información que necesites estaré a disposición.

Saludos Rani !

Motivación para simular un Watch

Buenas, quería saber si se podría implementar algo parecido a un watch.

En un mini proyecto aparte había agregado lo siguiente (que funcionaba bien)

.PHONY: watch
watch:
	while true; do $(MAKE) -q || $(MAKE); sleep 1; done

La motivación era que no fuese necesario ejecutar el make a cada rato,
y que detecte los cambios automáticamente en los archivos del proyecto.

Actualmente estaría ejecutando el make all cada segundo.
Quería proponer esta idea para no tener que estar tirando el make all a mano.

Saludos,

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.