El principal escollo que me he encontrado, es que tanto para mi código como para el ejemplo del SDK, me da el error "MainLibraryProperties not found in /opt/gemix/modules/linux/release/GMXEXT_mod_csv.so - MODULE not valid" :
El código lo tengo aquí por si alguien quiere mirar y se le ocurre que puede estar mal : https://github.com/Zardoz89/csvDll/tree/gemix/gemix
- Code: Select all
gemix /home/luis/repos/div/GMXEXT_mod_SDKexample/example.prg
**** GEMIX Compiler 0.7.5 (BETA) ****
Copyright (C) 2005-2016 Skygem Software. All rights reserved
Precompiling...
Can't load /opt/gemix/modules/linux/release/GMX_mod_dbms.so (/opt/gemix/modules/linux/release/GMX_mod_dbms.so: undefined symbol: pthread_mutexattr_settype)
MainLibraryProperties not found in /opt/gemix/modules/linux/release/GMXEXT_mod_csv.so - MODULE not valid
MainLibraryProperties not found in /opt/gemix/modules/linux/release/GMXEXT_mod_sdkexample.so - MODULE not valid
using module id: 03 - GMX_mod_stdmain
using module id: 04 - GMX_mod_math
using module id: 05 - GMX_mod_graphics2Dlgy
using module id: 07 - GMX_mod_inputlgy
using module id: 14 - GMX_mod_text2Dlgy
Compiling...
Compiling: example.prg
example.prg:8:9: ERROR 34: Unknown name ( sdk_min )
function:
Break (0 warnings)
Exit with errors
----
La documentación es un caos. El post viewtopic.php?f=124&t=5348 tiene erratas... por ejemplo, las lineas :
- // The real function must have the following form:
- GMXvoid GMXEXT_<name>() {
- [<Type> Variable = Get<Type>Param();]
- ...
- Ret<Type>Value(return_value);
- }
Cuando las funciones son "GMXAPI_GetTypeParam()" , "GMXAPI_RetTypeValue()"...
----
No he visto nada de como compilarlo en Linux. A base de prueba y error, he visto de Gemix está compilado para 32bit (igual en 2021 habría que migrar a 64bit, que ya varias distros están quitando el soporte a binarios de 32 bit...)
EDIT: Veo que la beta 8.0 esta en 32 y 64 bits
----
No veo que haya un ruta donde soltar los dll/so de los modulos externos sin mezclarlos con los propios de Gemix.
----
Otros detalles que veo mirando el código de las cabeceras y que ya no es referente a compilar en si módulos ...
Veo que se hace typedefs a tipos propios de Gemix, como GMXint, etc , pero se hacen directamente sobre los tipos básicos de C , lo cual puede ser un problema a la hora de portar el código de Gemix a otras plataformas o a 64 bits... Lo suyo es usar los tipos de <stdint.h> como uint8_t, int32_t, etc... que garantizan la portabilidad y los tamaños de los tipos en todas las plataformas.
----
El error "Can't load /opt/gemix/modules/linux/release/GMX_mod_dbms.so (/opt/gemix/modules/linux/release/GMX_mod_dbms.so: undefined symbol: pthread_mutexattr_settype)" , se debería de poder arreglar compilando (por lo menos) el modulo GMX_mod_dbms con el flag "-pthread" : https://stackoverflow.com/questions/221 ... tr-settype
----
El compilador de gemix, busca el fichero de configuración (gemix.cfg), los ficheros .rel y los .so necesarios en la ruta local. Es decir, espera que gemix.cfg, y los ficheros .rel estén exactamente en donde se está ejecutando. Si busca en otras rutas, no he visto mención de esto en ningún lado.
Lo cual lo vuelve complicado de instalar de una forma normal en un entorno unix cualquiera. Lo normal es buscar el fichero de configuración en este orden :
1. En el path de ejecución
2. $HOME/.config/gemix
3. /usr/share/gemix/
4. /usr/local/share/gemix
5. En la ubicación del ejecutable de gemix
Y para los ficheros .rel y .so sean necesarios, que siga un patrón similar:
1. En el path especificado en el gemix.cfg
2. /usr/lib/gemix/
3. /usr/local/lib/gemix
4. En la ubicación del ejecutable de gemix
Al seguir las rutas estándar, seria bastante fácil hacer un script de instalación de Gemix en un entorno unix y/o hacer un paquete .deb o .rpm. Y se podría lanzar gemix desde cualquier ruta, sin tener que ejecutarlo desde la carpeta donde descomprimes el ZIP (y poder usarlo desde un makefile; usarlo desde un language server desde vim o vscode, etc...)