 1ef08e341f
			
		
	
	
		1ef08e341f
		
	
	
	
	
		
			
			Instead of using a static file (error prone and hard to keep in sync), we generate it using a script. Note: if a symbol is not exported, we'll now notice it when linking for Windows/MacOS platforms. Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Message-Id: <20241112212622.3590693-3-pierrick.bouvier@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20241121165806.476008-37-alex.bennee@linaro.org>
		
			
				
	
	
		
			46 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python3
 | |
| # -*- coding: utf-8 -*-
 | |
| #
 | |
| # Extract QEMU Plugin API symbols from a header file
 | |
| #
 | |
| # Copyright 2024 Linaro Ltd
 | |
| #
 | |
| # Author: Pierrick Bouvier <pierrick.bouvier@linaro.org>
 | |
| #
 | |
| # This work is licensed under the terms of the GNU GPL, version 2 or later.
 | |
| # See the COPYING file in the top-level directory.
 | |
| #
 | |
| # SPDX-License-Identifier: GPL-2.0-or-later
 | |
| 
 | |
| import argparse
 | |
| import re
 | |
| 
 | |
| def extract_symbols(plugin_header):
 | |
|     with open(plugin_header) as file:
 | |
|         content = file.read()
 | |
|     # Remove QEMU_PLUGIN_API macro definition.
 | |
|     content = content.replace('#define QEMU_PLUGIN_API', '')
 | |
|     expected = content.count('QEMU_PLUGIN_API')
 | |
|     # Find last word between QEMU_PLUGIN_API and (, matching on several lines.
 | |
|     # We use *? non-greedy quantifier.
 | |
|     syms = re.findall(r'QEMU_PLUGIN_API.*?(\w+)\s*\(', content, re.DOTALL)
 | |
|     syms.sort()
 | |
|     # Ensure we found as many symbols as API markers.
 | |
|     assert len(syms) == expected
 | |
|     return syms
 | |
| 
 | |
| def main() -> None:
 | |
|     parser = argparse.ArgumentParser(description='Extract QEMU plugin symbols')
 | |
|     parser.add_argument('plugin_header', help='Path to QEMU plugin header.')
 | |
|     args = parser.parse_args()
 | |
| 
 | |
|     syms = extract_symbols(args.plugin_header)
 | |
| 
 | |
|     print('{')
 | |
|     for s in syms:
 | |
|         print("  {};".format(s))
 | |
|     print('};')
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     main()
 |