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