[waffle] waffle vs msvc: Round 1, Fight !!!
Emil Velikov
emil.l.velikov at gmail.com
Wed Jul 2 16:25:24 PDT 2014
On 2 July 2014 00:22, Chad Versace <chad.versace at intel.com> wrote:
> On Mon, Jun 30, 2014 at 01:05:27AM +0100, Emil Velikov wrote:
>> Hello all,
>>
>> Another day another long email :)
>>
>> As usual, a list of issues, possible solutions, and my personal
>> preference for each. At the end I have tried to assign a priority for
>> most.
>>
>> Any input would be greatly appreciated.
>>
>> Highlights:
>>
>> General (nitbits):
>> * C "Hello world" does not work OOTB with VC12 :)
>> ** Have to switch the platform toolset to v120_xp, as the default
>> v120 complains about missing headers, libraries... (SDKDDKVer.h...),
>>
>> * Compiling ninja - fails due to the missing toolset.
>> ** Planning to use VC for now.
>>
>> Jose are you having similar experience with VC12 ? Pardon but I'm
>> using VC12 for the first time, and the documentation out there is
>> rather... :\
>>
>>
>> Build system related:
>> * Tests fail to build due to the missing toolset (+ others?)
>> Possible fix(es)
>> ** if (windows && !mingw) hardcode generator and toolset across whole
>> of waffle endif ()
>>
>> * cmake does not find some headers and libs - GL/gl.h windows.h opengl32.lib
>> Possible fix(es)
>> ** Hardcode the libname, and ignore the headers' location as they
>> should just work (tm)
>
> On you GSOC2014 branch, I see that you're searching the headers with:
>
> if(waffle_on_windows)
> find_path(opengl_INCLUDE_DIR GL/gl.h REQUIRED)
> ...
> endif()
>
> What happens if you instead do this?
>
> if(waffle_on_windows)
> find_path(OpenGL REQUIRED)
> ...
> endif()
>
Hmm that looks rather strange according to the documentation. Either
way, cmake still failed to find the paths/library, yet it seems that
hard coding the library name was the only thing required :)
>> POSIX only
>> * getopt (utils/wflinfo, examples/gl_basic) - reuse one of the
>> following (license implications?)
>> Current implementations
>> ** http://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/pkgtools/libnbcompat/files/getopt.c
>> (BSD 3-clause)
>> ** http://sourceforge.net/p/mingw-w64/mingw-w64/ci/master/tree/mingw-w64-crt/misc/getopt.c
>> (unknown + BSD 2-clause)
>> Leaning towards reusing the NetBSD's implementation.
>
> I also prefer to reuse NetBSD's getopt. As long as VisualStudio can
> compile it :/
>
With a couple of small changes it seems to be working :)
>
>> * pthreads - reuse one of the following (license implications?)
>> Current implementations
>> ** http://locklessinc.com/downloads/winpthreads.h (BSD 3-clause)
>> ** https://www.sourceware.org/pthreads-win32/ (GNU Lesser GPL)
>> ** http://cgit.freedesktop.org/mesa/mesa/tree/include/c11/threads_win32.h
>> (Boost Software License, Version 1.0)
>> ** http://sourceforge.net/p/mingw-w64/mingw-w64/ci/master/tree/mingw-w64-libraries/winpthreads
>> (unknown [2]) - allegedly uses undocumented Windows API's
>> Leaning towards reusing locklessinc's implementation.
>
> For now, I also prefer to use a permissively licensed simulation of the pthreads
> API. Ideally, using a pthreads wrapper means you could simply drop in the
> winpthreads.h header and waffle's pthreads usage should just work.
>
> If time were not a decision factor, I would also consider Mesa's
> simulation of the standard C11 threads API. But that would require you
> to make more changes to Waffle, and therefore take more time.
>
I do not really mind spending the extra time this week, if that
benefits waffle in the future.
>> Other
>> * Symbols must be identically annotated in both declaration and
>> definition (i.e. we need to bring WAFFLEAPI back into the public
>> header ?)
>> Possible fix(es)
>> ** Pre-parse the header and ship one without the keyword ?
>> ** Define an empty WAFFLEAPI when using MSVC and use "module
>> definition file (.def)"
>> Leaning towards using a .def
>
> I want to avoid mangling the header sources. Instead, let's use
> the preprocessor to solve this problem.
>
> I suggest examining /usr/include/KHR/khrplatform.h for possible
> solutions.
>
Perhaps I was not clear enough, the first option involves mangling
with the header and parsing it through cmake.
While the latter is just a version-script like file (lists the
exported functions), and a one line change
--- a/src/waffle/api/api_priv.h
+++ b/src/waffle/api/api_priv.h
#if defined(_WIN32)
-# define WAFFLE_API __declspec(dllexport)
+# define WAFFLE_API
#elif defined(__GNUC__) && __GNUC__ >= 4
#endif
Pardon for going against your suggestion here, option which seems
cleaner imho. Will take a look at the former if you feel strongly
about it.
FWIW every header coming from Khronos provides its own keyword for
exported symbols which I hope is not what we want in waffle (read
"bring back WAFFLEAPI in the public header").
>> * struct waffle_* {} wfl - not strictly supported by C99 ?
>> http://stackoverflow.com/questions/755305/empty-structure-in-c
>> MSVC message "C requires that a struct or union has at least one member"
>> Possible fix(es)
>> ** Add a dummy param inside the struct. We do not rely on the struct
>> having a zero size but use it as a pointer to the start of the parent
>> struct ?
>>
>> Chad, does the last point make sense or did I completely miss out the
>> plot while reading through the internal API ?
>
> Ugh. I regret doing that little bit of nastiness in the internal API.
> I just submitted a patch to the list, you cc'd, to fix this.
>
Well considering that you wanted the member offset to be calculated
prior to the cast (container_of macro) I believe that it made sense at
the time :)
Long story short so far:
- msvc spotted a few trivial typos(bugs) in waffle.
- msvc c99 support is far from complete (missing a few functions,
inline, restrict ...).
- apart from pthreads (and testing of course) everything else is done :)
We're almost at the final stage of the project wohoo \o/
Big thanks for the help.
Emil
>> Priority (high to low)
>> * struct waffle_* {} wfl
>> * pthreads
>> * getopt
>> * WAFFLEAPI
>> * everything else
>>
>>
>> Cheers,
>> Emil
More information about the waffle
mailing list