]>
Commit | Line | Data |
---|---|---|
1 | ## @file\r | |
2 | # Run a makefile as part of a PREBUILD or POSTBUILD action.\r | |
3 | #\r | |
4 | # Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>\r | |
5 | # SPDX-License-Identifier: BSD-2-Clause-Patent\r | |
6 | #\r | |
7 | \r | |
8 | '''\r | |
9 | RunMakefile.py\r | |
10 | '''\r | |
11 | \r | |
12 | import os\r | |
13 | import sys\r | |
14 | import argparse\r | |
15 | import subprocess\r | |
16 | \r | |
17 | #\r | |
18 | # Globals for help information\r | |
19 | #\r | |
20 | __prog__ = 'RunMakefile'\r | |
21 | __version__ = '%s Version %s' % (__prog__, '1.0')\r | |
22 | __copyright__ = 'Copyright (c) 2017, Intel Corporation. All rights reserved.'\r | |
23 | __description__ = 'Run a makefile as part of a PREBUILD or POSTBUILD action.\n'\r | |
24 | \r | |
25 | #\r | |
26 | # Globals\r | |
27 | #\r | |
28 | gArgs = None\r | |
29 | \r | |
30 | def Log(Message):\r | |
31 | if not gArgs.Verbose:\r | |
32 | return\r | |
33 | sys.stdout.write (__prog__ + ': ' + Message + '\n')\r | |
34 | \r | |
35 | def Error(Message, ExitValue=1):\r | |
36 | sys.stderr.write (__prog__ + ': ERROR: ' + Message + '\n')\r | |
37 | sys.exit (ExitValue)\r | |
38 | \r | |
39 | def RelativePath(target):\r | |
40 | return os.path.relpath (target, gWorkspace)\r | |
41 | \r | |
42 | def NormalizePath(target):\r | |
43 | if isinstance(target, tuple):\r | |
44 | return os.path.normpath (os.path.join (*target))\r | |
45 | else:\r | |
46 | return os.path.normpath (target)\r | |
47 | \r | |
48 | if __name__ == '__main__':\r | |
49 | #\r | |
50 | # Create command line argument parser object\r | |
51 | #\r | |
52 | parser = argparse.ArgumentParser (\r | |
53 | prog = __prog__,\r | |
54 | version = __version__,\r | |
55 | description = __description__ + __copyright__,\r | |
56 | conflict_handler = 'resolve'\r | |
57 | )\r | |
58 | parser.add_argument (\r | |
59 | '-a', '--arch', dest = 'Arch', nargs = '+', action = 'append',\r | |
60 | required = True,\r | |
61 | help = '''ARCHS is one of list: IA32, X64, IPF, ARM, AARCH64 or EBC,\r | |
62 | which overrides target.txt's TARGET_ARCH definition. To\r | |
63 | specify more archs, please repeat this option.'''\r | |
64 | )\r | |
65 | parser.add_argument (\r | |
66 | '-t', '--tagname', dest = 'ToolChain', required = True,\r | |
67 | help = '''Using the Tool Chain Tagname to build the platform,\r | |
68 | overriding target.txt's TOOL_CHAIN_TAG definition.'''\r | |
69 | )\r | |
70 | parser.add_argument (\r | |
71 | '-p', '--platform', dest = 'PlatformFile', required = True,\r | |
72 | help = '''Build the platform specified by the DSC file name argument,\r | |
73 | overriding target.txt's ACTIVE_PLATFORM definition.'''\r | |
74 | )\r | |
75 | parser.add_argument (\r | |
76 | '-b', '--buildtarget', dest = 'BuildTarget', required = True,\r | |
77 | help = '''Using the TARGET to build the platform, overriding\r | |
78 | target.txt's TARGET definition.'''\r | |
79 | )\r | |
80 | parser.add_argument (\r | |
81 | '--conf=', dest = 'ConfDirectory', required = True,\r | |
82 | help = '''Specify the customized Conf directory.'''\r | |
83 | )\r | |
84 | parser.add_argument (\r | |
85 | '-D', '--define', dest = 'Define', nargs='*', action = 'append',\r | |
86 | help = '''Macro: "Name [= Value]".'''\r | |
87 | )\r | |
88 | parser.add_argument (\r | |
89 | '--makefile', dest = 'Makefile', required = True,\r | |
90 | help = '''Makefile to run passing in arguments as makefile defines.'''\r | |
91 | )\r | |
92 | parser.add_argument (\r | |
93 | '-v', '--verbose', dest = 'Verbose', action = 'store_true',\r | |
94 | help = '''Turn on verbose output with informational messages printed'''\r | |
95 | )\r | |
96 | \r | |
97 | #\r | |
98 | # Parse command line arguments\r | |
99 | #\r | |
100 | gArgs, remaining = parser.parse_known_args()\r | |
101 | gArgs.BuildType = 'all'\r | |
102 | for BuildType in ['all', 'fds', 'genc', 'genmake', 'clean', 'cleanall', 'modules', 'libraries', 'run']:\r | |
103 | if BuildType in remaining:\r | |
104 | gArgs.BuildType = BuildType\r | |
105 | remaining.remove(BuildType)\r | |
106 | break\r | |
107 | gArgs.Remaining = ' '.join(remaining)\r | |
108 | \r | |
109 | #\r | |
110 | # Start\r | |
111 | #\r | |
112 | Log ('Start')\r | |
113 | \r | |
114 | #\r | |
115 | # Find makefile in WORKSPACE or PACKAGES_PATH\r | |
116 | #\r | |
117 | PathList = ['']\r | |
118 | try:\r | |
119 | PathList.append(os.environ['WORKSPACE'])\r | |
120 | except:\r | |
121 | Error ('WORKSPACE environment variable not set')\r | |
122 | try:\r | |
123 | PathList += os.environ['PACKAGES_PATH'].split(os.pathsep)\r | |
124 | except:\r | |
125 | pass\r | |
126 | for Path in PathList:\r | |
127 | Makefile = NormalizePath((Path, gArgs.Makefile))\r | |
128 | if os.path.exists (Makefile):\r | |
129 | break\r | |
130 | if not os.path.exists(Makefile):\r | |
131 | Error ('makefile %s not found' % (gArgs.Makefile))\r | |
132 | \r | |
133 | #\r | |
134 | # Build command line arguments converting build arguments to makefile defines\r | |
135 | #\r | |
136 | CommandLine = [Makefile]\r | |
137 | CommandLine.append('TARGET_ARCH="%s"' % (' '.join([Item[0] for Item in gArgs.Arch])))\r | |
138 | CommandLine.append('TOOL_CHAIN_TAG="%s"' % (gArgs.ToolChain))\r | |
139 | CommandLine.append('TARGET="%s"' % (gArgs.BuildTarget))\r | |
140 | CommandLine.append('ACTIVE_PLATFORM="%s"' % (gArgs.PlatformFile))\r | |
141 | CommandLine.append('CONF_DIRECTORY="%s"' % (gArgs.ConfDirectory))\r | |
142 | if gArgs.Define:\r | |
143 | for Item in gArgs.Define:\r | |
144 | if '=' not in Item[0]:\r | |
145 | continue\r | |
146 | Item = Item[0].split('=', 1)\r | |
147 | CommandLine.append('%s="%s"' % (Item[0], Item[1]))\r | |
148 | CommandLine.append('EXTRA_FLAGS="%s"' % (gArgs.Remaining))\r | |
149 | CommandLine.append(gArgs.BuildType)\r | |
150 | if sys.platform == "win32":\r | |
151 | CommandLine = 'nmake /f %s' % (' '.join(CommandLine))\r | |
152 | else:\r | |
153 | CommandLine = 'make -f %s' % (' '.join(CommandLine))\r | |
154 | \r | |
155 | #\r | |
156 | # Run the makefile\r | |
157 | #\r | |
158 | try:\r | |
159 | Process = subprocess.Popen(CommandLine, shell=True)\r | |
160 | except:\r | |
161 | Error ('make command not available. Please verify PATH')\r | |
162 | Process.communicate()\r | |
163 | \r | |
164 | #\r | |
165 | # Done\r | |
166 | #\r | |
167 | Log ('Done')\r | |
168 | \r | |
169 | #\r | |
170 | # Return status from running the makefile\r | |
171 | #\r | |
172 | sys.exit(Process.returncode)\r |