; docformat = 'rst'
;+
; `MG_MAKE_RT` can build a cross-platform runtime distribution.
;
; :Todo:
; make a table of all possible combinations of platforms and test
;
; :Author:
; Michael Galloy
;-
;+
; Converts a Windows text file containing CR+LF linebreaks to a Unix style
; text file with just LF linebreaks.
;
; :Private:
;
; :Params:
; filename : in, required, type=string
; filename of text file to modify
;-
pro mg_make_rt_dos2unix, filename
compile_opt strictarr
; read the file
nlines = file_lines(filename)
lines = strarr(nlines)
openr, lun, filename, /get_lun
readf, lun, lines
free_lun, lun
; add the Unix style newline to each line
lines += string([10B])
; write the file
openw, lun, filename, /get_lun
writeu, lun, lines
free_lun, lun
end
;+
; Wrapper for `MAKE_RT`. `MG_MAKE_RT` will automatically use all the platforms
; which are available in the $IDL_DIR/bin directory. The params/keywords are
; the same as for `MAKE_RT`, except all the platform specifying ones are
; omitted since they are no longer needed.
;
; :Params:
; appname : in, required, type=string
; name of the application
; outdir : in, required, type=string
; directory to place output in; this directory must exist and must use
; the `OVERWRITE` keyword if this directory is not empty
;
; :Keywords:
; embedded : in, optional, type=boolean
; set to launch savefile in embedded license mode
; idldir : in, optional, type=string, default=!dir
; specify IDL distribution which the files should be copied from
; logfile : in, optional, type=string, default=outdir/appname/log.txt
; full path to log file produced while generating the runtime
; distribution
; manifest : in, optional, type=string, default=!DIR/bin/make_rt/manifest_rt.txt
; specify a manifest file
; app_manifest : in, optional, type=string
; specify a manifest of application files
; overwrite : in, optional, type=boolean
; set to overwrite existing files instead of generating an error
; savefile : in, optional, type=string
; full path to save file to be launched; if nothing specified, then a
; file selection dialog will be displayed
; vm : in, optional, type=boolean
; set to automatically run in virtual machine mode instead of attempting
; runtime
; dataminer : in, optional, type=boolean
; set to include support for Dataminer
; dicomex : in, optional, type=boolean
; set to include support for `IDLffDicomEx` objects
; hires_maps : in, optional, type=boolean
; set to include support for high resolution maps
;
; :Requires:
; IDL 7.1
;-
pro mg_make_rt, appname, outdir, $
idldir=idldir, logfile=logfile, $
app_manifest=appManifest, manifest=manifest, $
overwrite=overwrite, savefile=savefile, $
vm=vm, embedded=embedded, dataminer=dataminer, $
dicomex=dicomex, hires_maps=hires_maps
compile_opt strictarr
binFiles = filepath('bin.*', subdir=['bin'])
binDirs = file_basename(file_search(binFiles, /test_directory))
archAvailable = strmid(binDirs, 4)
for a = 0, n_elements(archAvailable) - 1L do begin
case archAvailable[a] of
'x86': win32 = 1
'x86_64': win64 = 1
'darwin.ppc': macppc32 = 1
'darwin.i386': macint32 = 1
'darwin.x86_64': macint64 = 1
'linux.x86': lin32 = 1
'linux.x86_64': lin64 = 1
'solaris2.sparc': sun32 = 1
'solaris2.sparc64': sun64 = 1
'solaris2.x86_64': sunx86_64 = 1
else: message, 'unknown architecture ' + archAvailable[a], /informational
endcase
endfor
; make the output directory if it doesn't exist already
if (~file_test(outdir, /directory)) then file_mkdir, outdir
make_rt, appname, outdir, $
idldir=idldir, logfile=logfile, manifest=manifest, $
overwrite=overwrite, savefile=savefile, $
vm=vm, embedded=embedded, dataminer=dataminer, $
dicomex=dicomex, hires_maps=hires_maps, $
win32=win32, win64=win64, $
macppc32=macppc32, macint32=macint32, macint64=macint64, $
lin32=lin32, lin64=lin64, $
sunx86_64=sunx86_64, sun32=sun32, sun64=sun64
if (n_elements(appManifest) gt 0L) then begin
if (~file_test(appManifest)) then begin
message, 'application manifest file specified does not exist', /informational
endif else begin
nlines = file_lines(appManifest)
manifestFiles = strarr(nlines)
openr, lun, appManifest, /get_lun
readf, lun, manifestFiles
free_lun, lun
_outdir = file_expand_path(outdir)
cd, current=origdir
if (n_elements(savefile) gt 0L) then cd, file_dirname(appManifest)
for i = 0L, nlines - 1L do begin
filename = strtrim(manifestFiles[i], 2)
file_copy, filename, $
filepath(filename, subdir=[appname], root=_outdir), $
recursive=file_test(filename, /directory)
endfor
cd, origdir
endelse
endif
; fixes for IDL problems
; if on Windows and producing a Linux run script, there will be CR-LF
; linebreaks instead of just LF
if (!version.os_family eq 'Windows' $
&& (keyword_set(lin32) || keyword_set(lin64))) then begin
script = filepath(appname, subdir=appname, root=outdir)
if (file_test(script)) then mg_make_rt_dos2unix, script
endif
; Mac launcher not created on Linux
if (keyword_set(macppc32) || keyword_set(macint32) || keyword_set(macint64)) then begin
if (!version.os_name ne 'Mac OS X') then begin
message, 'Mac launcher app not created', /informational
endif
endif
end