Generate an executable from a Mosel source file
|
|
Type: | Programming |
Rating: | 3 (intermediate) |
Description: | The 'mosdeploy' tool generates an executable from a Mosel source or bim file using the 'deploy' module. The result is either a binary file (produced thanks to a C-compiler) or a self-contained script embedding the bim file. Usage (generation of a shell script, the type is determined depending on the detected operating system): mosel mosdeploy.mos -- myfile.mosor by first generating a shell script from this file: mosel mosdeploy.mos -- mosdeploy.mos mosdeploy myfile.mosAlternatively, it is also possible to generate an executable from this file (requires a C-compiler): mosel mosdeploy.mos -- -exe mosdeploy.mosOther options include the specification of an output filename: mosel mosdeploy.mos -- -o runfile myfile.mosand a preselection of the output format (bat/cmd/sh) independent of the detected operating system: mosel mosdeploy.mos -- -cmd myfile.mos |
File(s): | mosdeploy.mos |
|
mosdeploy.mos |
(!****************************************************** Mosel Example Programs ====================== file mosdeploy.mos `````````````````` Generate an executable from a Mosel source or bim file using the 'deploy' module. The result is either a binary file (produced thanks to a C-compiler) or a self-contained script embedding the bim file. Usage: mosel mosdeploy.mos -- myfile.mos (c) 2024 Fair Isaac Corporation author: Y. Colombani, Nov 2022 *******************************************************!) model mosdeploy version 0.0.1 uses 'deploy','mmsystem','mmjobs' declarations fn="tmp:"+newmuid ! Temporary file for encoded bim bim="tmp:"+newmuid ! Temporary file for bim file iswin=tolower(getsysinfo(SYS_NAME))="windows" dest,src:text ! Source and destination file names force:boolean ! Whether to overwrite existing files mode:string ! Mode of operation:exe/sh/cmd/bat useb64:boolean ! Use base64 instead of ascii85 ! Internal subroutines procedure banner ! Display a banner procedure showhelp ! Display help text function basename(f:text):text ! Aux. routine returning basename end-declarations writeln(versionnum("deploy")) if argc=1 then banner showhelp exit(0) else if versionnum("deploy")<3001000: useb64:=true repeat if argv(2)="-V" then banner exit(0) elif argv(2)="-f" then force:=true elif argv(2)="-o" and argc>2 then shiftargv dest:=argv(2) elif argv(2)="-exe" and mode="" then mode:="exe" elif argv(2)="-bat" and mode="" then mode:="bat" elif argv(2)="-cmd" and mode="" then mode:="cmd" elif argv(2)="-sh" and mode="" then mode:="sh" elif argv(2)="-b64" and mode="" then useb64:=true else break end-if shiftargv until argc<2 if argc<2 or getchar(argv(2),1)=45 then banner showhelp exit(1) else fname:=argv(2) end-if if fname.size<5 or bittest(getfstat(fname),SYS_TYP)<>SYS_REG or getfsize(fname)<=0 or (not endswith(fname,".bim") and not endswith(fname,".mos")) then writeln("File '",fname,"' not found or invalid") exit(1) end-if if endswith(fname,".mos") then if compile("",fname,bim)<>0 then writeln("Failed to compile '",fname,"'.") writeln("Operation aborted.") exit(1) else src:=bim end-if else src:=fname end-if if mode="" then mode:=if(iswin,"bat","sh") end-if if dest="" then dest:=copytext(fname,1,getsize(fname)-4) if mode="bat" or mode="cmd" then dest+="."+mode end-if end-if if getfstat(dest)<>0 and not force then write("File '",dest,"' already exists, overwrite it?[y/N] ");fflush ans:="N" readln(ans) if ans.size<1 or (getchar(ans,1)<>89 and getchar(ans,1)<>121) then writeln("Operation aborted.") exit(1) end-if end-if if mode="exe" then fcopy(src,"deploy.exe:"+dest) if getsysstat<>0 then writeln("Failed to generate the executable") exit(2) end-if else setparam("ioctrl",true) fopen(dest,F_OUTPUT) setparam("ioctrl",false) if getparam("iostatus")<>0 then writeln("Failed to create '",dest,"'") exit(2) end-if if mode="sh" then writeln('#!/bin/sh') writeln("# File generated by '",basename(argv(1)),"' version ",getparam("model_version")) writeln("# Mosel version: ",getparam("parser_version")); if useb64 then writeln("exec mosel run \"zlib.deflate:mmssl.base64:deploy.skiphead:_BIMFILE_,$0\" deploy.progname=\"",basename(dest),"\" -- $@") else writeln("exec mosel run \"zlib.deflate:deploy.ascii85:$0\" deploy.progname=\"",basename(dest),"\" -- $@") end-if else writeln("@echo off") writeln("rem File generated by '",basename(argv(1)),"' version ",getparam("model_version")) writeln("rem Mosel version: ",getparam("parser_version")); if useb64 then writeln("mosel run \"zlib.deflate:mmssl.base64:deploy.skiphead:_BIMFILE_,%~f0\" deploy.progname=\"",basename(dest),"\" -- %*") else writeln("mosel run \"zlib.deflate:deploy.ascii85:%~f0\" deploy.progname=\"",basename(dest),"\" -- %*") end-if writeln("exit /b") end-if if useb64 :writeln("_BIMFILE_") fclose(F_OUTPUT) fcopy(src,if(useb64,"zlib.deflate:mmssl.base64:","zlib.deflate:deploy.ascii85:")+fn) if getsysstat<>0 then writeln("Failed to encode bim file") exit(2) end-if fcopy(fn,F_BINARY,dest,F_APPEND+F_BINARY) if getsysstat<>0 then writeln("Failed to append to bim file") exit(2) end-if if mode="sh" and not iswin then system("chmod","+x",dest) end-if end-if writeln("File '",dest,"' created") end-if !*********************** !* Display Banner !*********************** procedure banner writeln("FICO Xpress ",basename(argv(1))," v",getparam("model_version")) writeln("(c) Copyright Fair Isaac Corporation 2023-2024. All rights reserved") writeln(_("Link date"),": ",getparam("parser_date")," ",getparam("parser_time")) end-procedure !*********************** !* Display some help !*********************** procedure showhelp writeln_("\nUsage: ",basename(argv(1))," [-sh|-bat|-cmd|-exe|-V] [-f] [-o outfile] filename\n") write_(` -V: display banner and exit -f: overwrite existing file -sh: generate a sh script file (for posix systems) -cmd: generate a cmd script file (Windows) -bat: generate a bat script file (Windows) -exe: compile an executable for the current system -b64: for embedding the bim file use base64 even if ascii85 is available -o outfile: use 'outfile' for the destination file The file name must be a source Mosel file or a BIM file. By default a script for the current system is generated (bat or sh), the destination file name is produced using the provided input by updating the extension as necessary. `) end-procedure !********************************************************************** !* Extract the basename of a path (i.e. strip directory and extension) !********************************************************************** function basename(f:text):text returned:=pathsplit(SYS_FNAME,f) asproc(pathsplit(SYS_EXTN,returned,returned)) end-function end-model |
© 2001-2024 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.