From 7acf243286c74a67a0a3a80faff38572d430f160 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Mon, 30 Jun 2014 14:41:57 -0400 Subject: [PATCH] Make GYP work on Haiku. --- gyptest.py | 1 + pylib/gyp/common.py | 7 +++++-- pylib/gyp/generator/make.py | 13 ++++++++++++ pylib/gyp/haiku_tool.py | 49 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 pylib/gyp/haiku_tool.py diff --git a/gyptest.py b/gyptest.py index 8f3ee0f..88125b0 100755 --- a/gyptest.py +++ b/gyptest.py @@ -225,6 +225,7 @@ def main(argv=None): 'linux2': ['make', 'ninja'], 'linux3': ['make', 'ninja'], 'darwin': ['make', 'ninja', 'xcode'], + 'haiku1': ['make'], }[sys.platform] for format in format_list: diff --git a/pylib/gyp/common.py b/pylib/gyp/common.py index df71d97..8f2d888 100644 --- a/pylib/gyp/common.py +++ b/pylib/gyp/common.py @@ -420,12 +420,14 @@ def GetFlavor(params): return 'openbsd' if sys.platform.startswith('aix'): return 'aix' + if sys.platform.startswith('haiku'): + return 'haiku' return 'linux' def CopyTool(flavor, out_path): - """Finds (flock|mac|win)_tool.gyp in the gyp directory and copies it + """Finds (flock|mac|win|haiku)_tool.gyp in the gyp directory and copies it to |out_path|.""" # aix and solaris just need flock emulation. mac and win use more complicated # support scripts. @@ -433,7 +435,8 @@ def CopyTool(flavor, out_path): 'aix': 'flock', 'solaris': 'flock', 'mac': 'mac', - 'win': 'win' + 'win': 'win', + 'haiku': 'haiku', }.get(flavor, None) if not prefix: return diff --git a/pylib/gyp/generator/make.py b/pylib/gyp/generator/make.py index 8c31d10..a7db337 100644 --- a/pylib/gyp/generator/make.py +++ b/pylib/gyp/generator/make.py @@ -505,6 +505,13 @@ quiet_cmd_infoplist = INFOPLIST $@ cmd_infoplist = $(CC.$(TOOLSET)) -E -P -Wno-trigraphs -x c $(INFOPLIST_DEFINES) "$<" -o "$@" """ +SHARED_HEADER_HAIKU_COMMANDS = """ +# gyp-haiku-tool is written next to the root Makefile by gyp. +# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd +# already. +quiet_cmd_haiku_tool = HAIKUTOOL $(4) $< +cmd_haiku_tool = ./gyp-haiku-tool $(4) $< "$@" +""" def WriteRootHeaderSuffixRules(writer): extensions = sorted(COMPILABLE_EXTENSIONS.keys(), key=str.lower) @@ -2056,6 +2063,12 @@ def GenerateOutput(target_list, target_dicts, data, params): 'flock': './gyp-flock-tool flock', 'flock_index': 2, }) + elif flavor == 'haiku': + header_params.update({ + 'flock': './gyp-haiku-tool flock', + 'flock_index': 2, + 'extra_commands': SHARED_HEADER_HAIKU_COMMANDS, + }) header_params.update({ 'CC.target': GetEnvironFallback(('CC_target', 'CC'), '$(CC)'), diff --git a/pylib/gyp/haiku_tool.py b/pylib/gyp/haiku_tool.py new file mode 100644 index 0000000..cf23ca5 --- /dev/null +++ b/pylib/gyp/haiku_tool.py @@ -0,0 +1,49 @@ +#!python +# Copyright (c) 2011 Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""These functions are executed via gyp-haiku-tool when using the Makefile +generator.""" + +import fcntl +import os +import struct +import subprocess +import sys + + +def main(args): + executor = HaikuTool() + executor.Dispatch(args) + + +class HaikuTool(object): + """This class performs all the Haiku tooling steps. The methods can either be + executed directly, or dispatched from an argument list.""" + + def Dispatch(self, args): + """Dispatches a string command to a method.""" + if len(args) < 1: + raise Exception("Not enough arguments") + + method = "Exec%s" % self._CommandifyName(args[0]) + getattr(self, method)(*args[1:]) + + def _CommandifyName(self, name_string): + """Transforms a tool name like copy-info-plist to CopyInfoPlist""" + return name_string.title().replace('-', '') + + def ExecFlock(self, lockfile, *cmd_list): + """Emulates the most basic behavior of Linux's flock(1).""" + # Rely on exception handling to report errors. + fd = os.open(lockfile, os.O_RDONLY|os.O_NOCTTY|os.O_CREAT, 0o666) + fcntl.flock(fd, fcntl.LOCK_EX) + ret = subprocess.call(cmd_list) + # Haiki bug -- lock is not released on file close? + fcntl.flock(fd, fcntl.LOCK_UN) + return ret + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) -- 1.8.3.4