Notes for Windows Maintainers ============================= 1) fixed/h/config.h can be made automatically. Some of this is achieved by overrides in the configure script. You will need a copy of sh.exe in /bin. Then with the R sources in /R/R-2.10.0, I used in /TEMP/R (any other directory will do, except the sources). To test trio set LIBS='/src/extra/trio/libtrio.a' sh /R/R-2.10.0/configure --build=i386-pc-mingw32 --with-readline=no --with-x=no This ran fairly slowly, currently producing a src/include/config.h that differs only in that - it does not find the declarations of siglongjmp/sigsetjmp (in psignal.[ch]) - MinGW gcc 4.2.1 supports pthreads, but I left that undefined. Also, watch out for versions of the header files. For example, was in mingw-runtime-1.2 and later, but not (long ago) in the mingw-1.1 bundle. These days we insist on a current MinGW. BDR 2002-04-15, 2003-02-10, 2004-06-28, 2005-11-25, 2006-07-06, 2007-08-09, 2009-07-08 2) The Makefiles for building a distribution have been reorganized. Now all of the decisions about what files go into the distributables are made in installer/Makefile; the decisions about which component of the setup program each file goes into are made in installer/JRins.pl. DJM 2003-02-25 3) Making Tcl/Tk. For R 4.2 (64-bit UCRT bundle), see https://svn.r-project.org/R-dev-web/trunk/WindowsBuilds/winutf8/ucrt3/tcl_bundle/ For more background, see "Tcl/Tk bundle" in https://svn.r-project.org/R-dev-web/trunk/WindowsBuilds/winutf8/winutf8.html Earlier versions used: https://github.com/waddella/Tclbuild https://raw.githubusercontent.com/r-windows/r-base/master/create-tcltk-bundle.sh 4) Linking to DLLs. MinGW's ld.exe takes the internal name of the DLL as the object to link to, and hence for DLLs which are to be linked to (rather than loaded), the internal names need to be dllname.dll. This was not being done by the %.dll rule used in 2.2.1, which builds via a .def file with first line LIBRARY $* [The example in ld.info is LIBRARY "xyz.dll" whereas that in the MSDN documentation (http://msdn2.microsoft.com/en-us/library/d91k01sh.aspx) is LIBRARY BTREE so MinGW is inconsistent with MSDN here.] It would seem that this should just be replaced by $*.dll, but there is another problem: ld.exe rejects .def files whose LIBRARY name contains more than one dot, and so this is unable to cope with packages with a dot in their name. (We already document that two or more dots are not allowed.) So we have had to treat separately the DLLs which are designed to be linked to. These are R.dll : is special-cased, and as it wants to export entry points from static libraries and exports variables, nothing else we tried worked. Rblas.dll : has a .def file, and the name was changed to Rblas.dll there. Rlapack.dll : is simple, so gcc -shared with no .def file works. Rproxy.dll : is special-cased. (Linked against by rcom package.) The other DLLs which were in R_HOME/bin, Rbitmap.dll and Rchtml.dll, have been moved to R_HOME/modules. They are now made directly with gcc -shared. Rchtml.dll needs an import library as you cannot link directly to a .ocx. However, whereas MSDN says there must be a LIBRARY statement, it seems not to be required for ld.exe. So the %.dll rule in MkRules as from 2.3.0 does not have a LIBRARY statement, which circumvents the 'at most one dot' rule. BDR 2006-02-15, 2006-02-24 5) Rdll.hide AllDevicesKilled RConsole RFrame Rf_runcmd RgetMDIheight RgetMDIwidth RguiMDI Ri18n_wcwidth Riconv Riconv_close Riconv_open Rwin_graphicsx Rwin_graphicsy UserBreak locale2charset optclosefile optfile optline optopenfile optread for grDevices R_deferred_default_method R_do_MAKE_CLASS R_do_new_object R_do_slot R_do_slot_assign R_execMethod R_primitive_generic R_primitive_methods R_set_prim_method R_set_quick_method_check R_set_standardGeneric_ptr R_subassign3_dflt do_set_prim_method for methods set_R_Tcldo unset_R_Tcldo Rf_wtransChar for tcltk R_fixbackslash consolefn freeConsoleData freemenuitems lzma_crc64 orderVector1 wgl_histadd etc for utils R_gl_tab_set cmdlineoptions getDLLVersion gl_hist_init gl_loadhistory readconsolecfg saveConsoleTitle setupui for rgui/rterm/Rscript Rf_mbrtowc Rf_strchr localeCP for graphapp.dll setup_term_ui for package Rserve optif9 for package nlme BDR 2007-08-20 6) Conversion to Unicode/UTF-8. [Notes are a work in progress. This has been discussed since 2003.] As from R 2.7.0, Rgui works internally in UCS-2. Currently key strokes are recorded as bytes, but that could easily be changed if we had testers with CJK keyboards. Input/output is converted to/from the current locale in R_ReadConsole/R_WriteConsole. The internal pager works in UCS-2. History files are currently written in the locale's charset, for compatibility with Rterm and past versions of R. We could perhaps alleviate this by using a BOM when writing in UCS-2, and detecting that when loading history files. Chris Jackson's script editor is still MBCS. Quite a bit of work will be needed to convert it, since e.g. GA_gettext() expects to work with char *. The only bar to converting Rterm to UCS-2 is the lack of CJK keyboards to test on, but there would be little advantage in doing so. 6.1 Internal use of UTF-8 - Internal mbcs<->wchar/UCS translations would need to be modified to use UTF-8 and not the locale charset. Several places (e.g. Riconv_open) already have support for this. The gettext-runtime (src/extra/intl) does not. *All* I/O would need to be translated. This includes - Rprintf and allies, error messaging. [This one is really tricky: we don't want to be writing UTF-8 files when sink() is in use, for example, and rterm/some embedded uses run in environments that probably do not support UCS-2. The current compromise is to encode UTF-8 character vector elements in EncodeString, at least when called from printing and from cat(), and if outputting to the Rgui console. This is done by surrounding them by 3-byte escape sequences starting with STX/ETX.] - file names. Since Windows NTFS can have file names not valid in the current locale, this needs to use wfopen and similar interfaces, as well as GetFullPathNameW ... also _w* versions of mkdir, rmdir, unlink, open, popen, stat, system. Use with care, as not all file systems use UCS-2 file names. [Done] This needs to include bzlib and zlib, as well as file/folder selection widgets. [Done] - environment variables. Both values and names, since _wputenv is needed to set name=value strings. It would be better to use wmain and only ever use _wgetenv and _wputenv to avoid maintaining parallel environments. [Done] - graphics devices. Calls to text() and points() (with pch as a string) need either to be translated or, preferably, the device adjusted to accept UTF-8 (and we would need a flag to know if it could). Note that this impacts third-party devices. [Done for windows() family, postscript, pdf.] - GetUserName, GetComputerName, [GS]etCurrentDirectory. [Done] Also: - There would be compatibility issues with saved workspaces, although few for those working in CP1252 locales. - It is not clear what to do with strings passed to packages. We could force conversion in .C and .Fortran, but most character-manipulation packages are likely to be using .Call. BDR 2008-01-06 7) Changing the parser By default the parser in gram.y is only processed in maintainer mode, which isn't supported in Windows builds. Defining RUN_BISON will cause src/main/Makefile.win to process it (and correct for the erroneous line number records caused by our renaming of the output). 8) Making iconv.dll In the past this was done from the libiconv sources using VC++ 6, but as from version 1.12 that is no longer supported. It does not build easily with MinGW (due to the overuse of libtool), but we used setenv INSTALL cp setenv INSTALL_DATA cp sh configure --build=i386-pc-mingw32 --disable-nls cd libcharset; make cp include/localcharset.h ../lib cd ../lib make gcc -shared .libs/iconv.o .libs/localcharset.o .libs/relocatable.o \ .libs/iconv-exports.o -export-all-symbols -o Riconv.dll We now use a modified version of win-iconv, but the libiconv version can still be used by replacing bin/Riconv.dll. BDR 2009-02-08