编译luacheck Linux版
最近在写Visual Studio Code的Lua插件,需要把luacheck集成进去。但是luacheck默认只提供了win32版本,见https://github.com/mpeterv/luacheck/releases,但我的插件不可能只跑在win下啊。看了下README,没有提到编译的方法。搜索了一下,发现竞然也没有任何博客、文章提到如何在Linux下编译,只能自己研究。把源码clone下来,发现luacheck是纯Lua写的,那win32版本的luacheck.exe是如何来的?最后在build目录里找到一个makefile:
# Makefile for (cross)compiling luacheck binaries.
# Do not use directly, run scripts/build-binaries.sh instead. LUA_VERSION= 5.3.5
LFS_VERSION= 1.7.0-2
ARGPARSE_VERSION= 0.6.0-1
LANES_VERSION= 3.10.1-1 LUA_DIR= lua-$(LUA_VERSION)
LFS_DIR= luafilesystem-$(LFS_VERSION)/luafilesystem
ARGPARSE_DIR= argparse-$(ARGPARSE_VERSION)/argparse
LANES_DIR= lanes-$(LANES_VERSION)/lanes BASE_CC= gcc
BASE_AR= ar rc
BASE_RANLIB= ranlib
BASE_STRIP= strip CROSS=
CC= $(CROSS)$(BASE_CC)
CFLAGS= -O2 -Wall -Wextra
AR= $(CROSS)$(BASE_AR)
RANLIB= $(CROSS)$(BASE_RANLIB)
STRIP= $(CROSS)$(BASE_STRIP) SUFFIX=
TARGET= bin/luacheck$(SUFFIX) LUA_O= $(patsubst %.c,%.o,$(filter-out $(addprefix $(LUA_DIR)/src/,lua.c luac.c print.c),$(wildcard $(LUA_DIR)/src/*.c)))
LUA_A= $(LUA_DIR)/src/liblua.a
LFS_O= $(patsubst %.c,%.o,$(wildcard $(LFS_DIR)/src/*.c))
LFS_A= $(LFS_DIR)/src/lfs.a
LANES_O= $(patsubst %.c,%.o,$(wildcard $(LANES_DIR)/src/*.c))
LANES_A= $(LANES_DIR)/src/lanes.a default: $(TARGET) $(LUA_DIR):
@echo
@echo "=== Downloading Lua $(LUA_VERSION) ==="
@echo
curl "https://www.lua.org/ftp/$(LUA_DIR).tar.gz" | tar xz $(LFS_DIR):
@echo
@echo "=== Downloading LuaFileSystem $(LFS_VERSION) ==="
@echo
luarocks unpack luafilesystem $(LFS_VERSION) $(ARGPARSE_DIR):
@echo
@echo "=== Downloading argparse $(ARGPARSE_VERSION) ==="
@echo
luarocks unpack argparse $(ARGPARSE_VERSION) $(LANES_DIR):
@echo
@echo "=== Downloading Lanes $(LANES_VERSION) ==="
@echo
luarocks unpack lanes $(LANES_VERSION) fetch: $(LUA_DIR) $(LFS_DIR) $(ARGPARSE_DIR) $(LANES_DIR) $(LUA_O): CFLAGS+= $(if $(LINUX),-DLUA_USE_POSIX)
$(LUA_A): $(LUA_O)
$(LFS_O): CFLAGS+= -I$(LUA_DIR)/src
$(LFS_A): $(LFS_O)
$(LANES_O): CFLAGS+= -I$(LUA_DIR)/src
$(LANES_A): $(LANES_O) %.a:
$(AR) $@ $^
$(RANLIB) $@ bin/luacheck.lua.c: $(LUA_A) $(LFS_A) $(LANES_A)
cp $(LUA_A) .
cp $(LFS_A) .
cp $(ARGPARSE_DIR)/src/argparse.lua .
cp $(LANES_A) .
cp $(LANES_DIR)/src/lanes.lua .
cp -r ../src/luacheck .
CC="" luastatic bin/luacheck.lua luacheck/*.lua luacheck/*/*.lua luacheck/*/*/*.lua argparse.lua lanes.lua liblua.a lfs.a lanes.a $(TARGET): bin/luacheck.lua.c
$(CC) $(if $(LINUX),-static) -Os $< $(LUA_A) $(LFS_A) $(LANES_A) -I$(LUA_DIR)/src -lm $(if $(LINUX),-lpthread) -o $@
$(STRIP) $@ clean:
rm -f $(TARGET) bin/luacheck.lua.c
rm -f $(LUA_O) $(LUA_A) $(LFS_O) $(LFS_A) $(LANES_O) $(LANES_A)
rm -f argparse.lua lanes.lua liblua.a lfs.a lanes.a
rm -rf luacheck .PHONY: default fetch clean
这个就挺好理解了,先用curl下载依赖(lua 5.3.5等),然后把相关的依赖都编译成静态库(liblua.a、lfs.a、lanes.a等),最后用luastatic把Lua代码和这些静态库混合编译成一个独立的可运行文件即可。
根据注释,找到scripts目录下的build-binaries.sh脚本,尝试几次,就得出了编译的步骤:
apt install luarocks
luarocks install luastatic
git clone https://github.com/mpeterv/luacheck.git
cd luacheck
./scripts/build-binaries.sh
注意一下,luacheck支持下面几个平台的编译:
build "Linux x86-64" LINUX=
build "Linux x86" LINUX= "BASE_CC=gcc -m32" SUFFIX=
build "Windows x86-64" CROSS=x86_64-w64-mingw32- SUFFIX=.exe
build "Windows x86" CROSS=i686-w64-mingw32- SUFFIX=.exe
但是必须得安装对应的编译器才能编译,比如在debian9 x64下,只能编译Linux x86-64,如果想要编译Linux x86,但要安装32位库才能编译:
apt install gcc-multilib
apt install g++-multilib
如果是在win下,则需要安装mingw才能编译。MacOS应该是和Linux一样,能直接用GCC编译,不过我没有mac,测试不了。
编译生成的文件在build/bin目录下,是一个独立的可运行文件。由于是静态编译,可以在不同的Linux版本上运行,至少我测试在Debian9和Ubuntu 14.04上是可以的。现在可以把独立的luacheck集成到插件里去了。
PS:我之前一直不知道有luastatic这个工具可以把Lua编译成独立的可运行文件,以后有时间看下是什么原理
编译luacheck Linux版的更多相关文章
- Java 反编译工具 —— JAD 的下载地址(Windows版/Linux版/Mac OS 版)
Java 反编译工具 —— JAD 的下载地址. 各种版本哦! Windows版,Linux版,Mac OS 版,等等 下载地址: http://varaneckas.com/jad/
- Ubuntu 15.04 编译UE4 for Linux版
源 起 Unreal Engine 4 是全球最先进的Realtime Illumination & Physical 引擎: 长期以来,UE4都只有Windows版和Mac版,今年终于向Li ...
- Linux版OpenVPN安装、配置教程(转)
本文将以目前最新的openvpn-2.3.4.tar.gz(更新于2014-5-2,下载地址)为例来介绍如何在Linux系统中安装.配置及使用OpenVPN. 在这里,我们选用了一台预装CentOS ...
- SVN(linux版)安装与使用
SVN(linux版)安装与使用 一 简述: SVN有2种运行方式,一种是 linux自带的轻量级服务器svnserve,一种是基于Apache的. 基于svnserve的,默认端口为3690,通过 ...
- 使用 Redis 源码编译发布 Windows 版 Redis For Windows 发行包
Redis 是个高性能的键值数据库,现在日常项目开发过程中,目前个人开发项目基本都会用到 Redis,主要是用来做 缓存 和 分布式锁 的底层支持,个人喜欢用 .NET 技术体系,所以一般部署也是用 ...
- 使用VS+VisualGDB编译调试Linux程序
Linux程序开发变得越来越多,越来越多的程序.产品需要跨平台,甚至有些开源项目只支持Linux平台,所以掌握Linux开发变得越来越重要. 但是对于习惯了Windows下的开发,使用了VS这个宇宙第 ...
- linux版基金看板
程序员的吊丝们,还在害怕上班时偷偷看基金被老板发现吗?今天你们的福利来了,专属程序员吊丝一族的礼物,linux版基金看板. 优点: 1.自定义设置关注基金 2.linux系统,让别人可以以为你一直都在 ...
- XAMPP 的安装配置(Linux 版)
--姜庭华 msn: jaimejth@live.cn --博客:http://blog.csdn.net/jaimejth 软件下载在以下网站 http://www.apachefriends.o ...
- 将 ASP.NET Core 1.0 应用作为 docker 镜像发布 (Linux版)
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
随机推荐
- pip使用笔记
例子: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -U funcat -i: 指定库的安装源 -U:升级 原来已经安装的包,不带U ...
- MSE, MAE, Huber loss详解
转载:https://mp.weixin.qq.com/s/Xbi5iOh3xoBIK5kVmqbKYA https://baijiahao.baidu.com/s?id=16119517755261 ...
- 仙剑奇侠传1系列:2.编译主程序SDLPAL及SDL
上一篇:仙剑奇侠传1系列:1.本地运行环境及兼容性设置 介绍 仙剑奇侠传1是dos时代的经典游戏,相信以下图片能勾起大家的很多回忆. sdlpal是仙剑奇侠传1的主程序.github项目sdlpa ...
- spring 使用@Valid校验数据出错DEBUG org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod - Failed to resolve argument 0 of type
问题原因:在 @Valid 的那个参数后面紧跟着一个 BindingResult 的参数(一定要紧跟着) 参考来源:https://segmentfault.com/q/101000000838468 ...
- 处理HTTP请求
处理HTTP请求 当客户端浏览器通过URL访问web应用时,首先要做的就是获取用户提交的信息,也就是从HTTP请求数据中获得的信息.HTTP请求数据分为HTTP请求头和Body HTTP请求头包含了一 ...
- kdd cup 2019
比赛简介: 任务1:推荐最佳交通方式 任务描述:给定用户的一些信息,预测用户使用何种最佳交通方式由O(起点)到D(终点) 数据描述: profiles.csv: 属性pid:用户的ID: 属性p0~p ...
- Mysql性能优化之---(二)
建立适当的索引 说起提高数据库性能,索引是最物美价廉的东西了.不用加内存,不用改程序,不用调sql,只要执行个正确的'create index',查询速度就可能提高百倍千倍,这可真有诱惑力.可是天下没 ...
- 生成SSH秘钥连接github(详细教程)
第一步.首先,检查下自己之前有没有已经生成: 在开始菜单中打开git下的git bash(当然,在其他目录下打开git bash也是一样的): 然后执行 cd ~/.ssh 第二步.如果能进入到.ss ...
- [Cometoj#3 A]比赛_枚举/堆
比赛 题目链接:https://cometoj.com/contest/38/problem/A?problem_id=1534 数据范围:略. 题解: 原题没啥意思,就是个暴力枚举. 出了个加强版, ...
- 【AtCoder】AGC001
AGC001 A - BBQ Easy 从第\(2n - 1\)个隔一个加一下加到1即可 #include <bits/stdc++.h> #define fi first #define ...