diff options
author | Hisham Muhammad <hisham@gobolinux.org> | 2025-03-04 01:44:19 -0300 |
---|---|---|
committer | Hisham Muhammad <hisham@gobolinux.org> | 2025-03-10 10:51:04 -0300 |
commit | 9e162d9e980f7e17c0ea41e0cd29173d01ada330 (patch) | |
tree | 8e27b578738537d75031351892edd07b98656ccc | |
parent | f9a8ac22881533281673a2abd59f4fd69feeaa00 (diff) | |
download | luarocks-9e162d9e980f7e17c0ea41e0cd29173d01ada330.tar.gz luarocks-9e162d9e980f7e17c0ea41e0cd29173d01ada330.tar.bz2 luarocks-9e162d9e980f7e17c0ea41e0cd29173d01ada330.zip |
[wip] Makefile bootstrap script
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | GNUmakefile | 203 | ||||
-rw-r--r-- | Makefile.vendor | 147 | ||||
-rwxr-xr-x | bootstrap.tl | 518 | ||||
-rw-r--r-- | src/main.c | 160 |
5 files changed, 839 insertions, 190 deletions
@@ -8,7 +8,6 @@ | |||
8 | /*.rock | 8 | /*.rock |
9 | /*.tar.gz | 9 | /*.tar.gz |
10 | /*.zip | 10 | /*.zip |
11 | /src/*.* | ||
12 | /prefix-* | 11 | /prefix-* |
13 | /dev_* | 12 | /dev_* |
14 | /gh-pages | 13 | /gh-pages |
diff --git a/GNUmakefile b/GNUmakefile index 46be0cc6..cb0f72dd 100644 --- a/GNUmakefile +++ b/GNUmakefile | |||
@@ -1,197 +1,22 @@ | |||
1 | MAKEFLAGS += --jobs=1 | ||
2 | 1 | ||
3 | -include config.unix | 2 | CC = gcc |
3 | MKDIR = mkdir | ||
4 | MYLIBS = -llua -lz -lbz2 -lssl -lcrypto | ||
4 | 5 | ||
5 | datarootdir = $(prefix)/share | 6 | ZLIB_INCDIR = /usr/include |
6 | bindir = $(prefix)/bin | 7 | BZ2_INCDIR = /usr/include |
7 | INSTALL = install | 8 | OPENSSL_INCDIR = /usr/include |
8 | INSTALL_DATA = $(INSTALL) -m 644 | ||
9 | BINARY_PLATFORM = unix | ||
10 | 9 | ||
11 | SHEBANG = \#!$(LUA) | 10 | all: luarocks |
12 | luarocksconfdir = $(sysconfdir)/luarocks | ||
13 | luadir = $(datarootdir)/lua/$(LUA_VERSION) | ||
14 | builddir = ./build | ||
15 | buildbinarydir = ./build-binary | ||
16 | 11 | ||
17 | LUAROCKS_FILES = $(shell find src/luarocks/ -type f -name '*.lua') | 12 | -include Makefile.vendor |
18 | 13 | ||
19 | LUA_ENV_VARS = LUA_PATH LUA_PATH_5_2 LUA_PATH_5_3 LUA_PATH_5_4 LUA_CPATH LUA_CPATH_5_2 LUA_CPATH_5_3 LUA_CPATH_5_4 | 14 | luarocks: src/main.c gen/gen.h gen/libraries.h gen/main.h $(VENDOR_LIBS) |
15 | $(CC) -o luarocks $(MYLIBS) -I. src/main.c $(VENDOR_LIBS) | ||
20 | 16 | ||
21 | all: build | 17 | clean: |
18 | rm -rf gen target | ||
22 | 19 | ||
23 | # ---------------------------------------- | 20 | gen: clean |
24 | # Base build | 21 | ./bootstrap.tl |
25 | # ---------------------------------------- | ||
26 | 22 | ||
27 | build: config.unix $(builddir)/config-$(LUA_VERSION).lua $(builddir)/luarocks $(builddir)/luarocks-admin | ||
28 | |||
29 | config.unix: | ||
30 | @echo Please run the "./configure" script before building. | ||
31 | @echo | ||
32 | @exit 1 | ||
33 | |||
34 | $(builddir)/config-$(LUA_VERSION).lua: config.unix | ||
35 | mkdir -p "$(@D)" | ||
36 | @printf -- '-- LuaRocks configuration\n\n'\ | ||
37 | 'rocks_trees = {\n'\ | ||
38 | ' { name = "user", root = home .. "/.luarocks" };\n'\ | ||
39 | "$$([ "$(rocks_tree)" != "$(HOME)/.luarocks" ] && printf ' { name = "system", root = "'"$(rocks_tree)"'" };\\n')"\ | ||
40 | '}\n'\ | ||
41 | 'variables = {\n'\ | ||
42 | "$$([ -n "$(LUA_DIR)" ] && printf ' LUA_DIR = "%s";\\n' "$(LUA_DIR)")"\ | ||
43 | "$$([ -n "$(LUA_INCDIR)" ] && printf ' LUA_INCDIR = "%s";\\n' "$(LUA_INCDIR)")"\ | ||
44 | "$$([ -n "$(LUA_BINDIR)" ] && printf ' LUA_BINDIR = "%s";\\n' "$(LUA_BINDIR)")"\ | ||
45 | "$$([ -n "$(LUA_LIBDIR)" ] && printf ' LUA_LIBDIR = "%s";\\n' "$(LUA_LIBDIR)")"\ | ||
46 | "$$([ -n "$(LUA_VERSION)" ] && printf ' LUA_VERSION = "%s";\\n' "$(LUA_VERSION)")"\ | ||
47 | "$$([ -n "$(LUA)" ] && printf ' LUA = "%s";\\n' "$(LUA)")"\ | ||
48 | '}\n'\ | ||
49 | > $@ | ||
50 | |||
51 | luarocks: config.unix $(builddir)/config-$(LUA_VERSION).lua | ||
52 | mkdir -p .luarocks | ||
53 | cp $(builddir)/config-$(LUA_VERSION).lua .luarocks/config-$(LUA_VERSION).lua | ||
54 | rm -f src/luarocks/core/hardcoded.lua | ||
55 | echo "#!/bin/sh" > luarocks | ||
56 | echo "unset $(LUA_ENV_VARS)" >> luarocks | ||
57 | echo 'LUAROCKS_SYSCONFDIR="$(luarocksconfdir)" LUA_PATH="$(CURDIR)/src/?.lua;;" exec "$(LUA)" "$(CURDIR)/src/bin/luarocks" --project-tree="$(CURDIR)/lua_modules" "$$@"' >> luarocks | ||
58 | chmod +rx ./luarocks | ||
59 | ./luarocks init | ||
60 | |||
61 | luarocks-admin: config.unix | ||
62 | rm -f src/luarocks/core/hardcoded.lua | ||
63 | echo "#!/bin/sh" > luarocks-admin | ||
64 | echo "unset $(LUA_ENV_VARS)" >> luarocks-admin | ||
65 | echo 'LUAROCKS_SYSCONFDIR="$(luarocksconfdir)" LUA_PATH="$(CURDIR)/src/?.lua;;" exec "$(LUA)" "$(CURDIR)/src/bin/luarocks-admin" --project-tree="$(CURDIR)/lua_modules" "$$@"' >> luarocks-admin | ||
66 | chmod +rx ./luarocks-admin | ||
67 | |||
68 | $(builddir)/luarocks: src/bin/luarocks config.unix | ||
69 | mkdir -p "$(@D)" | ||
70 | (printf '$(SHEBANG)\n'\ | ||
71 | 'package.loaded["luarocks.core.hardcoded"] = { '\ | ||
72 | "$$([ -n "$(FORCE_CONFIG)" ] && printf 'FORCE_CONFIG = true, ')"\ | ||
73 | 'SYSCONFDIR = [[$(luarocksconfdir)]] }\n'\ | ||
74 | 'package.path=[[$(luadir)/?.lua;]] .. package.path\n'\ | ||
75 | 'local list = package.searchers or package.loaders; table.insert(list, 1, function(name) if name:match("^luarocks%%.") then return loadfile([[$(luadir)/]] .. name:gsub([[%%.]], [[/]]) .. [[.lua]]) end end)\n'; \ | ||
76 | tail -n +2 src/bin/luarocks \ | ||
77 | )> "$@" | ||
78 | |||
79 | $(builddir)/luarocks-admin: src/bin/luarocks-admin config.unix | ||
80 | mkdir -p "$(@D)" | ||
81 | (printf '$(SHEBANG)\n'\ | ||
82 | 'package.loaded["luarocks.core.hardcoded"] = { '\ | ||
83 | "$$([ -n "$(FORCE_CONFIG)" ] && printf 'FORCE_CONFIG = true, ')"\ | ||
84 | 'SYSCONFDIR = [[$(luarocksconfdir)]] }\n'\ | ||
85 | 'package.path=[[$(luadir)/?.lua;]] .. package.path\n'\ | ||
86 | 'local list = package.searchers or package.loaders; table.insert(list, 1, function(name) if name:match("^luarocks%%.") then return loadfile([[$(luadir)/]] .. name:gsub([[%%.]], [[/]]) .. [[.lua]]) end end)\n'; \ | ||
87 | tail -n +2 src/bin/luarocks-admin \ | ||
88 | )> "$@" | ||
89 | |||
90 | # ---------------------------------------- | ||
91 | # Base build | ||
92 | # ---------------------------------------- | ||
93 | |||
94 | binary: luarocks $(buildbinarydir)/luarocks.exe $(buildbinarydir)/luarocks-admin.exe | ||
95 | |||
96 | $(buildbinarydir)/luarocks.exe: src/bin/luarocks $(LUAROCKS_FILES) | ||
97 | (unset $(LUA_ENV_VARS); \ | ||
98 | "$(LUA)" binary/all_in_one "$<" "$(LUA_DIR)" "^src/luarocks/admin/" "$(luarocksconfdir)" "$(@D)" "$(FORCE_CONFIG)" $(BINARY_PLATFORM) $(CC) $(NM) $(BINARY_SYSROOT)) | ||
99 | |||
100 | $(buildbinarydir)/luarocks-admin.exe: src/bin/luarocks-admin $(LUAROCKS_FILES) | ||
101 | (unset $(LUA_ENV_VARS); \ | ||
102 | "$(LUA)" binary/all_in_one "$<" "$(LUA_DIR)" "^src/luarocks/cmd/" "$(luarocksconfdir)" "$(@D)" "$(FORCE_CONFIG)" $(BINARY_PLATFORM) $(CC) $(NM) $(BINARY_SYSROOT)) | ||
103 | |||
104 | # ---------------------------------------- | ||
105 | # Regular install | ||
106 | # ---------------------------------------- | ||
107 | |||
108 | INSTALL_FILES = | ||
109 | |||
110 | install: all install-config | ||
111 | mkdir -p '$(DESTDIR)$(bindir)/' | ||
112 | $(INSTALL) '$(builddir)/luarocks' '$(DESTDIR)$(bindir)/luarocks' | ||
113 | $(INSTALL) '$(builddir)/luarocks-admin' '$(DESTDIR)$(bindir)/luarocks-admin' | ||
114 | find src/luarocks/ -type d | while read f; \ | ||
115 | do \ | ||
116 | mkdir -p '$(DESTDIR)$(luadir)'/`echo $$f | sed 's,^src/,,'`; \ | ||
117 | done | ||
118 | find src/luarocks/ -type f -name '*.lua' | while read f; \ | ||
119 | do \ | ||
120 | $(INSTALL_DATA) "$$f" '$(DESTDIR)$(luadir)'/`echo $$f | sed 's,^src/,,'`; \ | ||
121 | done | ||
122 | ifeq (,$(findstring $(LUA_VERSION),"5.3" "5.4")) | ||
123 | find src/compat53/ -type d | while read f; \ | ||
124 | do \ | ||
125 | mkdir -p '$(DESTDIR)$(luadir)'/`echo $$f | sed 's,^src/,,'`; \ | ||
126 | done | ||
127 | find src/compat53/ -type f -name '*.lua' | while read f; \ | ||
128 | do \ | ||
129 | $(INSTALL_DATA) "$$f" '$(DESTDIR)$(luadir)'/`echo $$f | sed 's,^src/,,'`; \ | ||
130 | done | ||
131 | endif | ||
132 | |||
133 | install-config: | ||
134 | mkdir -p '$(DESTDIR)$(luarocksconfdir)/' | ||
135 | $(INSTALL_DATA) '$(builddir)/config-$(LUA_VERSION).lua' '$(DESTDIR)$(luarocksconfdir)/config-$(LUA_VERSION).lua' | ||
136 | |||
137 | uninstall: | ||
138 | rm -rf $(DESTDIR)$(bindir)/luarocks \ | ||
139 | $(DESTDIR)$(bindir)/luarocks-admin \ | ||
140 | $(DESTDIR)$(luarocksconfdir)/config-$(LUA_VERSION).lua \ | ||
141 | $(patsubst src/%, $(DESTDIR)$(luadir)/%, $(LUAROCKS_FILES)) | ||
142 | |||
143 | # ---------------------------------------- | ||
144 | # Binary install | ||
145 | # ---------------------------------------- | ||
146 | |||
147 | install-binary: binary install-config | ||
148 | mkdir -p '$(DESTDIR)$(bindir)/' | ||
149 | $(INSTALL) "$(buildbinarydir)/luarocks.exe" "$(DESTDIR)$(bindir)/luarocks" | ||
150 | $(INSTALL) "$(buildbinarydir)/luarocks-admin.exe" "$(DESTDIR)$(bindir)/luarocks-admin" | ||
151 | mkdir -p '$(DESTDIR)$(luadir)/luarocks/core' | ||
152 | for f in src/luarocks/core/*.lua src/luarocks/loader.lua; \ | ||
153 | do \ | ||
154 | $(INSTALL_DATA) "$$f" '$(DESTDIR)$(luadir)'/`echo $$f | sed 's,^src/,,'`; \ | ||
155 | done | ||
156 | |||
157 | # ---------------------------------------- | ||
158 | # Bootstrap install | ||
159 | # ---------------------------------------- | ||
160 | |||
161 | bootstrap: luarocks install-config | ||
162 | ./luarocks make --tree="$(DESTDIR)$(rocks_tree)" | ||
163 | |||
164 | # ---------------------------------------- | ||
165 | # Windows binary build | ||
166 | # ---------------------------------------- | ||
167 | |||
168 | windows-binary: windows-binary-32 windows-binary-64 | ||
169 | |||
170 | windows-clean: windows-clean-32 windows-clean-64 | ||
171 | |||
172 | windows-binary-32: luarocks | ||
173 | $(MAKE) -f binary/Makefile.windows windows-binary MINGW_PREFIX=i686-w64-mingw32 OPENSSL_PLATFORM=mingw | ||
174 | |||
175 | windows-clean-32: | ||
176 | $(MAKE) -f binary/Makefile.windows windows-clean MINGW_PREFIX=i686-w64-mingw32 OPENSSL_PLATFORM=mingw | ||
177 | |||
178 | windows-binary-64: luarocks | ||
179 | $(MAKE) -f binary/Makefile.windows windows-binary MINGW_PREFIX=x86_64-w64-mingw32 OPENSSL_PLATFORM=mingw64 | ||
180 | |||
181 | windows-clean-64: | ||
182 | $(MAKE) -f binary/Makefile.windows windows-clean MINGW_PREFIX=x86_64-w64-mingw32 OPENSSL_PLATFORM=mingw64 | ||
183 | |||
184 | # ---------------------------------------- | ||
185 | # Clean | ||
186 | # ---------------------------------------- | ||
187 | |||
188 | clean: windows-clean | ||
189 | rm -rf ./config.unix \ | ||
190 | ./luarocks \ | ||
191 | ./luarocks-admin \ | ||
192 | $(builddir)/ \ | ||
193 | $(buildbinarydir)/ \ | ||
194 | ./.luarocks \ | ||
195 | ./lua_modules | ||
196 | |||
197 | .PHONY: all build install install-config binary install-binary bootstrap clean windows-binary windows-clean | ||
diff --git a/Makefile.vendor b/Makefile.vendor new file mode 100644 index 00000000..e6c3d2cf --- /dev/null +++ b/Makefile.vendor | |||
@@ -0,0 +1,147 @@ | |||
1 | # automatically generated by bootstrap.tl | ||
2 | |||
3 | VENDOR_LIBS = target/libraries/des56.a target/libraries/md5/core.a target/libraries/zlib.a target/libraries/bz2.a target/libraries/lfs.a target/libraries/mime/core.a target/libraries/socket/core.a target/libraries/socket/serial.a target/libraries/socket/unix.a target/libraries/ssl.a target/libraries/miniposix.a | ||
4 | |||
5 | target/objects/md5/vendor/md5/src/compat-5.2.o: vendor/md5/src/compat-5.2.c | target/objects/md5/vendor/md5/src/ | ||
6 | $(CC) -c -o target/objects/md5/vendor/md5/src/compat-5.2.o vendor/md5/src/compat-5.2.c -I vendor/md5/src/ | ||
7 | target/objects/md5/vendor/md5/src/des56.o: vendor/md5/src/des56.c | target/objects/md5/vendor/md5/src/ | ||
8 | $(CC) -c -o target/objects/md5/vendor/md5/src/des56.o vendor/md5/src/des56.c -I vendor/md5/src/ | ||
9 | target/objects/md5/vendor/md5/src/ldes56.o: vendor/md5/src/ldes56.c | target/objects/md5/vendor/md5/src/ | ||
10 | $(CC) -c -o target/objects/md5/vendor/md5/src/ldes56.o vendor/md5/src/ldes56.c -I vendor/md5/src/ | ||
11 | target/libraries/des56.a: target/objects/md5/vendor/md5/src/compat-5.2.o target/objects/md5/vendor/md5/src/des56.o target/objects/md5/vendor/md5/src/ldes56.o | target/libraries/ | ||
12 | $(AR) rcu target/libraries/des56.a target/objects/md5/vendor/md5/src/compat-5.2.o target/objects/md5/vendor/md5/src/des56.o target/objects/md5/vendor/md5/src/ldes56.o | ||
13 | |||
14 | target/objects/md5/vendor/md5/src/md5.o: vendor/md5/src/md5.c | target/objects/md5/vendor/md5/src/ | ||
15 | $(CC) -c -o target/objects/md5/vendor/md5/src/md5.o vendor/md5/src/md5.c -I vendor/md5/src/ | ||
16 | target/objects/md5/vendor/md5/src/md5lib.o: vendor/md5/src/md5lib.c | target/objects/md5/vendor/md5/src/ | ||
17 | $(CC) -c -o target/objects/md5/vendor/md5/src/md5lib.o vendor/md5/src/md5lib.c -I vendor/md5/src/ | ||
18 | target/libraries/md5/core.a: target/objects/md5/vendor/md5/src/compat-5.2.o target/objects/md5/vendor/md5/src/md5.o target/objects/md5/vendor/md5/src/md5lib.o | target/libraries/md5/ | ||
19 | $(AR) rcu target/libraries/md5/core.a target/objects/md5/vendor/md5/src/compat-5.2.o target/objects/md5/vendor/md5/src/md5.o target/objects/md5/vendor/md5/src/md5lib.o | ||
20 | |||
21 | target/objects/lua-zlib/vendor/lua-zlib/lua_zlib.o: vendor/lua-zlib/lua_zlib.c | target/objects/lua-zlib/vendor/lua-zlib/ | ||
22 | $(CC) -c -o target/objects/lua-zlib/vendor/lua-zlib/lua_zlib.o vendor/lua-zlib/lua_zlib.c -I vendor/lua-zlib/$(ZLIB_INCDIR) -D LZLIB_COMPAT | ||
23 | target/libraries/zlib.a: target/objects/lua-zlib/vendor/lua-zlib/lua_zlib.o | target/libraries/ | ||
24 | $(AR) rcu target/libraries/zlib.a target/objects/lua-zlib/vendor/lua-zlib/lua_zlib.o | ||
25 | |||
26 | target/objects/lua-bz2/vendor/lua-bz2/lbz.o: vendor/lua-bz2/lbz.c | target/objects/lua-bz2/vendor/lua-bz2/ | ||
27 | $(CC) -c -o target/objects/lua-bz2/vendor/lua-bz2/lbz.o vendor/lua-bz2/lbz.c -I vendor/lua-bz2/$(BZ2_INCDIR) -D COMPAT53_PREFIX=compat53 | ||
28 | target/objects/lua-bz2/vendor/lua-bz2/lbz2_common.o: vendor/lua-bz2/lbz2_common.c | target/objects/lua-bz2/vendor/lua-bz2/ | ||
29 | $(CC) -c -o target/objects/lua-bz2/vendor/lua-bz2/lbz2_common.o vendor/lua-bz2/lbz2_common.c -I vendor/lua-bz2/$(BZ2_INCDIR) -D COMPAT53_PREFIX=compat53 | ||
30 | target/objects/lua-bz2/vendor/lua-bz2/lbz2_file_reader.o: vendor/lua-bz2/lbz2_file_reader.c | target/objects/lua-bz2/vendor/lua-bz2/ | ||
31 | $(CC) -c -o target/objects/lua-bz2/vendor/lua-bz2/lbz2_file_reader.o vendor/lua-bz2/lbz2_file_reader.c -I vendor/lua-bz2/$(BZ2_INCDIR) -D COMPAT53_PREFIX=compat53 | ||
32 | target/objects/lua-bz2/vendor/lua-bz2/lbz2_file_writer.o: vendor/lua-bz2/lbz2_file_writer.c | target/objects/lua-bz2/vendor/lua-bz2/ | ||
33 | $(CC) -c -o target/objects/lua-bz2/vendor/lua-bz2/lbz2_file_writer.o vendor/lua-bz2/lbz2_file_writer.c -I vendor/lua-bz2/$(BZ2_INCDIR) -D COMPAT53_PREFIX=compat53 | ||
34 | target/objects/lua-bz2/vendor/lua-bz2/lbz2_stream.o: vendor/lua-bz2/lbz2_stream.c | target/objects/lua-bz2/vendor/lua-bz2/ | ||
35 | $(CC) -c -o target/objects/lua-bz2/vendor/lua-bz2/lbz2_stream.o vendor/lua-bz2/lbz2_stream.c -I vendor/lua-bz2/$(BZ2_INCDIR) -D COMPAT53_PREFIX=compat53 | ||
36 | target/objects/lua-bz2/vendor/lua-bz2/compat-5.3.o: vendor/lua-bz2/compat-5.3.c | target/objects/lua-bz2/vendor/lua-bz2/ | ||
37 | $(CC) -c -o target/objects/lua-bz2/vendor/lua-bz2/compat-5.3.o vendor/lua-bz2/compat-5.3.c -I vendor/lua-bz2/$(BZ2_INCDIR) -D COMPAT53_PREFIX=compat53 | ||
38 | target/libraries/bz2.a: target/objects/lua-bz2/vendor/lua-bz2/lbz.o target/objects/lua-bz2/vendor/lua-bz2/lbz2_common.o target/objects/lua-bz2/vendor/lua-bz2/lbz2_file_reader.o target/objects/lua-bz2/vendor/lua-bz2/lbz2_file_writer.o target/objects/lua-bz2/vendor/lua-bz2/lbz2_stream.o target/objects/lua-bz2/vendor/lua-bz2/compat-5.3.o | target/libraries/ | ||
39 | $(AR) rcu target/libraries/bz2.a target/objects/lua-bz2/vendor/lua-bz2/lbz.o target/objects/lua-bz2/vendor/lua-bz2/lbz2_common.o target/objects/lua-bz2/vendor/lua-bz2/lbz2_file_reader.o target/objects/lua-bz2/vendor/lua-bz2/lbz2_file_writer.o target/objects/lua-bz2/vendor/lua-bz2/lbz2_stream.o target/objects/lua-bz2/vendor/lua-bz2/compat-5.3.o | ||
40 | |||
41 | target/objects/luafilesystem/vendor/luafilesystem/src/lfs.o: vendor/luafilesystem/src/lfs.c | target/objects/luafilesystem/vendor/luafilesystem/src/ | ||
42 | $(CC) -c -o target/objects/luafilesystem/vendor/luafilesystem/src/lfs.o vendor/luafilesystem/src/lfs.c | ||
43 | target/libraries/lfs.a: target/objects/luafilesystem/vendor/luafilesystem/src/lfs.o | target/libraries/ | ||
44 | $(AR) rcu target/libraries/lfs.a target/objects/luafilesystem/vendor/luafilesystem/src/lfs.o | ||
45 | |||
46 | target/objects/luasocket/vendor/luasocket/src/mime.o: vendor/luasocket/src/mime.c | target/objects/luasocket/vendor/luasocket/src/ | ||
47 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/mime.o vendor/luasocket/src/mime.c -D LUASOCKET_DEBUG | ||
48 | target/objects/luasocket/vendor/luasocket/src/compat.o: vendor/luasocket/src/compat.c | target/objects/luasocket/vendor/luasocket/src/ | ||
49 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/compat.o vendor/luasocket/src/compat.c -D LUASOCKET_DEBUG | ||
50 | target/libraries/mime/core.a: target/objects/luasocket/vendor/luasocket/src/mime.o target/objects/luasocket/vendor/luasocket/src/compat.o | target/libraries/mime/ | ||
51 | $(AR) rcu target/libraries/mime/core.a target/objects/luasocket/vendor/luasocket/src/mime.o target/objects/luasocket/vendor/luasocket/src/compat.o | ||
52 | |||
53 | target/objects/luasocket/vendor/luasocket/src/luasocket.o: vendor/luasocket/src/luasocket.c | target/objects/luasocket/vendor/luasocket/src/ | ||
54 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/luasocket.o vendor/luasocket/src/luasocket.c -D LUASOCKET_DEBUG | ||
55 | target/objects/luasocket/vendor/luasocket/src/timeout.o: vendor/luasocket/src/timeout.c | target/objects/luasocket/vendor/luasocket/src/ | ||
56 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/timeout.o vendor/luasocket/src/timeout.c -D LUASOCKET_DEBUG | ||
57 | target/objects/luasocket/vendor/luasocket/src/buffer.o: vendor/luasocket/src/buffer.c | target/objects/luasocket/vendor/luasocket/src/ | ||
58 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/buffer.o vendor/luasocket/src/buffer.c -D LUASOCKET_DEBUG | ||
59 | target/objects/luasocket/vendor/luasocket/src/io.o: vendor/luasocket/src/io.c | target/objects/luasocket/vendor/luasocket/src/ | ||
60 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/io.o vendor/luasocket/src/io.c -D LUASOCKET_DEBUG | ||
61 | target/objects/luasocket/vendor/luasocket/src/auxiliar.o: vendor/luasocket/src/auxiliar.c | target/objects/luasocket/vendor/luasocket/src/ | ||
62 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/auxiliar.o vendor/luasocket/src/auxiliar.c -D LUASOCKET_DEBUG | ||
63 | target/objects/luasocket/vendor/luasocket/src/options.o: vendor/luasocket/src/options.c | target/objects/luasocket/vendor/luasocket/src/ | ||
64 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/options.o vendor/luasocket/src/options.c -D LUASOCKET_DEBUG | ||
65 | target/objects/luasocket/vendor/luasocket/src/inet.o: vendor/luasocket/src/inet.c | target/objects/luasocket/vendor/luasocket/src/ | ||
66 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/inet.o vendor/luasocket/src/inet.c -D LUASOCKET_DEBUG | ||
67 | target/objects/luasocket/vendor/luasocket/src/except.o: vendor/luasocket/src/except.c | target/objects/luasocket/vendor/luasocket/src/ | ||
68 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/except.o vendor/luasocket/src/except.c -D LUASOCKET_DEBUG | ||
69 | target/objects/luasocket/vendor/luasocket/src/select.o: vendor/luasocket/src/select.c | target/objects/luasocket/vendor/luasocket/src/ | ||
70 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/select.o vendor/luasocket/src/select.c -D LUASOCKET_DEBUG | ||
71 | target/objects/luasocket/vendor/luasocket/src/tcp.o: vendor/luasocket/src/tcp.c | target/objects/luasocket/vendor/luasocket/src/ | ||
72 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/tcp.o vendor/luasocket/src/tcp.c -D LUASOCKET_DEBUG | ||
73 | target/objects/luasocket/vendor/luasocket/src/udp.o: vendor/luasocket/src/udp.c | target/objects/luasocket/vendor/luasocket/src/ | ||
74 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/udp.o vendor/luasocket/src/udp.c -D LUASOCKET_DEBUG | ||
75 | target/objects/luasocket/vendor/luasocket/src/usocket.o: vendor/luasocket/src/usocket.c | target/objects/luasocket/vendor/luasocket/src/ | ||
76 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/usocket.o vendor/luasocket/src/usocket.c -D LUASOCKET_DEBUG | ||
77 | target/libraries/socket/core.a: target/objects/luasocket/vendor/luasocket/src/luasocket.o target/objects/luasocket/vendor/luasocket/src/timeout.o target/objects/luasocket/vendor/luasocket/src/buffer.o target/objects/luasocket/vendor/luasocket/src/io.o target/objects/luasocket/vendor/luasocket/src/auxiliar.o target/objects/luasocket/vendor/luasocket/src/options.o target/objects/luasocket/vendor/luasocket/src/inet.o target/objects/luasocket/vendor/luasocket/src/except.o target/objects/luasocket/vendor/luasocket/src/select.o target/objects/luasocket/vendor/luasocket/src/tcp.o target/objects/luasocket/vendor/luasocket/src/udp.o target/objects/luasocket/vendor/luasocket/src/compat.o target/objects/luasocket/vendor/luasocket/src/usocket.o | target/libraries/socket/ | ||
78 | $(AR) rcu target/libraries/socket/core.a target/objects/luasocket/vendor/luasocket/src/luasocket.o target/objects/luasocket/vendor/luasocket/src/timeout.o target/objects/luasocket/vendor/luasocket/src/buffer.o target/objects/luasocket/vendor/luasocket/src/io.o target/objects/luasocket/vendor/luasocket/src/auxiliar.o target/objects/luasocket/vendor/luasocket/src/options.o target/objects/luasocket/vendor/luasocket/src/inet.o target/objects/luasocket/vendor/luasocket/src/except.o target/objects/luasocket/vendor/luasocket/src/select.o target/objects/luasocket/vendor/luasocket/src/tcp.o target/objects/luasocket/vendor/luasocket/src/udp.o target/objects/luasocket/vendor/luasocket/src/compat.o target/objects/luasocket/vendor/luasocket/src/usocket.o | ||
79 | |||
80 | target/objects/luasocket/vendor/luasocket/src/serial.o: vendor/luasocket/src/serial.c | target/objects/luasocket/vendor/luasocket/src/ | ||
81 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/serial.o vendor/luasocket/src/serial.c -D LUASOCKET_DEBUG | ||
82 | target/libraries/socket/serial.a: target/objects/luasocket/vendor/luasocket/src/buffer.o target/objects/luasocket/vendor/luasocket/src/compat.o target/objects/luasocket/vendor/luasocket/src/auxiliar.o target/objects/luasocket/vendor/luasocket/src/options.o target/objects/luasocket/vendor/luasocket/src/timeout.o target/objects/luasocket/vendor/luasocket/src/io.o target/objects/luasocket/vendor/luasocket/src/usocket.o target/objects/luasocket/vendor/luasocket/src/serial.o | target/libraries/socket/ | ||
83 | $(AR) rcu target/libraries/socket/serial.a target/objects/luasocket/vendor/luasocket/src/buffer.o target/objects/luasocket/vendor/luasocket/src/compat.o target/objects/luasocket/vendor/luasocket/src/auxiliar.o target/objects/luasocket/vendor/luasocket/src/options.o target/objects/luasocket/vendor/luasocket/src/timeout.o target/objects/luasocket/vendor/luasocket/src/io.o target/objects/luasocket/vendor/luasocket/src/usocket.o target/objects/luasocket/vendor/luasocket/src/serial.o | ||
84 | |||
85 | target/objects/luasocket/vendor/luasocket/src/unix.o: vendor/luasocket/src/unix.c | target/objects/luasocket/vendor/luasocket/src/ | ||
86 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/unix.o vendor/luasocket/src/unix.c -D LUASOCKET_DEBUG | ||
87 | target/objects/luasocket/vendor/luasocket/src/unixdgram.o: vendor/luasocket/src/unixdgram.c | target/objects/luasocket/vendor/luasocket/src/ | ||
88 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/unixdgram.o vendor/luasocket/src/unixdgram.c -D LUASOCKET_DEBUG | ||
89 | target/objects/luasocket/vendor/luasocket/src/unixstream.o: vendor/luasocket/src/unixstream.c | target/objects/luasocket/vendor/luasocket/src/ | ||
90 | $(CC) -c -o target/objects/luasocket/vendor/luasocket/src/unixstream.o vendor/luasocket/src/unixstream.c -D LUASOCKET_DEBUG | ||
91 | target/libraries/socket/unix.a: target/objects/luasocket/vendor/luasocket/src/buffer.o target/objects/luasocket/vendor/luasocket/src/compat.o target/objects/luasocket/vendor/luasocket/src/auxiliar.o target/objects/luasocket/vendor/luasocket/src/options.o target/objects/luasocket/vendor/luasocket/src/timeout.o target/objects/luasocket/vendor/luasocket/src/io.o target/objects/luasocket/vendor/luasocket/src/usocket.o target/objects/luasocket/vendor/luasocket/src/unix.o target/objects/luasocket/vendor/luasocket/src/unixdgram.o target/objects/luasocket/vendor/luasocket/src/unixstream.o | target/libraries/socket/ | ||
92 | $(AR) rcu target/libraries/socket/unix.a target/objects/luasocket/vendor/luasocket/src/buffer.o target/objects/luasocket/vendor/luasocket/src/compat.o target/objects/luasocket/vendor/luasocket/src/auxiliar.o target/objects/luasocket/vendor/luasocket/src/options.o target/objects/luasocket/vendor/luasocket/src/timeout.o target/objects/luasocket/vendor/luasocket/src/io.o target/objects/luasocket/vendor/luasocket/src/usocket.o target/objects/luasocket/vendor/luasocket/src/unix.o target/objects/luasocket/vendor/luasocket/src/unixdgram.o target/objects/luasocket/vendor/luasocket/src/unixstream.o | ||
93 | |||
94 | target/objects/luasec/vendor/luasec/src/options.o: vendor/luasec/src/options.c | target/objects/luasec/vendor/luasec/src/ | ||
95 | $(CC) -c -o target/objects/luasec/vendor/luasec/src/options.o vendor/luasec/src/options.c -I vendor/luasec/$(OPENSSL_INCDIR) -I vendor/luasec/src/ -I vendor/luasec/src/luasocket -D WITH_LUASOCKET -D LUASOCKET_DEBUG | ||
96 | target/objects/luasec/vendor/luasec/src/config.o: vendor/luasec/src/config.c | target/objects/luasec/vendor/luasec/src/ | ||
97 | $(CC) -c -o target/objects/luasec/vendor/luasec/src/config.o vendor/luasec/src/config.c -I vendor/luasec/$(OPENSSL_INCDIR) -I vendor/luasec/src/ -I vendor/luasec/src/luasocket -D WITH_LUASOCKET -D LUASOCKET_DEBUG | ||
98 | target/objects/luasec/vendor/luasec/src/ec.o: vendor/luasec/src/ec.c | target/objects/luasec/vendor/luasec/src/ | ||
99 | $(CC) -c -o target/objects/luasec/vendor/luasec/src/ec.o vendor/luasec/src/ec.c -I vendor/luasec/$(OPENSSL_INCDIR) -I vendor/luasec/src/ -I vendor/luasec/src/luasocket -D WITH_LUASOCKET -D LUASOCKET_DEBUG | ||
100 | target/objects/luasec/vendor/luasec/src/x509.o: vendor/luasec/src/x509.c | target/objects/luasec/vendor/luasec/src/ | ||
101 | $(CC) -c -o target/objects/luasec/vendor/luasec/src/x509.o vendor/luasec/src/x509.c -I vendor/luasec/$(OPENSSL_INCDIR) -I vendor/luasec/src/ -I vendor/luasec/src/luasocket -D WITH_LUASOCKET -D LUASOCKET_DEBUG | ||
102 | target/objects/luasec/vendor/luasec/src/context.o: vendor/luasec/src/context.c | target/objects/luasec/vendor/luasec/src/ | ||
103 | $(CC) -c -o target/objects/luasec/vendor/luasec/src/context.o vendor/luasec/src/context.c -I vendor/luasec/$(OPENSSL_INCDIR) -I vendor/luasec/src/ -I vendor/luasec/src/luasocket -D WITH_LUASOCKET -D LUASOCKET_DEBUG | ||
104 | target/objects/luasec/vendor/luasec/src/ssl.o: vendor/luasec/src/ssl.c | target/objects/luasec/vendor/luasec/src/ | ||
105 | $(CC) -c -o target/objects/luasec/vendor/luasec/src/ssl.o vendor/luasec/src/ssl.c -I vendor/luasec/$(OPENSSL_INCDIR) -I vendor/luasec/src/ -I vendor/luasec/src/luasocket -D WITH_LUASOCKET -D LUASOCKET_DEBUG | ||
106 | target/objects/luasec/vendor/luasec/src/luasocket/buffer.o: vendor/luasec/src/luasocket/buffer.c | target/objects/luasec/vendor/luasec/src/luasocket/ | ||
107 | $(CC) -c -o target/objects/luasec/vendor/luasec/src/luasocket/buffer.o vendor/luasec/src/luasocket/buffer.c -I vendor/luasec/$(OPENSSL_INCDIR) -I vendor/luasec/src/ -I vendor/luasec/src/luasocket -D WITH_LUASOCKET -D LUASOCKET_DEBUG | ||
108 | target/objects/luasec/vendor/luasec/src/luasocket/io.o: vendor/luasec/src/luasocket/io.c | target/objects/luasec/vendor/luasec/src/luasocket/ | ||
109 | $(CC) -c -o target/objects/luasec/vendor/luasec/src/luasocket/io.o vendor/luasec/src/luasocket/io.c -I vendor/luasec/$(OPENSSL_INCDIR) -I vendor/luasec/src/ -I vendor/luasec/src/luasocket -D WITH_LUASOCKET -D LUASOCKET_DEBUG | ||
110 | target/objects/luasec/vendor/luasec/src/luasocket/timeout.o: vendor/luasec/src/luasocket/timeout.c | target/objects/luasec/vendor/luasec/src/luasocket/ | ||
111 | $(CC) -c -o target/objects/luasec/vendor/luasec/src/luasocket/timeout.o vendor/luasec/src/luasocket/timeout.c -I vendor/luasec/$(OPENSSL_INCDIR) -I vendor/luasec/src/ -I vendor/luasec/src/luasocket -D WITH_LUASOCKET -D LUASOCKET_DEBUG | ||
112 | target/objects/luasec/vendor/luasec/src/luasocket/usocket.o: vendor/luasec/src/luasocket/usocket.c | target/objects/luasec/vendor/luasec/src/luasocket/ | ||
113 | $(CC) -c -o target/objects/luasec/vendor/luasec/src/luasocket/usocket.o vendor/luasec/src/luasocket/usocket.c -I vendor/luasec/$(OPENSSL_INCDIR) -I vendor/luasec/src/ -I vendor/luasec/src/luasocket -D WITH_LUASOCKET -D LUASOCKET_DEBUG | ||
114 | target/libraries/ssl.a: target/objects/luasec/vendor/luasec/src/options.o target/objects/luasec/vendor/luasec/src/config.o target/objects/luasec/vendor/luasec/src/ec.o target/objects/luasec/vendor/luasec/src/x509.o target/objects/luasec/vendor/luasec/src/context.o target/objects/luasec/vendor/luasec/src/ssl.o target/objects/luasec/vendor/luasec/src/luasocket/buffer.o target/objects/luasec/vendor/luasec/src/luasocket/io.o target/objects/luasec/vendor/luasec/src/luasocket/timeout.o target/objects/luasec/vendor/luasec/src/luasocket/usocket.o | target/libraries/ | ||
115 | $(AR) rcu target/libraries/ssl.a target/objects/luasec/vendor/luasec/src/options.o target/objects/luasec/vendor/luasec/src/config.o target/objects/luasec/vendor/luasec/src/ec.o target/objects/luasec/vendor/luasec/src/x509.o target/objects/luasec/vendor/luasec/src/context.o target/objects/luasec/vendor/luasec/src/ssl.o target/objects/luasec/vendor/luasec/src/luasocket/buffer.o target/objects/luasec/vendor/luasec/src/luasocket/io.o target/objects/luasec/vendor/luasec/src/luasocket/timeout.o target/objects/luasec/vendor/luasec/src/luasocket/usocket.o | ||
116 | |||
117 | target/objects/miniposix/vendor/miniposix/miniposix.o: vendor/miniposix/miniposix.c | target/objects/miniposix/vendor/miniposix/ | ||
118 | $(CC) -c -o target/objects/miniposix/vendor/miniposix/miniposix.o vendor/miniposix/miniposix.c | ||
119 | target/libraries/miniposix.a: target/objects/miniposix/vendor/miniposix/miniposix.o | target/libraries/ | ||
120 | $(AR) rcu target/libraries/miniposix.a target/objects/miniposix/vendor/miniposix/miniposix.o | ||
121 | |||
122 | |||
123 | target/libraries/: | ||
124 | $(MKDIR) -p target/libraries/ | ||
125 | target/libraries/md5/: | ||
126 | $(MKDIR) -p target/libraries/md5/ | ||
127 | target/libraries/mime/: | ||
128 | $(MKDIR) -p target/libraries/mime/ | ||
129 | target/libraries/socket/: | ||
130 | $(MKDIR) -p target/libraries/socket/ | ||
131 | target/objects/lua-bz2/vendor/lua-bz2/: | ||
132 | $(MKDIR) -p target/objects/lua-bz2/vendor/lua-bz2/ | ||
133 | target/objects/lua-zlib/vendor/lua-zlib/: | ||
134 | $(MKDIR) -p target/objects/lua-zlib/vendor/lua-zlib/ | ||
135 | target/objects/luafilesystem/vendor/luafilesystem/src/: | ||
136 | $(MKDIR) -p target/objects/luafilesystem/vendor/luafilesystem/src/ | ||
137 | target/objects/luasec/vendor/luasec/src/: | ||
138 | $(MKDIR) -p target/objects/luasec/vendor/luasec/src/ | ||
139 | target/objects/luasec/vendor/luasec/src/luasocket/: | ||
140 | $(MKDIR) -p target/objects/luasec/vendor/luasec/src/luasocket/ | ||
141 | target/objects/luasocket/vendor/luasocket/src/: | ||
142 | $(MKDIR) -p target/objects/luasocket/vendor/luasocket/src/ | ||
143 | target/objects/md5/vendor/md5/src/: | ||
144 | $(MKDIR) -p target/objects/md5/vendor/md5/src/ | ||
145 | target/objects/miniposix/vendor/miniposix/: | ||
146 | $(MKDIR) -p target/objects/miniposix/vendor/miniposix/ | ||
147 | |||
diff --git a/bootstrap.tl b/bootstrap.tl new file mode 100755 index 00000000..5017f117 --- /dev/null +++ b/bootstrap.tl | |||
@@ -0,0 +1,518 @@ | |||
1 | #!/usr/bin/env -S -- tl run | ||
2 | |||
3 | local PLATFORM = arg[1] or "unix" | ||
4 | |||
5 | local lfs = require("lfs") | ||
6 | |||
7 | local dependencies = { | ||
8 | "md5", | ||
9 | "lua-zlib", | ||
10 | "lua-bz2", | ||
11 | "luafilesystem", | ||
12 | "luasocket", | ||
13 | "luasec", | ||
14 | "miniposix", | ||
15 | } | ||
16 | |||
17 | local c_module_exceptions: {string:{string}} = { | ||
18 | ["ssl"] = { "ssl.core", "ssl.context", "ssl.x509", "ssl.config" }, | ||
19 | } | ||
20 | |||
21 | local rockspec_locations: {string:string} = { | ||
22 | ["md5"] = "vendor/md5/rockspec/md5-1.2-1.rockspec", | ||
23 | ["lua-zlib"] = "vendor/lua-zlib/lua-zlib-1.1-0.rockspec", | ||
24 | ["lua-bz2"] = "vendor/lua-bz2/lua-bz2-0.2.1-1.rockspec", | ||
25 | ["luafilesystem"] = "vendor/luafilesystem/luafilesystem-scm-1.rockspec", | ||
26 | ["luasocket"] = "vendor/luasocket/luasocket-scm-3.rockspec", | ||
27 | ["luasec"] = "vendor/luasec/luasec-1.3.2-1.rockspec", | ||
28 | ["miniposix"] = "vendor/miniposix/miniposix-dev-1.rockspec", | ||
29 | } | ||
30 | |||
31 | -------------------------------------------------------------------------------- | ||
32 | -- Utilities | ||
33 | -------------------------------------------------------------------------------- | ||
34 | |||
35 | local hexdump: function(string): string | ||
36 | do | ||
37 | local numtab = {} | ||
38 | for i = 0, 255 do | ||
39 | numtab[string.char(i)] = ("%-3d,"):format(i) | ||
40 | end | ||
41 | hexdump = function(str: string): string | ||
42 | return (str:gsub(".", numtab):gsub(("."):rep(80), "%0\n")) | ||
43 | end | ||
44 | end | ||
45 | |||
46 | local function apply_template(template: string, variables: {string:string}): string | ||
47 | return (template:gsub("$%(([^)]*)%)", variables)) | ||
48 | end | ||
49 | |||
50 | local function reindent_c(input: string): string | ||
51 | local out = {} | ||
52 | local indent = 0 | ||
53 | local previous_is_blank = true | ||
54 | for line in input:gmatch("([^\n]*)") do | ||
55 | line = line:match("^[ \t]*(.-)[ \t]*$") | ||
56 | |||
57 | local is_blank = (#line == 0) | ||
58 | local do_print = | ||
59 | (not is_blank) or | ||
60 | (not previous_is_blank and indent == 0) | ||
61 | |||
62 | if line:match("^[})]") then | ||
63 | indent = indent - 1 | ||
64 | if indent < 0 then indent = 0 end | ||
65 | end | ||
66 | if do_print then | ||
67 | table.insert(out, string.rep(" ", indent)) | ||
68 | table.insert(out, line) | ||
69 | table.insert(out, "\n") | ||
70 | end | ||
71 | if line:match("[{(]$") then | ||
72 | indent = indent + 1 | ||
73 | end | ||
74 | |||
75 | previous_is_blank = is_blank | ||
76 | end | ||
77 | return table.concat(out) | ||
78 | end | ||
79 | |||
80 | local function sortedpairs<K, V>(tbl: {K: V}): function(): (K, V) | ||
81 | local keys = {} | ||
82 | for k, _ in pairs(tbl) do | ||
83 | table.insert(keys, k) | ||
84 | end | ||
85 | table.sort(keys, function(a: K, b: K): boolean | ||
86 | if a is integer and not b is integer then | ||
87 | return true | ||
88 | elseif not a is integer and b is integer then | ||
89 | return false | ||
90 | end | ||
91 | return (a as integer) < (b as integer) | ||
92 | end) | ||
93 | local i = 1 | ||
94 | return function(): (K, V) | ||
95 | local key = keys[i] | ||
96 | i = i + 1 | ||
97 | return key, tbl[key] | ||
98 | end | ||
99 | end | ||
100 | |||
101 | local function mkdir_p(dirname: string) | ||
102 | local a, b = dirname:match("(.*)/(.*)") | ||
103 | if a and b then | ||
104 | mkdir_p(a) | ||
105 | end | ||
106 | lfs.mkdir(dirname) | ||
107 | end | ||
108 | |||
109 | local function dirname(filename: string): string | ||
110 | return (filename:gsub("[^/]*$", "")) | ||
111 | end | ||
112 | |||
113 | local function write_template(filename: string, template: string, variables: {string:string}) | ||
114 | local fd = assert(io.open(filename, "wb")) | ||
115 | local text = apply_template(template, variables) | ||
116 | if filename:match("%.[ch]$") then | ||
117 | text = reindent_c(text) | ||
118 | end | ||
119 | fd:write(text) | ||
120 | fd:close() | ||
121 | end | ||
122 | |||
123 | local function find_files(dir_name: string): (function(): string) | ||
124 | local iter_stack: {lfs.DirObj} = {} | ||
125 | local dir_stack: {string} = { dir_name } | ||
126 | local iter, dd = lfs.dir(dir_name) | ||
127 | return function(): string | ||
128 | while true do | ||
129 | local s = iter(dd) | ||
130 | if s ~= "." and s ~= ".." then | ||
131 | if not s then | ||
132 | if #iter_stack == 0 then | ||
133 | return nil | ||
134 | end | ||
135 | table.remove(dir_stack) | ||
136 | dd = table.remove(iter_stack) | ||
137 | else | ||
138 | local d = dir_stack[#dir_stack] | ||
139 | local pathname = d .. "/" .. s, "mode" | ||
140 | if lfs.attributes(pathname, "mode") ~= "directory" then | ||
141 | return pathname | ||
142 | else | ||
143 | table.insert(iter_stack, dd) | ||
144 | iter, dd = lfs.dir(pathname) | ||
145 | table.insert(dir_stack, pathname) | ||
146 | end | ||
147 | end | ||
148 | end | ||
149 | end | ||
150 | end | ||
151 | end | ||
152 | |||
153 | -------------------------------------------------------------------------------- | ||
154 | -- Collect data based on rockspecs in vendor/ | ||
155 | -------------------------------------------------------------------------------- | ||
156 | |||
157 | local record BuildEntry | ||
158 | sources: {string} | ||
159 | incdirs: {string} | ||
160 | defines: {string} | ||
161 | end | ||
162 | |||
163 | local record Data | ||
164 | record LuaEntry | ||
165 | dep: string | ||
166 | mod: string | ||
167 | source: string | ||
168 | |||
169 | h_file: string | ||
170 | length: integer | ||
171 | end | ||
172 | record CEntry | ||
173 | dep: string | ||
174 | mod: string | ||
175 | build: BuildEntry | ||
176 | |||
177 | a_file: string | ||
178 | end | ||
179 | |||
180 | luas: {LuaEntry} | ||
181 | cs: {CEntry} | ||
182 | end | ||
183 | |||
184 | local function add_lua(data: Data, dep: string, mod: string, source: string) | ||
185 | table.insert(data.luas, { dep = dep, mod = mod, source = source }) | ||
186 | end | ||
187 | |||
188 | local function add_c(data: Data, dep: string, mod: string, build: BuildEntry) | ||
189 | table.insert(data.cs, { dep = dep, mod = mod, build = build }) | ||
190 | end | ||
191 | |||
192 | local record Rockspec | ||
193 | record Build | ||
194 | record Install | ||
195 | lua: {(string | integer): string} | ||
196 | end | ||
197 | |||
198 | type: string | ||
199 | modules: {string: (string | BuildEntry)} | ||
200 | install: Install | ||
201 | platforms: {string: Build} | ||
202 | end | ||
203 | |||
204 | build: Build | ||
205 | end | ||
206 | |||
207 | local function load_rockspec(dep: string, rockspec_filename: string): Rockspec | ||
208 | local rockspec: Rockspec = {} | ||
209 | local fd = io.open(rockspec_filename) | ||
210 | local source = fd:read("*a") | ||
211 | fd:close() | ||
212 | local chunk = assert(load(source, dep, "t", rockspec as {any:any})) | ||
213 | chunk() | ||
214 | return rockspec | ||
215 | end | ||
216 | |||
217 | local function process_build_entry(data: Data, dep: string, mod: string, modt: string|BuildEntry) | ||
218 | if modt is string then | ||
219 | if modt:match("lua$") then | ||
220 | add_lua(data, dep, mod, "vendor/" .. dep .. "/" .. modt) | ||
221 | else | ||
222 | add_c(data, dep, mod, { sources = { modt } }) | ||
223 | end | ||
224 | elseif modt is BuildEntry then | ||
225 | add_c(data, dep, mod, modt) | ||
226 | end | ||
227 | end | ||
228 | |||
229 | local function process_build_modules(data: Data, dep: string, entries: {string: (string|BuildEntry)}) | ||
230 | for mod, modt in sortedpairs(entries) do | ||
231 | process_build_entry(data, dep, mod, modt) | ||
232 | end | ||
233 | end | ||
234 | |||
235 | local function process_build_install(data: Data, dep: string, entries: {(string|integer): string}) | ||
236 | for mod, modt in sortedpairs(entries) do | ||
237 | if mod is integer then | ||
238 | assert(modt is string) | ||
239 | mod = modt:gsub("^src/", ""):gsub("^lua/", ""):gsub("%.[^.]*$", ""):gsub("/", ".") | ||
240 | end | ||
241 | assert(mod is string) | ||
242 | |||
243 | process_build_entry(data, dep, mod, modt) | ||
244 | end | ||
245 | end | ||
246 | |||
247 | local function process_build(data: Data, dep: string, build: Rockspec.Build) | ||
248 | if build.modules then | ||
249 | process_build_modules(data, dep, build.modules) | ||
250 | end | ||
251 | if build.install and build.install.lua then | ||
252 | process_build_install(data, dep, build.install.lua) | ||
253 | end | ||
254 | end | ||
255 | |||
256 | local function process(data: Data, dep: string, rockspec_filename: string) | ||
257 | local rockspec = load_rockspec(dep, rockspec_filename) | ||
258 | |||
259 | assert(rockspec.build.type == "builtin") | ||
260 | |||
261 | if rockspec.build.modules or rockspec.build.install then | ||
262 | process_build(data, dep, rockspec.build) | ||
263 | end | ||
264 | |||
265 | if rockspec.build.platforms then | ||
266 | if rockspec.build.platforms[PLATFORM] then | ||
267 | process_build(data, dep, rockspec.build.platforms[PLATFORM]) | ||
268 | end | ||
269 | end | ||
270 | end | ||
271 | |||
272 | -------------------------------------------------------------------------------- | ||
273 | -- Generate entries for Makefile-based build | ||
274 | -------------------------------------------------------------------------------- | ||
275 | |||
276 | local function global_name(mod: string): string | ||
277 | return "luarocks_gen_" .. mod:gsub("%.", "_") | ||
278 | end | ||
279 | |||
280 | local function generate(input_filename: string, entry: Data.LuaEntry): string | ||
281 | local fd = assert(io.open(input_filename, "rb")) | ||
282 | local content = fd:read("*a"):gsub("^#![^\n]+\n", "") | ||
283 | fd:close() | ||
284 | |||
285 | entry.length = #content | ||
286 | |||
287 | return apply_template([[ | ||
288 | /* automatically generated by bootstrap.tl */ | ||
289 | |||
290 | static const unsigned char $(global)[] = { | ||
291 | $(code) | ||
292 | }; | ||
293 | ]], { | ||
294 | global = global_name(entry.mod), | ||
295 | code = hexdump(content), | ||
296 | }) | ||
297 | end | ||
298 | |||
299 | local function generate_all_luas(luas: {Data.LuaEntry}) | ||
300 | for _, entry in ipairs(luas) do | ||
301 | local filename = "gen/lua/" .. entry.mod:gsub("%.", "/") .. ".h" | ||
302 | mkdir_p(dirname(filename)) | ||
303 | |||
304 | local fd = assert(io.open(filename, "wb")) | ||
305 | fd:write(reindent_c(generate(entry.source, entry))) | ||
306 | entry.h_file = filename | ||
307 | fd:close() | ||
308 | end | ||
309 | |||
310 | local includes = {} | ||
311 | local array = {} | ||
312 | for _, entry in ipairs(luas) do | ||
313 | table.insert(includes, ("#include \"%s\""):format(entry.h_file)) | ||
314 | table.insert(array, apply_template([[ | ||
315 | { | ||
316 | .module_name = "$(mod)", | ||
317 | .source_name = "$(source)", | ||
318 | .length = $(length), | ||
319 | .code = $(global), | ||
320 | }, | ||
321 | ]], { | ||
322 | mod = entry.mod, | ||
323 | dep = entry.dep, | ||
324 | source = entry.source, | ||
325 | length = tostring(entry.length), | ||
326 | global = global_name(entry.mod), | ||
327 | })) | ||
328 | end | ||
329 | |||
330 | table.insert(array, apply_template([[ | ||
331 | { | ||
332 | .module_name = NULL, | ||
333 | .source_name = NULL, | ||
334 | .length = 0, | ||
335 | .code = NULL, | ||
336 | }, | ||
337 | ]], {})) | ||
338 | |||
339 | write_template("gen/gen.h", [[ | ||
340 | /* automatically generated by bootstrap.tl */ | ||
341 | |||
342 | $(includes) | ||
343 | |||
344 | static const Gen GEN[] = { | ||
345 | $(array) | ||
346 | }; | ||
347 | ]], { | ||
348 | array = table.concat(array, "\n"), | ||
349 | includes = table.concat(includes, "\n"), | ||
350 | }) | ||
351 | end | ||
352 | |||
353 | local function get_flag_list(flag: string, entries: {string}, parent: string): string | ||
354 | local out = {} | ||
355 | for _, entry in ipairs(entries) do | ||
356 | table.insert(out, flag .. " " .. parent .. entry) | ||
357 | end | ||
358 | return table.concat(out, " ") | ||
359 | end | ||
360 | |||
361 | local function generate_makefile_entry(entry: Data.CEntry, seen: {string:boolean}, dirs: {string:boolean}): string | ||
362 | local out = {} | ||
363 | assert(entry.build.sources) | ||
364 | |||
365 | local incdirs = "" | ||
366 | if entry.build.incdirs then | ||
367 | incdirs = get_flag_list("-I", entry.build.incdirs, "vendor/" .. entry.dep .. "/") | ||
368 | end | ||
369 | local defines = "" | ||
370 | if entry.build.defines then | ||
371 | defines = get_flag_list("-D", entry.build.defines, "") | ||
372 | end | ||
373 | |||
374 | local objects = {} | ||
375 | for _, f in ipairs(entry.build.sources) do | ||
376 | local file = "vendor/" .. entry.dep .. "/" .. f | ||
377 | local obj_file = "target/objects/" .. entry.dep .. "/" .. file:gsub("%.c$", ".o") | ||
378 | table.insert(objects, obj_file) | ||
379 | |||
380 | if not seen[file] then | ||
381 | local d = dirname(obj_file) | ||
382 | if not dirs[d] then | ||
383 | dirs[d] = true | ||
384 | end | ||
385 | |||
386 | -- the pipe indicates an order-only prerequisite | ||
387 | -- (https://www.gnu.org/software/make/manual/make.html#Prerequisite-Types) | ||
388 | table.insert(out, ("%s: %s | %s"):format(obj_file, file, d)) | ||
389 | table.insert(out, ("\t$(CC) -c -o %s %s %s %s"):format(obj_file, file, incdirs, defines)) | ||
390 | seen[file] = true | ||
391 | end | ||
392 | end | ||
393 | |||
394 | local a_file = "target/libraries/" .. entry.mod:gsub("%.", "/") .. ".a" | ||
395 | entry.a_file = a_file | ||
396 | |||
397 | local d = dirname(a_file) | ||
398 | if not dirs[d] then | ||
399 | dirs[d] = true | ||
400 | end | ||
401 | |||
402 | local object_list = table.concat(objects, " ") | ||
403 | table.insert(out, ("%s: %s | %s"):format(a_file, object_list, d)) | ||
404 | --table.insert(out, ("\t$(MKDIR) -p %s"):format(dirname(a_file))) | ||
405 | table.insert(out, ("\t$(AR) rcu %s %s"):format(a_file, object_list)) | ||
406 | table.insert(out, "") | ||
407 | |||
408 | return table.concat(out, "\n") | ||
409 | end | ||
410 | |||
411 | local function process_c_entry(mod: string, externs: {string}, declares: {string}) | ||
412 | if c_module_exceptions[mod] then | ||
413 | for _, m in ipairs(c_module_exceptions[mod]) do | ||
414 | process_c_entry(m, externs, declares) | ||
415 | end | ||
416 | return | ||
417 | end | ||
418 | |||
419 | local cfunc = "luaopen_" .. mod:gsub("%.", "_") | ||
420 | |||
421 | table.insert(externs, ("extern int %s(lua_State* L);"):format(cfunc)) | ||
422 | |||
423 | table.insert(declares, ("lua_pushcfunction(L, %s);"):format(cfunc)) | ||
424 | table.insert(declares, ("lua_setfield(L, -2, \"%s\");"):format(mod)) | ||
425 | end | ||
426 | |||
427 | local makefile_vendor_template = [[ | ||
428 | # automatically generated by bootstrap.tl | ||
429 | |||
430 | VENDOR_LIBS = $(a_files) | ||
431 | |||
432 | $(entries) | ||
433 | |||
434 | ]] | ||
435 | |||
436 | local function generate_all_cs(cs: {Data.CEntry}) | ||
437 | local seen = {} | ||
438 | local dirs = {} | ||
439 | |||
440 | local entries = {} | ||
441 | for _, entry in ipairs(cs) do | ||
442 | table.insert(entries, generate_makefile_entry(entry, seen, dirs)) | ||
443 | end | ||
444 | |||
445 | table.insert(entries, "") | ||
446 | for d, _ in sortedpairs(dirs) do | ||
447 | table.insert(entries, ("%s:"):format(d)) | ||
448 | table.insert(entries, ("\t$(MKDIR) -p %s"):format(d)) | ||
449 | end | ||
450 | |||
451 | local a_files = {} | ||
452 | for _, entry in ipairs(cs) do | ||
453 | table.insert(a_files, entry.a_file) | ||
454 | end | ||
455 | |||
456 | write_template("Makefile.vendor", makefile_vendor_template, { | ||
457 | entries = table.concat(entries, "\n"), | ||
458 | a_files = table.concat(a_files, " "), | ||
459 | }) | ||
460 | |||
461 | local externs = {} | ||
462 | local declares = {} | ||
463 | for _, entry in ipairs(cs) do | ||
464 | process_c_entry(entry.mod, externs, declares) | ||
465 | end | ||
466 | |||
467 | write_template("gen/libraries.h", [[ | ||
468 | /* automatically generated by bootstrap.tl */ | ||
469 | |||
470 | $(externs) | ||
471 | |||
472 | static void declare_libraries(lua_State* L) { | ||
473 | lua_getglobal(L, "package"); /* package */ | ||
474 | lua_getfield(L, -1, "preload"); /* package package.preload */ | ||
475 | $(declares) | ||
476 | lua_settop(L, 0); /* */ | ||
477 | } | ||
478 | ]], { | ||
479 | externs = table.concat(externs, "\n"), | ||
480 | declares = table.concat(declares, "\n"), | ||
481 | }) | ||
482 | end | ||
483 | |||
484 | local function generate_main_h() | ||
485 | local fd = assert(io.open("gen/main.h", "wb")) | ||
486 | fd:write(reindent_c(generate("src/bin/luarocks", { | ||
487 | mod = "main" | ||
488 | }))) | ||
489 | fd:close() | ||
490 | end | ||
491 | |||
492 | -------------------------------------------------------------------------------- | ||
493 | -- Main operation | ||
494 | -------------------------------------------------------------------------------- | ||
495 | |||
496 | local data: Data = { | ||
497 | luas = {}, | ||
498 | cs = {}, | ||
499 | } | ||
500 | |||
501 | for file in find_files("src") do | ||
502 | if file:match("%.lua$") then | ||
503 | table.insert(data.luas, { | ||
504 | dep = "luarocks", | ||
505 | mod = file:gsub("^src/(.*).lua", "%1"):gsub("/", "."), | ||
506 | source = file, | ||
507 | }) | ||
508 | end | ||
509 | end | ||
510 | |||
511 | for _, dep in ipairs(dependencies) do | ||
512 | print(dep) | ||
513 | process(data, dep, rockspec_locations[dep]) | ||
514 | end | ||
515 | |||
516 | generate_all_luas(data.luas) | ||
517 | generate_all_cs(data.cs) | ||
518 | generate_main_h() | ||
diff --git a/src/main.c b/src/main.c new file mode 100644 index 00000000..6cefe212 --- /dev/null +++ b/src/main.c | |||
@@ -0,0 +1,160 @@ | |||
1 | #include <lua.h> | ||
2 | #include <lualib.h> | ||
3 | #include <lauxlib.h> | ||
4 | #include <errno.h> | ||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | |||
8 | typedef struct { | ||
9 | char* module_name; | ||
10 | char* source_name; | ||
11 | int length; | ||
12 | const unsigned char* code; | ||
13 | } Gen; | ||
14 | |||
15 | #include "gen/gen.h" | ||
16 | #include "gen/libraries.h" | ||
17 | |||
18 | static const char* progname = "luarocks"; | ||
19 | |||
20 | /* portable alerts, from srlua */ | ||
21 | #ifdef _WIN32 | ||
22 | #include <windows.h> | ||
23 | #define alert(message) MessageBox(NULL, message, progname, MB_ICONERROR | MB_OK) | ||
24 | #define getprogname() char name[MAX_PATH]; argv[0]= GetModuleFileName(NULL,name,sizeof(name)) ? name : NULL; | ||
25 | #else | ||
26 | #define alert(message) fprintf(stderr,"%s: %s\n", progname, message) | ||
27 | #define getprogname() | ||
28 | #endif | ||
29 | |||
30 | static int registry_key; | ||
31 | |||
32 | /* fatal error, from srlua */ | ||
33 | static void fatal(const char* message) { | ||
34 | alert(message); | ||
35 | exit(EXIT_FAILURE); | ||
36 | } | ||
37 | |||
38 | static void load_main(lua_State* L) { | ||
39 | #include "gen/main.h" | ||
40 | |||
41 | if (luaL_loadbuffer(L, luarocks_gen_main, sizeof(luarocks_gen_main), progname) != LUA_OK) { | ||
42 | fatal(lua_tostring(L, -1)); | ||
43 | } | ||
44 | } | ||
45 | |||
46 | |||
47 | static void declare_modules(lua_State* L) { | ||
48 | lua_settop(L, 0); /* */ | ||
49 | lua_newtable(L); /* modules */ | ||
50 | lua_pushlightuserdata(L, (void*) ®istry_key); /* modules registry_key */ | ||
51 | lua_pushvalue(L, 1); /* modules registry_key modules */ | ||
52 | lua_rawset(L, LUA_REGISTRYINDEX); /* modules */ | ||
53 | |||
54 | for (int i = 0; GEN[i].module_name; i++) { | ||
55 | const Gen* entry = &GEN[i]; | ||
56 | luaL_loadbuffer(L, entry->code, entry->length, entry->source_name); | ||
57 | lua_setfield(L, 1, entry->module_name); | ||
58 | } | ||
59 | } | ||
60 | |||
61 | |||
62 | /* custom package loader */ | ||
63 | static int pkg_loader(lua_State* L) { | ||
64 | lua_pushlightuserdata(L, (void*) ®istry_key); /* modname ? registry_key */ | ||
65 | lua_rawget(L, LUA_REGISTRYINDEX); /* modname ? modules */ | ||
66 | lua_pushvalue(L, -1); /* modname ? modules modules */ | ||
67 | lua_pushvalue(L, 1); /* modname ? modules modules modname */ | ||
68 | lua_gettable(L, -2); /* modname ? modules mod */ | ||
69 | if (lua_type(L, -1) == LUA_TNIL) { | ||
70 | lua_pop(L, 1); /* modname ? modules */ | ||
71 | lua_pushvalue(L, 1); /* modname ? modules modname */ | ||
72 | lua_pushliteral(L, ".init"); /* modname ? modules modname ".init" */ | ||
73 | lua_concat(L, 2); /* modname ? modules modname..".init" */ | ||
74 | lua_gettable(L, -2); /* modname ? mod */ | ||
75 | } | ||
76 | return 1; | ||
77 | } | ||
78 | |||
79 | static void install_pkg_loader(lua_State* L) { | ||
80 | lua_settop(L, 0); /* */ | ||
81 | lua_getglobal(L, "table"); /* table */ | ||
82 | lua_getfield(L, -1, "insert"); /* table table.insert */ | ||
83 | lua_getglobal(L, "package"); /* table table.insert package */ | ||
84 | lua_getfield(L, -1, "searchers"); /* table table.insert package package.searchers */ | ||
85 | if (lua_type(L, -1) == LUA_TNIL) { | ||
86 | lua_pop(L, 1); | ||
87 | lua_getfield(L, -1, "loaders"); /* table table.insert package package.loaders */ | ||
88 | } | ||
89 | lua_copy(L, 4, 3); /* table table.insert package.searchers */ | ||
90 | lua_settop(L, 3); /* table table.insert package.searchers */ | ||
91 | lua_pushnumber(L, 1); /* table table.insert package.searchers 1 */ | ||
92 | lua_pushcfunction(L, pkg_loader); /* table table.insert package.searchers 1 pkg_loader */ | ||
93 | lua_call(L, 3, 0); /* table */ | ||
94 | lua_settop(L, 0); /* */ | ||
95 | } | ||
96 | |||
97 | /* main script launcher, from srlua */ | ||
98 | static int pmain(lua_State *L) { | ||
99 | int argc = lua_tointeger(L, 1); | ||
100 | char** argv = lua_touserdata(L, 2); | ||
101 | int i; | ||
102 | load_main(L); | ||
103 | lua_createtable(L, argc, 0); | ||
104 | for (i = 0; i < argc; i++) { | ||
105 | lua_pushstring(L, argv[i]); | ||
106 | lua_rawseti(L, -2, i); | ||
107 | } | ||
108 | lua_setglobal(L, "arg"); | ||
109 | luaL_checkstack(L, argc - 1, "too many arguments to script"); | ||
110 | for (i = 1; i < argc; i++) { | ||
111 | lua_pushstring(L, argv[i]); | ||
112 | } | ||
113 | lua_call(L, argc - 1, 0); | ||
114 | return 0; | ||
115 | } | ||
116 | |||
117 | /* error handler, from luac */ | ||
118 | static int msghandler (lua_State *L) { | ||
119 | /* is error object not a string? */ | ||
120 | const char *msg = lua_tostring(L, 1); | ||
121 | if (msg == NULL) { | ||
122 | /* does it have a metamethod that produces a string */ | ||
123 | if (luaL_callmeta(L, 1, "__tostring") && lua_type(L, -1) == LUA_TSTRING) { | ||
124 | /* then that is the message */ | ||
125 | return 1; | ||
126 | } else { | ||
127 | msg = lua_pushfstring(L, "(error object is a %s value)", luaL_typename(L, 1)); | ||
128 | } | ||
129 | } | ||
130 | /* append a standard traceback */ | ||
131 | luaL_traceback(L, L, msg, 1); | ||
132 | return 1; | ||
133 | } | ||
134 | |||
135 | /* main function, from srlua */ | ||
136 | int main(int argc, char** argv) { | ||
137 | lua_State* L; | ||
138 | getprogname(); | ||
139 | if (argv[0] == NULL) { | ||
140 | fatal("cannot locate this executable"); | ||
141 | } | ||
142 | L = luaL_newstate(); | ||
143 | if (L == NULL) { | ||
144 | fatal("not enough memory for state"); | ||
145 | } | ||
146 | luaL_openlibs(L); | ||
147 | install_pkg_loader(L); | ||
148 | declare_libraries(L); | ||
149 | declare_modules(L); | ||
150 | lua_pushcfunction(L, &msghandler); | ||
151 | lua_pushcfunction(L, &pmain); | ||
152 | lua_pushinteger(L, argc); | ||
153 | lua_pushlightuserdata(L, argv); | ||
154 | if (lua_pcall(L, 2, 0, -4) != 0) { | ||
155 | fatal(lua_tostring(L, -1)); | ||
156 | } | ||
157 | lua_close(L); | ||
158 | return EXIT_SUCCESS; | ||
159 | } | ||
160 | |||