Windows上CMake+Lua编译和luarocks环境配置 | Blurred code

Windows上CMake+Lua编译和luarocks环境配置

2022/01/31

LastMod:2022/03/10

Categories: Lua

Windows10

珍爱生命,远离预编译的包。编译Lua环境相对容易,只需要一个支持ANSI C的编译器环境,所以推荐自己编译,否则可能由于预编译的包的工具链和本机上的工具链版本不一样导致奇奇怪怪的问题。

Lua + CMake编译

Lua原生只提供makefile,而且是Linux下的makefile,有人提供了MSVC工具链可以调用的NMAKE工程文件,没有尝试,可以试试。

因为我想要自动化下载源代码,编译和打包这个流程,所以干脆就用cmake搞了一下。 Lua的源代码里不考虑MSVC的私货dllexport那一坨,所以在Win下编译要格外注意符号导出,或者就别搞动态链接库,直接打包成静态库(有个坑就是luac必须静态链接lualib,用动态链接找不到符号)。

自己fork了一份代码改了下cmake,工程在https://github.com/BlurryLight/Lua-with-cmake,支持从环境变量LUA_VERSION导入想要的版本号,pwsh中可以使用$env:LUA_VERSION = "5.3.5", bash直接用export就完事。 install部分参照着5.3.6的源码结构编写的,编译低版本(5.1.x)的话,由于部分头文件位置不一样所以install的时候可能会出错,需要手动复制一下lua.hpp这个头文件。

git clone [email protected]:BlurryLight/Lua-with-cmake.git

lua53编译出来的组织结构应该是

.
├── [4.0K]  bin
│   ├── [205K]  lua53.dll
│   ├── [ 18K]  lua53.exe
│   ├── [117K]  luac.exe
│   └── [205K]  luad.dll
├── [4.0K]  include
│   ├── [8.4K]  lauxlib.h
│   ├── [ 21K]  luaconf.h
│   ├── [ 14K]  lua.h
│   ├── [ 191]  lua.hpp
│   └── [1.3K]  lualib.h
├── [4.0K]  lib
│   ├── [ 57K]  lua53.lib
│   ├── [ 57K]  luad.lib
│   └── [922K]  luas.lib


3 directories, 12 files

lua51编译出来的结构应该是

.
├── [4.0K]  bin
│   ├── [168K]  lua51.dll
│   ├── [160K]  lua51.exe
│   └── [ 96K]  luac.exe
├── [4.0K]  include
│   ├── [5.6K]  lauxlib.h
│   ├── [ 22K]  luaconf.h
│   ├── [ 11K]  lua.h
│   ├── [ 191]  lua.hpp
│   └── [1.0K]  lualib.h
├── [4.0K]  lib
│   ├── [ 48K]  lua51.lib
│   └── [723K]  lua51s.lib

3 directories, 10 files

注意lua53.exe,lua51.dll等库和exe都要带版本号,如果格式不对的话需要手动重命名一下,以方便luarocks识别。

Luarocks安装

Luarocks官方提供的那个二进制浪费了我2小时,不如自己编译5分钟搞定。去这里下载源码包https://github.com/luarocks/luarocks/releases/tag/,下下来后解压,编译。

windows下的编译命令为

install.bat /F /LUA LUA_INSTALL_PATH /P LUAROCKS_INSTALL_DIR /SELFCONTAINED /Q

第一个参数LUA_INSTALL_PATH要指向lua编译出来的路径,第二个路径LUAROCKS_INSTALL_DIR指向luarocks将要安装的路径。 /SELFCONTAINED比较重要,把各种目录收拢在安装目录,方便安装多个版本的luarocks

5.1版本的安装 install.bat /F /LUA D:\opt\lua-5.1.5-build-Release /P D:\opt\Luarocks51 /SELFCONTAINED /Q /LV 5.1

5.3版本的安装 install.bat /F /LUA D:\opt\lua-5.3.5-build-Release /P D:\opt\Luarocks53 /SELFCONTAINED /Q /LV 5.3

多版本Lua环境和Luarocks

由于加了/SELFCONTAINED的标志后,lua安装的包都在luarocks的目录下。 luarocks提供了一个命令来设置环境变量, 不过也挺sb的,比bash的eval要难受多了。

  luarocks path > "%temp%\_lrp.bat" && call "%temp%\_lrp.bat" && del "%temp%\_lrp.bat

通过install.bat安装的目录下都包含luarocks.bat,这样如果都加到环境变量里会有冲突,可以酌情改成luarocks51.batluarocks53.bat

Powershell设置(可选)

具体可以看powershell的配置文件

我从majkinetor的posh脚本库拿了个脚本,可以从powershell里调用bat从而设置环境变量。 通过设置alias,注意要设置Scope以使得alias在函数外生效,以使得lualuarocks指向不同版本的lua。 注意不同lua的bin目录下也要加入到环境变量下,不然可能会找不到对应的lua.exe

function set_lua_51
{
    Set-Alias -name 'lua' -Value 'lua51.exe' -Scope GLobal
    Set-Alias -name 'luarocks' -Value 'luarocks51.bat' -Scope GLobal
    luarocks path > $env:TEMP\_lrp.bat
    Invoke-Environment $env:TEMP\_lrp.bat
}

function set_lua_53
{
    Set-Alias -name 'lua' -Value 'lua53.exe' -Scope GLobal
    Set-Alias -name 'luarocks' -Value 'luarocks53.bat' -Scope GLobal
    luarocks path > $env:TEMP\_lrp.bat
    Invoke-Environment $env:TEMP\_lrp.bat
}

luarocks安装包的时候可以要注意设置编译器路径,也是利用同样的手法Invoke-Environment来调用visual studio提供的设置环境变量的bat文件。

当然也可以简单一点,用VS提供的x64toolchains 设置好编译器的路径,然后cd到不同lua版本的luarocks下装包也不是不行,本身装包也是个低频操作,不需要特地在powershell里折腾半天。

测试

安装完成后可以用luarocks install luasocket测试一下,这个库需要编译C库,可以检验环境是否配置对。

#.1 激活lua53环境,设置lua53和luarocks53的环境变量
set_lua_53
#.2 安装luasocket
luarocks53.bat install luasocket
#.3 正常情况下应该看见编译和安装成功的提示
# luasocket 3.0rc1-2 is now installed in D:\opt\Luarocks53\systree (license: MIT)

调用require('socket')检查

luasocket