From 613b66c271e8b6d4c060668bfe3ca055fc35b166 Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Mon, 6 Jan 2020 17:47:37 -0300 Subject: support for building 64-bit Windows all-in-one binary --- GNUmakefile | 22 ++++++++---- binary/Makefile.windows | 94 ++++++++++++++++++++++++++----------------------- binary/all_in_one | 19 ++++++---- makedist | 14 ++++++-- 4 files changed, 89 insertions(+), 60 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index 04d1cca0..f4a6015f 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -93,11 +93,11 @@ binary: luarocks $(buildbinarydir)/luarocks.exe $(buildbinarydir)/luarocks-admin $(buildbinarydir)/luarocks.exe: src/bin/luarocks $(LUAROCKS_FILES) (unset $(LUA_ENV_VARS); \ - "$(LUA)" binary/all_in_one "$<" "$(LUA_DIR)" "^src/luarocks/admin/" "$(luarocksconfdir)" "$(@D)" "$(FORCE_CONFIG)" $(BINARY_PLATFORM) $(CC) $(NM) $(SYSROOT)) + "$(LUA)" binary/all_in_one "$<" "$(LUA_DIR)" "^src/luarocks/admin/" "$(luarocksconfdir)" "$(@D)" "$(FORCE_CONFIG)" $(BINARY_PLATFORM) $(CC) $(NM) $(BINARY_SYSROOT)) $(buildbinarydir)/luarocks-admin.exe: src/bin/luarocks-admin $(LUAROCKS_FILES) (unset $(LUA_ENV_VARS); \ - "$(LUA)" binary/all_in_one "$<" "$(LUA_DIR)" "^src/luarocks/cmd/" "$(luarocksconfdir)" "$(@D)" "$(FORCE_CONFIG)" $(BINARY_PLATFORM) $(CC) $(NM) $(SYSROOT)) + "$(LUA)" binary/all_in_one "$<" "$(LUA_DIR)" "^src/luarocks/cmd/" "$(luarocksconfdir)" "$(@D)" "$(FORCE_CONFIG)" $(BINARY_PLATFORM) $(CC) $(NM) $(BINARY_SYSROOT)) # ---------------------------------------- # Regular install @@ -155,11 +155,21 @@ bootstrap: luarocks $(DESTDIR)$(luarocksconfdir)/config-$(LUA_VERSION).lua # Windows binary build # ---------------------------------------- -windows-binary: luarocks - $(MAKE) -f binary/Makefile.windows windows-binary +windows-binary: windows-binary-32 windows-binary-64 -windows-clean: - $(MAKE) -f binary/Makefile.windows windows-clean +windows-clean: windows-clean-32 windows-clean-64 + +windows-binary-32: luarocks + $(MAKE) -f binary/Makefile.windows windows-binary MINGW_PREFIX=i686-w64-mingw32 OPENSSL_PLATFORM=mingw + +windows-clean-32: + $(MAKE) -f binary/Makefile.windows windows-clean MINGW_PREFIX=i686-w64-mingw32 OPENSSL_PLATFORM=mingw + +windows-binary-64: luarocks + $(MAKE) -f binary/Makefile.windows windows-binary MINGW_PREFIX=x86_64-w64-mingw32 OPENSSL_PLATFORM=mingw64 + +windows-clean-64: + $(MAKE) -f binary/Makefile.windows windows-clean MINGW_PREFIX=x86_64-w64-mingw32 OPENSSL_PLATFORM=mingw64 # ---------------------------------------- # Clean diff --git a/binary/Makefile.windows b/binary/Makefile.windows index e7bcca27..e6ec26bf 100644 --- a/binary/Makefile.windows +++ b/binary/Makefile.windows @@ -1,6 +1,6 @@ # "i686-w64-mingw32" or "x86_64-w64-mingw32" -MINGW_PREFIX=i686-w64-mingw32 +MINGW_PREFIX?=i686-w64-mingw32 # sysroot of your mingw-w64 installation MINGW_SYSROOT=/usr/lib/mingw-w64-sysroot/$(MINGW_PREFIX) # "mingw" or "mingw64" @@ -11,62 +11,66 @@ OPENSSL_VERSION=1.0.2o ZLIB_VERSION=1.2.11 BZIP2_VERSION=1.0.6 -windows-binary: windows-deps/lib/liblua.a windows-deps/lib/libssl.a windows-deps/lib/libz.a windows-deps/lib/libbz2.a +WINDOWS_DEPS_DIR=windows-deps-$(MINGW_PREFIX) +BUILD_WINDOWS_DEPS_DIR=build-windows-deps-$(MINGW_PREFIX) +BUILD_WINDOWS_BINARY_DIR=build-windows-binary-$(MINGW_PREFIX) + +windows-binary: $(WINDOWS_DEPS_DIR)/lib/liblua.a $(WINDOWS_DEPS_DIR)/lib/libssl.a $(WINDOWS_DEPS_DIR)/lib/libz.a $(WINDOWS_DEPS_DIR)/lib/libbz2.a STATIC_GCC_AR=$(MINGW_PREFIX)-ar \ STATIC_GCC_RANLIB=$(MINGW_PREFIX)-ranlib \ STATIC_GCC_CC=$(MINGW_PREFIX)-gcc \ LUAROCKS_CROSS_COMPILING=1 \ - $(MAKE) binary LUA_DIR=$(CURDIR)/windows-deps CC=$(MINGW_PREFIX)-gcc NM=$(MINGW_PREFIX)-nm BINARY_PLATFORM=windows buildbinarydir=build-windows-binary BINARY_SYSROOT=$(MINGW_SYSROOT) + $(MAKE) binary LUA_DIR=$(CURDIR)/$(WINDOWS_DEPS_DIR) CC=$(MINGW_PREFIX)-gcc NM=$(MINGW_PREFIX)-nm BINARY_PLATFORM=windows buildbinarydir=$(BUILD_WINDOWS_BINARY_DIR) BINARY_SYSROOT=$(MINGW_SYSROOT) -build-windows-deps/lua-$(LIBLUA_VERSION).tar.gz: +$(BUILD_WINDOWS_DEPS_DIR)/lua-$(LIBLUA_VERSION).tar.gz: mkdir -p $(@D) - cd build-windows-deps && curl -OL https://www.lua.org/ftp/lua-$(LIBLUA_VERSION).tar.gz -build-windows-deps/lua-$(LIBLUA_VERSION): build-windows-deps/lua-$(LIBLUA_VERSION).tar.gz - cd build-windows-deps && tar zxvpf lua-$(LIBLUA_VERSION).tar.gz -windows-deps/lib/liblua.a: build-windows-deps/lua-$(LIBLUA_VERSION) - $(MAKE) -C "build-windows-deps/lua-$(LIBLUA_VERSION)/src" LUA_A=liblua.a CC=$(MINGW_PREFIX)-gcc AR="$(MINGW_PREFIX)-ar rcu" RANLIB=$(MINGW_PREFIX)-ranlib SYSCFLAGS= SYSLIBS= SYSLDFLAGS= liblua.a - mkdir -p windows-deps/include - cd build-windows-deps/lua-$(LIBLUA_VERSION)/src && cp lauxlib.h lua.h lua.hpp luaconf.h lualib.h ../../../windows-deps/include - mkdir -p windows-deps/lib - cd build-windows-deps/lua-$(LIBLUA_VERSION)/src && cp liblua.a ../../../windows-deps/lib + cd $(BUILD_WINDOWS_DEPS_DIR) && curl -OL https://www.lua.org/ftp/lua-$(LIBLUA_VERSION).tar.gz +$(BUILD_WINDOWS_DEPS_DIR)/lua-$(LIBLUA_VERSION): $(BUILD_WINDOWS_DEPS_DIR)/lua-$(LIBLUA_VERSION).tar.gz + cd $(BUILD_WINDOWS_DEPS_DIR) && tar zxvpf lua-$(LIBLUA_VERSION).tar.gz +$(WINDOWS_DEPS_DIR)/lib/liblua.a: $(BUILD_WINDOWS_DEPS_DIR)/lua-$(LIBLUA_VERSION) + $(MAKE) -C "$(BUILD_WINDOWS_DEPS_DIR)/lua-$(LIBLUA_VERSION)/src" LUA_A=liblua.a CC=$(MINGW_PREFIX)-gcc AR="$(MINGW_PREFIX)-ar rcu" RANLIB=$(MINGW_PREFIX)-ranlib SYSCFLAGS= SYSLIBS= SYSLDFLAGS= liblua.a + mkdir -p $(WINDOWS_DEPS_DIR)/include + cd $(BUILD_WINDOWS_DEPS_DIR)/lua-$(LIBLUA_VERSION)/src && cp lauxlib.h lua.h lua.hpp luaconf.h lualib.h ../../../$(WINDOWS_DEPS_DIR)/include + mkdir -p $(WINDOWS_DEPS_DIR)/lib + cd $(BUILD_WINDOWS_DEPS_DIR)/lua-$(LIBLUA_VERSION)/src && cp liblua.a ../../../$(WINDOWS_DEPS_DIR)/lib -build-windows-deps/openssl-$(OPENSSL_VERSION).tar.gz: +$(BUILD_WINDOWS_DEPS_DIR)/openssl-$(OPENSSL_VERSION).tar.gz: mkdir -p $(@D) - cd build-windows-deps && curl -OL https://www.openssl.org/source/openssl-$(OPENSSL_VERSION).tar.gz -build-windows-deps/openssl-$(OPENSSL_VERSION): build-windows-deps/openssl-$(OPENSSL_VERSION).tar.gz - cd build-windows-deps && tar zxvpf openssl-$(OPENSSL_VERSION).tar.gz -windows-deps/lib/libssl.a: build-windows-deps/openssl-$(OPENSSL_VERSION) - cd build-windows-deps/openssl-$(OPENSSL_VERSION) && ./Configure --prefix=$(CURDIR)/windows-deps --cross-compile-prefix=$(MINGW_PREFIX)- $(OPENSSL_PLATFORM) - $(MAKE) -C "build-windows-deps/openssl-$(OPENSSL_VERSION)" - $(MAKE) -C "build-windows-deps/openssl-$(OPENSSL_VERSION)" install_sw + cd $(BUILD_WINDOWS_DEPS_DIR) && curl -OL https://www.openssl.org/source/openssl-$(OPENSSL_VERSION).tar.gz +$(BUILD_WINDOWS_DEPS_DIR)/openssl-$(OPENSSL_VERSION): $(BUILD_WINDOWS_DEPS_DIR)/openssl-$(OPENSSL_VERSION).tar.gz + cd $(BUILD_WINDOWS_DEPS_DIR) && tar zxvpf openssl-$(OPENSSL_VERSION).tar.gz +$(WINDOWS_DEPS_DIR)/lib/libssl.a: $(BUILD_WINDOWS_DEPS_DIR)/openssl-$(OPENSSL_VERSION) + cd $(BUILD_WINDOWS_DEPS_DIR)/openssl-$(OPENSSL_VERSION) && ./Configure --prefix=$(CURDIR)/$(WINDOWS_DEPS_DIR) --cross-compile-prefix=$(MINGW_PREFIX)- $(OPENSSL_PLATFORM) + $(MAKE) -C "$(BUILD_WINDOWS_DEPS_DIR)/openssl-$(OPENSSL_VERSION)" + $(MAKE) -C "$(BUILD_WINDOWS_DEPS_DIR)/openssl-$(OPENSSL_VERSION)" install_sw -build-windows-deps/zlib-$(ZLIB_VERSION).tar.gz: +$(BUILD_WINDOWS_DEPS_DIR)/zlib-$(ZLIB_VERSION).tar.gz: mkdir -p $(@D) - cd build-windows-deps && curl -OL https://www.zlib.net/zlib-$(ZLIB_VERSION).tar.gz -build-windows-deps/zlib-$(ZLIB_VERSION): build-windows-deps/zlib-$(ZLIB_VERSION).tar.gz - cd build-windows-deps && tar zxvpf zlib-$(ZLIB_VERSION).tar.gz -windows-deps/lib/libz.a: build-windows-deps/zlib-$(ZLIB_VERSION) - cd build-windows-deps/zlib-$(ZLIB_VERSION) && sed -ie "s,dllwrap,$(MINGW_PREFIX)-dllwrap," win32/Makefile.gcc - cd build-windows-deps/zlib-$(ZLIB_VERSION) && ./configure --prefix=$(CURDIR)/windows-deps --static - cd build-windows-deps/zlib-$(ZLIB_VERSION) && $(MAKE) -f win32/Makefile.gcc CC=$(MINGW_PREFIX)-gcc AR=$(MINGW_PREFIX)-ar RC=$(MINGW_PREFIX)-windres STRIP=$(MINGW_PREFIX)-strip IMPLIB=libz.dll.a - mkdir -p windows-deps/include - cd build-windows-deps/zlib-$(ZLIB_VERSION) && cp zlib.h zconf.h ../../windows-deps/include - cd build-windows-deps/zlib-$(ZLIB_VERSION) && $(MINGW_PREFIX)-strip -g libz.a + cd $(BUILD_WINDOWS_DEPS_DIR) && curl -OL https://www.zlib.net/zlib-$(ZLIB_VERSION).tar.gz +$(BUILD_WINDOWS_DEPS_DIR)/zlib-$(ZLIB_VERSION): $(BUILD_WINDOWS_DEPS_DIR)/zlib-$(ZLIB_VERSION).tar.gz + cd $(BUILD_WINDOWS_DEPS_DIR) && tar zxvpf zlib-$(ZLIB_VERSION).tar.gz +$(WINDOWS_DEPS_DIR)/lib/libz.a: $(BUILD_WINDOWS_DEPS_DIR)/zlib-$(ZLIB_VERSION) + cd $(BUILD_WINDOWS_DEPS_DIR)/zlib-$(ZLIB_VERSION) && sed -ie "s,dllwrap,$(MINGW_PREFIX)-dllwrap," win32/Makefile.gcc + cd $(BUILD_WINDOWS_DEPS_DIR)/zlib-$(ZLIB_VERSION) && ./configure --prefix=$(CURDIR)/$(WINDOWS_DEPS_DIR) --static + cd $(BUILD_WINDOWS_DEPS_DIR)/zlib-$(ZLIB_VERSION) && $(MAKE) -f win32/Makefile.gcc CC=$(MINGW_PREFIX)-gcc AR=$(MINGW_PREFIX)-ar RC=$(MINGW_PREFIX)-windres STRIP=$(MINGW_PREFIX)-strip IMPLIB=libz.dll.a + mkdir -p $(WINDOWS_DEPS_DIR)/include + cd $(BUILD_WINDOWS_DEPS_DIR)/zlib-$(ZLIB_VERSION) && cp zlib.h zconf.h ../../$(WINDOWS_DEPS_DIR)/include + cd $(BUILD_WINDOWS_DEPS_DIR)/zlib-$(ZLIB_VERSION) && $(MINGW_PREFIX)-strip -g libz.a mkdir -p $(@D) - cd build-windows-deps/zlib-$(ZLIB_VERSION) && cp libz.a ../../windows-deps/lib + cd $(BUILD_WINDOWS_DEPS_DIR)/zlib-$(ZLIB_VERSION) && cp libz.a ../../$(WINDOWS_DEPS_DIR)/lib -build-windows-deps/bzip2-$(BZIP2_VERSION).tar.gz: +$(BUILD_WINDOWS_DEPS_DIR)/bzip2-$(BZIP2_VERSION).tar.gz: mkdir -p $(@D) - cd build-windows-deps && curl -OL http://www.bzip.org/$(BZIP2_VERSION)/bzip2-$(BZIP2_VERSION).tar.gz -build-windows-deps/bzip2-$(BZIP2_VERSION): build-windows-deps/bzip2-$(BZIP2_VERSION).tar.gz - cd build-windows-deps && tar zxvpf bzip2-$(BZIP2_VERSION).tar.gz -windows-deps/lib/libbz2.a: build-windows-deps/bzip2-$(BZIP2_VERSION) - $(MAKE) -C "build-windows-deps/bzip2-$(BZIP2_VERSION)" libbz2.a CC=$(MINGW_PREFIX)-gcc AR=$(MINGW_PREFIX)-ar RANLIB=$(MINGW_PREFIX)-ranlib - mkdir -p windows-deps/include - cd build-windows-deps/bzip2-$(BZIP2_VERSION) && cp bzlib.h ../../windows-deps/include - cd build-windows-deps/bzip2-$(BZIP2_VERSION) && $(MINGW_PREFIX)-strip -g libbz2.a - mkdir -p windows-deps/lib - cd build-windows-deps/bzip2-$(BZIP2_VERSION) && cp libbz2.a ../../windows-deps/lib + cd $(BUILD_WINDOWS_DEPS_DIR) && curl -OL http://downloads.sourceforge.net/project/bzip2/bzip2-$(BZIP2_VERSION).tar.gz +$(BUILD_WINDOWS_DEPS_DIR)/bzip2-$(BZIP2_VERSION): $(BUILD_WINDOWS_DEPS_DIR)/bzip2-$(BZIP2_VERSION).tar.gz + cd $(BUILD_WINDOWS_DEPS_DIR) && tar zxvpf bzip2-$(BZIP2_VERSION).tar.gz +$(WINDOWS_DEPS_DIR)/lib/libbz2.a: $(BUILD_WINDOWS_DEPS_DIR)/bzip2-$(BZIP2_VERSION) + $(MAKE) -C "$(BUILD_WINDOWS_DEPS_DIR)/bzip2-$(BZIP2_VERSION)" libbz2.a CC=$(MINGW_PREFIX)-gcc AR=$(MINGW_PREFIX)-ar RANLIB=$(MINGW_PREFIX)-ranlib + mkdir -p $(WINDOWS_DEPS_DIR)/include + cd $(BUILD_WINDOWS_DEPS_DIR)/bzip2-$(BZIP2_VERSION) && cp bzlib.h ../../$(WINDOWS_DEPS_DIR)/include + cd $(BUILD_WINDOWS_DEPS_DIR)/bzip2-$(BZIP2_VERSION) && $(MINGW_PREFIX)-strip -g libbz2.a + mkdir -p $(WINDOWS_DEPS_DIR)/lib + cd $(BUILD_WINDOWS_DEPS_DIR)/bzip2-$(BZIP2_VERSION) && cp libbz2.a ../../$(WINDOWS_DEPS_DIR)/lib windows-clean: - rm -rf windows-deps build-windows-binary + rm -rf $(WINDOWS_DEPS_DIR) $(BUILD_WINDOWS_BINARY_DIR) diff --git a/binary/all_in_one b/binary/all_in_one index 4fa0ba76..82ea578c 100755 --- a/binary/all_in_one +++ b/binary/all_in_one @@ -29,15 +29,20 @@ local MAIN_PROGRAM = arg[1] or "src/bin/luarocks" local LUA_DIR = arg[2] or "/usr" local EXCLUDE = arg[3] or "^src/luarocks/admin/" local SYSCONFDIR = arg[4] or "/etc/luarocks" -local TARGET = arg[5] or "build-binary" +local TARGET_DIR = arg[5] or "build-binary" local FORCE_CONFIG = (arg[6] == "yes") local MY_PLATFORM = arg[7] or "unix" local CC = arg[8] or "gcc" local NM = arg[9] or "nm" local CROSSCOMPILER_SYSROOT = arg[10] or "/usr/lib/mingw-w64-sysroot/i686-w64-mingw32" +local TRIPLET = arg[11] or CROSSCOMPILER_SYSROOT:gsub(".*/", "") +local PROCESSOR = arg[12] or TRIPLET:gsub("%-.*", "") +if PROCESSOR == "i686" then + PROCESSOR = "x86" +end -local LUA_MODULES = TARGET .. "/lua_modules" -local CONFIG_DIR = TARGET .. "/.luarocks" +local LUA_MODULES = TARGET_DIR .. "/lua_modules" +local CONFIG_DIR = TARGET_DIR .. "/.luarocks" package.path = "./src/?.lua;" .. package.path @@ -144,7 +149,7 @@ local function write_hardcoded_module(dir) if if_platform("unix", true) then system, processor = sysdetect.detect() else - system, processor = "windows", "x86" + system, processor = "windows", PROCESSOR end local hardcoded = { @@ -400,7 +405,7 @@ local function generate(main_program, dir, skip) os.remove(hardcoded) - local c_filename = TARGET .. "/" .. program_name .. ".exe.c" + local c_filename = TARGET_DIR .. "/" .. program_name .. ".exe.c" local fd = io.open(c_filename, "w") fd:write(reindent_c(table.concat(out, "\n"))) fd:close() @@ -409,7 +414,7 @@ local function generate(main_program, dir, skip) deps.check_lua_libdir(cfg.variables) cmd = table.concat(filter_in(nonnull, { - CC, "-o", TARGET .. "/" .. program_name .. ".exe", + CC, "-o", TARGET_DIR .. "/" .. program_name .. ".exe", "-I", cfg.variables.LUA_INCDIR, if_platform("unix", "-rdynamic"), "-Os", @@ -453,7 +458,7 @@ local function main() LIBFLAG = "-static", }, platforms = if_platform("windows", { "windows", "win32", "mingw32" }), - external_deps_dirs = if_platform("windows", { CROSSCOMPILER_SYSROOT, fs.current_dir().."/windows-deps" }), + external_deps_dirs = if_platform("windows", { CROSSCOMPILER_SYSROOT, fs.current_dir() .. "/windows-deps-" .. TRIPLET }), }) local dependencies = { diff --git a/makedist b/makedist index 57c92695..c28e9247 100755 --- a/makedist +++ b/makedist @@ -167,8 +167,8 @@ then cd .. rm -f "$out-linux-x86_64.zip.asc" - make windows-binary - cd build-windows-binary + make windows-binary-32 + cd build-windows-binary-i686-w64-mingw32 mkdir "$out-windows-32" cp luarocks.exe "$out-windows-32/luarocks.exe" cp luarocks-admin.exe "$out-windows-32/luarocks-admin.exe" @@ -176,6 +176,15 @@ then cd .. rm -f "$out-windows-32.zip.asc" + make windows-binary-64 + cd build-windows-binary-x86_64-w64-mingw32 + mkdir "$out-windows-64" + cp luarocks.exe "$out-windows-64/luarocks.exe" + cp luarocks-admin.exe "$out-windows-64/luarocks-admin.exe" + zip "../$out-windows-64.zip" "$out-windows-64"/* + cd .. + rm -f "$out-windows-64.zip.asc" + fi if [ "$1" = "sign" ] @@ -184,6 +193,7 @@ then for f in \ $out-windows-32.zip \ + $out-windows-64.zip \ $out-linux-x86_64.zip \ $out-win32.zip \ $out.tar.gz -- cgit v1.2.3-55-g6feb