<div dir="ltr"><div class="gmail_quote"><div class="GmSign">On Fri, Sep 4, 2015 at 9:26 AM Frank Shearar &lt;<a href="mailto:frank.shearar@gmail.com">frank.shearar@gmail.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 4 September 2015 at 07:01, Tobias Pape &lt;<a href="mailto:Das.Linux@gmx.de" target="_blank">Das.Linux@gmx.de</a>&gt; wrote:<br>
&gt;<br>
&gt; On 04.09.2015, at 05:46, Chris Muller &lt;<a href="mailto:asqueaker@gmail.com" target="_blank">asqueaker@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt;&gt;&gt; I do think that anything  is better than the current situation. A bucket of<br>
&gt;&gt;&gt; any kind in an agreed upon location seems like a good place to start.<br>
&gt;&gt;<br>
&gt;&gt; I totally agree!<br>
&gt;<br>
&gt; what about<br>
&gt;<br>
&gt; <a href="http://github.com/squeak-vm/plugins" rel="noreferrer" target="_blank">http://github.com/squeak-vm/plugins</a><br>
&gt;<br>
&gt; or<br>
&gt;<br>
&gt; <a href="http://github.com/squeak-smalltalk/vm-plugins" rel="noreferrer" target="_blank">http://github.com/squeak-smalltalk/vm-plugins</a><br>
<br>
My preferred choice: the organisation already exists.<br>
<br>
frank<br>
<br>
&gt; Best<br>
&gt;         -tobias<br>
&gt;<br>
&gt; PS: we should look at <a href="https://github.com/search?q=squeak+vm" rel="noreferrer" target="_blank">https://github.com/search?q=squeak+vm</a><br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt;&gt; I<br>
&gt;&gt;&gt; hadn&#39;t considered that plugins would need meta data or labels.<br>
&gt;&gt;<br>
&gt;&gt; They could be put into a .zip file and stored and cataloged somewhere<br>
&gt;&gt; which would be a well-known place for Squeak.  And, each plugin would<br>
&gt;&gt; be tagged with one or more hierarchical Category&#39;s to indicate the<br>
&gt;&gt; platform and whatever else we wanted...<br>
&gt;&gt;<br>
&gt;&gt; And, if the plugin is compiled and hosted somewhere else, like GitHub,<br>
&gt;&gt; then the Squeak-well-known place should direct the user to THAT<br>
&gt;&gt; external place instead of hosting copies on <a href="http://squeak.org" rel="noreferrer" target="_blank">squeak.org</a> servers...<br>
&gt;&gt; Except as a backup, of course..<br>
&gt;&gt;<br>
&gt;&gt; Hmm, if only we have something that could do all that...    Oh wait,<br>
&gt;&gt; we do!!!!    ;-)<br>
&gt;&gt;<br>
&gt;&gt;&gt; Perhaps the best thing is to leave it as an open question for  a few weeks<br>
&gt;&gt;&gt; before settling on any kind of solution. A common location for plugins is<br>
&gt;&gt;&gt; about as far as my thinking takes me at the moment. I&#39;m sure the collective<br>
&gt;&gt;&gt; imagination of the community can come up with a better idea.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Chris<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; On 2015-09-03 10:07 PM, David T. Lewis wrote:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; On Thu, Sep 03, 2015 at 09:05:07PM -0400, Chris Cunnington wrote:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; This community needs a repository for plugins. A directory at<br>
&gt;&gt;&gt;&gt;&gt; <a href="http://ftp.squeak.org" rel="noreferrer" target="_blank">http://ftp.squeak.org</a> ought to do it.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; If I want to try Alien I need the plugin. Where am I going to get that?<br>
&gt;&gt;&gt;&gt;&gt; I could get VMMaker, read NewSqueakIA32ABIPlugin three times to see it<br>
&gt;&gt;&gt;&gt;&gt; is not saying Newspeak and realize it compiles a plugin called IA32ABI,<br>
&gt;&gt;&gt;&gt;&gt; which - coincidentally - is the name of the plugin the error Alien<br>
&gt;&gt;&gt;&gt;&gt; exampleCqsort will gives me. (NewSqueakIA32ABIPlugin class&gt;&gt; moduleName<br>
&gt;&gt;&gt;&gt;&gt; returns IA32ABI).<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Does anybody know what the Genie plugin does? Does Paul DeBrucker need<br>
&gt;&gt;&gt;&gt;&gt; to store a BerkeleyDB plugin dll he got by emailing somebody on GitHub?<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; If I understand this correctly, if such a directory existed, then all a<br>
&gt;&gt;&gt;&gt;&gt; person would need to do to try the above Alien code would be to download<br>
&gt;&gt;&gt;&gt;&gt; a pre-compiled plugin from - say -<br>
&gt;&gt;&gt;&gt;&gt; <a href="http://ftp.squeak/plugins/Alien/fooVersion" rel="noreferrer" target="_blank">http://ftp.squeak/plugins/Alien/fooVersion</a>, put it in their VM directory<br>
&gt;&gt;&gt;&gt;&gt; and start the image. Then check with SmalltalkImage current<br>
&gt;&gt;&gt;&gt;&gt; listLoadedModules to see if you&#39;re ready to go.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; I nominate Fabio Niephaus to be the person the community can send<br>
&gt;&gt;&gt;&gt;&gt; pre-compiled plugins for inclusion in such a directory. Eliot&#39;s been<br>
&gt;&gt;&gt;&gt;&gt; banging away about Alien for some time [1]. If a person could go, get<br>
&gt;&gt;&gt;&gt;&gt; the plugin and give the code shot, he could have more productive<br>
&gt;&gt;&gt;&gt;&gt; conversations about Alien.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; So, if, Eliot, you have a pre-compiled plugin for Alien, perhaps in an<br>
&gt;&gt;&gt;&gt;&gt; idle moment, you could email it to Fabio? And when, Fabio, you&#39;ve<br>
&gt;&gt;&gt;&gt;&gt; created the directory in <a href="http://ftp.squeak.org" rel="noreferrer" target="_blank">http://ftp.squeak.org</a> you could announce it<br>
&gt;&gt;&gt;&gt;&gt; here on Squeak-dev?<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; FWIW,<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Chris<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; A word of caution:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; I think the idea is good in principle, but it needs to be accompanied<br>
&gt;&gt;&gt;&gt; by a commitment by someone to do the hard work of keeping track of<br>
&gt;&gt;&gt;&gt; dependencies on the various flavors of OS, image word size, VM word size,<br>
&gt;&gt;&gt;&gt; spur/V3, and so forth. If someone would like to take that on, great.<br>
&gt;&gt;&gt;&gt; That said, we don&#39;t want to start a project that gets 80% completed, and<br>
&gt;&gt;&gt;&gt; then expect &quot;the community&quot; to do the rest of the work.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; I cannot speak for Fabio, but I don&#39;t think it is fair for us to expect<br>
&gt;&gt;&gt;&gt; him to take on this kind of workload unless he has indicated an interest<br>
&gt;&gt;&gt;&gt; in doing it.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Maybe a restricted repository focused just on compiled plugins known<br>
&gt;&gt;&gt;&gt; to work with the Spur VM on a limited range of OS flavors would be helpful<br>
&gt;&gt;&gt;&gt; at this stage. It probably does not belong on <a href="http://ftp.squeak.org" rel="noreferrer" target="_blank">ftp.squeak.org</a>, but it could<br>
&gt;&gt;&gt;&gt; be a very useful resource if someone (Chris Cunnington?) wants to set it<br>
&gt;&gt;&gt;&gt; up.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Dave<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; [1] <a href="http://wiki.squeak.org/squeak/uploads/6100/" rel="noreferrer" target="_blank">http://wiki.squeak.org/squeak/uploads/6100/</a><br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; On 2015-09-03 7:07 PM, Eliot Miranda wrote:<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Hi Craig,<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;    you need Alien-eem.24<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Here&#39;s Alien class&gt;&gt;exampleCqsort<br>
&gt;&gt;&gt;&gt;&gt;&gt; &quot;Call the libc qsort function (which requires a callback).&quot;<br>
&gt;&gt;&gt;&gt;&gt;&gt; &quot;Alien exampleCqsort&quot;<br>
&gt;&gt;&gt;&gt;&gt;&gt; &quot;(Time millisecondsToRun: [100 timesRepeat: [Alien exampleCqsort]]) /<br>
&gt;&gt;&gt;&gt;&gt;&gt; 100.0&quot;<br>
&gt;&gt;&gt;&gt;&gt;&gt; | cb rand nElements sizeofDouble values orig sort |<br>
&gt;&gt;&gt;&gt;&gt;&gt; rand := Random new.<br>
&gt;&gt;&gt;&gt;&gt;&gt; values := Alien newC: (nElements := 100) * (sizeofDouble := 8).<br>
&gt;&gt;&gt;&gt;&gt;&gt; 1 to: values dataSize by: sizeofDouble do:<br>
&gt;&gt;&gt;&gt;&gt;&gt; [:i| values doubleAt: i put: rand next].<br>
&gt;&gt;&gt;&gt;&gt;&gt; orig := (1 to: values dataSize by: sizeofDouble) collect: [:i| values<br>
&gt;&gt;&gt;&gt;&gt;&gt; doubleAt: i].<br>
&gt;&gt;&gt;&gt;&gt;&gt; cb := Callback<br>
&gt;&gt;&gt;&gt;&gt;&gt; signature:  #(int (*)(const void *, const void *))<br>
&gt;&gt;&gt;&gt;&gt;&gt; block: [ :arg1 :arg2 | ((arg1 doubleAt: 1) - (arg2 doubleAt: 1)) sign].<br>
&gt;&gt;&gt;&gt;&gt;&gt; (Alien lookup: &#39;qsort&#39; inLibrary: Alien libcName)<br>
&gt;&gt;&gt;&gt;&gt;&gt; primFFICallResult: nil<br>
&gt;&gt;&gt;&gt;&gt;&gt; with: values pointer<br>
&gt;&gt;&gt;&gt;&gt;&gt; with: nElements<br>
&gt;&gt;&gt;&gt;&gt;&gt; with: sizeofDouble<br>
&gt;&gt;&gt;&gt;&gt;&gt; with: cb thunk.<br>
&gt;&gt;&gt;&gt;&gt;&gt; sort := (1 to: values dataSize by: sizeofDouble) collect: [:i| values<br>
&gt;&gt;&gt;&gt;&gt;&gt; doubleAt: i].<br>
&gt;&gt;&gt;&gt;&gt;&gt; values free.<br>
&gt;&gt;&gt;&gt;&gt;&gt; ^orig -&gt; sort<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; The above example uses Alien to make the callout.  To use it with the<br>
&gt;&gt;&gt;&gt;&gt;&gt; FFI simply pass cb pointer as the argument as is done above.<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Implementation:<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; The way that it works is in two parts<br>
&gt;&gt;&gt;&gt;&gt;&gt; - the VM passes up a pointer to a structure from which all arguments,<br>
&gt;&gt;&gt;&gt;&gt;&gt; stacked and in registers (because the VM has copied the register args<br>
&gt;&gt;&gt;&gt;&gt;&gt; into the struct) can be accessed, and through which the result can be<br>
&gt;&gt;&gt;&gt;&gt;&gt; returned.<br>
&gt;&gt;&gt;&gt;&gt;&gt; - the image level provides marshalling methods that match the<br>
&gt;&gt;&gt;&gt;&gt;&gt; signature in the callback<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; So e.g. with a callback of<br>
&gt;&gt;&gt;&gt;&gt;&gt; Callback<br>
&gt;&gt;&gt;&gt;&gt;&gt; signature:  #(int (*)(const void *, const void *))<br>
&gt;&gt;&gt;&gt;&gt;&gt; block: [ :arg1 :arg2 | ((arg1 doubleAt: 1) - (arg2 doubleAt: 1)) sign]<br>
&gt;&gt;&gt;&gt;&gt;&gt; the marshalling methods are in Callback&#39;s signature protocol:<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Callback&gt;&gt;voidstarvoidstarRetint: callbackContext sp: spAlien<br>
&gt;&gt;&gt;&gt;&gt;&gt; &lt;signature: #(int (*)(const void *, const void *)) abi: &#39;IA32&#39;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; ^callbackContext wordResult:<br>
&gt;&gt;&gt;&gt;&gt;&gt; (block<br>
&gt;&gt;&gt;&gt;&gt;&gt; value: (Alien forPointer: (spAlien unsignedLongAt: 1))<br>
&gt;&gt;&gt;&gt;&gt;&gt; value: (Alien forPointer: (spAlien unsignedLongAt: 5)))<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; where spAlien is an Alien pointing to a VMCallbackContext32.<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; For ARM support we would add<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Callback&gt;&gt;voidstarvoidstarRetint: callbackContext sp: spAlien<br>
&gt;&gt;&gt;&gt;&gt;&gt; intRegArgs: regsAlien<br>
&gt;&gt;&gt;&gt;&gt;&gt; &lt;signature: #(int (*)(const void *, const void *)) abi: &#39;ARMV5&#39;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; ^callbackContext wordResult:<br>
&gt;&gt;&gt;&gt;&gt;&gt; (block<br>
&gt;&gt;&gt;&gt;&gt;&gt; value: (Alien forPointer: (regsAlien unsignedLongAt: 1))<br>
&gt;&gt;&gt;&gt;&gt;&gt; value: (Alien forPointer: (regsAlien unsignedLongAt: 5)))<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Basically the idea is that the selector of the method doesn&#39;t matter<br>
&gt;&gt;&gt;&gt;&gt;&gt; except for the number of arguments.  What&#39;s important is the pragma<br>
&gt;&gt;&gt;&gt;&gt;&gt; which defines the signature and the ABI for which this is a valid<br>
&gt;&gt;&gt;&gt;&gt;&gt; marshalling method.<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; When the callback is instantiated, Callback introspects to find the<br>
&gt;&gt;&gt;&gt;&gt;&gt; marshalling method that matches the signature.  If one doesn&#39;t already<br>
&gt;&gt;&gt;&gt;&gt;&gt; exist you can write one.  Hopefully we&#39;ll write an ABI compiler that<br>
&gt;&gt;&gt;&gt;&gt;&gt; will automatically generate these marshalling methods according to the<br>
&gt;&gt;&gt;&gt;&gt;&gt; platform&#39;s ABI, but for now its a manual process.  But at least it&#39;s<br>
&gt;&gt;&gt;&gt;&gt;&gt; open and flexible.  When the callback is invoked the evaluator is<br>
&gt;&gt;&gt;&gt;&gt;&gt; performed with the current callbackContext and pointer(s) to the<br>
&gt;&gt;&gt;&gt;&gt;&gt; arguments. There is a 32-bit and a 64-bit callback context, and it can<br>
&gt;&gt;&gt;&gt;&gt;&gt; have a stack pointer, integer register args and floating point<br>
&gt;&gt;&gt;&gt;&gt;&gt; register args.  So it&#39;s general enough for any callback.<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; To pass back the result, a value is assigned into the struct via the<br>
&gt;&gt;&gt;&gt;&gt;&gt; accessor in the marshalling method and control returns to teh point<br>
&gt;&gt;&gt;&gt;&gt;&gt; where teh callback comes in, and this uses a primitive to return.<br>
&gt;&gt;&gt;&gt;&gt;&gt; Inside the callbackCOntext is a jmpbuf from a setjmp.  The primitive<br>
&gt;&gt;&gt;&gt;&gt;&gt; longjmp&#39;s back to the entry point in the VM which extracts the result<br>
&gt;&gt;&gt;&gt;&gt;&gt; and the code for the kind of result and returns:<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Callback class&gt;&gt;invokeCallbackContext: vmCallbackContextAddress<br>
&gt;&gt;&gt;&gt;&gt;&gt; &quot;&lt;Integer&gt;&quot; &quot;^&lt;FFICallbackReturnValue&gt;&quot;<br>
&gt;&gt;&gt;&gt;&gt;&gt; &quot;The low-level entry-point for callbacks sent from the VM/IA32ABI<br>
&gt;&gt;&gt;&gt;&gt;&gt; plugin.<br>
&gt;&gt;&gt;&gt;&gt;&gt; Return via primReturnFromContext:through:.  thisContext&#39;s sender is the<br>
&gt;&gt;&gt;&gt;&gt;&gt; call-out context.&quot;<br>
&gt;&gt;&gt;&gt;&gt;&gt; | callbackAlien type |<br>
&gt;&gt;&gt;&gt;&gt;&gt; callbackAlien := (Smalltalk wordSize = 4<br>
&gt;&gt;&gt;&gt;&gt;&gt; ifTrue: [VMCallbackContext32]<br>
&gt;&gt;&gt;&gt;&gt;&gt; ifFalse: [VMCallbackContext64])<br>
&gt;&gt;&gt;&gt;&gt;&gt; atAddress: vmCallbackContextAddress.<br>
&gt;&gt;&gt;&gt;&gt;&gt; [type := Callback evaluateCallbackForContext: callbackAlien]<br>
&gt;&gt;&gt;&gt;&gt;&gt; ifCurtailed: [self error: &#39;attempt to non-local return across a<br>
&gt;&gt;&gt;&gt;&gt;&gt; callback&#39;].<br>
&gt;&gt;&gt;&gt;&gt;&gt; type ifNil:<br>
&gt;&gt;&gt;&gt;&gt;&gt; [type := 1. callbackAlien wordResult: -1].<br>
&gt;&gt;&gt;&gt;&gt;&gt; callbackAlien primReturnAs: type fromContext: thisContext<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; On Thu, Sep 3, 2015 at 5:22 AM, Craig Latta &lt;<a href="mailto:craig@netjam.org" target="_blank">craig@netjam.org</a><br>
&gt;&gt;&gt;&gt;&gt;&gt; &lt;mailto:<a href="mailto:craig@netjam.org" target="_blank">craig@netjam.org</a>&gt;&gt; wrote:<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;    Hi all--<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;         I&#39;d like to use a C shared library via FFI from Squeak or<br>
&gt;&gt;&gt;&gt;&gt;&gt; Pharo.<br>
&gt;&gt;&gt;&gt;&gt;&gt;    Specifically, I want to call a C function which takes as one of its<br>
&gt;&gt;&gt;&gt;&gt;&gt;    parameters a pointer to an array of callback function addresses.<br>
&gt;&gt;&gt;&gt;&gt;&gt; Does<br>
&gt;&gt;&gt;&gt;&gt;&gt;    one of the FFI approaches floating around handle that, and provide a<br>
&gt;&gt;&gt;&gt;&gt;&gt;    relatively pleasant mapping between Smalltalk block closures and C<br>
&gt;&gt;&gt;&gt;&gt;&gt;    callback function addresses?<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;         I was doing this so far in GemStone, but apparently its FFI<br>
&gt;&gt;&gt;&gt;&gt;&gt; only<br>
&gt;&gt;&gt;&gt;&gt;&gt;    supports passing callback function addresses one at a time as direct<br>
&gt;&gt;&gt;&gt;&gt;&gt;    parameters of C callouts. I suppose I could write a wrapper C<br>
&gt;&gt;&gt;&gt;&gt;&gt; library<br>
&gt;&gt;&gt;&gt;&gt;&gt;    around the one I really want to use, that provides the callback<br>
&gt;&gt;&gt;&gt;&gt;&gt; setup<br>
&gt;&gt;&gt;&gt;&gt;&gt;    interface that GemStone expects, but whenever I have to write actual<br>
&gt;&gt;&gt;&gt;&gt;&gt; C<br>
&gt;&gt;&gt;&gt;&gt;&gt;    code I start to think &quot;Hm, why don&#39;t I just use a Smalltalk VM for<br>
&gt;&gt;&gt;&gt;&gt;&gt;    which<br>
&gt;&gt;&gt;&gt;&gt;&gt;    I have the source?&quot; :)  All the fancy distributed object-database<br>
&gt;&gt;&gt;&gt;&gt;&gt;    stuff<br>
&gt;&gt;&gt;&gt;&gt;&gt;    that my project also wants can wait for a bit.<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;         thanks!<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;    -C<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;    --<br>
&gt;&gt;&gt;&gt;&gt;&gt;    Craig Latta<br>
&gt;&gt;&gt;&gt;&gt;&gt;    <a href="http://netjam.org" rel="noreferrer" target="_blank">netjam.org</a> &lt;<a href="http://netjam.org" rel="noreferrer" target="_blank">http://netjam.org</a>&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;    +31 6 2757 7177 &lt;tel:%2B31%20%20%206%202757%207177&gt; (SMS ok)<br>
&gt;&gt;&gt;&gt;&gt;&gt;    + 1 415 287 3547 &lt;tel:%2B%201%20415%20%20287%203547&gt; (no SMS)<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; --<br>
&gt;&gt;&gt;&gt;&gt;&gt; _,,,^..^,,,_<br>
&gt;&gt;&gt;&gt;&gt;&gt; best, Eliot<br>
&gt;<br>
&gt;<br>
&gt;<br>
<br></blockquote><div><br></div><div>I&#39;d agree that the best thing for now is to leave it as an open question</div><div>and then we should go for a solution that everyone feels comfortable</div><div>with.</div><div><br></div><div>I&#39;m not sure though if a single GitHub repository will do the trick</div><div>considering the meta information mentioned by David.</div><div>However, we could e.g. use different branches for different Squeak</div><div>versions, but we really need to think this through.</div><div><br></div><div>A related question: how hard would it be to build plugins</div><div>automatically (e.g. on Travis CI or on AppVeyor) from source?</div><div><br></div></div></div>