Hi guys, Hi have for the past week been trying to build the VLC player with mingw32ce. This has been serving me to get a feeling for what is needed/lacking in mingw32ce. I have successfully ported/built a bunch of stuff, like zlib, libogg, libmad, libbidi, and freetype. I have built ffmpeg also without plugins, and Daniel Alm has made good progress on some plugins porting.
On the mingw32ce side, I ended up reimplementing the time related functions, since they were buggy, and added among other things. Things like a stat function, strerror, and perror, based on GetLastError(), not errno. Most of the uses I've seen of perror, come after calling stdio functions, like fopen, and coredll does set GetLastError on error there. This leads me to the biggest frustration in porting stuff to wince: The famous `no errno` problem. I got tired of doing #ifndef __MINGW32CE__ or #ifdef HAVE_ERRNO_H around errno stuff. I have seen different solutions to the problem, which I'll describe below. 1) define an `int errno` somewhere in the code, and an `extern int errno` in an errno.h file in some cecompat subdir in the project. Problems: Gives false sence of error handling. Eg: fopen ("doesnt_exist.txt", "r"); if (f == NULL && errno == ENOENT) { // oops, this will never be reached, because fopen has no notion // of our errno. } Only explicit errno sets will be caught, since the runtime (coredll.dll) doesn't know a thing about it. I am looking at an easy way out, so I am looking at putting something in mingw32ce to solve this. If we provided an int errno in libmingwex.a, it wouldn't be shared across dlls, which may result in nasty surprises. eg: int function_in_dll (const char* param) { printf ("%p\n", &errno); if (!param) { errno = EINVAL; return -1; } return 0; } int function_in_app () { printf ("%p\n", &errno); errno = 0; function_in_dll (NULL); if (errno != 0) { // oooops, dll's errno is different from the app's errno. } } The errno from the dll would have a different errno from the app, so the calling function would never see the errno being set. Plus, it isn't thread safe. A proper errno would have to be put into TLS. 2) Same as (1) but move int errno into a shared dll. To solve the multiple errno problem, we might move the errno to a dll, then it would be shared among all the apps, but I hate having an extra dependency. 3) Rewrite the code to use [Get|Set]LastError() This is what I have been doing, and it has been very, very time consuming. It is mostly a cycle of build, look at error, wrap in ifdefs, eventually rewrite, rebuild, rewind, wait, build, rewait, etc. Major time killer. Been doing late hours because of this :) 4) Map errno to [Get|Set]LastError() with preprocessor macros. #define errno GetLastError() #define __set_errno(X) SetLastError((DWORD)X) #define ENOMEM ERROR_OUTOFMEMORY (...) Simple, has no multiple errno across dlls problem. Still needs code porting to replace all the errno = X with __set_errno(X), but since __set_errno is somewhat of a defacto standard, and some srcs already use it, should be easy to convince the upstream maintainers of the app/lib you are porting to change the code, or accept patches in that direction. --------------------------- Conclusion: I like 4 the best, and I am going to give it a try. Any opinions/comments/requests-for-clarification/war_stories would be much appreciated. Cheers, Pedro Alves __________________________________________________________ Email gratuito com 2 000 MB Espaço para guardar 1 milhão de mensagens http://www.portugalmail.pt/2000mb ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Cegcc-devel mailing list Cegcc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/cegcc-devel