Index: build/mac/make_ib_classes.py |
=================================================================== |
--- build/mac/make_ib_classes.py (revision 10642) |
+++ build/mac/make_ib_classes.py (working copy) |
@@ -1,146 +0,0 @@ |
-#!/usr/bin/python |
- |
-# Copyright (c) 2009 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-# Usage: make_ib_classes.py output.mm input.xib [...] |
-# |
-# Generates an Objective-C++ file at output.mm referencing each class described |
-# in input.xib. |
-# |
-# This script is useful when building an application containing .nib or .xib |
-# files that reference Objective-C classes that may not be referenced by other |
-# code in the application. The intended use case is when the .nib and .xib |
-# files refer to classes that are built into a static library that gets linked |
-# into the main executable. If nothing in the main executable references those |
-# classes, the linker will not include them in its output (without -all_load or |
-# -ObjC). Using this script, references to such classes are created, such that |
Mark Mentovai
2009/02/28 00:50:12
See?
|
-# if output.mm is compiled into the application itself, it will provide the |
-# class references and cause the linker to bring the required code into the |
-# executable. |
-# |
-# If your application is structured in the above way, and you're plagued with |
-# messages like: |
-# app[12345:101] Unknown class `MyApp' in nib file, using `NSObject' instead. |
-# then this script may be right for you. |
- |
- |
-import errno |
-import os |
-import os.path |
-import re |
-import subprocess |
-import sys |
- |
- |
-# Patterns used by ListIBClasses |
- |
-# A pattern that matches the line preceding a class name. |
-_class_re = re.compile('<key>class</key>$') |
- |
-# A pattern that matches the line with a class name; match group 1 should be |
-# the class name. |
-_class_name_re = re.compile('<string>(.*)</string>$') |
- |
-# A pattern that matches class names to exclude from the output. This includes |
-# various Cocoa classes. |
-_forbidden_class_re = re.compile('^(NS|IB|FirstResponder$|WebView$)') |
- |
-def ListIBClasses(ib_path, class_names=None): |
- """Returns a list of class names referenced by ib_path. |
- |
- ib_path is a path to an Interface Builder document. It may be a .nib or a |
- .xib. |
- |
- This function calls "ibtool --classes" to get the list of class names. |
- ibtool's output is in XML plist format. Rather than doing proper structured |
- plist scanning, this function relies on the fact that plists are serialized |
- to XML in a consistent way, and simply takes the string value names of any |
- dictionary key named "class" as class names. |
- |
- class_names may be specified as an existing list to use. This is helpful |
- when this function will be called several times for multiple nib/xib files. |
- """ |
- if class_names == None: |
- class_names = [] |
- |
- # When running within an Xcode build, use the tools from that Xcode |
- # installation. |
- developer_tools_dir = os.getenv('DEVELOPER_BIN_DIR', '/usr/bin') |
- ibtool_path = os.path.join(developer_tools_dir, 'ibtool') |
- ibtool_command = [ibtool_path, '--classes', ib_path] |
- |
- ibtool = subprocess.Popen(ibtool_command, stdout=subprocess.PIPE) |
- |
- ibtool_output = ibtool.communicate()[0] |
- |
- ibtool_rv = ibtool.returncode |
- assert ibtool_rv == 0 |
- |
- # Loop through the output, looking for "class" keys. The string value on |
- # any line following a "class" key is taken as a class name. |
- is_class_name = False |
- for line in ibtool_output.splitlines(): |
- if is_class_name: |
- class_name = _class_name_re.search(line).group(1) |
- is_class_name = False |
- if not class_name in class_names and \ |
- not _forbidden_class_re.search(class_name): |
- class_names.append(class_name) |
- elif _class_re.search(line): |
- is_class_name = True |
- |
- return class_names |
- |
- |
-def main(args): |
- assert len(args) > 2 |
- (script_path, output_path) = args[0:2] |
- assert output_path.endswith('.mm') |
- input_paths = args[2:] |
- |
- try: |
- os.unlink(output_path) |
- except OSError, e: |
- if e.errno != errno.ENOENT: |
- raise |
- |
- class_names = [] |
- |
- # Get the class names for all desired files. |
- for input_path in input_paths: |
- ListIBClasses(input_path, class_names) |
- |
- class_names.sort() |
- |
- # Write the requested output file. Each class is referenced simply by |
- # calling its +class function. In order to do this, each class needs a |
- # bogus @interface to tell the compiler that it's an NSObject subclass. |
- # #import NSObject.h to get the definition of NSObject without bringing in |
- # other headers that might provide real declarations. |
- |
- output_file = open(output_path, 'w') |
- print >>output_file, \ |
-"""// This file was generated by %s. Do not edit. |
- |
-#import <Foundation/NSObject.h> |
-""" % os.path.basename(script_path) |
- |
- for class_name in class_names: |
- print >>output_file, '@interface %s : NSObject\n@end' % class_name |
- |
- print >>output_file, '\nnamespace {\n\nvoid IBClasses() {' |
- |
- for class_name in class_names: |
- print >>output_file, ' [%s class];' % class_name |
- |
- print >>output_file, '}\n\n} // namespace' |
- |
- output_file.close() |
- |
- return 0 |
- |
- |
-if __name__ == '__main__': |
- sys.exit(main(sys.argv)) |