diff --git a/apps/bundle_deploy/Makefile b/apps/bundle_deploy/Makefile index f0e0c0fa05bc..b81df55852fa 100644 --- a/apps/bundle_deploy/Makefile +++ b/apps/bundle_deploy/Makefile @@ -64,8 +64,6 @@ $(else) QUIET ?= @ $(endif) -CRT_SRCS = $(shell find $(CRT_ROOT)) - MODEL_OBJ = $(build_dir)/model_c/devc.o $(build_dir)/model_c/lib0.o $(build_dir)/model_c/lib1.o TEST_MODEL_OBJ = $(build_dir)/test_model_c/devc.o $(build_dir)/test_model_c/lib0.o $(build_dir)/test_model_c/lib1.o @@ -83,14 +81,20 @@ demo_static: $(build_dir)/demo_static $(build_dir)/cat.bin test_static: $(build_dir)/test_static $(build_dir)/test_data_c.bin $(build_dir)/test_output_c.bin $(QUIET)TVM_NUM_THREADS=1 $(build_dir)/test_static $(build_dir)/test_data_c.bin $(build_dir)/test_output_c.bin $(build_dir)/test_graph_c.json $(build_dir)/test_params_c.bin -$(build_dir)/crt/libcommon.a: $(CRT_SRCS) - $(QUIET)cd $(CRT_ROOT) && make QUIET= BUILD_DIR=$(abspath $(build_dir))/crt CRT_CONFIG=$(abspath $(build_dir)/crt_config/crt_config.h) "EXTRA_CFLAGS=$(PKG_COMPILE_OPTS)" common +$(build_dir)/crt_config/crt_config.h: + $(QUIET)mkdir --parents $(build_dir)/crt_config && cp ../../build/microtvm_template_projects/crt/crt_config/crt_config.h $(build_dir)/crt_config/crt_config.h + +$(build_dir)/crt: + $(QUIET)mkdir --parents $(build_dir)/crt && cp -r $(CRT_ROOT)/* $(build_dir)/crt + +$(build_dir)/libcommon.a: $(build_dir)/crt $(build_dir)/crt_config/crt_config.h + $(QUIET)cd $(build_dir)/crt && mkdir -p build && cd build && cmake -DCRT_CONFIG_PATH=$(abspath $(build_dir)/crt_config) -DCMAKE_C_FLAGS="${PKG_COMPILE_OPTS}" .. && make && cp libcommon.a $(abspath $(build_dir)/libcommon.a) -$(build_dir)/crt/libgraph_executor.a: $(CRT_SRCS) - $(QUIET)cd $(CRT_ROOT) && make QUIET= BUILD_DIR=$(abspath $(build_dir))/crt CRT_CONFIG=$(abspath $(build_dir)/crt_config/crt_config.h) "EXTRA_CFLAGS=$(PKG_COMPILE_OPTS)" graph_executor +$(build_dir)/libgraph_executor.a: $(build_dir)/crt $(build_dir)/crt_config/crt_config.h + $(QUIET)cd $(build_dir)/crt && mkdir -p build && cd build && cmake -DCRT_CONFIG_PATH=$(abspath $(build_dir)/crt_config) -DCMAKE_C_FLAGS="${PKG_COMPILE_OPTS}" .. && make && cp libgraph_executor.a $(abspath $(build_dir)/libgraph_executor.a) -$(build_dir)/crt/libmemory.a: $(CRT_SRCS) - $(QUIET)cd $(CRT_ROOT) && make QUIET= BUILD_DIR=$(abspath $(build_dir))/crt CRT_CONFIG=$(abspath $(build_dir)/crt_config/crt_config.h) "EXTRA_CFLAGS=$(PKG_COMPILE_OPTS)" memory +$(build_dir)/libmemory.a: $(build_dir)/crt $(build_dir)/crt_config/crt_config.h + $(QUIET)cd $(build_dir)/crt && mkdir -p build && cd build && cmake -DCRT_CONFIG_PATH=$(abspath $(build_dir)/crt_config) -DCMAKE_C_FLAGS="${PKG_COMPILE_OPTS}" .. && make && cp libmemory.a $(abspath $(build_dir)/libmemory.a) $(build_dir)/demo_dynamic: demo.cc $(QUIET)mkdir -p $(@D) @@ -100,11 +104,11 @@ $(build_dir)/test_dynamic: test.cc ${build_dir}/test_graph_c.json ${build_dir}/t $(QUIET)mkdir -p $(@D) $(QUIET)g++ $(PKG_CXXFLAGS) -o $@ test.cc $(BACKTRACE_OBJS) $(BACKTRACE_LDFLAGS) -$(build_dir)/demo_static: demo_static.c ${build_dir}/bundle_static.o $(MODEL_OBJ) ${build_dir}/crt/libmemory.a ${build_dir}/crt/libgraph_executor.a ${build_dir}/crt/libcommon.a ${build_dir}/graph_c.json.c ${build_dir}/params_c.bin.c $(BACKTRACE_OBJS) +$(build_dir)/demo_static: demo_static.c ${build_dir}/bundle_static.o $(MODEL_OBJ) ${build_dir}/libmemory.a ${build_dir}/libgraph_executor.a ${build_dir}/libcommon.a ${build_dir}/graph_c.json.c ${build_dir}/params_c.bin.c $(BACKTRACE_OBJS) $(QUIET)mkdir -p $(@D) $(QUIET)gcc $(PKG_CFLAGS) -o $@ $^ $(PKG_LDFLAGS) $(BACKTRACE_LDFLAGS) $(BACKTRACE_CFLAGS) -$(build_dir)/test_static: test_static.c ${build_dir}/bundle_static.o $(TEST_MODEL_OBJ) ${build_dir}/crt/libmemory.a ${build_dir}/crt/libgraph_executor.a ${build_dir}/crt/libcommon.a $(BACKTRACE_OBJS) +$(build_dir)/test_static: test_static.c ${build_dir}/bundle_static.o $(TEST_MODEL_OBJ) ${build_dir}/libmemory.a ${build_dir}/libgraph_executor.a ${build_dir}/libcommon.a $(BACKTRACE_OBJS) $(QUIET)mkdir -p $(@D) $(QUIET)gcc $(PKG_CFLAGS) -o $@ $^ $(BACKTRACE_LDFLAGS) @@ -142,7 +146,7 @@ $(build_dir)/bundle.so: bundle.cc runtime.cc $(build_dir)/model_cpp.o $(QUIET)mkdir -p $(@D) $(QUIET)g++ -shared $(PKG_CXXFLAGS) -fvisibility=hidden -o $@ $^ $(PKG_LDFLAGS) -$(build_dir)/bundle_c.so: bundle.c $(MODEL_OBJ) ${build_dir}/crt/libmemory.a ${build_dir}/crt/libgraph_executor.a ${build_dir}/crt/libcommon.a $(BACKTRACE_OBJS) +$(build_dir)/bundle_c.so: bundle.c $(MODEL_OBJ) ${build_dir}/libmemory.a ${build_dir}/libgraph_executor.a ${build_dir}/libcommon.a $(BACKTRACE_OBJS) $(QUIET)mkdir -p $(@D) $(QUIET)gcc -shared $(PKG_CFLAGS) -fvisibility=hidden -o $@ $^ $(PKG_LDFLAGS) $(BACKTRACE_LDFLAGS) $(BACKTRACE_CFLAGS) @@ -150,7 +154,7 @@ $(build_dir)/test_bundle.so: bundle.cc runtime.cc $(build_dir)/test_model_cpp.o $(QUIET)mkdir -p $(@D) $(QUIET)g++ -shared $(PKG_CXXFLAGS) -fvisibility=hidden -o $@ $^ $(PKG_LDFLAGS) -$(build_dir)/test_bundle_c.so: bundle.c $(TEST_MODEL_OBJ) ${build_dir}/crt/libmemory.a ${build_dir}/crt/libgraph_executor.a ${build_dir}/crt/libcommon.a $(BACKTRACE_OBJS) +$(build_dir)/test_bundle_c.so: bundle.c $(TEST_MODEL_OBJ) ${build_dir}/libmemory.a ${build_dir}/libgraph_executor.a ${build_dir}/libcommon.a $(BACKTRACE_OBJS) $(QUIET)mkdir -p $(@D) $(QUIET)gcc -shared $(PKG_CFLAGS) -fvisibility=hidden -o $@ $^ $(PKG_LDFLAGS) $(BACKTRACE_LDFLAGS) $(BACKTRACE_CFLAGS) diff --git a/apps/bundle_deploy/build_model.py b/apps/bundle_deploy/build_model.py index 621846611d80..2f8feeba633b 100644 --- a/apps/bundle_deploy/build_model.py +++ b/apps/bundle_deploy/build_model.py @@ -26,7 +26,6 @@ import logging from tvm.relay.backend import Runtime from tvm.contrib import cc as _cc -from tvm.micro import copy_crt_config_header RUNTIMES = [ (Runtime("crt", {"system-lib": True}), "{name}_c.{ext}"), @@ -166,8 +165,3 @@ def transform_image(image): else: build_module(opts) build_inputs(opts) - - crt_config_output_path = pathlib.Path(__file__).parent.resolve() / "build" / "crt_config" - if not crt_config_output_path.exists(): - crt_config_output_path.mkdir() - copy_crt_config_header("crt", crt_config_output_path) diff --git a/apps/microtvm/zephyr/template_project/CMakeLists.txt.template b/apps/microtvm/zephyr/template_project/CMakeLists.txt.template index cec29e724882..a190505a2315 100644 --- a/apps/microtvm/zephyr/template_project/CMakeLists.txt.template +++ b/apps/microtvm/zephyr/template_project/CMakeLists.txt.template @@ -54,13 +54,12 @@ else() set(cmsis_includes "") endif() +# Add CRT libraries set(CRT_LIBS ) -set(CRT_LIB_BASE crt/src/runtime/crt) +set(CRT_CONFIG_PATH ${CMAKE_SOURCE_DIR}/crt_config) +add_subdirectory(crt) foreach(crt_lib_name ${CRT_LIBS}) - zephyr_library_named(${crt_lib_name}) - file(GLOB_RECURSE crt_lib_srcs ${CRT_LIB_BASE}/${crt_lib_name}/*.c ${CRT_LIB_BASE}/${crt_lib_name}/*.cc) - target_sources(${crt_lib_name} PRIVATE ${crt_lib_srcs}) - zephyr_library_include_directories(${crt_lib_name} PRIVATE crt_config crt/include) + target_link_libraries(${crt_lib_name} PUBLIC zephyr_interface) target_link_libraries(app PRIVATE ${crt_lib_name}) endforeach(crt_lib_name ${CRT_LIBS}) diff --git a/apps/microtvm/zephyr/template_project/microtvm_api_server.py b/apps/microtvm/zephyr/template_project/microtvm_api_server.py index 227b0389445a..8a792ff41e8d 100644 --- a/apps/microtvm/zephyr/template_project/microtvm_api_server.py +++ b/apps/microtvm/zephyr/template_project/microtvm_api_server.py @@ -383,7 +383,7 @@ def server_info_query(self, tvm_version): ) # These files and directories will be recursively copied into generated projects from the CRT. - CRT_COPY_ITEMS = ("include", "Makefile", "src") + CRT_COPY_ITEMS = ("include", "CMakeLists.txt", "src") # Maps extra line added to prj.conf to a tuple or list of zephyr_board for which it is needed. EXTRA_PRJ_CONF_DIRECTIVES = { diff --git a/cmake/modules/StandaloneCrt.cmake b/cmake/modules/StandaloneCrt.cmake index 77025d77b7f9..f6a3c6d4108e 100644 --- a/cmake/modules/StandaloneCrt.cmake +++ b/cmake/modules/StandaloneCrt.cmake @@ -79,7 +79,7 @@ if(USE_MICRO) "include/tvm/runtime c_*_api.h -> include/tvm/runtime" "include/tvm/runtime metadata_types.h -> include/tvm/runtime" "include/tvm/runtime/crt *.h -> include/tvm/runtime/crt" - "src/runtime/crt Makefile -> ." + "src/runtime/crt CMakeLists.txt -> ." "src/runtime/crt/include *.h -> include" "src/runtime/crt/aot_executor *.c -> src/runtime/crt/aot_executor" "src/runtime/crt/aot_executor_module *.c -> src/runtime/crt/aot_executor_module" diff --git a/src/runtime/crt/CMakeLists.txt b/src/runtime/crt/CMakeLists.txt new file mode 100644 index 000000000000..ea170bca1c86 --- /dev/null +++ b/src/runtime/crt/CMakeLists.txt @@ -0,0 +1,51 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.18) +project(standalone_crt_libs C CXX) + +if(NOT DEFINED CRT_CONFIG_PATH) + message(FATAL_ERROR "Must supply path to crt_config.h: CRT_CONFIG_PATH=...") +endif() + +set(CRT_LIB_BASE ${CMAKE_CURRENT_SOURCE_DIR}/src/runtime/crt) +if(NOT EXISTS "${CRT_LIB_BASE}") + message(FATAL_ERROR + "This CMakeList does not build inside TVM source tree. +Build the standalone_crt target, and re-invoke CMakeList.txt in build/standalone_crt.") +endif() + +if (NOT DEFINED CRT_LIBS) + set(CRT_LIBS microtvm_rpc_server + microtvm_rpc_common + aot_executor_module + aot_executor + graph_executor_module + graph_executor + common + memory + ) +endif() + +foreach(crt_lib_name ${CRT_LIBS}) + add_library(${crt_lib_name}) + file(GLOB_RECURSE crt_lib_srcs ${CRT_LIB_BASE}/${crt_lib_name}/*.c ${CRT_LIB_BASE}/${crt_lib_name}/*.cc) + target_sources(${crt_lib_name} PRIVATE ${crt_lib_srcs}) + target_include_directories(${crt_lib_name} PRIVATE include ${CRT_CONFIG_PATH}) +endforeach(crt_lib_name ${CRT_LIBS}) diff --git a/src/runtime/crt/Makefile b/src/runtime/crt/Makefile deleted file mode 100644 index a9987b8b7cb1..000000000000 --- a/src/runtime/crt/Makefile +++ /dev/null @@ -1,85 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -# NOTE: Although this Makefile contains build commands for the C runtime, it isn't intended to be -# used directly in the TVM source tree. Instead, build the "standalone_crt" target, which produces a -# directory tree suitable for this Makefile. If this Makefile looks like it's the top-level of a -# source tree, you can probably ignore this message. - -# NOTE: If files appear to be missing in the generated standalone_crt target, consult the copy job -# specs listed in the TVM repo in cmake/modules/StandaloneCrt.cmake. - -ifeq ($(CRT_CONFIG),) -$(error "Must supply path to crt_config.h: CRT_CONFIG=...") -endif - -ifneq ($(wildcard .gitignore),) -$(error "detected building inside tvm source tree.") -$(error "build the standalone_crt target, and re-invoke makefile in build/standalone_crt") -endif - -BUILD_DIR ?= build -PREFIX ?= - -AR ?= ${PREFIX}ar -CC ?= ${PREFIX}gcc -CXX ?= ${PREFIX}g++ -RANLIB ?= ${PREFIX}ranlib - -QUIET ?= @ - -CRT_PREFIX = $(wildcard src/crt) - -INCLUDES ?= -isystem include -iquote $(dir ${CRT_CONFIG}) -CFLAGS += ${INCLUDES} -Werror -g $(EXTRA_CFLAGS) -DDMLC_USE_LOGGING_LIBRARY=\ -CXXFLAGS += ${INCLUDES} -std=c++11 -Werror -g $(EXTRA_CXXFLAGS) -DDMLC_USE_LOGGING_LIBRARY=\ -LDFLAGS += -Werror -g $(EXTRA_LDFLAGS) - -${BUILD_DIR}/%.o: src/%.c $(CRT_CONFIG) - ${QUIET}mkdir -p $(dir $@) - ${QUIET}${CC} ${CFLAGS} -c -o "$@" "$<" - -${BUILD_DIR}/%.o: src/%.cc $(CRT_CONFIG) - ${QUIET}mkdir -p $(dir $@) - ${QUIET}${CXX} ${CXXFLAGS} -c -o "$@" "$<" - -define LIB_template -$${BUILD_DIR}/lib$(notdir $(1)).a: $$(patsubst src/%.c,$${BUILD_DIR}/%.o,$$(wildcard src/$(1:src/%=%)/*.c)) $$(patsubst src/%.cc,${BUILD_DIR}/%.o,$$(wildcard src/$(1:src/%=%)/*.cc)) - $${QUIET}$${AR} -cr "$$@" $$^ - $${QUIET}$${RANLIB} $${RANLIBFLAGS} "$$@" -$(notdir $(1)): $${BUILD_DIR}/lib$(notdir $(1)).a - -endef - -LIBS = \ - src/runtime/crt/aot_executor \ - src/runtime/crt/aot_executor_module \ - src/runtime/crt/common \ - src/runtime/crt/graph_executor \ - src/runtime/crt/graph_executor_module \ - src/runtime/crt/memory \ - src/runtime/crt/microtvm_rpc_common \ - src/runtime/crt/microtvm_rpc_server - -$(foreach lib,$(LIBS),$(eval $(call LIB_template,$(lib)))) - -all: $(notdir $(LIBS)) -clean: - rm -rf "${BUILD_DIR}" - -.PHONY: all $(notdir $(LIBS)) -.DEFAULT_GOAL: all diff --git a/src/runtime/crt/host/microtvm_api_server.py b/src/runtime/crt/host/microtvm_api_server.py index af6947a18b9c..7271c4512abc 100644 --- a/src/runtime/crt/host/microtvm_api_server.py +++ b/src/runtime/crt/host/microtvm_api_server.py @@ -79,7 +79,7 @@ def server_info_query(self, tvm_version): ) # These files and directories will be recursively copied into generated projects from the CRT. - CRT_COPY_ITEMS = ("include", "Makefile", "src") + CRT_COPY_ITEMS = ("include", "CMakeLists.txt", "src") def _populate_cmake( self,