1*da58b97aSjoerg# Ensure the ${model} is available at ${final_path}. 2*da58b97aSjoerg# 3*da58b97aSjoergfunction(tfgetmodel model final_path) 4*da58b97aSjoerg if (IS_ABSOLUTE ${model}) 5*da58b97aSjoerg set(${final_path} ${model} PARENT_SCOPE) 6*da58b97aSjoerg else() 7*da58b97aSjoerg set(${final_path} 8*da58b97aSjoerg ${CMAKE_CURRENT_SOURCE_DIR}/${model} PARENT_SCOPE) 9*da58b97aSjoerg endif() 10*da58b97aSjoergendfunction() 11*da58b97aSjoerg 12*da58b97aSjoerg# Run the tensorflow compiler (saved_model_cli) on the saved model in the 13*da58b97aSjoerg# ${model} directory, looking for the ${tag_set} tag set, and the SignatureDef 14*da58b97aSjoerg# ${signature_def_key}. 15*da58b97aSjoerg# Produce a pair of files called ${fname}.h and ${fname}.o in the 16*da58b97aSjoerg# ${CMAKE_CURRENT_BINARY_DIR}. The generated header will define a C++ class 17*da58b97aSjoerg# called ${cpp_class} - which may be a namespace-qualified class name. 18*da58b97aSjoergfunction(tfcompile model tag_set signature_def_key fname cpp_class) 19*da58b97aSjoerg set(prefix ${CMAKE_CURRENT_BINARY_DIR}/${fname}) 20*da58b97aSjoerg set(obj_file ${prefix}.o) 21*da58b97aSjoerg set(hdr_file ${prefix}.h) 22*da58b97aSjoerg string(TOUPPER ${fname} fname_allcaps) 23*da58b97aSjoerg set(override_header ${LLVM_OVERRIDE_MODEL_HEADER_${fname_allcaps}}) 24*da58b97aSjoerg set(override_object ${LLVM_OVERRIDE_MODEL_OBJECT_${fname_allcaps}}) 25*da58b97aSjoerg if (EXISTS "${override_header}" AND EXISTS "${override_object}") 26*da58b97aSjoerg configure_file(${override_header} ${hdr_file} COPYONLY) 27*da58b97aSjoerg configure_file(${override_object} ${obj_file} COPYONLY) 28*da58b97aSjoerg message("Using provided header " 29*da58b97aSjoerg ${hdr_file} " and object " ${obj_file} 30*da58b97aSjoerg " files for model " ${model}) 31*da58b97aSjoerg else() 32*da58b97aSjoerg tfgetmodel(${model} LLVM_ML_MODELS_ABSOLUTE) 33*da58b97aSjoerg message("Using model at " ${LLVM_ML_MODELS_ABSOLUTE}) 34*da58b97aSjoerg add_custom_command(OUTPUT ${obj_file} ${hdr_file} 35*da58b97aSjoerg COMMAND "XLA_FLAGS=\"--xla_cpu_multi_thread_eigen=false\"" ${TENSORFLOW_AOT_COMPILER} aot_compile_cpu 36*da58b97aSjoerg --dir ${LLVM_ML_MODELS_ABSOLUTE} 37*da58b97aSjoerg --tag_set ${tag_set} 38*da58b97aSjoerg --signature_def_key ${signature_def_key} 39*da58b97aSjoerg --output_prefix ${prefix} 40*da58b97aSjoerg --cpp_class ${cpp_class} 41*da58b97aSjoerg --target_triple ${LLVM_HOST_TRIPLE} 42*da58b97aSjoerg ) 43*da58b97aSjoerg endif() 44*da58b97aSjoerg 45*da58b97aSjoerg # Aggregate the objects so that results of different tfcompile calls may be 46*da58b97aSjoerg # grouped into one target. 47*da58b97aSjoerg set(GENERATED_OBJS ${GENERATED_OBJS} ${obj_file} PARENT_SCOPE) 48*da58b97aSjoerg set_source_files_properties(${obj_file} PROPERTIES 49*da58b97aSjoerg GENERATED 1 EXTERNAL_OBJECT 1) 50*da58b97aSjoerg 51*da58b97aSjoerg set(GENERATED_HEADERS ${GENERATED_HEADERS} ${hdr_file} PARENT_SCOPE) 52*da58b97aSjoerg set_source_files_properties(${hdr_file} PROPERTIES 53*da58b97aSjoerg GENERATED 1) 54*da58b97aSjoerg 55*da58b97aSjoergendfunction() 56