blob: eafd7a11cbbd6193f57a825785f2439a3280326a [file] [log] [blame]
#!/usr/bin/env python3
# Copyright 2023 The SwiftShader Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import contextlib
import os
import sys
from string import Template
## Generates `CMakeLists.txt`, `Android.bp`, and `BUILD.gn`
CMAKE_TEMPLATE_PATH = "template_CMakeLists.txt"
DESTINATION_CMAKELISTS_PATH = "../CMakeLists.txt"
ANDROID_BP_TEMPLATE_PATH = "template_Android.bp"
DESTINATION_ANDROID_BP_PATH = "../Android.bp"
BUILD_GN_TEMPLATE_PATH = "template_BUILD.gn"
DESTINATION_BUILD_GN_PATH = "../BUILD.gn"
# This custom template class changes the delimiter from '$' to
# '%$%'.
# This is needed because CMake build files use '$' extensively.
class CustomTemplate(Template):
delimiter = '%$%'
@contextlib.contextmanager
def pushd(new_dir):
previous_dir = os.getcwd()
os.chdir(new_dir)
try:
yield
finally:
os.chdir(previous_dir)
# Returns a list of all the .cpp and .c files in the CWD.
def list_all_potentially_compiled_files():
all_files = []
for root, sub_folders, files in os.walk("."):
for file in files:
file_path = os.path.join(root,file)
extensions = os.path.splitext(file_path)
if extensions[1] == ".cpp" or extensions[1] == ".c":
assert(file_path[0] == '.')
# Trim the leading '.' out of the path.
all_files.append(file_path[1:])
all_files.sort()
return all_files
# Returns the subset of `files` that do no starts with `banned_prefixes`
def exclude_files_with_prefixes(files, banned_prefixes):
result = []
for f in files:
file_start_with_banned_prefix = False
for prefix in banned_prefixes:
if f.startswith(prefix):
file_start_with_banned_prefix = True
break
if not file_start_with_banned_prefix:
result.append(f)
return result
# Returns the subset of `files` that starts `needed_prefix`
def keep_files_with_prefix(files, needed_prefix):
result = []
for f in files:
if f.startswith(needed_prefix):
result.append(f)
return result
# Get all the files
with pushd("../llvm"):
all_files = list_all_potentially_compiled_files()
# Split the `all_files`` in several groups
# LLVM common files
prefixes_of_files_not_needed_by_llvm = [
# The following is a list of files and directories that were
# removed during the process of making llvm 16 build.
"/lib/DebugInfo/PDB/DIA/",
"/lib/ExecutionEngine/OProfileJIT/OProfileWrapper.cpp",
"/lib/ExecutionEngine/IntelJITEvents/IntelJITEventListener.cpp",
"/lib/ExecutionEngine/PerfJITEvents/PerfJITEventListener.cpp",
"/lib/ExecutionEngine/OProfileJIT",
"/lib/Frontend/OpenACC/",
"/lib/ObjCopy/",
"/lib/Support/BLAKE3/",
"/lib/Target/",
"/lib/Testing/",
"/lib/ToolDrivers/llvm-lib/LibDriver.cpp",
"/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp",
"/lib/WindowsManifest/WindowsManifestMerger.cpp",
# The following is a list of files and directories founds by running
# build/strip_cmakelists.sh on a build that uses CMakeLists.txt.
# The files removed were copied here.
"/lib/Analysis/AliasAnalysisSummary.cpp",
"/lib/Analysis/Analysis.cpp",
"/lib/Analysis/DevelopmentModeInlineAdvisor.cpp",
"/lib/Analysis/DomPrinter.cpp",
"/lib/Analysis/Interval.cpp",
"/lib/Analysis/IntervalPartition.cpp",
"/lib/Analysis/MLInlineAdvisor.cpp",
"/lib/Analysis/MemDepPrinter.cpp",
"/lib/Analysis/ModelUnderTrainingRunner.cpp",
"/lib/Analysis/NoInferenceModelRunner.cpp",
"/lib/Analysis/RegionPrinter.cpp",
"/lib/Analysis/TFLiteUtils.cpp",
"/lib/Analysis/Trace.cpp",
"/lib/Analysis/TrainingLogger.cpp",
"/lib/BinaryFormat/AMDGPUMetadataVerifier.cpp",
"/lib/BinaryFormat/DXContainer.cpp",
"/lib/BinaryFormat/ELF.cpp",
"/lib/BinaryFormat/Minidump.cpp",
"/lib/BinaryFormat/MsgPackDocument.cpp",
"/lib/BinaryFormat/MsgPackDocumentYAML.cpp",
"/lib/BinaryFormat/MsgPackReader.cpp",
"/lib/BinaryFormat/MsgPackWriter.cpp",
"/lib/Bitcode/Reader/BitReader.cpp",
"/lib/Bitcode/Reader/BitcodeAnalyzer.cpp",
"/lib/Bitcode/Writer/BitWriter.cpp",
"/lib/Bitcode/Writer/BitcodeWriterPass.cpp",
"/lib/CodeGen/AsmPrinter/ErlangGCPrinter.cpp",
"/lib/CodeGen/AsmPrinter/OcamlGCPrinter.cpp",
"/lib/CodeGen/CodeGenPassBuilder.cpp",
"/lib/CodeGen/CommandFlags.cpp",
"/lib/CodeGen/MIRParser/MILexer.cpp",
"/lib/CodeGen/MIRParser/MIParser.cpp",
"/lib/CodeGen/MIRParser/MIRParser.cpp",
"/lib/CodeGen/MIRYamlMapping.cpp",
"/lib/CodeGen/MLRegallocPriorityAdvisor.cpp",
"/lib/CodeGen/MachinePassManager.cpp",
"/lib/CodeGen/MultiHazardRecognizer.cpp",
"/lib/CodeGen/NonRelocatableStringpool.cpp",
"/lib/CodeGen/ParallelCG.cpp",
"/lib/CodeGen/RegAllocScore.cpp",
"/lib/CodeGen/VLIWMachineScheduler.cpp",
"/lib/DWARFLinker/DWARFLinker.cpp",
"/lib/DWARFLinker/DWARFLinkerCompileUnit.cpp",
"/lib/DWARFLinker/DWARFLinkerDeclContext.cpp",
"/lib/DWARFLinker/DWARFStreamer.cpp",
"/lib/DWARFLinkerParallel/DWARFLinker.cpp",
"/lib/DWP/DWP.cpp",
"/lib/DWP/DWPError.cpp",
"/lib/DebugInfo/CodeView/AppendingTypeTableBuilder.cpp",
"/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp",
"/lib/DebugInfo/CodeView/DebugChecksumsSubsection.cpp",
"/lib/DebugInfo/CodeView/DebugCrossExSubsection.cpp",
"/lib/DebugInfo/CodeView/DebugCrossImpSubsection.cpp",
"/lib/DebugInfo/CodeView/DebugFrameDataSubsection.cpp",
"/lib/DebugInfo/CodeView/DebugInlineeLinesSubsection.cpp",
"/lib/DebugInfo/CodeView/DebugLinesSubsection.cpp",
"/lib/DebugInfo/CodeView/DebugStringTableSubsection.cpp",
"/lib/DebugInfo/CodeView/DebugSubsection.cpp",
"/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp",
"/lib/DebugInfo/CodeView/DebugSubsectionVisitor.cpp",
"/lib/DebugInfo/CodeView/DebugSymbolRVASubsection.cpp",
"/lib/DebugInfo/CodeView/DebugSymbolsSubsection.cpp",
"/lib/DebugInfo/CodeView/Formatters.cpp",
"/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp",
"/lib/DebugInfo/CodeView/MergingTypeTableBuilder.cpp",
"/lib/DebugInfo/CodeView/StringsAndChecksums.cpp",
"/lib/DebugInfo/CodeView/SymbolDumper.cpp",
"/lib/DebugInfo/CodeView/SymbolRecordHelpers.cpp",
"/lib/DebugInfo/CodeView/SymbolSerializer.cpp",
"/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp",
"/lib/DebugInfo/CodeView/TypeRecordHelpers.cpp",
"/lib/DebugInfo/CodeView/TypeStreamMerger.cpp",
"/lib/DebugInfo/DWARF/DWARFLocationExpression.cpp",
"/lib/DebugInfo/GSYM/",
"/lib/DebugInfo/LogicalView/",
"/lib/DebugInfo/MSF/",
"/lib/DebugInfo/PDB/",
"/lib/DebugInfo/Symbolize/",
"/lib/Debuginfod/",
"/lib/ExecutionEngine/ExecutionEngine.cpp",
"/lib/ExecutionEngine/ExecutionEngineBindings.cpp",
"/lib/ExecutionEngine/GDBRegistrationListener.cpp",
"/lib/ExecutionEngine/IntelJITEvents/jitprofiling.c",
"/lib/ExecutionEngine/Interpreter/Execution.cpp",
"/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp",
"/lib/ExecutionEngine/Interpreter/Interpreter.cpp",
"/lib/ExecutionEngine/MCJIT/MCJIT.cpp",
"/lib/ExecutionEngine/Orc/COFFPlatform.cpp",
"/lib/ExecutionEngine/Orc/COFFVCRuntimeSupport.cpp",
"/lib/ExecutionEngine/Orc/CompileOnDemandLayer.cpp",
"/lib/ExecutionEngine/Orc/DebugObjectManagerPlugin.cpp",
"/lib/ExecutionEngine/Orc/DebuggerSupportPlugin.cpp",
"/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp",
"/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp",
"/lib/ExecutionEngine/Orc/EPCEHFrameRegistrar.cpp",
"/lib/ExecutionEngine/Orc/EPCGenericDylibManager.cpp",
"/lib/ExecutionEngine/Orc/EPCGenericJITLinkMemoryManager.cpp",
"/lib/ExecutionEngine/Orc/EPCGenericRTDyldMemoryManager.cpp",
"/lib/ExecutionEngine/Orc/EPCIndirectionUtils.cpp",
"/lib/ExecutionEngine/Orc/IRTransformLayer.cpp",
"/lib/ExecutionEngine/Orc/IndirectionUtils.cpp",
"/lib/ExecutionEngine/Orc/LLJIT.cpp",
"/lib/ExecutionEngine/Orc/LazyReexports.cpp",
"/lib/ExecutionEngine/Orc/LookupAndRecordAddrs.cpp",
"/lib/ExecutionEngine/Orc/MapperJITLinkMemoryManager.cpp",
"/lib/ExecutionEngine/Orc/MemoryMapper.cpp",
"/lib/ExecutionEngine/Orc/ObjectTransformLayer.cpp",
"/lib/ExecutionEngine/Orc/OrcABISupport.cpp",
"/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp",
"/lib/ExecutionEngine/Orc/Shared/OrcRTBridge.cpp",
"/lib/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.cpp",
"/lib/ExecutionEngine/Orc/SimpleRemoteEPC.cpp",
"/lib/ExecutionEngine/Orc/SpeculateAnalyses.cpp",
"/lib/ExecutionEngine/Orc/Speculation.cpp",
"/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp",
"/lib/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.cpp",
"/lib/ExecutionEngine/Orc/TargetProcess/OrcRTBootstrap.cpp",
"/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorDylibManager.cpp",
"/lib/ExecutionEngine/Orc/TargetProcess/SimpleExecutorMemoryManager.cpp",
"/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp",
"/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp",
"/lib/ExecutionEngine/TargetSelect.cpp",
"/lib/Extensions/Extensions.cpp",
"/lib/FileCheck/FileCheck.cpp",
"/lib/Frontend/HLSL/HLSLResource.cpp",
"/lib/Frontend/OpenMP/OMP.cpp",
"/lib/Frontend/OpenMP/OMPContext.cpp",
"/lib/FuzzMutate/",
"/lib/IR/Core.cpp",
"/lib/IR/ReplaceConstant.cpp",
"/lib/IR/StructuralHash.cpp",
"/lib/IR/TypedPointerType.cpp",
"/lib/IR/VectorBuilder.cpp",
"/lib/InterfaceStub/",
"/lib/LTO/",
"/lib/LineEditor/LineEditor.cpp",
"/lib/Linker/LinkModules.cpp",
"/lib/MC/ConstantPools.cpp",
"/lib/MC/MCAsmInfoGOFF.cpp",
"/lib/MC/MCAsmInfoWasm.cpp",
"/lib/MC/MCAsmInfoXCOFF.cpp",
"/lib/MC/MCDisassembler/Disassembler.cpp",
"/lib/MC/MCDisassembler/MCDisassembler.cpp",
"/lib/MC/MCDisassembler/MCExternalSymbolizer.cpp",
"/lib/MC/MCDisassembler/MCSymbolizer.cpp",
"/lib/MC/MCInstrInfo.cpp",
"/lib/MC/MCLabel.cpp",
"/lib/MC/MCParser/COFFMasmParser.cpp",
"/lib/MC/MCParser/MasmParser.cpp",
"/lib/MC/MCTargetOptionsCommandFlags.cpp",
"/lib/MC/MCWasmObjectTargetWriter.cpp",
"/lib/MC/MCXCOFFObjectTargetWriter.cpp",
"/lib/MCA/",
"/lib/Object/ArchiveWriter.cpp",
"/lib/Object/BuildID.cpp",
"/lib/Object/COFFImportFile.cpp",
"/lib/Object/COFFModuleDefinition.cpp",
"/lib/Object/DXContainer.cpp",
"/lib/Object/FaultMapParser.cpp",
"/lib/Object/MachOUniversalWriter.cpp",
"/lib/Object/Object.cpp",
"/lib/Object/SymbolSize.cpp",
"/lib/Object/WindowsMachineFlag.cpp",
"/lib/ObjectYAML/",
"/lib/Passes/PassBuilderBindings.cpp",
"/lib/Passes/PassPlugin.cpp",
"/lib/Passes/StandardInstrumentations.cpp",
"/lib/ProfileData/Coverage/CoverageMapping.cpp",
"/lib/ProfileData/Coverage/CoverageMappingReader.cpp",
"/lib/ProfileData/Coverage/CoverageMappingWriter.cpp",
"/lib/ProfileData/GCOV.cpp",
"/lib/ProfileData/InstrProfWriter.cpp",
"/lib/ProfileData/RawMemProfReader.cpp",
"/lib/ProfileData/SampleProfWriter.cpp",
"/lib/Remarks/Remark.cpp",
"/lib/Remarks/RemarkLinker.cpp",
"/lib/Support/AMDGPUMetadata.cpp",
"/lib/Support/APFixedPoint.cpp",
"/lib/Support/ARMWinEH.cpp",
"/lib/Support/AddressRanges.cpp",
"/lib/Support/Allocator.cpp",
"/lib/Support/Atomic.cpp",
"/lib/Support/AutoConvert.cpp",
"/lib/Support/Base64.cpp",
"/lib/Support/BuryPointer.cpp",
"/lib/Support/COM.cpp",
"/lib/Support/CSKYAttributeParser.cpp",
"/lib/Support/CSKYAttributes.cpp",
"/lib/Support/CachePruning.cpp",
"/lib/Support/Caching.cpp",
"/lib/Support/DAGDeltaAlgorithm.cpp",
"/lib/Support/DeltaAlgorithm.cpp",
"/lib/Support/FileCollector.cpp",
"/lib/Support/FileOutputBuffer.cpp",
"/lib/Support/FileUtilities.cpp",
"/lib/Support/InitLLVM.cpp",
"/lib/Support/LockFileManager.cpp",
"/lib/Support/MSP430AttributeParser.cpp",
"/lib/Support/MSP430Attributes.cpp",
"/lib/Support/Parallel.cpp",
"/lib/Support/PluginLoader.cpp",
"/lib/Support/RWMutex.cpp",
"/lib/Support/SHA256.cpp",
"/lib/Support/SystemUtils.cpp",
"/lib/Support/TarWriter.cpp",
"/lib/Support/ThreadPool.cpp",
"/lib/Support/UnicodeNameToCodepoint.cpp",
"/lib/Support/UnicodeNameToCodepointGenerated.cpp",
"/lib/Support/Watchdog.cpp",
"/lib/Support/Z3Solver.cpp",
"/lib/Support/raw_os_ostream.cpp",
"/lib/TableGen/",
"/lib/TargetParser/CSKYTargetParser.cpp",
"/lib/TargetParser/LoongArchTargetParser.cpp",
"/lib/TargetParser/RISCVTargetParser.cpp",
"/lib/TargetParser/TargetParser.cpp",
"/lib/TargetParser/X86TargetParser.cpp",
"/lib/TextAPI/Symbol.cpp",
"/lib/Transforms/Hello/Hello.cpp",
"/lib/Transforms/IPO/BarrierNoopPass.cpp",
"/lib/Transforms/IPO/ExtractGV.cpp",
"/lib/Transforms/IPO/IPO.cpp",
"/lib/Transforms/IPO/InlineSimple.cpp",
"/lib/Transforms/IPO/PassManagerBuilder.cpp",
"/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp",
"/lib/Transforms/Scalar/PlaceSafepoints.cpp",
"/lib/Transforms/Scalar/Scalar.cpp",
"/lib/Transforms/Utils/AMDGPUEmitPrintf.cpp",
"/lib/Transforms/Utils/LowerMemIntrinsics.cpp",
"/lib/Transforms/Utils/SanitizerStats.cpp",
"/lib/Transforms/Utils/SplitModule.cpp",
"/lib/Transforms/Utils/Utils.cpp",
"/lib/Transforms/Vectorize/VPlanSLP.cpp",
"/lib/Transforms/Vectorize/Vectorize.cpp",
"/lib/WindowsDriver/MSVCPaths.cpp",
"/lib/XRay/",
"/lib/Target/X86/Disassembler/X86Disassembler.cpp",
"/lib/Target/X86/MCA/X86CustomBehaviour.cpp",
"/lib/Target/Mips/Disassembler/MipsDisassembler.cpp",
"/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp",
"/lib/Target/ARM/Disassembler/ARMDisassembler.cpp",
"/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp",
"/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp",
]
files_to_add_back_for_llvm = [
"/lib/Target/TargetLoweringObjectFile.cpp",
"/lib/Target/TargetMachine.cpp",
"/lib/Support/BLAKE3/blake3.c",
"/lib/Support/BLAKE3/blake3_dispatch.c",
"/lib/Support/BLAKE3/blake3_portable.c"
]
files_llvm = exclude_files_with_prefixes(all_files, prefixes_of_files_not_needed_by_llvm)
files_llvm.extend(files_to_add_back_for_llvm)
# Architecture specific files
files_x86 = keep_files_with_prefix(all_files, "/lib/Target/X86/")
files_Mips = keep_files_with_prefix(all_files, "/lib/Target/Mips/")
files_AArch64 = keep_files_with_prefix(all_files, "/lib/Target/AArch64/")
files_ARM = keep_files_with_prefix(all_files, "/lib/Target/ARM/")
files_PowerPC = keep_files_with_prefix(all_files, "/lib/Target/PowerPC/")
files_RISCV = keep_files_with_prefix(all_files, "/lib/Target/RISCV/")
generated_file_comment = "File generated by " + sys.argv[0]
# Generate CMakeLists.txt
def format_file_list_for_cmake(files):
return '\n'.join([" ${LLVM_DIR}" + s for s in files])
cmake_template_data = {
'generated_file_comment' : "# " + generated_file_comment,
'files_llvm' : '\n'.join([" ${LLVM_DIR}" + s for s in files_llvm]),
'files_x86' : format_file_list_for_cmake(files_x86),
'files_Mips' : format_file_list_for_cmake(files_Mips),
'files_AArch64' : format_file_list_for_cmake(files_AArch64),
'files_ARM' : format_file_list_for_cmake(files_ARM),
'files_PowerPC' : format_file_list_for_cmake(files_PowerPC),
'files_RISCV' : format_file_list_for_cmake(files_RISCV),
}
with open(CMAKE_TEMPLATE_PATH, 'r') as f:
cmake_template = CustomTemplate(f.read())
result = cmake_template.substitute(cmake_template_data)
cmake_output = open(DESTINATION_CMAKELISTS_PATH, "w")
cmake_output.write(result)
# Generate Android.bp
def format_file_list_for_android_bp(files):
return '\n'.join([" \"llvm" + s + "\"," for s in files])
android_bp_template_data = {
'generated_file_comment' : "// " + generated_file_comment,
'files_llvm' : format_file_list_for_android_bp(files_llvm),
'files_x86' : format_file_list_for_android_bp(files_x86),
'files_AArch64' : format_file_list_for_android_bp(files_AArch64),
'files_ARM' : format_file_list_for_android_bp(files_ARM),
'files_RISCV' : format_file_list_for_android_bp(files_RISCV),
}
with open(ANDROID_BP_TEMPLATE_PATH, 'r') as f:
android_bp_template = CustomTemplate(f.read())
result = android_bp_template.substitute(android_bp_template_data)
cmake_output = open(DESTINATION_ANDROID_BP_PATH, "w")
cmake_output.write(result)
# Generate BUILD.gn
# Remove 3 files that are special cases.
# They are dealt with in the template file.
files_llvm_build_gn = exclude_files_with_prefixes(files_llvm, ['/lib/MC/MCWasmObjectTargetWriter.cpp', '/lib/MC/MCXCOFFObjectTargetWriter.cpp'])
files_ARM_build_gn = exclude_files_with_prefixes(files_ARM, ['/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp'])
# GN doesn't allow for duplicate source file names, even if they are
# in different subdirectories. Because of this, `files_llvm_build_gn` is
# partitionned into multiple targets.
def get_filename(path):
return path.split("/")[-1]
# Takes a list of paths and returns multiple lists of paths.
# Every list will contain a unique set of filenames.
def partition_paths(filepaths):
partitions = []
for path in filepaths:
filename = get_filename(path)
inserted = False
for partition in partitions:
if not filename in partition:
partition[filename] = path
inserted = True
break
if not inserted:
new_partition = {filename : path}
partitions.append(new_partition)
return [[p for f, p in partition.items()] for partition in partitions]
# Returns a string containing a GN source set containing the filepaths
def create_source_set(source_set_name, filepaths):
s = 'swiftshader_llvm_source_set("%s") {\n' % source_set_name
s += ' sources = [\n'
for filepath in filepaths:
s += ' "llvm%s",\n' % filepath
s += ' ]\n'
s += '}\n'
return s
def source_set_name(i):
return 'swiftshader_llvm_source_set_%i' % i
# Generate the GN source set code
files_llvm_partitions = partition_paths(files_llvm_build_gn)
source_set_code = ""
i = 0
for partition in files_llvm_partitions:
source_set_code += create_source_set(source_set_name(i), partition)
i = i+1
# Generate the GN deps code
deps_code = ''
i = 0
for partition in files_llvm_partitions:
deps_code += ' ":%s",\n' % source_set_name(i)
i = i+1
def format_file_list_for_build_gn(files):
return '\n'.join([" \"llvm" + s + "\"," for s in files])
build_gn_template_data = {
'generated_file_comment' : "# " + generated_file_comment,
'llvm_source_sets' : source_set_code,
'llvm_deps' : deps_code,
'files_x86' : format_file_list_for_build_gn(files_x86),
'files_AArch64' : format_file_list_for_build_gn(files_AArch64),
'files_ARM' : format_file_list_for_build_gn(files_ARM_build_gn),
'files_Mips' : format_file_list_for_build_gn(files_Mips),
'files_PowerPC' : format_file_list_for_build_gn(files_PowerPC),
'files_RISCV' : format_file_list_for_build_gn(files_RISCV),
}
with open(BUILD_GN_TEMPLATE_PATH, 'r') as f:
build_gn_template = CustomTemplate(f.read())
result = build_gn_template.substitute(build_gn_template_data)
cmake_output = open(DESTINATION_BUILD_GN_PATH, "w")
cmake_output.write(result)