From 80a96fd90d8b6306d025300f291122d341a000d8 Mon Sep 17 00:00:00 2001 From: Hubert Maier Date: Mon, 21 Oct 2019 20:38:24 +0200 Subject: AMIGAOS4: Automate special target installation even more (#1901) * AMIGAOS4: Update amigaos.mk - reorg - add stripping/copying engine plugins - add Ext_Ins_so.rexx * Ext_Inst_so.rexx Add script to extract and install all compiled-in shared libraries to a local sobjs/ dir. Reason is that not every AmigaOS4 installation, especially vanilla ones, feature all mandatory libraries (which has led to many bug reports and lots of gathering of the correct libraries for users in the past) * AMIGAOS4: RM2AG.rexx - Add automatic installation to the correct path - Add deleting the temp file - Typos and rewording - Add I/O panic switches --- dists/amiga/Ext_Inst_so.rexx | 107 ++++++++++++++++++++++++++++++ dists/amiga/RM2AG.rexx | 151 ++++++++++++++++++++++++++++++------------- 2 files changed, 212 insertions(+), 46 deletions(-) create mode 100644 dists/amiga/Ext_Inst_so.rexx (limited to 'dists') diff --git a/dists/amiga/Ext_Inst_so.rexx b/dists/amiga/Ext_Inst_so.rexx new file mode 100644 index 0000000000..845acc687b --- /dev/null +++ b/dists/amiga/Ext_Inst_so.rexx @@ -0,0 +1,107 @@ +/* +$VER: Ext_Inst_so.rexx 0.3 (21.10.2019) Extract and install compiled-in shared libraries from a given ELF binary. +*/ + +PARSE ARG executable install_path + +/* +Check if arguments are available, otherwise quit. +*/ +IF ~ARG() THEN DO + SAY 'No Arguments given!' + SAY 'Usage: Ext_Inst_so.rexx EXECUTABLE INSTALL_PATH' + EXIT No Arguments given! +END + +/* +If the given filename/path has spaces in it, AmigaDOS/CLI +will add extra quotation marks to secure a sane working path. +Get rid of them to make AREXX find the file and remove leading +and trailing spaces. +*/ +IF ~EXISTS(executable) THEN DO + SAY executable' not available!' + EXIT EXECUTABLE not available! +END +ELSE DO + executable=STRIP(executable) + executable=COMPRESS(executable,'"') +END +IF installpath='' THEN DO + SAY 'No installation destination given!' + EXIT No installation destination given! +END +ELSE DO + install_path=STRIP(install_path) + install_path=COMPRESS(install_path,'"') + /* + Check for destination path and create it, if needed. + */ + IF ~EXISTS(install_path'/sobjs/') THEN + ADDRESS COMMAND 'makedir 'install_path'/sobjs' +END + +/* +Create shared objects dump. +*/ +ADDRESS COMMAND 'readelf -d 'executable' >so_dump' + +/* +Error check, if I/O went wrong. +*/ +IF ~OPEN(SO_read,'so_dump','R') THEN DO + SAY 'File so_dump opening failed!' + EXIT File so_dump opening failed! +END + +/* +We know that the dumped shared library entries always start +at line 4. Skip unneeded lines to speed up processing. +*/ +working_line=CALL READLN(SO_read) +working_line=CALL READLN(SO_read) +working_line=CALL READLN(SO_read) + +i=1 + +DO WHILE i>0 + working_line=READLN(SO_read) + IF POS('Shared library:', working_line)>0 THEN DO + i=1 + /* + We know that the shared library names always start at position 59. + */ + lib.so=SUBSTR(working_line,59,LASTPOS(']', working_line)-59) + /* + Check whether the installed shared libraries are placed in the SDK + (most of them) or AmigaOS SOBJS: drawer (few of them) and copy them accordingly. + */ + IF EXISTS('SDK:local/newlib/lib/'lib.so) THEN + ADDRESS COMMAND 'copy clone SDK:local/newlib/lib/'lib.so install_path'/sobjs/' + ELSE + IF EXISTS('SYS:SOBJS/'lib.so) THEN + ADDRESS COMMAND 'copy clone SYS:SOBJS/'lib.so install_path'/sobjs/' + ELSE DO + /* + If a shared library is not found, abort. + */ + SAY lib.so' not found! Aborting!' + EXIT Shared Library not found! Aborting! + END + END + ELSE + i=0 +END + +/* +AREXX is doing its own cleaning up of open files. +Close the file manually anyway. +*/ +IF ~CLOSE(SO_Read) THEN DO + SAY 'File so_dump closing failed!' + EXIT File so_dump opening failed! +END + +ADDRESS COMMAND 'delete so_dump' + +EXIT 0 diff --git a/dists/amiga/RM2AG.rexx b/dists/amiga/RM2AG.rexx index 43900e0801..f496605ffd 100644 --- a/dists/amiga/RM2AG.rexx +++ b/dists/amiga/RM2AG.rexx @@ -1,32 +1,80 @@ /* -README(.md) to .guide converter $VER: RM2AG.rexx 0.20 (18.05.2019) -This script converts a given markdown README file of ScummVM to a basic -hypertext Amiga guide file. +$VER: RM2AG.rexx 0.22 (22.10.2019) README(.md) to .guide converter. +This script converts a given markdown README file (right now, only +ScummVM is supported) to a basic hypertext Amiga guide file and installs +it to a given path, if available. */ -PARSE ARG readme_md +PARSE ARG readme_md install_path /* -Check if the given file is really the readme. -If a given filename has spaces, AmigaDOS/AmigaCLI will add extra -quotation marks to secure a sane working path. We get rid of them to make -AREXX find the file. +Check if arguments are available, otherwise quit. */ -readme_md=COMPRESS(readme_md,'"') -OPEN(check_readme,readme_md,'R') -IF READCH(check_readme,18) = '# [ScummVM README]' THEN - CLOSE(check_readme) +IF ~ARG() THEN DO + SAY 'No Arguments given!' + SAY 'Usage: RM2AG.rexx README_MD INSTALL_PATH' + EXIT No Arguments given! +END + +/* +If the given filename/path has spaces in it, AmigaDOS/CLI +will add extra quotation marks to secure a sane working path. +Get rid of them to make AREXX find the file and remove leading +and trailing spaces. +*/ +IF ~EXISTS(readme_md) THEN DO + SAY readme_md' not available!' + EXIT README.md not available! +END +ELSE DO + readme_md=STRIP(readme_md) + readme_md=COMPRESS(readme_md,'"') +END +IF installpath='' THEN DO + SAY 'No installation destination given!' + EXIT No installation destination given! +END +ELSE DO + install_path=STRIP(install_path) + install_path=COMPRESS(install_path,'"') + /* + Check for destination path and create it, if needed. + */ + IF ~EXISTS(install_path'sobjs/') THEN + ADDRESS COMMAND 'makedir 'install_path'sobjs' +END + +IF ~OPEN(check_readme,readme_md,'R') THEN DO + SAY readme_md' opening failed!' + EXIT README.md opening failed! +END + +IF READCH(check_readme,18) = '# [ScummVM README]' THEN DO + IF ~CLOSE(check_readme) THEN DO + SAY readme_md' closing failed!' + EXIT README.md closing failed! + END +END ELSE DO + IF ~CLOSE(check_readme) THEN DO + SAY readme_md' closing failed!' + EXIT File README.md closing failed! + END SAY "Not the ScummVM README.md file. Aborting!" - CLOSE(check_readme) - EXIT 0 + EXIT Not the ScummVM README.md file. END -OPEN(readme_read,readme_md,'R') -OPEN(guide_write,'README.guide','W') +IF ~OPEN(readme_read,readme_md,'R') THEN DO + SAY 'File 'readme_md' opening failed!' + EXIT File README.md opening failed! +END +IF ~OPEN(guide_write,'README.guide','W') THEN DO + SAY README.guide' opening failed!' + EXIT README.md opening failed! +END /* -Prepare the Amiga guide file, add the intro and fixed text. +Prepare the Amiga guide file, add intro and fixed text. */ WRITELN(guide_write,'@DATABASE ScummVM README.guide') WRITELN(guide_write,'@$VER: ScummVM Readme 2.2.0git') @@ -39,22 +87,21 @@ WRITELN(guide_write,SUBSTR(READLN(readme_read),4,14)) WRITELN(guide_write,'@{ub}') /* -Creating the main (TOC) link nodes. +Creating main (TOC) link nodes. */ DO WHILE EOF(readme_read) = 0 working_line=READLN(readme_read) /* - Check for the start of actual the content and, if found, leave the - TOC link loop. + Check for start of actual content and, if available, leave TOC link loop. */ IF POS('## <>1.0<>)',working_line) = 1 THEN LEAVE /* - Check for any "rolled over" lines, if found, read in the rest (on the - following line) and rejoin them again, before processing any further. + Check for any "rolled over" lines and, if available, read in the rest + (on the following line) and rejoin them again before processing any further. e.g. - [<>3.6.3<>) Broken Sword games cutscenes](#363-broken-sword-games-cutscenes) */ @@ -72,10 +119,10 @@ DO WHILE EOF(readme_read) = 0 WRITELN(guide_write,working_line) ELSE DO /* - Fix the empty chapters: - Two chapters (1.0 and 7.8) are "empty", consisting of only it's - chapter names. We link them to their respective sub chapters - (1.1 and 7.8.1), so we don't end up displaying a blank page. + Fix empty chapters: + Two chapters (1.0 and 7.8) are "empty", consisting of only + it's chapter names. Link them to their respective sub chapters + (1.1 and 7.8.1) to not display a blank page. If chapter 1.0 is found, add a link node to chapter 1.1. */ @@ -101,11 +148,11 @@ DO WHILE EOF(readme_read) = 0 END /* - If a single number main chapter is found (1.0 upto 9.0), prepare - and write the link node. + If a single number main chapter is found (1.0 upto 9.0), + prepare and write the link node. Just for the record: A "\" (backslash) is treated as escape character in AmigaGuides. - Thus we remove it from the node links. + Remove it from the node links. */ IF POS('- [<>',working_line) = 3 THEN DO WRITELN(guide_write,' ') @@ -118,8 +165,8 @@ DO WHILE EOF(readme_read) = 0 END /* - If a single number level one sub chapter is found - (i.e. 1.1, 1.2 etc.), prepare and write the link node. + If a level one sub chapter is found (i.e. 1.1, 1.2 etc.), + prepare and write the link node. */ IF POS('- [<>',working_line) = 7 THEN DO WRITELN(guide_write,' @{" 'SUBSTR(working_line,POS('<>',working_line)+2,LASTPOS('<>',working_line)-POS('<>',working_line)-2) '" Link "'SUBSTR(working_line,POS('<>',working_line)+2,LASTPOS('<>',working_line)-POS('<>',working_line)-2)'"} 'COMPRESS(SUBSTR(working_line,1,LASTPOS(']',working_line)-1),'*<>[]\')) @@ -146,8 +193,8 @@ DO WHILE EOF(readme_read) = 0 END /* -Finish the TOC (Hardcoded due the outro text would be read in last, but -needs to be written after the TOC creation). +Finish TOC (hardcoded as the outro text would be read in last, +but needs to be written after TOC creation finished). */ WRITELN(guide_write,'-----') WRITELN(guide_write,' ') @@ -156,11 +203,11 @@ WRITELN(guide_write,'The ScummVM team.') WRITELN(guide_write,'@{"https://www.scummvm.org/" System "URLOpen https://www.scummvm.org/"}') /* -Creating the sub link nodes. +Creating sub link nodes. */ DO WHILE EOF(readme_read) = 0 /* - Change the html/markdown links to AmigaGuide ones + Change html/markdown links to AmigaGuide ones. */ IF POS('[here](',working_line) > 0 THEN DO working_line=INSERT('@{"',working_line,POS('[',working_line)-1) @@ -177,10 +224,10 @@ DO WHILE EOF(readme_read) = 0 ELSE DO /* Fix empty chapters: - Two chapters (1.0 and 7.8) are "empty", consisting of only it's - chapter names. We link them to their respective sub chapters - (1.1 and 7.8.1), so we don't end up displaying a blank page. - If chapter 1.1 is found don't close the NODE, just write the line. + Two chapters (1.0 and 7.8) are "empty", consisting of only + it's chapter names. Link them to their respective sub chapters + (1.1 and 7.8.1) to not display a blank page. + If chapter 1.1 is found, don't close the NODE, just write the line. */ IF POS('<>1.1<>',working_line) = 1 THEN DO /* @@ -191,8 +238,7 @@ DO WHILE EOF(readme_read) = 0 END /* - If chapter 7.8.1 is found don't close the NODE, just write the - line. + If chapter 7.8.1 is found don't close the NODE, just write the line. */ IF POS('<>7.8.1<>',working_line) = 1 THEN DO /* @@ -217,7 +263,7 @@ DO WHILE EOF(readme_read) = 0 END ELSE DO /* - If a chapter has been found, prepare and write the link. + If a chapter has been found, prepare and write the link node. */ WRITELN(guide_write,'@ENDNODE') WRITELN(guide_write,'@NODE "'SUBSTR(working_line,POS('<>',working_line)+2,LASTPOS('<>',working_line)-POS('<>',working_line)-2)'" "'COMPRESS(working_line,'<>#')'"') @@ -237,7 +283,7 @@ DO WHILE EOF(readme_read) = 0 working_line=READLN(readme_read) /* - If the outtro text is found, leave the loop and prepare for closing. + If the outtro text has been found, leave loop and prepare for closing. */ IF POS('-----',working_line,1) =1 THEN LEAVE @@ -246,11 +292,24 @@ END WRITELN(guide_write,'@ENDNODE') /* -Close the guide and clean up. +Close guide and clean up. */ WRITELN(guide_write,'@ENDNODE') -CLOSE(readme_read) -CLOSE(guide_write) +IF ~CLOSE(readme_read) THEN DO + SAY readme_md' closing failed!' + EXIT README.md closing failed! +END +IF ~CLOSE(guide_write) THEN DO + SAY 'README.guide closing failed!' + EXIT README.guide closing failed! +END + +/* +Install finished README.guide to installation path +and delete README.guide. +*/ +ADDRESS COMMAND 'copy README.guide 'install_path +ADDRESS COMMAND 'delete README.guide' EXIT 0 -- cgit v1.2.3