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_day10 socket serverr
    python_day10 协程 GEVENT
    python_day10 协程 Greenlet
    python_day10 协程
    python_day10 paramiko模块
    python-day10 线程 queue
    python_day10 event
    python_day10 信号量
    python_day10 锁
    CSS命名规范(规则)
  • 原文地址:https://www.cnblogs.com/coding-my-life/p/12044483.html
Copyright © 2011-2022 走看看