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-2025 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.
