lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]

Hello Olexa,

this works perfectly to get the 'assembler' output. Thanks.
 luac.exe -p -l file.lua

**under certain circumstances I also want a binary executable file.

this is the function to create the binary file:

local function crt_bin(cmdstr)

  hdl_cmd = io.popen(cmdstr, 'r')
  rtxdta, _err = hdl_cmd:read('*all')
  hdl_cmd = nil

  if _err then onerr(_err) end

this works perfectly and does what I want from the command line:
 luac.exe -o /Plugins/file.lua -l /Plugins/QSRC/file.lua

however, when I run it through the function io.popen I get: directory not found in rtxdta and the binary is not produced.
ok, I will do it just like the one that works
 luac.exe -l /Plugins/QSRC/file.lua
_err is nil, nothing returned in rtxdta, not in luac.out
ok, try this one
 luac.exe - -l /Plugins/QSRC/file.lua
_err is nil, nothing returned in rtxdta,not in luac.out
try them with a mode of 'rb'
same result.

what do I have to do to accomplish this?  thank you.

From: Olexa Bilaniuk <>
Sent: Wednesday, September 20, 2023 21:42
To: Lua mailing list <>
Subject: Re: cannot get luac.exe to work.
Hello Ron,

I'm not an expert in Windows, but if this can help a bit:

1. I notice your paths have spaces inside them, which explains why you
quote things. But you have to be careful when you use functions like
io.popen() that take a single string; That Lua function hands its
string straight down to the C function _popen() on Windows, and then
that function uses whatever rules it uses to parse the string back
into an array of arguments.

2. Some of your files have exclamation marks as well (!!) On a POSIX
shell, not even a double-quote shields an exclamation mark enough, it
may be necessary to use single quotes. On Windows I don't know what it

3. I'll simplify from now on the notation:

        luac.exe -l file.lua > file.irp

    This works in the shell because it uses a shell redirect. At least
on Linux, luac *never* sees the ">" as an argument, and all it sees is
["luac.exe", "-l", "file.lua"]. It writes the compiled code to the
default output filename, called "luac.out", and prints to standard
output the listing, but standard output gets redirected to "file.irp".

    I am not sure if the C function _popen(), which io.popen() is
based on Windows, interprets its command string through a shell. If it
*does*, you have to be more careful about quoting, but redirections
work; whereas if it *does not*, then it will not understand the

4. You say you use io.popen() with the "w" mode. That's unfortunate,
because you don't need to give luac any standard input and it doesn't
take any, but you *do* need to read the standard output to get the
listing. I recommend the "r" mode.

5. The commands

        luac.exe -l file.lua > file.irp
        luac.exe -l file.lua -o file.irp

    are not equivalent. The former compiles "file.lua" to bytecode in
"luac.out" and the listing to "file.irp". The latter does not even run
because after luac sees the first thing it interprets as a filename
("file.lua"), it assumes everything that follows is a Lua filename to
be compiled as well. "-o" is not a filename.

6. A slight improvement is

        luac.exe -o file.irp -l file.lua

    This will actually run, and compile "file.lua" to bytecode in
"file.irp", overriding the default output filename, and prints to
standard output the listing. But that's not what you wanted; as I
gather it, you want the listing in "file.irp". Unfortunately there is
no way for you to indicate a file to write the listing to.

7. Most appropriate for you is, I believe,

        luac.exe -p -l file.lua

    This uses the "parse only" flag of Luac, and spits out the listing
to standard output. From there, a redirection will take the listing to
wherever you want to have it in the shell, or else io.popen("luac.exe
-p -l file.lua", "r") with the "r" mode will let you capture the
listing from luac's standard output with a :read("*a") . Most
importantly, luac will not create an output file, "luac.out" or

I hope this will be useful to you.


Olexa Bilaniuk

On Wed, Sep 20, 2023 at 7:47 PM Ron Unknown <> wrote:
> I am on windows 11, and use a program called Family Historian
> Family Historian uses Lua for plugins they will only use from their Plugins folder, not any subfolders.
> Family Historian  version 6.2.7 uses Lua version 5.1 (I do not know the variant beyond that)
> Family Historian  version 7.0.x uses Lua version 5.3 (I do not know the variant beyond that)
> I have downloaded the 5.1.5 binaries  in both 32 and 64 bit (there is no difference in the outcome)
> I :gsub('\\', '/') since windows has understood '/' since windows 98 and the '\\' repeats throughout are tiresome.
> from a non-elevated command prompt:
> the very first issue I ran into was luac.out access denied, so in Windows/system32 I have an luac.out with full access for all and no longer receive that message.
>  "C:/Program Files (x86)/LUAC/5.1/luac5.1.exe" -l "C:/ProgramData/Calico Pie/Family Historian/Plugins/!!XPcall.fh_lua" > "C:/ProgramData/Calico Pie/Family Historian/Plugins/IRP/5.1/!!XPcall.irp"
> this works whether the outfile exists or not on the command line.
> so, I am ready to run it through my program:
>  "C:/Program Files (x86)/LUAC/5.1/luac5.1.exe" -l "C:/ProgramData/Calico Pie/Family Historian/Plugins/!!XPcall.fh_lua" > "C:/ProgramData/Calico Pie/Family Historian/Plugins/IRP/5.1/!!XPcall.irp"
> using io.popen(... , 'w')
> result:  No such file or directory
> I posit that luac will not understand the redirection pipe:
>  "C:/Program Files (x86)/LUAC/5.1/luac5.1.exe" -l  "C:/ProgramData/Calico Pie/Family Historian/Plugins/!!XPcall.fh_lua" -o "C:/ProgramData/Calico Pie/Family Historian/Plugins/IRP/5.1/!!XPcall.irp"
> result:  No such file or directory
> ok, create the file before you output the listing:
> result:  No such file or directory
> Yes there is, I just created it.
> take it back out to the non-elevated command prompt.
> cannot open -o: No such file or directory
> aha, there is some type of error I cannot understand in my command strings when run thru io.popen (or os.execute or laucom) ,  or on the command line,  and the error are from luac.exe
> 1) so what does the command string have to look like?
>  "C:/Program Files (x86)/LUAC/5.1/luac5.1.exe" -l  "C:/ProgramData/Calico Pie/Family Historian/Plugins/!!XPcall.fh_lua" -o "C:/ProgramData/Calico Pie/Family Historian/Plugins/IRP/5.1/!!XPcall.irp"
> additonally, under some circumstances I want to create a binary object.
> "C:/Program Files (x86)/LUAC/5.1/luac5.1.exe" -t -s  "C:/ProgramData/Calico Pie/Family Historian/Plugins/QSRC/QSYS.lua" -o "C:/ProgramData/Calico Pie/Family Historian/Plugins/QSYS.lua"  I understand that I may not use -t on 5.1 compiles.
> result:  No such file or directory
> 2, 3) so what does that command string have to look like, and do I have to 'wb' for this?
> 4_) do I need to create empty supplied outfiles, or does luac create them (or overwrite them if they exist)?
> I can supply the lua code (it uses several requires that I would have to supply and it is geared only to Family Historian paths, etc) but I do not feel the errors are in the general code, just the assembling of the command string)
> Thank you,
> Ronald Melby