| include app_configuration.mk |
| |
| # Default build type. |
| BUILD=debug |
| |
| FLUTTER_MANAGED_DIR=flutter |
| FLUTTER_EPHEMERAL_DIR=$(FLUTTER_MANAGED_DIR)/ephemeral |
| |
| # Configuration provided via flutter tool. |
| FLUTTER_CONFIG_FILE=$(FLUTTER_EPHEMERAL_DIR)/generated_config.mk |
| include $(FLUTTER_CONFIG_FILE) |
| |
| # Dependency locations |
| FLUTTER_APP_DIR=$(CURDIR)/.. |
| FLUTTER_APP_BUILD_DIR=$(FLUTTER_APP_DIR)/build |
| |
| OUT_DIR=$(FLUTTER_APP_BUILD_DIR)/linux |
| OBJ_DIR=$(OUT_DIR)/obj/$(BUILD) |
| |
| # Libraries |
| FLUTTER_LIB_NAME=flutter_linux_glfw |
| FLUTTER_LIB=$(FLUTTER_EPHEMERAL_DIR)/lib$(FLUTTER_LIB_NAME).so |
| |
| # Tools |
| FLUTTER_BIN=$(FLUTTER_ROOT)/bin/flutter |
| LINUX_BUILD=$(FLUTTER_ROOT)/packages/flutter_tools/bin/tool_backend.sh |
| |
| # Resources |
| ICU_DATA_NAME=icudtl.dat |
| ICU_DATA_SOURCE=$(FLUTTER_EPHEMERAL_DIR)/$(ICU_DATA_NAME) |
| FLUTTER_ASSETS_NAME=flutter_assets |
| FLUTTER_ASSETS_SOURCE=$(FLUTTER_APP_BUILD_DIR)/$(FLUTTER_ASSETS_NAME) |
| |
| # Bundle structure |
| BUNDLE_OUT_DIR=$(OUT_DIR)/$(BUILD) |
| BUNDLE_DATA_DIR=$(BUNDLE_OUT_DIR)/data |
| BUNDLE_LIB_DIR=$(BUNDLE_OUT_DIR)/lib |
| |
| BIN_OUT=$(BUNDLE_OUT_DIR)/$(BINARY_NAME) |
| ICU_DATA_OUT=$(BUNDLE_DATA_DIR)/$(ICU_DATA_NAME) |
| FLUTTER_LIB_OUT=$(BUNDLE_LIB_DIR)/$(notdir $(FLUTTER_LIB)) |
| ALL_LIBS_OUT=$(FLUTTER_LIB_OUT) \ |
| $(foreach lib,$(EXTRA_BUNDLED_LIBRARIES),$(BUNDLE_LIB_DIR)/$(notdir $(lib))) |
| |
| # Add relevant code from the wrapper library, which is intended to be statically |
| # built into the client. |
| # Use abspath for the wrapper root, which can contain relative paths; the |
| # intermediate build files will be based on the source path, which will cause |
| # issues if they start with one or more '../'s. |
| WRAPPER_ROOT=$(abspath $(FLUTTER_EPHEMERAL_DIR)/cpp_client_wrapper_glfw) |
| WRAPPER_SOURCES= \ |
| $(WRAPPER_ROOT)/flutter_window_controller.cc \ |
| $(WRAPPER_ROOT)/plugin_registrar.cc \ |
| $(WRAPPER_ROOT)/engine_method_result.cc |
| |
| # Use abspath for extra sources, which may also contain relative paths (see |
| # note above about WRAPPER_ROOT). |
| SOURCES=main.cc window_configuration.cc \ |
| flutter/generated_plugin_registrant.cc \ |
| $(WRAPPER_SOURCES) $(abspath $(EXTRA_SOURCES)) |
| |
| # Headers |
| WRAPPER_INCLUDE_DIR=$(WRAPPER_ROOT)/include |
| INCLUDE_DIRS=$(FLUTTER_EPHEMERAL_DIR) $(WRAPPER_INCLUDE_DIR) |
| |
| # Build settings |
| ifneq ($(strip $(SYSTEM_LIBRARIES)),) |
| EXTRA_CPPFLAGS+=$(patsubst -I%,-isystem%,$(shell pkg-config --cflags $(SYSTEM_LIBRARIES))) |
| EXTRA_LDFLAGS+=$(shell pkg-config --libs $(SYSTEM_LIBRARIES)) |
| endif |
| CXX=clang++ |
| CPPFLAGS.release=-DNDEBUG |
| CPPFLAGS.profile=$(CPPFLAGS.release) |
| CXXFLAGS.release=-O2 |
| CXXFLAGS.profile=$(CXXFLAGS.release) |
| CXXFLAGS=-std=c++14 -Wall -Werror $(CXXFLAGS.$(BUILD)) $(EXTRA_CXXFLAGS) |
| CPPFLAGS=$(patsubst %,-I%,$(INCLUDE_DIRS)) \ |
| $(CPPFLAGS.$(BUILD)) $(EXTRA_CPPFLAGS) |
| LDFLAGS=-L$(BUNDLE_LIB_DIR) \ |
| -l$(FLUTTER_LIB_NAME) \ |
| $(EXTRA_LDFLAGS) \ |
| -Wl,-rpath=\$$ORIGIN/lib |
| |
| # Intermediate files. |
| OBJ_FILES=$(SOURCES:%.cc=$(OBJ_DIR)/%.o) |
| DEPENDENCY_FILES=$(OBJ_FILES:%.o=%.d) |
| |
| # Targets |
| |
| .PHONY: all |
| all: $(BIN_OUT) bundle |
| |
| # Add the plugin targets, and their associated settings. |
| include $(FLUTTER_MANAGED_DIR)/generated_plugins.mk |
| EXTRA_BUNDLED_LIBRARIES+=$(PLUGIN_LIBRARIES) |
| EXTRA_LDFLAGS+=$(PLUGIN_LDFLAGS) |
| EXTRA_CPPFLAGS+=$(PLUGIN_CPPFLAGS) |
| |
| # This is a phony target because the flutter tool cannot describe |
| # its inputs and outputs yet. |
| .PHONY: sync |
| sync: $(FLUTTER_CONFIG_FILE) |
| $(LINUX_BUILD) linux-x64 $(BUILD) |
| |
| .PHONY: bundle |
| bundle: $(ICU_DATA_OUT) $(ALL_LIBS_OUT) bundleflutterassets |
| |
| $(BIN_OUT): $(OBJ_FILES) $(ALL_LIBS_OUT) |
| mkdir -p $(@D) |
| $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OBJ_FILES) $(LDFLAGS) -o $@ |
| |
| $(WRAPPER_SOURCES) $(FLUTTER_LIB) $(ICU_DATA_SOURCE) $(FLUTTER_ASSETS_SOURCE) \ |
| $(PLUGIN_TARGETS): | sync |
| |
| # Plugin library bundling pattern. |
| $(BUNDLE_LIB_DIR)/%: $(OUT_DIR)/% |
| mkdir -p $(BUNDLE_LIB_DIR) |
| cp $< $@ |
| |
| $(FLUTTER_LIB_OUT): $(FLUTTER_LIB) |
| mkdir -p $(@D) |
| cp $< $@ |
| |
| $(ICU_DATA_OUT): $(ICU_DATA_SOURCE) |
| mkdir -p $(@D) |
| cp $< $@ |
| |
| -include $(DEPENDENCY_FILES) |
| |
| $(OBJ_DIR)/%.o : %.cc | sync |
| mkdir -p $(@D) |
| $(CXX) $(CXXFLAGS) $(CPPFLAGS) -MMD -c $< -o $@ |
| |
| # Fully re-copy the assets directory on each build to avoid having to keep a |
| # comprehensive list of all asset files here, which would be fragile to changes |
| # in other files (e.g., adding a new font to pubspec.yaml). |
| .PHONY: bundleflutterassets |
| bundleflutterassets: $(FLUTTER_ASSETS_SOURCE) |
| mkdir -p $(BUNDLE_DATA_DIR) |
| rsync -rpu --delete $(FLUTTER_ASSETS_SOURCE) $(BUNDLE_DATA_DIR) |
| |
| .PHONY: clean |
| clean: |
| rm -rf $(OUT_DIR); \ |
| cd $(FLUTTER_APP_DIR); \ |
| $(FLUTTER_BIN) clean |