On 2011-09-08 12:41+0100 Andrew Ross wrote:

> On Wed, Sep 07, 2011 at 12:46:23PM -0700, Alan Irwin wrote:
>> On 2011-09-06 11:52+0100 Andrew Ross wrote:
>>
>>>
>>> I've committed a perl script to do this. It would be nicer to do it in
>>> sed but I'm not sure how. The old octave bindings required perl anyway
>>> so it is not an extra constraint. I have not yet modified CMakeFiles.txt
>>> to actually call the script as I'm not sure how to do this neatly to
>>> integrate with the cmake SWIG support. Alan, do you have any thoughts
>>> on the best way to do this?
>>
>> Before commenting on that, I want to be sure I have the correct
>> overview of what you are trying to do.  My apologies in advance if you
>> have already covered this overview in previous e-mails, but I have been
>> distracted by non-PLplot development this summer so I have not been
>> paying as close attention as usual.
>>
>> My understanding is
>>
>> #pragma GCC visibility push(default)
>>
>> is the same thing as a temporary use of -fvisibility=default for all
>> the code until
>>
>> #pragma GCC visibility pop
>>
>> In other words this is just a workaround installed into the source
>> code for some problem for gcc and Octave with -fvisibility=hidden.
>>
>> IIRC, you mentioned in previous e-mails that the issue occurred
>> because of a problem for one of the octave headers we were using, but
>> is the proposed fix for that case also a workaround like above, or is
>> it a real fix?  If there is a real fix, why can't we deploy that same
>> fix ourselves rather than using a workaround?
>>
>> Assuming your answer to this overview question is we could deploy the
>> real fix ourselves, then I suggest that you implement that.  Here are two 
>> possible
>> approaches I am thinking about that make sense from the CMake
>> perspective.
>>
>> (1) From the man page, CMake allows you to
>>
>> SET_SOURCE_FILES_PROPERTIES( ${swig_generated_file_fullname}
>>                        PROPERTIES COMPILE_FLAGS "-bla")
>>
>> So if the real fix for the octave header can be reduced to defining
>> and undefining a series of macro values with the -D and -U options,
>> then I suggest this is the way to go.
>>
>> (2) Alternatively, if the real fix demands a more complicated octave
>> header transformation than can be expressed as a series of
>> preprocessing #define and #undef commands, then I suggest a sed or perl 
>> script is
>> the right way to go to transform the octave header before we use it.
>>
>> The problem with your present proposal (besides it being a workaround)
>> is that I am not sure how easy it is going to be to modify
>> swig-generated source code from the CMake level.  The relevant CMake
>> logic appears to be
>>
>>      # Set up swig + c wrapper.
>>      swig_add_module(plplot_octave octave plplot_octave.i)
>>      swig_link_libraries(
>>        plplot_octave ....
>>
>> But I am virtually certain the first command sets up run-time
>> generation of the appropriate octave interface code AND the run-time
>> build of that code into a shared object, while the second simply
>> modifies how that build is linked.
>>
>> To interfere in that process and modify the code after it is generated
>> at run time but before it is built into a shared object may require a
>> special version of FindSWIG.cmake and/or UseSwig.cmake that we
>> maintain from now on.  I would prefer to avoid that maintenance burden
>> if at all possible so I think transforming the octave header in one of
>> the two alternative ways I mentioned above would be a better way to
>> go (and also give us access to the real fix if that is known).
>>
>
> What plplot does and what swig also does on the whole is to explicitly
> mark any function which is to be exported with
>  __attribute__ ( ( visibility( "default" ) ) )
> on gcc version > 3. With -fvisibility=hidden then anything not explicitly
> exported is hidden. We do this through all the PLDLLxxx macros in pldll.h
> The same macros are defined differently to import / export functions with
> windows. This makes it easy to write code which will work on multiple
> systems.
>
> Octave also defines an OCTAVE_EXPORT macro in oct-dlldefs.h which does
> this job on windows, but is not defined at all on gcc. To my mind the
> best fix would be for octave to define OCTAVE_EXPORT as
>  __attribute__ ( ( visibility( "default" ) ) )
> on gcc. Unfortunately the definition of OCTAVE_EXPORT in oct-dlldefs.h is
> unconditional so there is no way to over-ride it with compiler flags. This
> rules out option (1)

I was thinking along the lines of #including the following header
_before_ any other octave header

#include <oct-dlldefs.h>
#if !defined (_MSC_VER)
#undef OCTAVE_EXPORT
#define OCTAVE_EXPORT __attribute__ ( ( visibility( "default" ) ) )
#endif

(I am oversimplifying here since we would want to check gcc version,
etc., but I assume you have already thought of this idea so understand
what I am driving at).

But when I looked up
build_dir/bindings/octave/plplot_octaveOCTAVE_wrap.cxx
it #included plplotP.h long after all the octave includes.

Is there a swig directive to force our headers to be #defined
first?  If so, I believe this idea would work.  I
couldn't find anything that seemed relevant at
http://www.swig.org/Doc1.3/Preprocessor.html, but you might
want to take a look there yourself.  Or maybe you have already
decided there is no way to make this work with swig and
moved on?

>
> You could try to locate and massage oct-dlldefs.h automatically with
> cmake using a perl / sed scripti (option 2). The gcc -M option would
> find the absolute path of the include file, then use sed to replace the
> definition of OCTAVE_EXPORT. The following should do it.
>
> cat "#include <octave/oct-dlldefs.h>" > test.c
> mkdir -p octave
> sed -e 's/^#define OCTAVE_EXPORT$/#define OCTAVE_EXPORT __attribute__ ( ( 
> visibility( "default" ) ) )/' `gcc -M test.c |cut -d\  -f 3` > 
> octave/oct-dlldefs.h
>
> You'd probably want to add some include path stuff to the gcc options
> in case the octave headers were in a non-standard location. If the
> masssaged version of octave oct-dlldefs.h appeared in the
> bindings/octave/octave directory then it should be picked up by the
> build ahead of the system version. Note the only complication is the
> need to create the octave subdirectory since the include file is
> referenced as octave/oct-dlldefs.h.
>
> My solution using the #pragma statements is an alternative way of
> marking a function to be exported and seems to be a little less error
> prone in this case. It's what I did in the old octave bindings to
> work round the same problem. The net effect should be the same
> as redefining OCTAVE_EXPORT, but it is more transparent. I agree
> with your analysis of the problems with the CMake swig support. This
> was the conclusion I reached, hence asking if you had any better ideas!

