summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTony Theodore <tonyt@logyst.com>2016-07-14 07:51:31 (GMT)
committerGitHub <noreply@github.com>2016-07-14 07:51:31 (GMT)
commit837e5e705c60bb298bcc5884c77330e318923178 (patch)
tree5f16d2a170992f9fef83a0bf7dca2050f73bc8d1
parentde9611cfeec38f2c9efd1836a2c574b241ecf44e (diff)
parent38a5c97d0b6cee5fb4c658ef4ec1843ec9bb2d0a (diff)
downloadmxe-837e5e705c60bb298bcc5884c77330e318923178.zip
mxe-837e5e705c60bb298bcc5884c77330e318923178.tar.gz
mxe-837e5e705c60bb298bcc5884c77330e318923178.tar.bz2
Merge pull request #1432 from LuaAndC/skeleton
add tool skeleton.py
-rw-r--r--Makefile15
-rw-r--r--index.html111
-rwxr-xr-xtools/skeleton.py283
3 files changed, 354 insertions, 55 deletions
diff --git a/Makefile b/Makefile
index ab61761..8151794 100644
--- a/Makefile
+++ b/Makefile
@@ -369,16 +369,18 @@ $(PREFIX)/installed/print-git-oneline-$(GIT_HEAD): | $(PREFIX)/installed/.gitkee
@rm -f '$(PREFIX)/installed/print-git-oneline-'*
@touch '$@'
-# include core MXE packages and set *_MAKEFILE
+# include core MXE packages and set base filenames
include $(patsubst %,$(TOP_DIR)/src/%.mk,$(PKGS))
$(foreach PKG,$(PKGS),\
- $(eval $(PKG)_MAKEFILE := $(realpath $(TOP_DIR)/src/$(PKG).mk)))
+ $(eval $(PKG)_MAKEFILE := $(realpath $(TOP_DIR)/src/$(PKG).mk)) \
+ $(eval $(PKG)_TEST_FILE := $(realpath $(wildcard $(TOP_DIR)/src/$(PKG)-test.*))))
-# include files from MXE_PLUGIN_DIRS, set *_MAKEFILE and `all-<plugin>` target
+# include files from MXE_PLUGIN_DIRS, set base filenames and `all-<plugin>` target
PLUGIN_FILES := $(realpath $(wildcard $(addsuffix /*.mk,$(MXE_PLUGIN_DIRS))))
PLUGIN_PKGS := $(basename $(notdir $(PLUGIN_FILES)))
$(foreach FILE,$(PLUGIN_FILES),\
- $(eval $(basename $(notdir $(FILE)))_MAKEFILE ?= $(FILE)) \
+ $(eval $(basename $(notdir $(FILE)))_MAKEFILE ?= $(FILE)) \
+ $(eval $(basename $(notdir $(FILE)))_TEST_FILE ?= $(wildcard $(basename $(FILE))-test.*)) \
$(eval all-$(lastword $(call split,/,$(dir $(FILE)))): $(basename $(notdir $(FILE)))))
include $(PLUGIN_FILES)
PKGS := $(sort $(PKGS) $(PLUGIN_PKGS))
@@ -525,6 +527,9 @@ build-only-$(1)_$(3): TARGET = $(3)
build-only-$(1)_$(3): BUILD_$(if $(findstring shared,$(3)),SHARED,STATIC) = TRUE
build-only-$(1)_$(3): LIB_SUFFIX = $(if $(findstring shared,$(3)),dll,a)
build-only-$(1)_$(3): BITS = $(if $(findstring x86_64,$(3)),64,32)
+build-only-$(1)_$(3): SOURCE_DIR = $(2)/$($(1)_SUBDIR)
+build-only-$(1)_$(3): BUILD_DIR = $(2)/$($(1)_SUBDIR).build_
+build-only-$(1)_$(3): TEST_FILE = $($(1)_TEST_FILE)
build-only-$(1)_$(3): CMAKE_RUNRESULT_FILE = $(PREFIX)/share/cmake/modules/TryRunResults.cmake
build-only-$(1)_$(3): CMAKE_TOOLCHAIN_FILE = $(PREFIX)/$(3)/share/cmake/mxe-conf.cmake
build-only-$(1)_$(3): CMAKE_TOOLCHAIN_DIR = $(PREFIX)/$(3)/share/cmake/mxe-conf.d
@@ -543,6 +548,8 @@ build-only-$(1)_$(3):
perl --version 2>&1 | head -3
rm -rf '$(2)'
mkdir -p '$(2)'
+ mkdir -p '$$(SOURCE_DIR)'
+ mkdir -p '$$(BUILD_DIR)'
# disable wine with readonly directory
# see https://github.com/mxe/mxe/issues/841
diff --git a/index.html b/index.html
index 902f94e..6f9feb4 100644
--- a/index.html
+++ b/index.html
@@ -1142,10 +1142,6 @@ local-pkg-list: $(LOCAL_PKG_LIST)</pre>
<td class="website"><a href="http://www.aubio.org/">aubio</a></td>
</tr>
<tr>
- <td class="package">db</td>
- <td class="website"><a href="http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/overview/index.html">Oracle Berkeley DB</a></td>
- </tr>
- <tr>
<td class="package">bfd</td>
<td class="website"><a href="https://www.gnu.org/software/binutils/">Binary File Descriptor library</a></td>
</tr>
@@ -1214,14 +1210,14 @@ local-pkg-list: $(LOCAL_PKG_LIST)</pre>
<td class="website"><a href="http://acoustid.org/chromaprint">Chromaprint</a></td>
</tr>
<tr>
- <td class="package">cloog</td>
- <td class="website"><a href="http://www.cloog.org/">CLooG Code Generator</a></td>
- </tr>
- <tr>
<td class="package">cimg</td>
<td class="website"><a href="http://cimg.eu/">CImg Library</a></td>
</tr>
<tr>
+ <td class="package">cloog</td>
+ <td class="website"><a href="http://www.cloog.org/">CLooG Code Generator</a></td>
+ </tr>
+ <tr>
<td class="package">cmake</td>
<td class="website"><a href="http://www.cmake.org/">cmake</a></td>
</tr>
@@ -1262,6 +1258,10 @@ local-pkg-list: $(LOCAL_PKG_LIST)</pre>
<td class="website"><a href="http://curl.haxx.se/libcurl/">cURL</a></td>
</tr>
<tr>
+ <td class="package">db</td>
+ <td class="website"><a href="http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/overview/index.html">Oracle Berkeley DB</a></td>
+ </tr>
+ <tr>
<td class="package">dbus</td>
<td class="website"><a href="http://dbus.freedesktop.org/">dbus</a></td>
</tr>
@@ -1866,14 +1866,14 @@ local-pkg-list: $(LOCAL_PKG_LIST)</pre>
<td class="website"><a href="http://www.libpng.org/">libpng</a></td>
</tr>
<tr>
- <td class="package">librsvg</td>
- <td class="website"><a href="http://librsvg.sourceforge.net/">librsvg</a></td>
- </tr>
- <tr>
<td class="package">librosco</td>
<td class="website"><a href="https://github.com/colinbourassa/librosco/">librosco</a></td>
</tr>
<tr>
+ <td class="package">librsvg</td>
+ <td class="website"><a href="http://librsvg.sourceforge.net/">librsvg</a></td>
+ </tr>
+ <tr>
<td class="package">librtmp</td>
<td class="website"><a href="http://rtmpdump.mplayerhq.hu/">librtmp</a></td>
</tr>
@@ -1998,6 +1998,10 @@ local-pkg-list: $(LOCAL_PKG_LIST)</pre>
<td class="website"><a href="http://sourceforge.net/projects/mdbtools/">mdbtools</a></td>
</tr>
<tr>
+ <td class="package">mingw-w64</td>
+ <td class="website"><a href="http://mingw-w64.sourceforge.net/">MinGW-w64 Runtime</a></td>
+ </tr>
+ <tr>
<td class="package">miniupnpc</td>
<td class="website"><a href="http://miniupnp.free.fr/">miniupnpc</a></td>
</tr>
@@ -2006,10 +2010,6 @@ local-pkg-list: $(LOCAL_PKG_LIST)</pre>
<td class="website"><a href="http://www.winimage.com/zLibDll/minizip.html">minizip</a></td>
</tr>
<tr>
- <td class="package">mingw-w64</td>
- <td class="website"><a href="http://mingw-w64.sourceforge.net/">MinGW-w64 Runtime</a></td>
- </tr>
- <tr>
<td class="package">mman-win32</td>
<td class="website"><a href="https://code.google.com/p/mman-win32/">MMA-Win32</a></td>
</tr>
@@ -2150,7 +2150,7 @@ local-pkg-list: $(LOCAL_PKG_LIST)</pre>
<td class="website"><a href="https://www.openssl.org/">openssl</a></td>
</tr>
<tr>
- <td class="package">openthreads</td>
+ <td class="package">openthreads</td>
<td class="website"><a href="http://www.openscenegraph.org/">OpenThreads</a></td>
</tr>
<tr>
@@ -2374,11 +2374,11 @@ local-pkg-list: $(LOCAL_PKG_LIST)</pre>
<td class="website"><a href="http://qt-project.org/">Qt</a></td>
</tr>
<tr>
- <td class="package">qtscxml</td>
+ <td class="package">qtscript</td>
<td class="website"><a href="http://qt-project.org/">Qt</a></td>
</tr>
<tr>
- <td class="package">qtscript</td>
+ <td class="package">qtscxml</td>
<td class="website"><a href="http://qt-project.org/">Qt</a></td>
</tr>
<tr>
@@ -2486,6 +2486,30 @@ local-pkg-list: $(LOCAL_PKG_LIST)</pre>
<td class="website"><a href="http://www.libsdl.org/">SDL</a></td>
</tr>
<tr>
+ <td class="package">sdl2</td>
+ <td class="website"><a href="http://www.libsdl.org/">SDL2</a></td>
+ </tr>
+ <tr>
+ <td class="package">sdl2_gfx</td>
+ <td class="website"><a href="http://www.ferzkopp.net/joomla/content/view/19/14/">SDL2_gfx</a></td>
+ </tr>
+ <tr>
+ <td class="package">sdl2_image</td>
+ <td class="website"><a href="http://www.libsdl.org/">SDL2_image</a></td>
+ </tr>
+ <tr>
+ <td class="package">sdl2_mixer</td>
+ <td class="website"><a href="http://www.libsdl.org/">SDL2_mixer</a></td>
+ </tr>
+ <tr>
+ <td class="package">sdl2_net</td>
+ <td class="website"><a href="http://www.libsdl.org/">sdl2_net</a></td>
+ </tr>
+ <tr>
+ <td class="package">sdl2_ttf</td>
+ <td class="website"><a href="http://www.libsdl.org/">SDL2_ttf</a></td>
+ </tr>
+ <tr>
<td class="package">sdl_gfx</td>
<td class="website"><a href="http://www.ferzkopp.net/joomla/content/view/19/14/">SDL_gfx</a></td>
</tr>
@@ -2518,30 +2542,6 @@ local-pkg-list: $(LOCAL_PKG_LIST)</pre>
<td class="website"><a href="http://www.libsdl.org/projects/SDL_ttf/">SDL_ttf</a></td>
</tr>
<tr>
- <td class="package">sdl2</td>
- <td class="website"><a href="http://www.libsdl.org/">SDL2</a></td>
- </tr>
- <tr>
- <td class="package">sdl2_gfx</td>
- <td class="website"><a href="http://www.ferzkopp.net/joomla/content/view/19/14/">SDL2_gfx</a></td>
- </tr>
- <tr>
- <td class="package">sdl2_image</td>
- <td class="website"><a href="http://www.libsdl.org/">SDL2_image</a></td>
- </tr>
- <tr>
- <td class="package">sdl2_mixer</td>
- <td class="website"><a href="http://www.libsdl.org/">SDL2_mixer</a></td>
- </tr>
- <tr>
- <td class="package">sdl2_net</td>
- <td class="website"><a href="http://www.libsdl.org/">sdl2_net</a></td>
- </tr>
- <tr>
- <td class="package">sdl2_ttf</td>
- <td class="website"><a href="http://www.libsdl.org/">SDL2_ttf</a></td>
- </tr>
- <tr>
<td class="package">sfml</td>
<td class="website"><a href="http://www.sfml-dev.org/">SFML</a></td>
</tr>
@@ -2574,14 +2574,14 @@ local-pkg-list: $(LOCAL_PKG_LIST)</pre>
<td class="website"><a href="http://www.sqlite.org/">SQLite</a></td>
</tr>
<tr>
- <td class="package">suitesparse</td>
- <td class="website"><a href="http://www.cise.ufl.edu/research/sparse/SuiteSparse/">SuiteSparse</a></td>
- </tr>
- <tr>
<td class="package">subversion</td>
<td class="website"><a href="http://subversion.apache.org">subversion</a></td>
</tr>
<tr>
+ <td class="package">suitesparse</td>
+ <td class="website"><a href="http://www.cise.ufl.edu/research/sparse/SuiteSparse/">SuiteSparse</a></td>
+ </tr>
+ <tr>
<td class="package">t4k_common</td>
<td class="website"><a href="http://tux4kids.alioth.debian.org/">t4k_common</a></td>
</tr>
@@ -2734,6 +2734,10 @@ local-pkg-list: $(LOCAL_PKG_LIST)</pre>
<td class="website"><a href="http://www.xvid.org/">xvidcore</a></td>
</tr>
<tr>
+ <td class="package">xxhash</td>
+ <td class="website"><a href="http://cyan4973.github.io/xxHash/">xxHash</a></td>
+ </tr>
+ <tr>
<td class="package">xz</td>
<td class="website"><a href="http://tukaani.org/xz/">XZ</a></td>
</tr>
@@ -2749,10 +2753,6 @@ local-pkg-list: $(LOCAL_PKG_LIST)</pre>
<td class="package">zziplib</td>
<td class="website"><a href="http://zziplib.sourceforge.net/">ZZIPlib</a></td>
</tr>
- <tr>
- <td class="package">xxhash</td>
- <td class="website"><a href="http://cyan4973.github.io/xxHash/">xxHash</a></td>
- </tr>
</table>
<script>
@@ -2913,6 +2913,15 @@ local-pkg-list: $(LOCAL_PKG_LIST)</pre>
The <a href="doc/gmsl.html">GNU Make Standard Library</a> is also
available (though it should be unnecessary for most packages).
</p>
+
+ <p>
+ Alternatively you can use tool <code>tools/skeleton.py</code> to
+ create a skeleton of new MXE package. It fills most of the fields
+ of <code>.mk</code> file automatically and supports typical
+ build scenarios through option <code>--builder</code>. It also
+ adds a package to the <a href="#packages">list of packages</a>
+ (see below).
+ </p>
</li>
<li>
diff --git a/tools/skeleton.py b/tools/skeleton.py
new file mode 100755
index 0000000..e7857a3
--- /dev/null
+++ b/tools/skeleton.py
@@ -0,0 +1,283 @@
+#!/usr/bin/env python
+
+""" Create a skeleton of new MXE package.
+
+This file is part of MXE.
+See index.html for further information.
+"""
+
+import argparse
+import hashlib
+import os
+import re
+import shutil
+import subprocess
+import tempfile
+try:
+ import urllib2
+except:
+ # Python 3
+ import urllib.request as urllib2
+
+MK_TEMPLATE = r'''
+# This file is part of MXE.
+# See index.html for further information.
+
+PKG := %(name)s
+$(PKG)_IGNORE :=
+$(PKG)_VERSION := %(version)s
+$(PKG)_CHECKSUM := %(checksum)s
+$(PKG)_SUBDIR := %(subdir_template)s
+$(PKG)_FILE := %(filename_template)s
+$(PKG)_URL := %(file_url_template)s
+$(PKG)_DEPS := gcc
+
+define $(PKG)_UPDATE
+ echo 'TODO: write update script for %(name)s.' >&2;
+ echo $(%(name)s_VERSION)
+endef
+
+define $(PKG)_BUILD
+ %(build)s
+endef
+'''
+
+CMAKE_BUILD = r'''
+ # build and install the library
+ cd '$(BUILD_DIR)' && $(TARGET)-cmake \
+ '$(SOURCE_DIR)'
+ $(MAKE) -C '$(BUILD_DIR)' -j '$(JOBS)'
+ $(MAKE) -C '$(BUILD_DIR)' -j 1 install
+'''
+
+AUTOTOOLS_BUILD = r'''
+ # build and install the library
+ cd '$(BUILD_DIR)' && $(SOURCE_DIR)/configure \
+ $(MXE_CONFIGURE_OPTS)
+ $(MAKE) -C '$(BUILD_DIR)' -j '$(JOBS)'
+ $(MAKE) -C '$(BUILD_DIR)' -j 1 install \
+ bin_PROGRAMS= \
+ sbin_PROGRAMS= \
+ noinst_PROGRAMS=
+'''
+
+MAKE_BUILD = r'''
+ # build and install the library
+ $(MAKE) -C '$(SOURCE_DIR)' -j '$(JOBS)'
+ $(MAKE) -C '$(SOURCE_DIR)' -j 1 install
+'''
+
+BUILDERS = {
+ 'autotools': AUTOTOOLS_BUILD,
+ 'make': MAKE_BUILD,
+ 'cmake': CMAKE_BUILD,
+}
+
+PC_AND_TEST = r'''
+ # create pkg-config files
+ $(INSTALL) -d '$(PREFIX)/$(TARGET)/lib/pkgconfig'
+ (echo 'Name: $(PKG)'; \
+ echo 'Version: $($(PKG)_VERSION)'; \
+ echo 'Description: %(description)s'; \
+ echo 'Libs: -l%(libname)s';) \
+ > '$(PREFIX)/$(TARGET)/lib/pkgconfig/$(PKG).pc'
+
+ # compile test
+ '$(TARGET)-gcc' \
+ -W -Wall -Werror -ansi -pedantic \
+ '$(TEST_FILE)' -o '$(PREFIX)/$(TARGET)/bin/test-$(PKG).exe' \
+ `'$(TARGET)-pkg-config' $(PKG) --cflags --libs`
+'''
+
+def get_filename(file_url):
+ return file_url.rsplit('/', 1)[1]
+
+def deduce_version(file_url):
+ filename = get_filename(file_url)
+ return re.search(r'\d[\d.-_]+\d|\d', filename).group()
+
+def deduce_website(file_url):
+ return file_url.split('://', 1)[1].split('/', 1)[0]
+
+def download_file(destination, url):
+ with open(destination, 'wb') as d:
+ request = urllib2.urlopen(url)
+ shutil.copyfileobj(request, d)
+ request.close()
+
+def make_checksum(filepath):
+ hasher = hashlib.sha256()
+ with open(filepath, 'rb') as f:
+ for chunk in iter(lambda: f.read(1024 ** 2), b''):
+ hasher.update(chunk)
+ return hasher.hexdigest()
+
+def deduce_subdir(archive):
+ args = ['tar', '-tf', archive]
+ tar = subprocess.Popen(args, stdout=subprocess.PIPE)
+ output = tar.communicate()[0]
+ if not isinstance(output, str):
+ # Python 3
+ output = output.decode()
+ files = output.strip().split('\n')
+ first_file = files[0].strip()
+ directory = first_file.split('/', 1)[0]
+ return directory
+
+def make_build(options, builder):
+ commands_template = BUILDERS[builder].lstrip() + PC_AND_TEST.rstrip()
+ return commands_template % options
+
+def update_index_html(name, description, website):
+ # read HTML and find a list of packages
+ with open('index.html', 'rb') as f:
+ index_html = f.read()
+ if not isinstance(index_html, str):
+ # Python 3
+ index_html = index_html.decode()
+ sep1 = ' <table id="package-list" class="old">'
+ sep2 = ' </table>'
+ (prefix, other) = index_html.split(sep1, 1)
+ (packages_html, suffix) = other.split(sep2, 1)
+ # find existing packages
+ pkg_re = r'''
+ <tr>
+ <td class="package">(?P<name>.*)</td>
+ <td class="website"><a href="(?P<website>.*)">(?P<description>.*)</a></td>
+ </tr>
+ '''.strip()
+ packages = [
+ {
+ 'name': match.group('name'),
+ 'description': match.group('description'),
+ 'website': match.group('website'),
+ }
+ for match in re.finditer(pkg_re, packages_html)
+ ]
+ packages.append({
+ 'name': name,
+ 'description': description,
+ 'website': website,
+ })
+ packages.sort(key=lambda package: package['name'])
+ pkg_template = r'''
+ <tr>
+ <td class="package">%(name)s</td>
+ <td class="website"><a href="%(website)s">%(description)s</a></td>
+ </tr>
+ '''.rstrip()
+ packages_html = ''.join(pkg_template % package for package in packages)
+ packages_html += '\n'
+ # build and write HTML
+ index_html = prefix + sep1 + packages_html + sep2 + suffix
+ (_, tmp_index_html) = tempfile.mkstemp()
+ with open(tmp_index_html, 'wt') as f:
+ f.write(index_html)
+ os.rename(tmp_index_html, 'index.html')
+
+def make_skeleton(
+ name,
+ description,
+ file_url,
+ version,
+ subdir,
+ website,
+ builder,
+):
+ mk_filename = 'src/%s.mk' % name
+ if os.path.isfile(mk_filename):
+ raise Exception('File %s exists!' % mk_filename)
+ if description is None:
+ description = name
+ if version is None:
+ version = deduce_version(file_url)
+ if website is None:
+ website = deduce_website(file_url)
+ with tempfile.NamedTemporaryFile() as pkg_file:
+ download_file(pkg_file.name, file_url)
+ checksum = make_checksum(pkg_file.name)
+ if subdir is None:
+ subdir = deduce_subdir(pkg_file.name)
+ filename = get_filename(file_url)
+ filename_template = filename.replace(version, '$($(PKG)_VERSION)')
+ file_url_template = file_url.replace(version, '$($(PKG)_VERSION)')
+ subdir_template = subdir.replace(version, '$($(PKG)_VERSION)')
+ libname = name
+ if libname.startswith('lib'):
+ libname = libname[3:]
+ with open(mk_filename, 'wt') as mk:
+ options = {
+ 'name': name,
+ 'description': description,
+ 'libname': libname,
+ 'website': website,
+ 'file_url_template': file_url_template,
+ 'checksum': checksum,
+ 'version': version,
+ 'subdir_template': subdir_template,
+ 'filename_template': filename_template,
+ }
+ options['build'] = make_build(options, builder)
+ mk.write(MK_TEMPLATE.lstrip() % options)
+ update_index_html(name, description, website)
+
+def main():
+ parser = argparse.ArgumentParser(
+ description=__doc__,
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter,
+ )
+ parser.add_argument(
+ '--name',
+ type=str,
+ help='Package name',
+ required=True,
+ )
+ parser.add_argument(
+ '--file-url',
+ type=str,
+ help='URL with file of package',
+ required=True,
+ )
+ parser.add_argument(
+ '--description',
+ type=str,
+ help='Package description (defaults to name)',
+ required=False,
+ )
+ parser.add_argument(
+ '--version',
+ type=str,
+ help='Package version (can be deduced from file)',
+ required=False,
+ )
+ parser.add_argument(
+ '--subdir',
+ type=str,
+ help='Package subdir (can be deduced from file)',
+ required=False,
+ )
+ parser.add_argument(
+ '--website',
+ type=str,
+ help='Package website (defaults to domain of file)',
+ required=False,
+ )
+ parser.add_argument(
+ '--builder',
+ choices=sorted(BUILDERS.keys()),
+ help='Template of $(PKG)_BUILD',
+ default='autotools',
+ )
+ args = parser.parse_args()
+ make_skeleton(
+ args.name,
+ args.description,
+ args.file_url,
+ args.version,
+ args.subdir,
+ args.website,
+ args.builder,
+ )
+
+if __name__ == '__main__':
+ main()