zoukankan      html  css  js  c++  java
  • 编译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=1
    build "Linux x86" LINUX=1 "BASE_CC=gcc -m32" SUFFIX=32
    build "Windows x86-64" CROSS=x86_64-w64-mingw32- SUFFIX=.exe
    build "Windows x86" CROSS=i686-w64-mingw32- SUFFIX=32.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编译成独立的可运行文件,以后有时间看下是什么原理

  • 相关阅读:
    基于Python的人脸动漫转换
    let 与 var的区别
    【LeetCode】汇总
    【HDU】4632 Palindrome subsequence(回文子串的个数)
    【算法】均匀的生成圆内的随机点
    【LeetCode】725. Split Linked List in Parts
    【LeetCode】445. Add Two Numbers II
    【LeetCode】437. Path Sum III
    【LeetCode】222. Count Complete Tree Nodes
    【LeetCode】124. Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/coding-my-life/p/12044483.html
Copyright © 2011-2022 走看看