[M3devel] platform/build_dir is a big tuple?

Tony Hosking hosking at cs.purdue.edu
Tue Jan 22 18:54:04 CET 2008


On Jan 22, 2008, at 8:29 AM, Olaf Wagner wrote:

> All this may be useful during development, but it is not really
> useful for a software distribution to our users, I think.
>
> Nobody will understand it :-( We need to keep things more simple.
>
> We don't need to support everything out of the box. Instead, we should
> offer some sensible default combinations of everyhing you describe.
>
> First of all: we don't distribute cross compilers (at least until  
> now).
> This is a special topic reserved for adding new platforms.

Precisely why I don't like many of the recent changes.  I don't want  
to build Windows interfaces and gorp for a non-Windows platform.   
Jay, can you *please* back these changes out?

>
> Runtime and compilers used do not necessarily need to be distinguished
> by target or build dir, in many cases different cm3.cfg may suffice.
>
> Until now, threading models are also no choice that needs to be
> visible at this level. There's one default model for every target,
> and the user can change it by recompiling.
>
> And if we should really agree that changing the target naming scheme
> is a good idea, we should
>
>  o use a systematic one with not more than 4 elements (better still,
>    3 (e.g. <arch>-<os>-<variant>))
>  o don't use cryptic abbreviations that will confuse most people
>
> Just my 2 cents,
>
> Olaf
>
> Quoting Jay <jayk123 at hotmail.com>:
>> I'm still torn over that any NT386 target could  have a choice of   
>> three threading models (win32, pthread, vtalarm), two  windowing   
>> libraries (ms, x), two (three) compilers (ms, mingwin, cygwin),  
>> two  (three) linkers (ms, mingwn, cygwin), various runtimes (msvc  
>> various  versions, cygwin, mingwin (discouraged)) etc.
>>
>> Appending a short string of unreadable bits to BUILD_DIR is very   
>> temptingin order to easily generate and test the combinatorial   
>> possibilities.
>>
>> backend: 0 integrated, 1 gcc already a setting (with four values)
>>
>> ccompiler/linker: 0 ms, 1 gcc (these could be split, and could   
>> allocate more bits...) maybe 00 ms, 01 cygwin, 10 ming  maybe  
>> define  enum up front that allows for watcom, metrowerks,  
>> digitalmars, llvm  etc.
>>  maybe use a decimal digit for all these, and 0 is reserved, maybe.
>>
>> threading: 0 win32, 1 pthreads  drop vtalarm, or use two bits?
>>
>> windowing: 0 ms, 1 x
>>
>> cruntime: 0 ms, 1 cyg  There is also a ming runtime, discouraged    
>> There also really N ms runtimes, ming offers several:    
>> msvcrt.dll,  msvcr70.dll, msvcr71.dll, msvcr80.dll,  
>> msvcr90.dll...   but jmpbuf  presumbly doesn't change again could  
>> allocate multiple bits..
>>
>> cruntime I guess determines oSTYPE Win32 or Posix, thoughit loses   
>> its meaning mostly, and X vs. not-X is usually decide the same...
>>
>> The three most common combinations:  00000 -- NT386  11111 --   
>> NT386GNU  11000 -- NT386MINGNU
>>
>> but several others would work  11101 -- cygwin with native  
>> windowing   11011 -- cygwin with native threads  11001 -- cygwin  
>> with native  threads and native windowing
>>  BUILD_DIR would be NT386-$(config)as a special case perhaps, the   
>> three commoncases could be translated to the above strings.
>>
>> But the underlying implementation would be a few bools/enums,and   
>> iterating through them would be easy, while special casingand   
>> skipping deemed invalid combinations, like ms runtime and   
>> pthreads,and possibly ms runtime and x windows.
>> Really, it might surprise folks, but really, basically every  
>> single  combination works.
>> Compilers are very independent of headers and libs and headers  
>> and  libs are very independent of compilers, aside from a few  
>> language  extensions like __stdcall. You can generally mix  
>> runtimes in the  same process, just as you can mix them on the  
>> same machine, you just  need to be careful about what you pass to  
>> what. If you call fopen,  be sure pass the result back to the  
>> matching fclose, malloc/free,  etc. Startup code, to the extent  
>> that it matters, might be a  problem, but really, just avoid C++  
>> globals with  constructors/destructors anyway, they are always a  
>> problem. Modula-3  has its own startup code, and if you were to  
>> write "main" in C and  link in Modula-3 static .libs, that  
>> probably doesn't work...might  actually be better to play into  
>> whatever the platform's C++  constructor story is, as problematic  
>> as they (probably always?) are  -- i.e. unpredictable/hard-to- 
>> control ordering.
>>
>> (bad editing...and maybe use hex for compression..)
>>
>> Bringing back cminstall is almost interesting, to promptthe user,  
>> or  probe their system, though Quake/cm3 can probe at runtime.if  
>> os ==  windows_nt   system_cc | findstr version | findstr gcc    
>> else  system_cc | findstr visual c++else   system_cc | grep  
>> version | grep  gcc   else system_cc | grep visual c++end
>>
>> inefficient.
>>
>> anyway, I'll merge current NT386GNU into NT386 and make it  
>> chosehow  to compile/link which are the main variables today.
>> and then decide about cygwin, but probably do like the above,   
>> sinceit'll totally share code with NT386 except the naming   
>> conventionsand the removal of the -mno-cygwin switch..
>>
>> I know this seems overly complicated, but it should be   
>> exposableeasily enough to users by hiding the choices, presenting   
>> three basic ones,and still allow all the obvious and perhaps  
>> useful  knobs, and iterating throughthe combinations, without  
>> creating a  combinatorial explosion of source filesor Modula-3 or  
>> Quake code.
>>   ...Jay
>>
>>
>> From: jayk123 at hotmail.comTo: m3devel at elegosoft.comDate: Tue, 22  
>> Jan  2008 10:48:56 +0000Subject: Re: [M3devel] platform/build_dir  
>> is a  big tuple?
>>
>>
>> Final answer? I played around with this but just can't accept   
>> platforms/build_dirs like:  ntx86msmsmscm3msn   
>> ntx86gccgcccm3cgmsn   ntx86gccgcccm3cgxn  ntx86-gggggmn  ntx86- 
>> ggixn  ntx86_mmmimmOk, I  have one more name here, and then a bit  
>> of a change, or a stronger  statement of something I had already  
>> said.NT386MINGNUOk, I think we  (me!) are confusing host and  
>> target, MOSTLY.And cm3 might not have  them quite divided  
>> appropriately.What is a "host"? What is a  "target"?MinGWin and  
>> Visual C++ output similar results, targetingthe  same runtime  
>> (usually), threading library, windowing library.There  is a chance  
>> for exception handling to diverge however.Well, speaking  of  
>> Visual C++ the C/C++ compiler and MinGWinthe gcc environment,   
>> yes, very different, not interoperable.MinGWin uses what gcc  
>> calls  "sjlj" -- setjmp/longjmp exceptions.Very inefficient. But  
>> heck, gcc  doesn't support __try/__except/__finally,only C++  
>> exceptions, and  interop of C++ is often not great,what with name  
>> mangling and  all.NT386GNU's OUTPUT uses a different runtime,  
>> unless you  trim  dependencies, possibly a different threading  
>> library,  possibly a  different windowing library. All this  
>> probably  configurable. Again  exception handling is a sore point  
>> in  that it is the primary C  runtime dependency of Modula-3.  If  
>> you use Cygwin but say  -mno-cygwin, that means  you are targeting  
>> NT386. (and don't use  pthreads or X Windows;  behavior of  
>> exceptions/setjmp/longjmp TBD --  really, need  to not use the - 
>> mno-cygwin headers in that case; I'll  check).Perhaps m3core.dll  
>> should export m3_setjmp/m3_longjmp..Either  one can do a cross  
>> build to the other.Two cm3.exes, two sets of  outputs, that either  
>> can produce.NT386 can use gcc or the integrated  backend.  And the  
>> gcc it uses can be MinGWin or Cygwin.  (theoretically and probably  
>> soon reality) NT386GNU can use either as  well! (also currently  
>> theory, but a real possibility)  It isn't GNU  tools, it is GNU  
>> runtime.One small area with cm3 might fall down  just slightly is  
>> that of   cross builds where host and target have  different  
>> naming conventions.   -lfoo vs. foo.lib, foo.o vs. foo.obj  are an  
>> aspect of the host and   I vaguely recall that cm3 ties  naming  
>> convention to ostype.   The appending of .exe is a target   
>> characteristics, but the others are not really.   Naming  
>> convention  is really a host thing and not a target thing.The  
>> config files are a  mix of host and target information, mostly  
>> actually host,  except  for the one line that says TARGET. Most of  
>> the target variation is  in cm3,  which always can do any, and  
>> cm3cg (which might be nice to  be similar, but that's  another  
>> matter and not likely to ever  change, except when AMD64 is the  
>> last  architecture standing. :) )If  Windows had "rpath", then SL  
>> would be split between HOST_SL and  TARGET_SL.As it stands, SL is  
>> HOST_SL.Consider as well the various  versions of Visual C++.They  
>> output mostly the same, very  interoperable.Consider optimization  
>> switches. Host or  target?Consider version of gcc or Visual C++?  
>> Host or target?Well,  inevitably, the host has an affect on the  
>> target.  If not the for  the host, the target would not even  
>> exist.  Bugs in the host produce  bugs in the target.  etc.(And  
>> realize that Cygwin runs on top of an  OS built witha Microsoft  
>> compiler, so really there is interop, but  sometimes through a  
>> layer.) So there's a risk of saying there is  six+ combinations. 
>> (host cygwin, host mingwin, host native) x (target  nt386, target  
>> nt386gnu)  But generally the host is assumed not a  factor. I  
>> guess "LIBC" could be seperated into several options...You  could  
>> actually have code that needs one runtime or another, and they   
>> couldlink together, depending on what they do.. This is something  
>> I  don't know if cm3 handles, or anything I have seen. I should be  
>> able  to build a static .lib, that includes some C code, that  
>> imbues its    clients with build time dependencies. Well, I guess  
>> #pragma  comment(linker) is this.So the next tasks are roughly:    
>> Merge my  NT386 and NT386GNU files.   Switching on a variable such  
>> as backend  mode.    Introduce a "new" (old) NT386GNU file,  
>> perhaps more like  what was already there.    Change NT386GNU back  
>> to Posix.    Build  NT386GNU. oh, one more point...while these are  
>> two targets from  cm3's point of view, they are PROBABLY the same  
>> target to cm3cgand  so only one is needed. I have to check if  
>> configure differentiates  between i686-pc-cygwin and i686-pc- 
>> mingwin...but I guess it  should...It might actually be profitable  
>> to have two bloated  cm3cg.exe's.And they should ship to \cm3\pkg 
>> \m3cc\target\host or  host\target and cm3 should know which to  
>> run.Blech..four of them  when one would suffice?The detail being  
>> mainly what the paths to  .libs look like, unfortunate.Possibly  
>> cm3 can bridge this gap using  that "broken" feature that symlinks  
>> libs into the target  directory,using NTFS hard links, if  
>> installroot and root are on the  same volume... (or symlinks on  
>> Vista).Or maybe convert the paths as  appropriate, hacky, but  
>> saves an extra cm3cg.exe which is good to  avoid. (all the more  
>> reason to lump all targets into one file, so  that the host x  
>> target matrix collapses to just one axis, host;  andthen you can  
>> write stuff in Perl/Python/Java/C# to collapse that  to just one,  
>> except for the underlying runtime/interpreter...) Oh,  cm3cg isn't  
>> the issue. It is always sitting in the correct directory  and  
>> reads one file and writes one file, no slashes.The issue is gcc   
>> as the linker. Again, this is a host issue..and cm3 or the config   
>> file definitely should do the translation.  - Jay
>>
>>
>> From: jayk123 at hotmail.comTo: m3devel at elegosoft.comDate: Mon, 21  
>> Jan  2008 23:01:44 +0000Subject: [M3devel] platform/build_dir is a  
>> big  tuple?
>>
>> Need to know the score, the latest news, or you need your   
>> Hotmail®-get your "fix". Check it out.
>> _________________________________________________________________
>> Climb to the top of the charts! Play the word scramble challenge   
>> with star power.
>> http://club.live.com/star_shuffle.aspx? 
>> icid=starshuffle_wlmailtextlink_jan
>
>
>
> -- 
> Olaf Wagner -- elego Software Solutions GmbH
>                Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin,  
> Germany
> phone: +49 30 23 45 86 96  mobile: +49 177 2345 869  fax: +49 30 23  
> 45 86 95
>    http://www.elegosoft.com | Geschäftsführer: Olaf Wagner | Sitz:  
> Berlin
> Handelregister: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr:  
> DE163214194
>




More information about the M3devel mailing list