Compare commits

..

34 Commits

Author SHA1 Message Date
Peter Melnichenko
c0349eee68
0.20.0 release 2018-09-10 18:50:43 +03:00
Peter Melnichenko
edd95bc6b1
Add support for LuaRocks 3.0.2 but set 2.4.4 as stable again 2018-09-10 18:09:54 +03:00
Peter Melnichenko
dca47dcac5 Add CHANGELOG.md 2018-08-18 15:29:20 +03:00
Peter Melnichenko
d672ccd087 Move install action into a separate function 2018-08-18 12:21:54 +03:00
Peter Melnichenko
acd620b247 Allow using --show together with installing
--show now always lists programs installed in given location, possibly
after installing some.
2018-08-18 11:38:11 +03:00
Peter Melnichenko
0b33cd59fc More description error when no programs are specified 2018-08-18 11:31:29 +03:00
Peter Melnichenko
15388ec7b4 Add support for LuaRocks 3.0.1 2018-08-18 11:08:53 +03:00
Peter Melnichenko
16f9a52e6c Attempt to fix OS X Travis build 2018-08-07 13:40:52 +03:00
Peter Melnichenko
fdd1024833 Fix ./?/init.lua not being in package path for Lua 5.3+ 2018-08-07 12:41:14 +03:00
Peter Melnichenko
c1cbbca543 Support LuaRocks 3.0.0 and alias ^ and latest to it 2018-07-26 19:27:30 +03:00
Peter Melnichenko
ca2fd3194c Revert incorrect fix for the Lua 5.4.0-work2 VS problem 2018-07-11 21:28:54 +03:00
Peter Melnichenko
a30d0dd550 Fix 5.4 build when using VS 2018-07-11 21:17:48 +03:00
Peter Melnichenko
732397ef98 0.19.0 release 2018-07-11 20:17:58 +03:00
Peter Melnichenko
cc7bb37e1a Fix newly introduced error when installing Luarocks on win
Archive names contain dots, don't remove too much
when stripping extensions.
2018-07-11 13:48:26 +03:00
Peter Melnichenko
095dcc9b4a Add Lua 5.4.0-work{1,2} to supported releases
Refactor the way download names and urls are acquired to
allow more flexibility.
2018-07-11 13:21:43 +03:00
Peter Melnichenko
68d9caef5a Use pycodestyle instead of pep8, fix its warnings and config 2018-07-10 20:07:27 +03:00
Peter Melnichenko
49b8acac6e Support Lua 5.3.5 2018-07-10 19:15:32 +03:00
Peter Melnichenko
cecb55f5ad Add missing patches for Lua 5.3.4 2018-07-10 17:11:44 +03:00
Peter Melnichenko
bfd7d8efd1 Preliminary Lua 5.4 support
Now Lua 5.4 work1 can be properly installed by unpacking its
.tar.gz and running `hererocks <prefix> -l <untared>/src`.
Use `--cflags=-DLUA_NILINTABLE` if very brave.
2018-03-15 22:19:45 +03:00
Peter Melnichenko
cc30733d11 0.18.0 release (fixed) 2018-03-13 13:19:41 +03:00
Peter Melnichenko
3f370377e7 0.18.0 release 2018-03-13 13:16:04 +03:00
Peter Melnichenko
66b2e9bc7a Another attempt to fix build on OS X 2018-03-13 13:08:11 +03:00
Peter Melnichenko
4ce0ab9daa Fix OS X Travis CI 2018-03-13 12:58:28 +03:00
Peter Melnichenko
a8d4e2c08d Add a patch for Lua 5.3.4 2018-03-13 12:48:36 +03:00
Peter Melnichenko
248de26b94 Fix a test installing Lua from git
Bleeding edge Lua is now 5.4 and not supported by LuaRocks,
use latest 5.3 commit instead.
2018-03-13 12:46:08 +03:00
Peter Melnichenko
2d0e07cf7f Add support for LuaRocks 2.4.4, update LuaRocks 3 branch
Use @master instead of @luarocks-3 for LuaRocks 3.
2018-03-13 12:40:49 +03:00
Peter Melnichenko
46d1e02119 0.17.0 release 2017-09-13 16:50:59 +03:00
Peter Melnichenko
d18b005558 Fix a pyflakes warning 2017-09-13 16:19:21 +03:00
Peter Melnichenko
898256d5c3 Update --help for PUC-Rio Lua repo changes 2017-09-13 16:16:51 +03:00
Peter Melnichenko
0e3fc45758 Support new directory structure of PUC-Rio Lua git repo
When installing PUC-Rio Lua from git or local sources,
look for source files in root project directory instead
of `src`.

Default PUC-Rio Lua repo does not contain sources for luac.
It lacks lua.hpp, too.
2017-09-13 16:11:36 +03:00
Peter Melnichenko
7f6f5b02b5 Add patches for Lua 5.3.4 2017-09-13 12:35:34 +03:00
Peter Melnichenko
8cc94db304 Update license year 2017-09-13 12:23:23 +03:00
Peter Melnichenko
8289a5f705 Merge pull request #38 from fperrad/luarocks
Add LuaRocks 2.4.3 support
2017-09-13 12:18:50 +03:00
Francois Perrad
c44db4fcdb Add LuaRocks 2.4.3 support 2017-09-13 11:02:27 +02:00
9 changed files with 718 additions and 232 deletions

View File

@ -12,10 +12,11 @@ matrix:
language: generic language: generic
install: install:
- pip install pyflakes pep8 coverage coveralls nose - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then sudo pip2 install pyflakes pycodestyle coverage coveralls nose --ignore-installed; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then pip install pyflakes pycodestyle coverage coveralls nose; fi
script: script:
- pyflakes . - pyflakes .
- pep8 . - pycodestyle .
- nosetests - nosetests
- coveralls - coveralls

243
CHANGELOG.md Normal file
View File

