Gil:

thank you very much for your update! Will be interested in your final solution, 
also in your
findings and examples using CMake, as I have not had time to look into that 
corner.

Would it be possible that you write an ooRexx-Sourceforge blog about your work, 
findings and solutions?

---rony


On 03.02.2017 21:30, Gil Barmwater wrote:
> I know it has been a while since I gave an update on this topic so I've 
> included the last one I posted to refresh everyone's memory.
>
> As noted in the last post, I was at the point of writing my own C++ code 
> for some native methods.  I chose to implement the methods that I had 
> previously written using GCI to change the color attributes of the 
> Windows console.  Even though this is somewhat obsolete with Windows 10 
> - ANSI escape sequences are again supported to do color highlighting - 
> it has always been my goal to "complete" the original effort so that it 
> would work on 64-bit versions of ooRexx as well (GCI is limited to 
> 32-bit).  By writing native methods, I would be able to compile them for 
> both addressing modes. By keeping the same interfaces, I only needed to 
> replace the GCI-based methods in the Class definition with the new 
> native method definitions (one liners!).  There are three methods 
> involved, one that takes no arguments but returns a value, one that 
> takes the value returned by the first method and returns a (different) 
> value, and finally one that again takes the value returned by the first 
> method but returns nothing.  Using Rony's examples and the work I did 
> for the GCI-based methods, it was fairly straightforward to come up with 
> the C++ code and the .def file.  I took part of Rony's makefile and was 
> able to get a 32-bit DLL to build!  Making the noted changes to the 
> Class definition, my test program ran successfully!
>
> I still had lots of questions about the makefile contents so I did some 
> research which included looking at the samples\native.api folder that is 
> installed with ooRexx.  This example contains code and a makefile which 
> is very different than Rony's.  It distinguishes between building a 
> debug version and a "release" version while Rony's has a choice between 
> 32- and 64-bit versions. I decided that my "general" build process 
> should allow for all four combinations of addressing mode and 
> debug/"regular" versions.  I also read that building "out of source" is 
> recommended - doing the build in an empty directory rather than the 
> directory where the source files are located.  The advantage cited was 
> to allow the deletion of the build files w/o the possible accidental 
> loss of a source file.  For me, this structure would also allow me to 
> build both 32- and 64-bit versions without having to adopt a naming 
> convention or renaming the .dll since each version would be in its own 
> directory.  I spent some time writing a Rexx program to automate the 
> process: check that the specified build "type" was valid, creating the 
> appropriate subdirectory if needed, passing the correct argument to the 
> vcvarsall.bat file to set up the compiler/linker for the correct target 
> addressing mode, setting an environmental variable for use by the 
> makefile to control the flags for debug/non-debug compiling and linking, 
> and finally running nmake. After tweaking the makefile so that it 
> reflected the fact that the source files were now in the parent 
> directory, I got it to build a 32-bit .dll which worked with my test 
> program.
>
> However, when I tried to build a 64-bit .dll, I ran into a (compile) 
> problem.  It turned out that the first method returns a value called a 
> handle which is more like a pointer than an integer.  In 32-bit mode, 
> pointers and integers are the same size but that is NOT true in 64-bit 
> mode.  So I needed to change my code to use the new "types" added to the 
> ooRexx API.  After changing the type from "int" to "uintptr_t" wherever 
> the handle was referenced, the compile was clean in both 32- and 64-bit 
> versions. I was able to install the latest 64-bit ooRexx 5.0.0 beta and 
> verify that my test program, using the 64-bit .dll, ran successfully.  
> So goal accomplished!
>
> I still need to decide on the structure and contents of the makefile 
> however.  There are flags which are now considered obsolete which I want 
> to remove and I need to put in the logic for debug/regular build flags.  
> I'd like some opinions on structure as well.  Rony's sample makefile 
> does the compile and link back-toback.  The sample in the native.api 
> directory, does them separately.  I believe the terminology is "target" 
> and "dependency" so that the .exe or .dll "target" is dependent on the 
> .obj and the .obj "target" is dependent on the .cpp.  Having separate 
> "rules" would let you do just the compile or just the link or both if 
> you desire.  In complex cases, this might be advantageous but for simple 
> bits of code (like mine), running both commands is easier to understand.
>
> I've also written a simplified version of my Class that only uses two 
> (native) methods that might be suitable for inclusion in the native.api 
> samples.  Once I decide on the contents of the makefile, I'll make the 
> pieces available for review.
>
> Thanks for reading this far!  Comments or questions are welcome.
>
> PS I've started to look at CMAKE but haven't yet done any experimenting 
> with it so far.
>
> On 9/17/2016 1:29 PM, Gil Barmwater wrote:
>> Success!  I have now been able to build and run Rony's examples from
>> last year's Symposium.  Here is what I did to get there.
>>
>> Having discovered that my Visual Studio Express installation was
>> incomplete(!), I decided to "start over" rather than try to "fix" it.  I
>> uninstalled Visual Studio from Control Panel -> Programs and Features.
>> There were messages about third party installers possibly leaving items
>> still installed but I did not see anything obvious.  There were items
>> that had the same date as when I had installed Visual Studio but they
>> might have just been updates so I did not uninstall them.  In any case,
>> they did not affect what I did next.
>>
>> I went back to Rene's presentation and clicked on the link he supplied
>> for Visual Studio Community.  This seems to be the most recent free MS
>> Visual Studio product and, although Express is still supported, I
>> suspect future support will be concentrated on Community.  And I wanted
>> to be sure that the ooRexx project would build correctly (when I get to
>> that point) with the newest free Visual Studio.  I selected the custom
>> install and picked just one item under Programming Languages - Visual
>> C++/Common Tools.  I also selected the Tools (1.4.1) & Windows 10 SDK
>> under Windows and Web/Universal Windows Application Development because
>> I seem to remember comments on this list in the past to the effect that
>> it was needed for something (perhaps debugging?).  So I only had two
>> items checked in the custom dialog.  The install process started and as
>> packages finished downloading, they were installed in parallel. Even so,
>> the download portion took over an hour and then the remaining installs
>> and updates took another hour!  Glad I didn't select anything else from
>> the menu!
>>
>> I located the "shortcut" for a command prompt which would run the
>> VCVArsAll.bat and it ran successfully so I knew I now had the C++ tools
>> I needed.  I then found the full path name to that .bat file and put it
>> in a short .cmd file in the folder where I had put the source for Rony's
>> examples.  When I ran the that .cmd file and then the NMAKE command he
>> documented in his presentation, the DLLs were built and I ran the 4 test
>> cases he supplied without error.
>>
>> The next step for me is to experiment with writing my own native methods
>> to be sure I understand all the parts I need - a .cpp file, a .def file
>> and a makefile - to get a DLL I can reference from a ::method statement.
>>
>> So it will be a while before I am ready to get all the other tools to
>> attempt to build ooRexx from an SVN checkout.  I'll post again when I'm
>> at that point.
>>


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to