Sorry, I couldn't help you there.

It's frustrating that we know what we want to do, but CMake blocks us
from doing that easily, and it appears swig does as well. I will ask further
on the swig list about possibilities for getting our header included
first, but that might not lead to a solution.

>
> Anyway, the best long-term solution is probably to submit an octave
> bug report to get the octave header file fixed.

Yes, please!

Alan

__________________________
Alan W. Irwin

Astronomical research affiliation with Department of Physics and Astronomy,
University of Victoria (astrowww.phys.uvic.ca).

Programming affiliations with the FreeEOS equation-of-state
implementation for stellar interiors (freeeos.sf.net); the Time
Ephemerides project (timeephem.sf.net); PLplot scientific plotting
software package (plplot.sf.net); the libLASi project
(unifont.org/lasi); the Loads of Linux Links project (loll.sf.net);
and the Linux Brochure Project (lbproject.sf.net).
__________________________

Linux-powered Science
__________________________

------------------------------------------------------------------------------
Doing More with Less: The Next Generation Virtual Desktop 
What are the key obstacles that have prevented many mid-market businesses
from deploying virtual desktops?   How do next-generation virtual desktops
provide companies an easier-to-deploy, easier-to-manage and more affordable
virtual desktop model.http://www.accelacomm.com/jaw/sfnl/114/51426474/
_______________________________________________
Plplot-devel mailing list
Plplot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/plplot-devel

Reply via email to