Hi,

Let's get this straight: the title of this mail was only to trick you
into reading what's below and "considered harmful" should never be used.

I'm updating win-builds.org with EFL git and ephysics failed building
because too many things use the EAPI define.
EAPI is useful because some platforms want that symbols exported from
shared libraries are explicitly marked and, conversely, when using
symbols from another shared library, they should be marked but
differently.

Basically that means:
when eina_init() is compiled, it must be marked "dllexport" (for
Windows but this is also useful for ELF) and when it is used from my
application, its definition must be marked "dllimport".

Simple enough.

In the EFL world, this is achieved through EAPI.
Below is code from EPhysics.h:

  #ifdef EAPI
  # undef EAPI
  #endif

  #ifdef _WIN32
  # ifdef EFL_EPHYSICS_BUILD
  #  ifdef DLL_EXPORT
  #   define EAPI __declspec(dllexport)
  #  else
  #   define EAPI
  #  endif /* ! DLL_EXPORT */
  # else
  #  define EAPI __declspec(dllimport)
  # endif /* ! EFL_EPHYSICS_BUILD */


Then ephysics_world.cpp gets built with -DEFL_EPHYSICS_BUILD=1 and EAPI
gets "dllexport". That way, it will be possible to export the symbols
defined in ephysics_world.cpp.
Except that Eina.h is then included and since EFL_EINA_BUILD isn't
defined and the code in Eina.h is similar, we get #undef EAPI and then
#define again but for dllimport. Then the symbols are declared while
getting a decoration that means they are to be imported from another
shared library. That makes no sense and compilation aborts.

There's the quick solution: include EPhysics.h after all others.

There's the clean solution: stop abusing EAPI for 20 different
libraries. Think about it: today it's 20 but the goal is to get that
much higher; this will not happen if the order in which headers have to
be included is tricky.
Maybe that having EINA_API, EPHYSICS_API, ECORE_API, and so on looks a
bit tedious but at least it's simple to get right.
Another way to see it is that currently, a /single/ define (EAPI) is
controlled by 20 other defines (each of the EFL_.*_BUILD).

To everyone writing new libraries: do not ever write "EAPI" in your code
but use a specific define for your library.

-- 
Adrien Nader

------------------------------------------------------------------------------
BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT
Develop your own process in accordance with the BPMN 2 standard
Learn Process modeling best practices with Bonita BPM through live exercises
http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- event?utm_
source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to