@ -0,0 +1,243 @@
# Changelog
## 0.20.0 (2018-09-10)
### New features and improvements
* Added support for LuaRocks 3.0.0 - 3.0.2. `latest` and `^` aliases still
point to `2.4.4`.
* `--show` can now be used when installing programs; all programs present
in the given location are listed after installation is complete.
### Fixes
* `package.path` for Lua 5.3+ built with hererocks now includes `./?/init.lua`,
just as with standard Lua.
## 0.19.0 (2018-07-11)
### New features and improvements
* Added support for Lua 5.4.0-work1 and 5.4.0-work2.
* Added support for Lua 5.3.5.
* Added patches for Lua 5.3.4:
- `Lua crashes when building sequences with more than 2^30 elements`
- `Table length computation overflows for sequences larger than 2^31
elements`
- `Memory-allocation error when resizing a table can leave it in an
inconsistent state`
## 0.18.0 (2018-03-13)
### New features and improvements
* Added support for LuaRocks 2.4.4.
* Using `3` as version when installing LuaRocks now uses master branch of the
LuaRocks git repo instead of `luarocks-3`.
* Added `lua_pushcclosure should not call the garbage collector when n is zero`
patch for Lua 5.3.4.
## 0.17.0 (2017-09-13)
### New features and improvements
* Added support for LuaRocks 2.4.3.
* When installing PUC-Rio Lua from a git repo or local sources, source files
are expected to be in root directory instead of `src`. This allows one to
install Lua from the default Lua repo at github.com/lua/lua.
## 0.16.0 (2017-06-10)
### New features and improvements
* Added support for LuaJIT 2.0.5 and 2.1.0-beta3.
* Added fallback to a mirror for PUC-Rio Lua download.
* Added `--timeout` option for downloads.
## 0.15.0 (2017-04-02)
### New features and improvements
* When building Lua with custom cflags, hererocks now instructs LuaRocks to use
same flags when building C modules.
## 0.14.0 (2017-01-31)
### New features and improvements
* Added support for Lua 5.3.4.
## 0.13.1 (2017-01-09)
### Fixes
* Fixed an error when setting up cl.exe and hererocks has been installed using
a version of pip that passes `prefix/hererocks` instead of
`prefix/hererocks-script.py` as `sys.argv[0]`.
## 0.13.0 (2016-12-22)
### New features and improvements
* Added support for LuaRocks 2.4.2.
* LuaRocks is now configured to allow using config in user home directory.
In particular, API keys for `luarocks upload` command are now properly cached.
## 0.12.0 (2016-11-04)
### New features and improvements
* Added support for LuaRocks 2.4.1.
* Updated URL for LuaRocks downloads and default git repo.
## 0.11.0 (2016-09-10)
### New features and improvements
* Added support for LuaRocks 2.4.0.
* Added two new patches for bugs in Lua 5.3.3, try `--patch`.
* Caching of downloads now works on Unix-like systems even when `$HOME` is
unset (#28).
## 0.10.0 (2016-07-14)
### New features and improvements
* hererocks now creates activation scripts a-la virtualenv in `<location>/bin`.
Bash, Zsh, Dash, Fish, Csh, Batch, and PowerShell are supported.
* Lua 5.3.3 can now be patched to fix a bug (`Expression list with four or more
expressions in a 'for' loop can crash the interpreter`), try `--patch`.
## 0.9.0 (2016-06-21)
### New features and improvements
* Added support for LuaRocks 2.0.13.
### Fixes
* Fixed occasional SHA256 mismatches when downloading LuaJIT (#27).
## 0.8.1 (2016-06-12)
### Fixes
* Fixed error when installing from non-default git repo on Windows.
## 0.8.0 (2016-06-07)
### New features and improvements
* Added support for Lua 5.3.3.
## 0.7.0 (2016-05-03)
### New features and improvements
* Windows support with automatic Visual Studio setup.
* New values for `--target` option for selecting Visual Studio version and
target architecture.
* New `--show` option for listing programs installed in a location.
* New `--patch` option for applying official patches for bugs in Lua (#21).
* Documented `--downloads` and `--builds` options, may be useful for caching.
### Fixes
* Fixed an error when a command failed when using Python 3 (#15).
* Fixed error when running with `HOME` environment variable undefined (#24).
## 0.6.2 (2016-03-22)
### Fixes
Fixed a bug that resulted in Lua being built without compatibility flags (#14).
## 0.6.1 (2016-03-22) [yanked]
## 0.6.0 (2016-03-20)
### Breaking changes
* `hererocks --luajit 2.1` now installs LuaJIT 2.1.0-beta2 instead of
using v2.1 git branch. Use `hererocks --luajit @v2.1` to get old behaviour.
### New features and improvements
* LuaJIT versions 2.1.0-beta1 - 2.1.0-beta2 are now supported.
* Lua is now built manually (`make` is not run).
* OS X 10.4+ support for Lua 5.1.0 - 5.1.2.
* SHA256 checksums for downloaded archives are now verified (#13).
* `--no-readline` flag for building Lua without readline library.
* Lua archives are now downloaded using HTTPS.
### Fixes
* `luajit.h` is installed for LuaJIT (#11, #12).
* `jit.*` modules work correctly for LuaJIT 2.0.1.
## 0.5.0 (2016-01-11)
### New features and improvements
LuaRocks 2.3.0 is now supported.
## 0.4.0 (2016-01-03)
### New features and improvements
* Documented --no-git-cache option.
### Fixes
* Fixed error when installing Lua 5.1 on OS X, thanks to @xpol.
## 0.3.1 (2015-12-22)
### Fixes
* Fetch LuaJIT from GitHub mirror archive to avoid 'Connection refused' errors
when installing it on Travis.
## 0.3.0 (2015-12-19)
### New features and improvements
* LuaRocks versions 2.0.8 - 2.0.12 are now supported.
* `--compat=none` now turns off Lua 5.0 compatibility options when installing
Lua 5.1
* Default git repos are cached.
* New `--cflags` option for adding custom compiler flags when compiling Lua and
LuaJIT.
### Fixes
* LuaJIT `jit.*` modules are now properly installed.
## 0.2.0 (2015-12-02)
### New features and improvements
* Lua 5.3.2 is now supported.
* Versions of installed programs are showed in status messages.
## 0.1.0 (2015-11-29)
### Breaking changes
* Removed `-c` and `-t` shortcuts.
### New features and improvements
* `--verbose` flag that prints commands hererocks runs.
* hererocks now checks if requested versions are already installed, and skips
installation in that case. Override using `--ignore-installed/-i` flag.
* PUC Rio Lua now has default git URI.
### Fixes
* Installing from a git branch now works with newer git versions.
## 0.0.3 (2015-08-14)
The first release.

View File

@ -1,6 +1,6 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2015 - 2016 Peter Melnichenko Copyright (c) 2015 - 2017 Peter Melnichenko
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -95,7 +95,7 @@ Lua and LuaJIT have some flags that add compatibility with other Lua versions. L
Installing standard PUC-Rio Lua Installing standard PUC-Rio Lua
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Available versions: 5.1 - 5.1.5, 5.2.0 - 5.2.4, 5.3.0 - 5.3.4. Available versions: 5.1 - 5.1.5, 5.2.0 - 5.2.4, 5.3.0 - 5.3.5, 5.4.0-work1 - 5.4.0-work2 (5.4 and 5.4.0 are aliases for 5.4.0-work2). ``latest`` and ``^`` version aliases point to ``5.3.5``.
Use ``5.1.0`` to install Lua ``5.1`` which was released without patch version for some reason. Use ``5.1.0`` to install Lua ``5.1`` which was released without patch version for some reason.
@ -104,12 +104,12 @@ When building Lua, ``hererocks`` tries to emulate a sensible ``make`` target. Th
Installing LuaJIT Installing LuaJIT
^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^
Available versions: 2.0.0 - 2.0.5, 2.1.0-beta1 - 2.1.0-beta3. Available versions: 2.0.0 - 2.0.5, 2.1.0-beta1 - 2.1.0-beta3. ``latest`` and ``^`` version aliases point to ``2.0.5``.
Installing LuaRocks Installing LuaRocks
^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^
Available versions: 2.0.8 - 2.0.13, 2.1.0 - 2.1.2, 2.2.0 - 2.2.2, 2.3.0, 2.4.0 - 2.4.2, 3 (installs from ``luarocks-3`` branch of the LuaRocks git repository). Available versions: 2.0.8 - 2.0.13, 2.1.0 - 2.1.2, 2.2.0 - 2.2.2, 2.3.0, 2.4.0 - 2.4.4, 3.0.0 - 3.0.2. ``latest`` and ``^`` version aliases point to ``2.4.4``.
Version 2.0.8 does not support Lua 5.2. Versions 2.0.8 - 2.1.2 do not support Lua 5.3. Version 2.0.8 does not support Lua 5.2. Versions 2.0.8 - 2.1.2 do not support Lua 5.3.

View File

@ -7,11 +7,11 @@ environment:
build_script: build_script:
- PATH %CD%\here\bin;C:\mingw\bin;C:\python%Python%;C:\python%Python%\scripts;%PATH% - PATH %CD%\here\bin;C:\mingw\bin;C:\python%Python%;C:\python%Python%\scripts;%PATH%
- pip install pyflakes pep8 coverage coveralls nose - pip install pyflakes pycodestyle coverage coveralls nose
test_script: test_script:
- pyflakes . - pyflakes .
- pep8 . - pycodestyle .
- nosetests - nosetests
- coverage report - coverage report
- if not "%COVERALLS_REPO_TOKEN%"=="" coveralls - if not "%COVERALLS_REPO_TOKEN%"=="" coveralls

View File

@ -5,6 +5,7 @@
from __future__ import print_function from __future__ import print_function
import argparse import argparse
import contextlib
import hashlib import hashlib
import inspect import inspect
import json import json
@ -34,7 +35,7 @@ if os.name == "nt":
except ImportError: except ImportError:
import winreg import winreg
hererocks_version = "Hererocks 0.16.0" hererocks_version = "Hererocks 0.20.0"
__all__ = ["main"] __all__ = ["main"]
opts = None opts = None
@ -153,7 +154,7 @@ def write_activation_scripts():
"LOCATION_DQ": opts.location.replace("\\", "\\\\").replace('"', '\\"'), "LOCATION_DQ": opts.location.replace("\\", "\\\\").replace('"', '\\"'),
"LOCATION_SQ": opts.location.replace("'", "'\\''"), "LOCATION_SQ": opts.location.replace("'", "'\\''"),
"LOCATION_NESTED_SQ": opts.location.replace("'", "'\\''").replace("'", "'\\''"), "LOCATION_NESTED_SQ": opts.location.replace("'", "'\\''").replace("'", "'\\''"),
"LOCATION_PAREN": re.sub("[&,=()]", "^\g<0>", opts.location) "LOCATION_PAREN": re.sub("[&,=()]", r"^\g<0>", opts.location)
} }
for template_name in template_names: for template_name in template_names:
@ -164,9 +165,7 @@ def write_activation_scripts():
script_handle.write(script) script_handle.write(script)
def is_executable(path): def is_executable(path):
return (os.path.exists(path) and return os.path.exists(path) and os.access(path, os.F_OK | os.X_OK) and not os.path.isdir(path)
os.access(path, os.F_OK | os.X_OK) and
not os.path.isdir(path))
def program_exists(prog): def program_exists(prog):
path = os.environ.get("PATH", os.defpath) path = os.environ.get("PATH", os.defpath)
@ -197,7 +196,6 @@ platform_to_lua_target = {
def using_cl(): def using_cl():
return opts.target.startswith("vs") return opts.target.startswith("vs")
def get_default_lua_target(): def get_default_lua_target():
for plat, lua_target in platform_to_lua_target.items(): for plat, lua_target in platform_to_lua_target.items():
if sys.platform.startswith(plat): if sys.platform.startswith(plat):
@ -420,6 +418,14 @@ def sha256_of_file(filename):
return hashlib.sha256(contents).hexdigest() return hashlib.sha256(contents).hexdigest()
def strip_extensions(filename):
if filename.endswith(".zip"):
return filename[:-len(".zip")]
elif filename.endswith(".tar.gz"):
return filename[:-len(".tar.gz")]
else:
return filename
class Program(object): class Program(object):
def __init__(self, version): def __init__(self, version):
version = self.translations.get(version, version) version = self.translations.get(version, version)
@ -429,7 +435,6 @@ class Program(object):
self.source = "release" self.source = "release"
self.fetched = False self.fetched = False
self.version = version self.version = version
self.fixed_version = version
self.version_suffix = " " + version self.version_suffix = " " + version
elif "@" in version: elif "@" in version:
# Version from a git repo. # Version from a git repo.
@ -498,15 +503,6 @@ class Program(object):
if need_checkout and ref != "master": if need_checkout and ref != "master":
run("git", "checkout", ref) run("git", "checkout", ref)
def get_download_name(self):
return self.name + "-" + self.fixed_version + ("-win32" if self.win32_zip else "")
def get_file_name(self):
return self.get_download_name() + (".zip" if self.win32_zip else ".tar.gz")
def get_download_url(self, base_url):
return base_url + "/" + self.get_file_name()
def fetch(self): def fetch(self):
if self.fetched: if self.fetched:
return return
@ -519,18 +515,17 @@ class Program(object):
return return
if opts.downloads is None: if opts.downloads is None:
archive_name = os.path.join(temp_dir, self.get_file_name()) archive_name = os.path.join(temp_dir, self.get_download_name())
else: else:
if not os.path.exists(opts.downloads): if not os.path.exists(opts.downloads):
os.makedirs(opts.downloads) os.makedirs(opts.downloads)
archive_name = os.path.join(opts.downloads, self.get_file_name()) archive_name = os.path.join(opts.downloads, self.get_download_name())
if opts.downloads and os.path.exists(archive_name): if opts.downloads and os.path.exists(archive_name):
print("Fetching {}{} (cached)".format(self.title, self.version_suffix)) print("Fetching {}{} (cached)".format(self.title, self.version_suffix))
else: else:
for base_url in self.downloads: for url in self.get_download_urls():
url = self.get_download_url(base_url)
print("Fetching {}{} from {}".format(self.title, self.version_suffix, url)) print("Fetching {}{} from {}".format(self.title, self.version_suffix, url))
try: try:
@ -543,7 +538,7 @@ class Program(object):
sys.exit(1) sys.exit(1)
print("Verifying SHA256 checksum") print("Verifying SHA256 checksum")
expected_checksum = self.checksums[self.get_file_name()] expected_checksum = self.checksums[self.get_download_name()]
observed_checksum = sha256_of_file(archive_name) observed_checksum = sha256_of_file(archive_name)
if expected_checksum != observed_checksum: if expected_checksum != observed_checksum:
message = "SHA256 checksum mismatch for {}\nExpected: {}\nObserved: {}".format( message = "SHA256 checksum mismatch for {}\nExpected: {}\nObserved: {}".format(
@ -554,14 +549,14 @@ class Program(object):
else: else:
sys.exit("Error: " + message) sys.exit("Error: " + message)
if self.win32_zip: if archive_name.endswith(".zip"):
archive = zipfile.ZipFile(archive_name) archive = zipfile.ZipFile(archive_name)
else: else:
archive = tarfile.open(archive_name, "r:gz") archive = tarfile.open(archive_name, "r:gz")
archive.extractall(temp_dir) archive.extractall(temp_dir)
archive.close() archive.close()
os.chdir(os.path.join(temp_dir, self.get_download_name())) os.chdir(os.path.join(temp_dir, strip_extensions(self.get_download_name())))
self.fetched = True self.fetched = True
def set_identifiers(self): def set_identifiers(self):
@ -595,6 +590,8 @@ class Lua(Program):
def __init__(self, version): def __init__(self, version):
super(Lua, self).__init__(version) super(Lua, self).__init__(version)
self.source_files_prefix = self.get_source_files_prefix()
if self.source == "release": if self.source == "release":
self.major_version = self.major_version_from_version() self.major_version = self.major_version_from_version()
else: else:
@ -613,8 +610,28 @@ class Lua(Program):
self.add_compat_cflags_and_redefines() self.add_compat_cflags_and_redefines()
@staticmethod @staticmethod
def major_version_from_source(): def get_source_files_prefix():
with open(os.path.join("src", "lua.h")) as lua_h: return "src"
def get_source_file_path(self, file_name):
if self.source_files_prefix is None:
return file_name
else:
return os.path.join(self.source_files_prefix, file_name)
@contextlib.contextmanager
def in_source_files_prefix(self):
if self.source_files_prefix is not None:
start_dir = os.getcwd()
os.chdir(self.source_files_prefix)
yield
if self.source_files_prefix is not None:
os.chdir(start_dir)
def major_version_from_source(self):
with open(self.get_source_file_path("lua.h")) as lua_h:
for line in lua_h: for line in lua_h:
match = re.match(r"^\s*#define\s+LUA_VERSION_NUM\s+50(\d)\s*$", line) match = re.match(r"^\s*#define\s+LUA_VERSION_NUM\s+50(\d)\s*$", line)
@ -674,6 +691,10 @@ class Lua(Program):
os.path.join(module_path, "?", "init.lua") os.path.join(module_path, "?", "init.lua")
] ]
module_path_parts.insert(0 if local_paths_first else 2, os.path.join(".", "?.lua")) module_path_parts.insert(0 if local_paths_first else 2, os.path.join(".", "?.lua"))
if self.major_version in ["5.3", "5.4"]:
module_path_parts.append(os.path.join(".", "?", "init.lua"))
self.package_path = ";".join(module_path_parts) self.package_path = ";".join(module_path_parts)
cmodule_path = os.path.join(opts.location, "lib", "lua", self.major_version) cmodule_path = os.path.join(opts.location, "lib", "lua", self.major_version)
@ -697,14 +718,15 @@ class Lua(Program):
]) ])
def patch_redefines(self): def patch_redefines(self):
luaconf_path = self.get_source_file_path("luaconf.h")
redefines = "\n".join(self.redefines) redefines = "\n".join(self.redefines)
with open(os.path.join("src", "luaconf.h"), "rb") as luaconf_h: with open(luaconf_path, "rb") as luaconf_h:
luaconf_src = luaconf_h.read() luaconf_src = luaconf_h.read()
body, _, tail = luaconf_src.rpartition(b"#endif") body, _, tail = luaconf_src.rpartition(b"#endif")
with open(os.path.join("src", "luaconf.h"), "wb") as luaconf_h: with open(luaconf_path, "wb") as luaconf_h:
luaconf_h.write(body) luaconf_h.write(body)
luaconf_h.write(redefines.encode("UTF-8")) luaconf_h.write(redefines.encode("UTF-8"))
luaconf_h.write(b"\n#endif") luaconf_h.write(b"\n#endif")
@ -853,40 +875,46 @@ class Patch(object):
class RioLua(Lua): class RioLua(Lua):
name = "lua" name = "lua"
title = "Lua" title = "Lua"
downloads = ["http://www.lua.org/ftp", "http://webserver2.tecgraf.puc-rio.br/lua/mirror/ftp"] base_download_urls = ["http://www.lua.org/ftp", "http://webserver2.tecgraf.puc-rio.br/lua/mirror/ftp"]
win32_zip = False work_base_download_url = "http://www.lua.org/work"
default_repo = "https://github.com/lua/lua" default_repo = "https://github.com/lua/lua"
versions = [ versions = [
"5.1", "5.1.1", "5.1.2", "5.1.3", "5.1.4", "5.1.5", "5.1", "5.1.1", "5.1.2", "5.1.3", "5.1.4", "5.1.5",
"5.2.0", "5.2.1", "5.2.2", "5.2.3", "5.2.4", "5.2.0", "5.2.1", "5.2.2", "5.2.3", "5.2.4",
"5.3.0", "5.3.1", "5.3.2", "5.3.3", "5.3.4" "5.3.0", "5.3.1", "5.3.2", "5.3.3", "5.3.4", "5.3.5",
"5.4.0", "5.4.0-work1", "5.4.0-work2"
] ]
translations = { translations = {
"5": "5.3.4", "5": "5.3.5",
"5.1": "5.1.5", "5.1": "5.1.5",
"5.1.0": "5.1", "5.1.0": "5.1",
"5.2": "5.2.4", "5.2": "5.2.4",
"5.3": "5.3.4", "5.3": "5.3.5",
"^": "5.3.4", "5.4": "5.4.0-work2",
"latest": "5.3.4" "5.4.0": "5.4.0-work2",
"^": "5.3.5",
"latest": "5.3.5"
} }
checksums = { checksums = {
"lua-5.1.tar.gz" : "7f5bb9061eb3b9ba1e406a5aa68001a66cb82bac95748839dc02dd10048472c1", "lua-5.1.tar.gz" : "7f5bb9061eb3b9ba1e406a5aa68001a66cb82bac95748839dc02dd10048472c1",
"lua-5.1.1.tar.gz": "c5daeed0a75d8e4dd2328b7c7a69888247868154acbda69110e97d4a6e17d1f0", "lua-5.1.1.tar.gz" : "c5daeed0a75d8e4dd2328b7c7a69888247868154acbda69110e97d4a6e17d1f0",
"lua-5.1.2.tar.gz": "5cf098c6fe68d3d2d9221904f1017ff0286e4a9cc166a1452a456df9b88b3d9e", "lua-5.1.2.tar.gz" : "5cf098c6fe68d3d2d9221904f1017ff0286e4a9cc166a1452a456df9b88b3d9e",
"lua-5.1.3.tar.gz": "6b5df2edaa5e02bf1a2d85e1442b2e329493b30b0c0780f77199d24f087d296d", "lua-5.1.3.tar.gz" : "6b5df2edaa5e02bf1a2d85e1442b2e329493b30b0c0780f77199d24f087d296d",
"lua-5.1.4.tar.gz": "b038e225eaf2a5b57c9bcc35cd13aa8c6c8288ef493d52970c9545074098af3a", "lua-5.1.4.tar.gz" : "b038e225eaf2a5b57c9bcc35cd13aa8c6c8288ef493d52970c9545074098af3a",
"lua-5.1.5.tar.gz": "2640fc56a795f29d28ef15e13c34a47e223960b0240e8cb0a82d9b0738695333", "lua-5.1.5.tar.gz" : "2640fc56a795f29d28ef15e13c34a47e223960b0240e8cb0a82d9b0738695333",
"lua-5.2.0.tar.gz": "cabe379465aa8e388988073d59b69e76ba0025429d2c1da80821a252cdf6be0d", "lua-5.2.0.tar.gz" : "cabe379465aa8e388988073d59b69e76ba0025429d2c1da80821a252cdf6be0d",
"lua-5.2.1.tar.gz": "64304da87976133196f9e4c15250b70f444467b6ed80d7cfd7b3b982b5177be5", "lua-5.2.1.tar.gz" : "64304da87976133196f9e4c15250b70f444467b6ed80d7cfd7b3b982b5177be5",
"lua-5.2.2.tar.gz": "3fd67de3f5ed133bf312906082fa524545c6b9e1b952e8215ffbd27113f49f00", "lua-5.2.2.tar.gz" : "3fd67de3f5ed133bf312906082fa524545c6b9e1b952e8215ffbd27113f49f00",
"lua-5.2.3.tar.gz": "13c2fb97961381f7d06d5b5cea55b743c163800896fd5c5e2356201d3619002d", "lua-5.2.3.tar.gz" : "13c2fb97961381f7d06d5b5cea55b743c163800896fd5c5e2356201d3619002d",
"lua-5.2.4.tar.gz": "b9e2e4aad6789b3b63a056d442f7b39f0ecfca3ae0f1fc0ae4e9614401b69f4b", "lua-5.2.4.tar.gz" : "b9e2e4aad6789b3b63a056d442f7b39f0ecfca3ae0f1fc0ae4e9614401b69f4b",
"lua-5.3.0.tar.gz": "ae4a5eb2d660515eb191bfe3e061f2b8ffe94dce73d32cfd0de090ddcc0ddb01", "lua-5.3.0.tar.gz" : "ae4a5eb2d660515eb191bfe3e061f2b8ffe94dce73d32cfd0de090ddcc0ddb01",
"lua-5.3.1.tar.gz": "072767aad6cc2e62044a66e8562f51770d941e972dc1e4068ba719cd8bffac17", "lua-5.3.1.tar.gz" : "072767aad6cc2e62044a66e8562f51770d941e972dc1e4068ba719cd8bffac17",
"lua-5.3.2.tar.gz": "c740c7bb23a936944e1cc63b7c3c5351a8976d7867c5252c8854f7b2af9da68f", "lua-5.3.2.tar.gz" : "c740c7bb23a936944e1cc63b7c3c5351a8976d7867c5252c8854f7b2af9da68f",
"lua-5.3.3.tar.gz": "5113c06884f7de453ce57702abaac1d618307f33f6789fa870e87a59d772aca2", "lua-5.3.3.tar.gz" : "5113c06884f7de453ce57702abaac1d618307f33f6789fa870e87a59d772aca2",
"lua-5.3.4.tar.gz": "f681aa518233bc407e23acf0f5887c884f17436f000d453b2491a9f11a52400c", "lua-5.3.4.tar.gz" : "f681aa518233bc407e23acf0f5887c884f17436f000d453b2491a9f11a52400c",
"lua-5.3.5.tar.gz" : "0c2eed3f960446e1a3e4b9a1ca2f3ff893b6ce41942cf54d5dd59ab4b3b058ac",
"lua-5.4.0-work1.tar.gz": "ada03980481110bfde44b3bd44bde4b03d72c84318b34d657b5b5a91ddb3912c",
"lua-5.4.0-work2.tar.gz": "68b7e8f1ff561b9a7e1c29de26ff99ac2a704773c0965a4fe1800b7657d5a057",
} }
all_patches = { all_patches = {
"When loading a file, Lua may call the reader function again after it returned end of input": """ "When loading a file, Lua may call the reader function again after it returned end of input": """
@ -1019,6 +1047,150 @@ class RioLua(Lua):
freeexps(fs, e1, e2); freeexps(fs, e1, e2);
e1->u.info = luaK_codeABC(fs, op, 0, rk1, rk2); /* generate opcode */ e1->u.info = luaK_codeABC(fs, op, 0, rk1, rk2); /* generate opcode */
e1->k = VRELOCABLE; /* all those operations are relocatable */ e1->k = VRELOCABLE; /* all those operations are relocatable */
""",
"Wrong code generated for a 'goto' followed by a label inside an 'if'": """
lparser.c:
@@ -1392,7 +1392,7 @@
luaK_goiffalse(ls->fs, &v); /* will jump to label if condition is true */
enterblock(fs, &bl, 0); /* must enter block before 'goto' */
gotostat(ls, v.t); /* handle goto/break */
- skipnoopstat(ls); /* skip other no-op statements */
+ while (testnext(ls, ';')) {} /* skip semicolons */
if (block_follow(ls, 0)) { /* 'goto' is the entire block? */
leaveblock(fs);
return; /* and that is it */
""",
"Lua does not check GC when creating error messages": """
ldebug.c:
@@ -653,6 +653,7 @@
CallInfo *ci = L->ci;
const char *msg;
va_list argp;
+ luaC_checkGC(L); /* error message uses memory */
va_start(argp, fmt);
msg = luaO_pushvfstring(L, fmt, argp); /* format message */
va_end(argp);
""",
"Dead keys with nil values can stay in weak tables": """
lgc.c:
@@ -643,8 +643,9 @@
for (n = gnode(h, 0); n < limit; n++) {
if (!ttisnil(gval(n)) && (iscleared(g, gkey(n)))) {
setnilvalue(gval(n)); /* remove value ... */
- removeentry(n); /* and remove entry from table */
}
+ if (ttisnil(gval(n))) /* is entry empty? */
+ removeentry(n); /* remove entry from table */
}
}
}
""",
"lua_pushcclosure should not call the garbage collector when n is zero": """
lapi.c:
@@ -533,6 +533,7 @@
lua_lock(L);
if (n == 0) {
setfvalue(L->top, fn);
+ api_incr_top(L);
}
else {
CClosure *cl;
@@ -546,9 +547,9 @@
/* does not need barrier because closure is white */
}
setclCvalue(L, L->top, cl);
+ api_incr_top(L);
+ luaC_checkGC(L);
}
- api_incr_top(L);
- luaC_checkGC(L);
lua_unlock(L);
}
""",
"Lua crashes when building sequences with more than 2^30 elements": """
ltable.c:
@@ -223,7 +223,9 @@
unsigned int na = 0; /* number of elements to go to array part */
unsigned int optimal = 0; /* optimal size for array part */
/* loop while keys can fill more than half of total size */
- for (i = 0, twotoi = 1; *pna > twotoi / 2; i++, twotoi *= 2) {
+ for (i = 0, twotoi = 1;
+ twotoi > 0 && *pna > twotoi / 2;
+ i++, twotoi *= 2) {
if (nums[i] > 0) {
a += nums[i];
if (a > twotoi/2) { /* more than half elements present? */
""",
"Table length computation overflows for sequences larger than 2^31 elements": """
ltable.h:
@@ -56,3 +56,3 @@
LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key);
-LUAI_FUNC int luaH_getn (Table *t);
+LUAI_FUNC lua_Unsigned luaH_getn (Table *t);
ltable.c:
@@ -614,4 +614,4 @@
-static int unbound_search (Table *t, unsigned int j) {
- unsigned int i = j; /* i is zero or a present index */
+static lua_Unsigned unbound_search (Table *t, lua_Unsigned j) {
+ lua_Unsigned i = j; /* i is zero or a present index */
j++;
@@ -620,3 +620,3 @@
i = j;
- if (j > cast(unsigned int, MAX_INT)/2) { /* overflow? */
+ if (j > l_castS2U(LUA_MAXINTEGER) / 2) { /* overflow? */
/* table was built with bad purposes: resort to linear search */
@@ -630,3 +630,3 @@
while (j - i > 1) {
- unsigned int m = (i+j)/2;
+ lua_Unsigned m = (i+j)/2;
if (ttisnil(luaH_getint(t, m))) j = m;
@@ -642,3 +642,3 @@
*/
-int luaH_getn (Table *t) {
+lua_Unsigned luaH_getn (Table *t) {
unsigned int j = t->sizearray;
""",
"Memory-allocation error when resizing a table can leave it in an inconsistent state":
"""
ltable.c:
@@ -332,17 +332,34 @@
}
+typedef struct {
+ Table *t;
+ unsigned int nhsize;
+} AuxsetnodeT;
+
+
+static void auxsetnode (lua_State *L, void *ud) {
+ AuxsetnodeT *asn = cast(AuxsetnodeT *, ud);
+ setnodevector(L, asn->t, asn->nhsize);
+}
+
+
void luaH_resize (lua_State *L, Table *t, unsigned int nasize,
unsigned int nhsize) {
unsigned int i;
int j;
+ AuxsetnodeT asn;
unsigned int oldasize = t->sizearray;
int oldhsize = allocsizenode(t);
Node *nold = t->node; /* save old hash ... */
if (nasize > oldasize) /* array part must grow? */
setarrayvector(L, t, nasize);
/* create new hash part with appropriate size */
- setnodevector(L, t, nhsize);
+ asn.t = t; asn.nhsize = nhsize;
+ if (luaD_rawrunprotected(L, auxsetnode, &asn) != LUA_OK) { /* mem. error? */
+ setarrayvector(L, t, oldasize); /* array back to its original size */
+ luaD_throw(L, LUA_ERRMEM); /* rethrow memory error */
+ }
if (nasize < oldasize) { /* array part must shrink? */
t->sizearray = nasize;
/* re-insert elements from vanishing slice */
""" """
} }
patches_per_version = { patches_per_version = {
@ -1037,6 +1209,15 @@ class RioLua(Lua):
"Expression list with four or more expressions in a 'for' loop can crash the interpreter", "Expression list with four or more expressions in a 'for' loop can crash the interpreter",
"Checking a format for os.date may read past the format string", "Checking a format for os.date may read past the format string",
"Lua can generate wrong code in functions with too many constants" "Lua can generate wrong code in functions with too many constants"
],
"4": [
"Wrong code generated for a 'goto' followed by a label inside an 'if'",
"Lua crashes when building sequences with more than 2^30 elements",
"Table length computation overflows for sequences larger than 2^31 elements",
"Lua does not check GC when creating error messages",
"Dead keys with nil values can stay in weak tables",
"lua_pushcclosure should not call the garbage collector when n is zero",
"Memory-allocation error when resizing a table can leave it in an inconsistent state"
] ]
} }
} }
@ -1057,6 +1238,22 @@ class RioLua(Lua):
else: else:
self.dll_file = None self.dll_file = None
def get_download_name(self):
return "{}-{}.tar.gz".format(self.name, self.version)
def get_download_urls(self):
if self.version.startswith("5.4.0-work"):
return ["{}/{}".format(self.work_base_download_url, self.get_download_name())]
else:
return ["{}/{}".format(base_download_url, self.get_download_name()) for base_download_url in self.base_download_urls]
def get_source_files_prefix(self):
# When installing PUC-Rio Lua from a git repo or local sources,
# use directory structure of its GitHub mirror, where
# source files are direcly in project root instead of `src`.
if self.source == "release":
return "src"
def set_identifiers(self): def set_identifiers(self):
super(RioLua, self).set_identifiers() super(RioLua, self).set_identifiers()
@ -1074,8 +1271,10 @@ class RioLua(Lua):
self.compat = "none" if opts.compat == "none" else "default" self.compat = "none" if opts.compat == "none" else "default"
elif self.major_version == "5.2": elif self.major_version == "5.2":
self.compat = "none" if opts.compat in ["none", "5.2"] else "default" self.compat = "none" if opts.compat in ["none", "5.2"] else "default"
else: elif self.major_version == "5.3":
self.compat = "default" if opts.compat in ["default", "5.2"] else opts.compat self.compat = "default" if opts.compat in ["default", "5.2"] else opts.compat
else:
self.compat = "default" if opts.compat in ["default", "5.3"] else opts.compat
def add_compat_cflags_and_redefines(self): def add_compat_cflags_and_redefines(self):
if self.major_version == "5.1": if self.major_version == "5.1":
@ -1088,12 +1287,15 @@ class RioLua(Lua):
elif self.major_version == "5.2": elif self.major_version == "5.2":
if self.compat == "default": if self.compat == "default":
self.compat_cflags.append("-DLUA_COMPAT_ALL") self.compat_cflags.append("-DLUA_COMPAT_ALL")
else: elif self.major_version == "5.3":
if self.compat in ["5.1", "all"]: if self.compat in ["5.1", "all"]:
self.compat_cflags.append("-DLUA_COMPAT_5_1") self.compat_cflags.append("-DLUA_COMPAT_5_1")
if self.compat in ["default", "5.2", "all"]: if self.compat in ["default", "5.2", "all"]:
self.compat_cflags.append("-DLUA_COMPAT_5_2") self.compat_cflags.append("-DLUA_COMPAT_5_2")
else:
if self.compat in ["default", "5.3", "all"]:
self.compat_cflags.append("-DLUA_COMPAT_5_3")
def apply_patch(self, patch_name): def apply_patch(self, patch_name):
patch = self.all_patches[patch_name] patch = self.all_patches[patch_name]
@ -1107,7 +1309,7 @@ class RioLua(Lua):
regexps = [ regexps = [
# Lua 5.1.x, but not Lua 5.1(.0) # Lua 5.1.x, but not Lua 5.1(.0)
r'^\s*#define\s+LUA_RELEASE\s+"Lua 5\.1\.(\d)"\s*$', r'^\s*#define\s+LUA_RELEASE\s+"Lua 5\.1\.(\d)"\s*$',
# Lua 5.2.x and 5.3.x # Lua 5.2.x+
r'^\s*#define LUA_VERSION_RELEASE\s+"(\d)"\s*$' r'^\s*#define LUA_VERSION_RELEASE\s+"(\d)"\s*$'
] ]
@ -1153,7 +1355,7 @@ class RioLua(Lua):
applied, "" if applied == 1 else "es", len(patches))) applied, "" if applied == 1 else "es", len(patches)))
def make(self): def make(self):
if self.major_version == "5.3": if self.major_version == "5.3" or self.major_version == "5.4":
cc = ["gcc", "-std=gnu99"] cc = ["gcc", "-std=gnu99"]
else: else:
cc = "gcc" cc = "gcc"
@ -1212,77 +1414,85 @@ class RioLua(Lua):
elif using_cl(): elif using_cl():
cflags.insert(0, "-DLUA_BUILD_AS_DLL") cflags.insert(0, "-DLUA_BUILD_AS_DLL")
os.chdir("src") with self.in_source_files_prefix():
self.handle_patches() self.handle_patches()
objs = [] objs = []
luac_objs = ["luac" + objext(), "print" + objext()] luac_objs = ["luac" + objext(), "print" + objext()]
for src in sorted(os.listdir(".")): for src in sorted(os.listdir(".")):
base, ext = os.path.splitext(src) base, ext = os.path.splitext(src)
if ext == ".c": if ext == ".c":
obj = base + objext() obj = base + objext()
objs.append(obj) objs.append(obj)
cmd_suffix = src if using_cl() else ["-c", "-o", obj, src] cmd_suffix = src if using_cl() else ["-c", "-o", obj, src]
run(cc, static_cflags if obj in luac_objs else cflags, cmd_suffix) run(cc, static_cflags if obj in luac_objs else cflags, cmd_suffix)
lib_objs = [obj_ for obj_ in objs if obj_ not in luac_objs and (obj_ != "lua" + objext())] lib_objs = [obj_ for obj_ in objs if obj_ not in luac_objs and (obj_ != "lua" + objext())]
luac_objs = ["luac" + objext()]
if "print" + objext() in objs: if not using_cl():
luac_objs.append("print" + objext()) run("ar", "rcu", self.arch_file, lib_objs)
run("ranlib", self.arch_file)
if using_cl(): built_luac_objs = [obj_ for obj_ in luac_objs if obj_ in objs]
run("link", "/nologo", "/out:luac.exe", luac_objs, lib_objs)
if os.path.exists("luac.exe.manifest"): # Handle the case when there are no source files for `luac`, likely because installing
run("mt", "/nologo", "-manifest", "luac.exe.manifest", "-outputresource:luac.exe") # from a git repo that does not have them, like the default one.
else: if len(built_luac_objs) > 0:
run("ar", "rcu", self.arch_file, lib_objs) if using_cl():
run("ranlib", self.arch_file) run("link", "/nologo", "/out:luac.exe", built_luac_objs, lib_objs)
run(cc, "-o", self.luac_file, luac_objs, self.arch_file, lflags)
if opts.target == "mingw": if os.path.exists("luac.exe.manifest"):
run(cc, "-shared", "-o", self.dll_file, lib_objs) run("mt", "/nologo", "-manifest", "luac.exe.manifest", "-outputresource:luac.exe")
run("strip", "--strip-unneeded", self.dll_file) else:
run(cc, "-o", self.lua_file, "-s", "lua.o", self.dll_file) run(cc, "-o", self.luac_file, built_luac_objs, self.arch_file, lflags)
elif using_cl():
run("link", "/nologo", "/DLL", "/out:" + self.dll_file, lib_objs)
if os.path.exists(self.dll_file + ".manifest"): if opts.target == "mingw":
run("mt", "/nologo", "-manifest", self.dll_file + ".manifest", run(cc, "-shared", "-o", self.dll_file, lib_objs)
"-outputresource:" + self.dll_file) run("strip", "--strip-unneeded", self.dll_file)
run(cc, "-o", self.lua_file, "-s", "lua.o", self.dll_file)
elif using_cl():
run("link", "/nologo", "/DLL", "/out:" + self.dll_file, lib_objs)
run("link", "/nologo", "/out:lua.exe", "lua.obj", self.arch_file) if os.path.exists(self.dll_file + ".manifest"):
run("mt", "/nologo", "-manifest", self.dll_file + ".manifest",
"-outputresource:" + self.dll_file)
if os.path.exists("lua.exe.manifest"): run("link", "/nologo", "/out:lua.exe", "lua.obj", self.arch_file)
run("mt", "/nologo", "-manifest", "lua.exe.manifest", "-outputresource:lua.exe")
else:
run(cc, "-o", self.lua_file, "lua.o", self.arch_file, lflags)
os.chdir("..") if os.path.exists("lua.exe.manifest"):
run("mt", "/nologo", "-manifest", "lua.exe.manifest", "-outputresource:lua.exe")
else:
run(cc, "-o", self.lua_file, "lua.o", self.arch_file, lflags)
def make_install(self): def make_install(self):
os.chdir("src") with self.in_source_files_prefix():
copy_files(os.path.join(opts.location, "bin"), luac = self.luac_file
self.lua_file, self.luac_file, self.dll_file)
lua_hpp = "lua.hpp" if not os.path.exists(luac):
luac = None
if not os.path.exists(lua_hpp): copy_files(os.path.join(opts.location, "bin"),
lua_hpp = "../etc/lua.hpp" self.lua_file, luac, self.dll_file)
copy_files(os.path.join(opts.location, "include"), lua_hpp = "lua.hpp"
"lua.h", "luaconf.h", "lualib.h", "lauxlib.h", lua_hpp)
copy_files(os.path.join(opts.location, "lib"), self.arch_file) if not os.path.exists(lua_hpp):
if self.source_files_prefix is None:
lua_hpp = None
else:
lua_hpp = "../etc/lua.hpp"
copy_files(os.path.join(opts.location, "include"),
"lua.h", "luaconf.h", "lualib.h", "lauxlib.h", lua_hpp)
copy_files(os.path.join(opts.location, "lib"), self.arch_file)
class LuaJIT(Lua): class LuaJIT(Lua):
name = "LuaJIT" name = "LuaJIT"
title = "LuaJIT" title = "LuaJIT"
downloads = ["https://github.com/LuaJIT/LuaJIT/archive"] base_download_url = "https://github.com/LuaJIT/LuaJIT/archive"
win32_zip = False
default_repo = "https://github.com/LuaJIT/LuaJIT" default_repo = "https://github.com/LuaJIT/LuaJIT"
versions = [ versions = [
"2.0.0", "2.0.1", "2.0.2", "2.0.3", "2.0.4", "2.0.5", "2.0.0", "2.0.1", "2.0.2", "2.0.3", "2.0.4", "2.0.5",
@ -1307,15 +1517,12 @@ class LuaJIT(Lua):
"LuaJIT-2.1.0-beta3.tar.gz": "409f7fe570d3c16558e594421c47bdd130238323c9d6fd6c83dedd2aaeb082a8", "LuaJIT-2.1.0-beta3.tar.gz": "409f7fe570d3c16558e594421c47bdd130238323c9d6fd6c83dedd2aaeb082a8",
} }
def __init__(self, version): def get_download_name(self):
super(LuaJIT, self).__init__(version) # v2.0.1 tag is broken, use v2.0.1-fixed.
return "{}-{}.tar.gz".format(self.name, "2.0.1-fixed" if self.version == "2.0.1" else self.version)
if self.source == "release" and self.version == "2.0.1": def get_download_urls(self):
# v2.0.1 tag is broken, use v2.0.1-fixed. return ["{}/v{}.tar.gz".format(self.base_download_url, "2.0.1-fixed" if self.version == "2.0.1" else self.version)]
self.fixed_version = "2.0.1-fixed"
def get_download_url(self, base_url):
return base_url + "/v" + self.fixed_version + ".tar.gz"
@staticmethod @staticmethod
def major_version_from_version(): def major_version_from_version():
@ -1352,13 +1559,11 @@ class LuaJIT(Lua):
cflags.extend(opts.cflags.split()) cflags.extend(opts.cflags.split())
if using_cl(): if using_cl():
os.chdir("src") with self.in_source_files_prefix():
if cflags:
self.add_cflags_to_msvcbuild(" ".join(cflags))
if cflags: run("msvcbuild.bat")
self.add_cflags_to_msvcbuild(" ".join(cflags))
run("msvcbuild.bat")
os.chdir("..")
else: else:
if opts.target == "mingw" and program_exists("mingw32-make"): if opts.target == "mingw" and program_exists("mingw32-make"):
make = "mingw32-make" make = "mingw32-make"
@ -1384,52 +1589,53 @@ class LuaJIT(Lua):
target_arch_file = "lua51.lib" target_arch_file = "lua51.lib"
dll_file = "lua51.dll" dll_file = "lua51.dll"
os.chdir("src") with self.in_source_files_prefix():
copy_files(os.path.join(opts.location, "bin"), dll_file) copy_files(os.path.join(opts.location, "bin"), dll_file)
shutil.copy(luajit_file, os.path.join(opts.location, "bin", lua_file)) shutil.copy(luajit_file, os.path.join(opts.location, "bin", lua_file))
copy_files(os.path.join(opts.location, "include"), copy_files(os.path.join(opts.location, "include"),
"lua.h", "luaconf.h", "lualib.h", "lauxlib.h", "lua.hpp", "luajit.h") "lua.h", "luaconf.h", "lualib.h", "lauxlib.h", "lua.hpp", "luajit.h")
copy_files(os.path.join(opts.location, "lib")) copy_files(os.path.join(opts.location, "lib"))
if opts.target != "mingw": if opts.target != "mingw":
shutil.copy(arch_file, os.path.join(opts.location, "lib", target_arch_file)) shutil.copy(arch_file, os.path.join(opts.location, "lib", target_arch_file))
if os.name != "nt": if os.name != "nt":
shutil.copy(so_file, os.path.join(opts.location, "lib", target_so_file)) shutil.copy(so_file, os.path.join(opts.location, "lib", target_so_file))
jitlib_path = os.path.join( jitlib_path = os.path.join(
opts.location, "share", "lua", self.major_version, "jit") opts.location, "share", "lua", self.major_version, "jit")
if os.path.exists(jitlib_path): if os.path.exists(jitlib_path):
remove_dir(jitlib_path) remove_dir(jitlib_path)
copy_dir("jit", jitlib_path) copy_dir("jit", jitlib_path)
class LuaRocks(Program): class LuaRocks(Program):
name = "luarocks" name = "luarocks"
title = "LuaRocks" title = "LuaRocks"
downloads = ["http://luarocks.github.io/luarocks/releases"] base_download_url = "http://luarocks.github.io/luarocks/releases"
win32_zip = os.name == "nt"
default_repo = "https://github.com/luarocks/luarocks" default_repo = "https://github.com/luarocks/luarocks"
versions = [ versions = [
"2.0.8", "2.0.9", "2.0.10", "2.0.11", "2.0.12", "2.0.13", "2.0.8", "2.0.9", "2.0.10", "2.0.11", "2.0.12", "2.0.13",
"2.1.0", "2.1.1", "2.1.2", "2.1.0", "2.1.1", "2.1.2",
"2.2.0", "2.2.1", "2.2.2", "2.2.0", "2.2.1", "2.2.2",
"2.3.0", "2.3.0",
"2.4.0", "2.4.1", "2.4.2" "2.4.0", "2.4.1", "2.4.2", "2.4.3", "2.4.4",
"3.0.0", "3.0.1", "3.0.2"
] ]
translations = { translations = {
"2": "2.4.2", "2": "2.4.4",
"2.0": "2.0.13", "2.0": "2.0.13",
"2.1": "2.1.2", "2.1": "2.1.2",
"2.2": "2.2.2", "2.2": "2.2.2",
"2.3": "2.3.0", "2.3": "2.3.0",
"2.4": "2.4.2", "2.4": "2.4.4",
"3": "@luarocks-3", "3": "3.0.2",
"^": "2.4.2", "3.0": "3.0.2",
"latest": "2.4.2" "^": "2.4.4",
"latest": "2.4.4"
} }
checksums = { checksums = {
"luarocks-2.0.10.tar.gz" : "11731dfe6e210a962cb2a857b8b2f14a9ab1043e13af09a1b9455b486401b46e", "luarocks-2.0.10.tar.gz" : "11731dfe6e210a962cb2a857b8b2f14a9ab1043e13af09a1b9455b486401b46e",
@ -1464,8 +1670,24 @@ class LuaRocks(Program):
"luarocks-2.4.1-win32.zip" : "c6cf36ca2e03b1a910e4dde9ac5c9360dc16f3f7afe50a978213d26728f4c667", "luarocks-2.4.1-win32.zip" : "c6cf36ca2e03b1a910e4dde9ac5c9360dc16f3f7afe50a978213d26728f4c667",
"luarocks-2.4.2.tar.gz" : "0e1ec34583e1b265e0fbafb64c8bd348705ad403fe85967fd05d3a659f74d2e5", "luarocks-2.4.2.tar.gz" : "0e1ec34583e1b265e0fbafb64c8bd348705ad403fe85967fd05d3a659f74d2e5",
"luarocks-2.4.2-win32.zip" : "63abc6f1240e0774f94bfe4150eaa5be06979c245db1dd5c8ddc4fb4570f7204", "luarocks-2.4.2-win32.zip" : "63abc6f1240e0774f94bfe4150eaa5be06979c245db1dd5c8ddc4fb4570f7204",
"luarocks-2.4.3.tar.gz" : "4d414d32fed5bb121c72d3ff1280b7f2dc9027a9bc012e41dfbffd5b519b362e",
"luarocks-2.4.3-win32.zip" : "08821ec39e7c3ad20f5b3d3e118ba8f1f5a7db6e6ad22e11eb5e8a2bdc95cbfb",
"luarocks-2.4.4.tar.gz" : "3938df33de33752ff2c526e604410af3dceb4b7ff06a770bc4a240de80a1f934",
"luarocks-2.4.4-win32.zip" : "763d2fbe301b5f941dd5ea4aea485fb35e75cbbdceca8cc2f18726b75f9895c1",
"luarocks-3.0.0.tar.gz" : "a43fffb997100f11cccb529a3db5456ce8dab18171a5cb3645f948147b6f64a1",
"luarocks-3.0.0-win32.zip" : "f5c6070f49f78ef61a2e5d6de353b34ef691ad4a6b45e065d5c85701a4a3a981",
"luarocks-3.0.1.tar.gz" : "b989c4b60d6c9edcd65169e5e42fcffbd39cdbebe6b138fa5aea45102f8d9ec0",
"luarocks-3.0.1-win32.zip" : "af54263b8f71406d79556c880f3e2674e6690934a69cefbbdfd18710f05eeeaf",
"luarocks-3.0.2.tar.gz" : "3836267eff2f85fb552234e966602b1e649c58f81f47c7de3785e071c8127f5a",
"luarocks-3.0.2-win32.zip" : "c9e93d7198f9ae7add331675d3d84fa1b61feb851814ee2a89b9930bd651bfb9",
} }
def get_download_name(self):
return "{}-{}{}".format(self.name, self.version, "-win32.zip" if os.name == "nt" else ".tar.gz")
def get_download_urls(self):
return ["{}/{}".format(self.base_download_url, self.get_download_name())]
def is_luarocks_2_0(self): def is_luarocks_2_0(self):
if self.source == "release": if self.source == "release":
return self.versions.index(self.version) < self.versions.index("2.1.0") return self.versions.index(self.version) < self.versions.index("2.1.0")
@ -1757,6 +1979,71 @@ class UseActualArgsFileAction(argparse.Action):
main(args_content.split("\r\n")[1:]) main(args_content.split("\r\n")[1:])
def install_programs(vs_already_set_up):
global temp_dir
temp_dir = tempfile.mkdtemp()
if (opts.lua or opts.luajit) and os.name == "nt" and not vs_already_set_up and using_cl():
setup_vs(opts.target)
start_dir = os.getcwd()
opts.location = os.path.abspath(opts.location)
if opts.downloads is not None:
opts.downloads = os.path.abspath(opts.downloads)
if opts.builds is not None:
opts.builds = os.path.abspath(opts.builds)
identifiers = get_installed_identifiers()
if not os.path.exists(os.path.join(opts.location, "bin")):
os.makedirs(os.path.join(opts.location, "bin"))
write_activation_scripts()
if opts.lua:
if "LuaJIT" in identifiers:
del identifiers["LuaJIT"]
if RioLua(opts.lua).update_identifiers(identifiers):
save_installed_identifiers(identifiers)
os.chdir(start_dir)
if opts.luajit:
if "lua" in identifiers:
del identifiers["lua"]
if LuaJIT(opts.luajit).update_identifiers(identifiers):
save_installed_identifiers(identifiers)
os.chdir(start_dir)
if opts.luarocks:
if LuaRocks(opts.luarocks).update_identifiers(identifiers):
save_installed_identifiers(identifiers)
os.chdir(start_dir)
remove_dir(temp_dir)
print("Done.")
def show_location():
if os.path.exists(opts.location):
all_identifiers = get_installed_identifiers()
if all_identifiers:
print("Programs installed in {}:".format(opts.location))
for program in [RioLua, LuaJIT, LuaRocks]:
if program.name in all_identifiers:
show_identifiers(all_identifiers[program.name])
else:
print("No programs installed in {}.".format(opts.location))
else:
print("{} does not exist.".format(opts.location))
def main(argv=None): def main(argv=None):
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description=hererocks_version + ", a tool for installing Lua and/or LuaRocks locally.", description=hererocks_version + ", a tool for installing Lua and/or LuaRocks locally.",
@ -1770,29 +2057,32 @@ def main(argv=None):
parser.add_argument( parser.add_argument(
"-l", "--lua", help="Version of standard PUC-Rio Lua to install. " "-l", "--lua", help="Version of standard PUC-Rio Lua to install. "
"Version can be specified as a version number, e.g. 5.2 or 5.3.1. " "Version can be specified as a version number, e.g. 5.2 or 5.3.1. "
"Versions 5.1.0 - 5.3.4 are supported, " "Versions 5.1.0 - 5.3.5 and 5.4.0-work1 - 5.4.0-work2 are supported. "
"'^' or 'latest' can be used to install the latest stable version. " "'latest' and '^' are aliases for 5.3.5. "
"If the argument contains '@', sources will be downloaded " "If the argument contains '@', sources will be downloaded "
"from a git repo using URI before '@' and using part after '@' as git reference " "from a git repo using URI before '@' and using part after '@' as git reference "
"to checkout, 'master' by default. " "to checkout, 'master' by default. "
"Default git repo is https://github.com/lua/lua which contains tags for most " "Default git repo is https://github.com/lua/lua. "
"unstable versions, i.e. Lua 5.3.2-rc1 can be installed using '@5.3.2-rc1' as version. " "The argument can also be a path to local directory. "
"The argument can also be a path to local directory.") "When installing PUC-Rio Lua from a git repo or a local directory, "
"source files are expected to be in the root directory instead of 'src'. ")
parser.add_argument( parser.add_argument(
"-j", "--luajit", help="Version of LuaJIT to install. " "-j", "--luajit", help="Version of LuaJIT to install. "
"Version can be specified in the same way as for standard Lua. " "Version can be specified in the same way as for standard Lua. "
"Versions 2.0.0 - 2.1.0-beta3 are supported. " "Versions 2.0.0 - 2.1.0-beta3 are supported. "
"When installing from the LuaJIT main git repo its URI can be left out, " "'latest' and '^' are aliases for to 2.0.5. "
"so that '@458a40b' installs from a commit and '@' installs from the master branch.") "Default git repo is https://github.com/luajit/luajit. ")
parser.add_argument( parser.add_argument(
"-r", "--luarocks", help="Version of LuaRocks to install. " "-r", "--luarocks", help="Version of LuaRocks to install. "
"As with Lua, a version number (in range 2.0.8 - 2.4.2), '^', git URI with reference or " "Version can be specified in the same way as for standard Lua. "
"a local path can be used. '3' can be used as a version number and installs from " "Versions 2.0.8 - 3.0.2 are supported. "
"the 'luarocks-3' branch of the standard LuaRocks git repo. " "'latest' and '^' are aliases for 2.4.4. "
"Note that Lua 5.2 is not supported in LuaRocks 2.0.8 " "Default git repo is https://github.com/luarocks/luarocks. "
"and Lua 5.3 is supported only since LuaRocks 2.2.0.") "Note that Lua 5.2 is not supported in LuaRocks 2.0.8, "
"Lua 5.3 is supported only since LuaRocks 2.2.0, and Lua 5.4 is supported only since "
"LuaRocks 3.0.0.")
parser.add_argument("--show", default=False, action="store_true", parser.add_argument("--show", default=False, action="store_true",
help="Instead of installing show programs already present in <location>") help="Show programs installed in <location>, possibly after installing new ones.")
parser.add_argument("-i", "--ignore-installed", default=False, action="store_true", parser.add_argument("-i", "--ignore-installed", default=False, action="store_true",
help="Install even if requested version is already present.") help="Install even if requested version is already present.")
parser.add_argument( parser.add_argument(
@ -1854,79 +2144,17 @@ def main(argv=None):
global opts global opts
opts = parser.parse_args(argv) opts = parser.parse_args(argv)
if not opts.lua and not opts.luajit and not opts.luarocks and not opts.show: if not opts.lua and not opts.luajit and not opts.luarocks and not opts.show:
parser.error("nothing to do") parser.error("a version of Lua, LuaJIT, or LuaRocks needs to be specified unless --show is used")
if opts.lua and opts.luajit: if opts.lua and opts.luajit:
parser.error("can't install both PUC-Rio Lua and LuaJIT") parser.error("can't install both PUC-Rio Lua and LuaJIT")
if (opts.lua or opts.luajit or opts.luarocks) and opts.show: if opts.lua or opts.luajit or opts.luarocks:
parser.error("can't both install and show") install_programs(argv is not None)
if opts.show: if opts.show:
if os.path.exists(opts.location): show_location()
all_identifiers = get_installed_identifiers()
if all_identifiers:
print("Programs installed in {}:".format(opts.location))
for program in [RioLua, LuaJIT, LuaRocks]:
if program.name in all_identifiers:
show_identifiers(all_identifiers[program.name])
else:
print("No programs installed in {}.".format(opts.location))
else:
print("Location does not exist.")
sys.exit(0)
global temp_dir
temp_dir = tempfile.mkdtemp()
if (opts.lua or opts.luajit) and os.name == "nt" and argv is None and using_cl():
setup_vs(opts.target)
start_dir = os.getcwd()
opts.location = os.path.abspath(opts.location)
if opts.downloads is not None:
opts.downloads = os.path.abspath(opts.downloads)
if opts.builds is not None:
opts.builds = os.path.abspath(opts.builds)
identifiers = get_installed_identifiers()
if not os.path.exists(os.path.join(opts.location, "bin")):
os.makedirs(os.path.join(opts.location, "bin"))
write_activation_scripts()
if opts.lua:
if "LuaJIT" in identifiers:
del identifiers["LuaJIT"]
if RioLua(opts.lua).update_identifiers(identifiers):
save_installed_identifiers(identifiers)
os.chdir(start_dir)
if opts.luajit:
if "lua" in identifiers:
del identifiers["lua"]
if LuaJIT(opts.luajit).update_identifiers(identifiers):
save_installed_identifiers(identifiers)
os.chdir(start_dir)
if opts.luarocks:
if LuaRocks(opts.luarocks).update_identifiers(identifiers):
save_installed_identifiers(identifiers)
os.chdir(start_dir)
remove_dir(temp_dir)
print("Done.")
sys.exit(0) sys.exit(0)
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -1,2 +1,2 @@
[pep8] [pycodestyle]
ignore = E203,E302,E501 ignore = E203,E302,E305,E501

View File

@ -9,7 +9,7 @@ readme.close()
setuptools.setup( setuptools.setup(
name="hererocks", name="hererocks",
version="0.16.0", version="0.20.0",
description="Tool for installing Lua and LuaRocks locally", description="Tool for installing Lua and LuaRocks locally",
long_description=long_description, long_description=long_description,
keywords="lua", keywords="lua",
@ -29,7 +29,8 @@ setuptools.setup(
"Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.3",
"Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6" "Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7"
], ],
py_modules=["hererocks"], py_modules=["hererocks"],
entry_points={ entry_points={

View File

@ -53,7 +53,7 @@ class TestCLI(unittest.TestCase):
def test_install_latest_lua_with_latest_luarocks(self): def test_install_latest_lua_with_latest_luarocks(self):
self.assertHererocksSuccess(["--lua", "latest", "--luarocks", "latest"]) self.assertHererocksSuccess(["--lua", "latest", "--luarocks", "latest"])
self.assertHererocksSuccess(["--show"], ["Programs installed in", "Compat: default"]) self.assertHererocksSuccess(["--show"], ["Programs installed in", "Compat: default"])
self.assertSuccess(["lua", "-v"], ["Lua 5.3.4"]) self.assertSuccess(["lua", "-v"], ["Lua 5.3.5"])
self.assertSuccess(["lua", "-e", "assert(bit32)"]) self.assertSuccess(["lua", "-e", "assert(bit32)"])
self.assertSuccess(["luarocks", "--version"]) self.assertSuccess(["luarocks", "--version"])
@ -66,6 +66,11 @@ class TestCLI(unittest.TestCase):
def test_install_latest_lua_with_luarocks_from_git(self): def test_install_latest_lua_with_luarocks_from_git(self):
self.assertHererocksSuccess(["--lua", "latest", "--luarocks", "https://github.com/mpeterv/luarocks@master"]) self.assertHererocksSuccess(["--lua", "latest", "--luarocks", "https://github.com/mpeterv/luarocks@master"])
def test_install_lua_from_git_with_latest_luarocks(self):
self.assertHererocksSuccess(["--lua", "@b1daa06", "--luarocks", "latest"])
self.assertHererocksSuccess(["--show"], ["Programs installed in", "cloned from https://github.com/lua/lua"])
self.assertSuccess(["luarocks", "--version"])
def test_verbose_install_bleeding_edge_luajit_with_latest_luarocks(self): def test_verbose_install_bleeding_edge_luajit_with_latest_luarocks(self):
self.assertHererocksSuccess(["--luajit", "@v2.1", "--luarocks", "latest", "--verbose"]) self.assertHererocksSuccess(["--luajit", "@v2.1", "--luarocks", "latest", "--verbose"])
self.assertSuccess(["lua", "-v"], ["LuaJIT 2.1.0"]) self.assertSuccess(["lua", "-v"], ["LuaJIT 2.1.0"])
@ -141,3 +146,11 @@ class TestCLI(unittest.TestCase):
"activate 2: {}{}{}".format(path2, os.pathsep, path), "activate 2: {}{}{}".format(path2, os.pathsep, path),
"deactivate 2: {}".format(path) "deactivate 2: {}".format(path)
], from_prefix=False) ], from_prefix=False)
def test_install_lua_5_4_with_luarocks_3(self):
self.assertHererocksSuccess(["--lua", "5.4", "--luarocks", "3"])
self.assertHererocksSuccess(["--lua", "5.4.0-work1", "--luarocks", "3"])
if os.name == "nt":
self.assertHererocksSuccess(["--lua", "5.4", "--luarocks", "3", "--target", "vs"])
self.assertHererocksSuccess(["--lua", "5.4.0-work1", "--luarocks", "3", "--target", "vs"])